硬件平台:MSM8953/SDM450
软件平台:Android9.0
主摄IC: IMX258 (AF、Flash)
前摄IC: GC5025(AF)
景深: OV5670/GC5025(AF)
Qocm平台Android5.1 和Android8.0 (N1 msm8909)流程基本一致,Android9.0(msm8953)框架变化较大。
而展讯平台Android4.4(S2 SC9020E),框架又有所不同,因此共三份文档。
这是第一份,A-(msm8953 Android9.0)。后续有 B-(msm8909 Android5.1/8.0) 和C-(SC9820E Android4.4)
在msm8953平台,前摄和景深配置和主摄基本一致,只是CSI 配置和CCI配置不同。
MSM8953 最多支持(4+4+2+1)4个摄像头,SDM450最多支持(4+4+4)3个摄像头
名字解释;
- Rear Camera : 主摄、后摄
- Front Camera:前摄、副摄
- Depth Camera:景深、后辅摄
目录 1
前言 4
1. 内核部分(kernel部分) 5
1.1 主摄硬件原理图 (Rear Camera SCH) 5
1.2 主摄设备树配置 (Rear Camera dts cfg) 6
1.3 前摄硬件原理图 (Front Camera HardWare) 8
1.4 前摄设备树配置 (Front Camera dts cfg) 8
1.5 景深硬件原理图 (Depth Camera SCH) 10
1.6 景深摄像头设备树配置 (Depth Camera dts cfg) 10
1.7 闪光灯 (Flash LED) 11
1.8 对焦马达AF 12
1.9 平台硬件接口定义 (Platform Camera SCH) 12
2 vendor 添加驱动 15
2.1 lib 驱动参数配置部分 15
2.2 Chromatix 效果参数配置部分 16
2.3. vendor编译选项配置 17
2.3.1 配置系统要加载的camera 17
2.3.2 效果编译选项配置 20
2.3.3 lib和chromatix库包含编译选项 21
3. Camera MCLK修改 23
3.1 修改MCLK驱动频率 23
3.2 修改MCLK驱动能力 24
Tips: 26
lib so库单刷验证: 26
主摄imx258 sensor硬件原理图:有AF、闪光灯
主摄闪光灯:
由主摄硬件原理图,配置 imx258 (CSI_0)主摄节点:
路径: kernel\msm-4.9\arch\arm64\boot\dts\xxx\xxx_msm8953-camera-sensor-qrd.dtsi
重点关注供电脚、rst脚、pwd脚、mclk脚、CCI通道配置,CSI通道配置等。
/* Back Cmaera */
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
reg = <0x0>;
// csi0 默认为主摄
qcom,csiphy-sd-index = <0>;
// 同上
qcom,csid-sd-index = <0>;
// 挂载角度,根据显示效果修改,这里不起作用,需修改vendorxml配置
qcom,mount-angle = <90>;
// 闪光灯
qcom,led-flash-src = <&led_flash0>;
// eeprom,也叫OTP,用于校准camera sensor的显示效果
//qcom,eeprom-src = <&eeprom0>;
// 自动对焦马达AF选配功能
qcom,actuator-src = <&actuator0>;
// pin-29 1.8伏IO核电
cam_vio-supply = <&pm8953_l6>;
// pin-25 26 1.2伏数字dig电
cam_vdig-supply = <&pm8953_l2>;
// pin-17 2.8伏模拟vana电
cam_vana-supply = <&pm8953_l22>;
// AF马达2.8V供电,
cam_vaf-supply = <&pm8953_l17>;
qcom,cam-vreg-name = "cam_vana", "cam_vio", "cam_vdig","cam_vaf";
qcom,cam-vreg-min-voltage = <2800000 0 1200000 2850000>;
qcom,cam-vreg-max-voltage = <2800000 0 1225000 2850000>;
qcom,cam-vreg-op-mode = <80000 0 105000 100000>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_default
&cam_sensor_rear_default>;
pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>;
// 依次是mclk rst pwd
gpios = <&tlmm 26 0>,
<&tlmm 40 0>,
<&tlmm 39 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0",
"CAM_STANDBY0";
// 位置0 表主摄。vendor的配置起实际作用
qcom,sensor-position = <0>;
qcom,sensor-mode = <0>;
// 挂载的CCI通道编号(0/1)
qcom,cci-master = <0>;
status = "ok";
clocks = <&clock_gcc clk_mclk0_clk_src>,
<&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";
// mclk 频率配置, Cam正常工作后会输出24M 波形,
// vendor 配置起实际作用,频率可修改
qcom,clock-rates = <24000000 0>;
};
前摄gc5025 硬件接线原理图
由前摄硬件原理图,配置 gc5025 (CSI_2)前摄节点:有AF,无闪光灯
路径: kernel\msm-4.9\arch\arm64\boot\dts\xxx\xxx_msm8953-camera-sensor-qrd.dtsi
重点关注供电脚、rst脚、pwd脚、mclk脚、CCI通道配置,CSI通道配置等。马达 eeprom 闪光灯先不讲。
/* Front Cmaera */
qcom,camera@2 {
cell-index = <2>;
compatible = "qcom,camera";
reg = <0x02>;
qcom,csiphy-sd-index = <2>;
qcom,csid-sd-index = <2>;
qcom,mount-angle = <270>;
//qcom,eeprom-src = <&eeprom2>;
qcom,actuator-src = <&actuator1>;
cam_vdig-supply = <&pm8953_l23>;
cam_vana-supply = <&pm8953_l22>;
cam_vio-supply = <&pm8953_l6>;
cam_vaf-supply = <&pm8953_l17>;
qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana","cam_vaf";
qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>;
qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>;
qcom,cam-vreg-op-mode = <105000 0 80000 100000>;
qcom,gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk1_default
&cam_sensor_front1_default>;
pinctrl-1 = <&cam_sensor_mclk1_sleep
&cam_sensor_front1_sleep>;
gpios = <&tlmm 27 0>,
<&tlmm 129 0>,
<&tlmm 130 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK1",
"CAM_RESET1",
"CAM_STANDBY1";
qcom,sensor-position = <1>;
qcom,sensor-mode = <0>;
qcom,cci-master = <0>;
status = "ok";
clocks = <&clock_gcc clk_mclk1_clk_src>,
<&clock_gcc clk_gcc_camss_mclk1_clk>;
clock-names = "cam_src_clk", "cam_clk";
qcom,clock-rates = <24000000 0>;
};
景深使用OV5670/GC5025兼容设计:
由景深摄硬件原理图,配置 OV5670/GC5025 (CSI_1)景深节点:有AF,无闪光灯
景深摄像头,使用OV5670/GC5025 兼容设计,支持AF,CCI和主摄挂载在同一路,前摄单独一路,因此可以上层打开三个camera,而不会发生IIC寻址冲突。
/* Depth Cmaera */
qcom,camera@1 {
cell-index = <1>;
compatible = "qcom,camera";
reg = <0x1>;
qcom,csiphy-sd-index = <1>;
qcom,csid-sd-index = <1>;
qcom,mount-angle = <270>;
qcom,actuator-src = <&actuator1>;
cam_vdig-supply = <&pm8953_l23>;
cam_vana-supply = <&pm8953_l22>;
cam_vio-supply = <&pm8953_l6>;
cam_vaf-supply = <&pm8953_l17>;
qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana","cam_vaf";
qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>;
qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>;
qcom,cam-vreg-op-mode = <105000 0 80000 100000>;
qcom,gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk2_default
&cam_sensor_front_default>;
pinctrl-1 = <&cam_sensor_mclk2_sleep
&cam_sensor_front_sleep>;
gpios = <&tlmm 28 0>,
<&tlmm 131 0>,
<&tlmm 132 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK2",
"CAM_RESET2",
"CAM_STANDBY2";
qcom,sensor-position = <0>;
qcom,sensor-mode = <0>;
qcom,cci-master = <1>;
status = "ok";
clocks = <&clock_gcc clk_mclk2_clk_src>,
<&clock_gcc clk_gcc_camss_mclk2_clk>;
clock-names = "cam_src_clk", "cam_clk";
qcom,clock-rates = <24000000 0>;
};
闪光灯其实是pmi632驱动的一个IO口,兼具闪光和照明两种功能。
闪光模式,亮度值最大值255,照明模式为一半亮度<=127。
闪光灯拍照,会先预闪(短闪,为了防止红眼现象),然后再闪一次(长闪),中间需要设置正确的跳帧数,再拍照。
flash led 节点配置路径:kernel\msm-4.9\arch\arm64\boot\dts\xxx\xxx_pmi632.dtsi
配置 led_flash 节点,闪光灯由pmi632驱动:
&soc {
led_flash0: qcom,camera-flash {
cell-index = <0>;
compatible = "qcom,camera-flash";
qcom,flash-type = <1>;
qcom,flash-source = <&pmi632_flash0 &pmi632_flash1>;
qcom,torch-source = <&pmi632_torch0 &pmi632_torch1>;
qcom,switch-source = <&pmi632_switch0>;
};
};
引用闪光灯节点
qcom,led-flash-src = <&led_flash0>;
用途,实现摄像头的自动对焦功能。软件上当作一个CCI设备来处理。
拥有cam sensor一样的上电时序,挂载在CCI设备。
AF 加载失败会导致camera 无法正常打开。
配置AF 节点
actuator0: qcom,actuator@0 {
cell-index = <0>;
reg = <0x0>;
compatible = "qcom,actuator";
qcom,cci-master = <0>;
cam_vaf-supply = <&pm8953_l17>;
qcom,cam-vreg-name = "cam_vaf";
qcom,cam-vreg-min-voltage = <2850000>;
qcom,cam-vreg-max-voltage = <2850000>;
qcom,cam-vreg-op-mode = <80000>;
};
引用AF 节点
qcom,actuator-src = <&actuator0>;
一般lib和chromatix驱动文件厂家会提供,若不提供,需要找一个比较相近的sensor,或同一个厂商、同一个数据格式的驱动文件上修改而来。
vendor驱动主要分三部分,
- lib 驱动参数配置部分
- chromatix 效果参数配置部分
- 编译选项配置
主摄lib驱动路径为:vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\imx258\
路径下共三个文件:
imx258_lib.c // 主要参数配置在这里面
imx258_lib.h // 曝光函数、对焦等函数定义
Android.mk // 编译配置文件
imx258_lib.c 包含:上电时序、init-setting、分辨率输出配置、数据格式、gain地址配置、通道配置、降噪参数配置等等。
此文件直接决定sensor是否能正常出图。
imx258_lib.h 包含:gain(模拟增益和数字增益)、曝光行、等配置。此文件直接决定sensor曝光的3A显示效果(配合效果文件参数配置进行)。
Android.mk作用:这里声明生成的so库为 libmmcamera_imx258 .so
LOCAL_MODULE := libmmcamera_imx258
以后修改了这里面的参数,可以单编,adb单刷libmmcamera_imx258 .so。
同理,前摄、景深和主摄配置流程一致:
主摄:libmmcamera_imx258.so
前摄:libmmcamera_gc5025.so
景深:libmmcamera_ov5670.so或 libmmcamera_gc5025.so(与前摄共用)
以后修改了这里面的参数,可以单编,adb单刷libmmcamera_imx258 .so。
划重点,后面要考的。
补充:
adb 可以查看lib so库的位置,可以单编单push去更新配置。
如:libmmcamera_imx258.so 位于 vendor\lib
- adb root
- adb remount (Adnroid9.0 需要先disable-verity,才能remount)
- adb push libmmcamera_imx258.so /vendor/lib/
- adb sync
- adb remount
主摄效果文件路径为:vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\chromatix\0310\chromatix_imx258\
adb 下位于 vendor\lib == 格式为 libchromatix_imx258_xxx
路径下有很多文件,简单说明:
3A:3A 算法参数配置文件
common: 公共参数配置文件,这个是必须的
cpp:后端处理效果参数配置文件
isp:ISP部分文件
postproc:略
Android.mk:编译选项配置文件。上面每个文件夹中,都会有一个Android.mk 文件,会包含对应的文件,并生成一个效果库。
”举个栗子“:
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\chromatix\0310\chromatix_imx258\common\Android.mk
LOCAL_SRC_FILES:= chromatix_imx258_common.c
LOCAL_MODULE := libchromatix_imx258_common
对应生成 libchromatix_imx258_common.so 效果参数库
划重点,后面要考
如有单独修改,可单编单刷验证。
其他的效果文件,配置同上,都会生成对应的效果so库。
前摄和景深和主摄配置方法一致,略过。
配置文件:
vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\ msm8953_camera.xml
// 注意,有做项目抽取的,要到对应目录修改同名文件
这个配置文件,不能单编单刷,必须全编全刷vendor才会更新。
adb 下位于 vendor\etc\camera\camera_config.xml
下面就是为系统配置了默认主摄imx258,可做兼容。主要信息做简要说明。
主摄(ixm258) xml配置文件
0 // camera ID,主摄0,景深1,前摄2
imx258 // cam sensor 名字,和imx258_lib.h 中一致
dw9714 // 马达驱动名字,先忽略
pmic // 闪光灯控制方式
imx258_bear_chromatix // 效果配置文件名
1
BACK // 位置后摄
90 // 挂载角度
0 // CSID 的编号,主摄0,景深、前摄1
// csi配置,bit1固定为clk,bit0,bit2、bit3、bit4,代表miipi-csi lane通道是否启用
// 如使用4lane,为0xb11111=0x1F。 使用2lane,0b111 = 0x03
0x1F
0x4320 // 同上
0
// 镜头等参数配置,根据规格书填写
3.47
2.2
1.9
63.84
47.88
0.1
前摄(GC5025) xml配置文件
2
gc5025
ces6301
gc5025_chromatix
1
FRONT
270
1
0x7
0x4320
0
1.98
2.4
1.2
68.0
51.0
0.1
景深(兼容OV5670/GC5025 ) xml 配置:
景深 (OV5670) xml 配置:
1
ov5670
ov5670_chromatix
1
BACK_AUX
270
1
0x7
0x4320
0
1.98
2.4
1.2
68.0
51.0
0.1
景深(GC5025) xml 配置
1
gc5025
dw9714
gc5025_chromatix
1
BACK_AUX
270
1
0x7
0x4320
0
1.98
2.4
1.2
68.0
51.0
0.1
平台配置文件中,配置了几个camera就有几个效果配置文件。
主摄:imx258_bear_chromatix.xml
前摄:gc5025_chromatix.xml
景深:gc5025_chromatix.xml(和前摄共用) 、ov5670_chromatix.xml
imx258_bear_chromatix // 效果配置文件名
上面提到的这个属性,就是对应的效果文件名,包含了不同效果模式的配置。
效果配置文件路径:vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\configs\ imx258_bear_chromatix.xml
内容如下:
// 预览、拍照、录像使用的基本的配置
imx258_bear_common
imx258_bear_postproc
imx258_bear_cpp_preview
imx258_bear_cpp_snapshot
imx258_bear_cpp_liveshot
imx258_bear_snapshot
imx258_bear_snapshot
imx258_bear_default_video
imx258_bear_cpp_video
imx258_bear_zsl_preview_lc898217xc
imx258_bear_zsl_video_lc898217xc
如上每一种index,都是一种不同显示模式需要的参数搭配,包含了不同帧率、不同分辨率的配置类型。
imx258_bear_common
imx258_bear_postproc
imx258_bear_cpp_preview
imx258_bear_cpp_snapshot
每一个库,都可以在效果路径下找到对应的Android.mk。
在 device-vendor.mk 配置文件中
路径:vendor\qcom\proprietary\common\config\ device-vendor.mk
// 注意,有做项目抽取的,要到对应目录修改同名文件
主要有两类文件:
libmmcamera_xxx.so 是lib驱动的库
libchromatix_xx.so 是效果驱动的库
1、 lib 库包含
MM_CAMERA += libchromatix_imx258_common
2、 chromatix库包含
MM_CAMERA += libchromatix_imx258_bear_common
MM_CAMERA += libchromatix_imx258_bear_cpp_hfr_60
MM_CAMERA += libchromatix_imx258_bear_cpp_hfr_90
MM_CAMERA += libchromatix_imx258_bear_cpp_hfr_120
MM_CAMERA += libchromatix_imx258_bear_cpp_liveshot
MM_CAMERA += libchromatix_imx258_bear_cpp_preview
MM_CAMERA += libchromatix_imx258_bear_cpp_snapshot
MM_CAMERA += libchromatix_imx258_bear_cpp_video
MM_CAMERA += libchromatix_imx258_bear_cpp_video_4k
MM_CAMERA += libchromatix_imx258_bear_default_video
MM_CAMERA += libchromatix_imx258_bear_hfr_60
MM_CAMERA += libchromatix_imx258_bear_hfr_90
MM_CAMERA += libchromatix_imx258_bear_hfr_120
MM_CAMERA += libchromatix_imx258_bear_liveshot
MM_CAMERA += libchromatix_imx258_bear_postproc
MM_CAMERA += libchromatix_imx258_bear_preview
MM_CAMERA += libchromatix_imx258_bear_snapshot
MM_CAMERA += libchromatix_imx258_bear_video_4k
MM_CAMERA += libchromatix_imx258_bear_4k_preview_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_4k_video_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_default_preview_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_default_video_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_hfr_60_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_hfr_90_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_hfr_120_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_zsl_preview_lc898217xc
MM_CAMERA += libchromatix_imx258_bear_zsl_video_lc898217xc
3、charomatix 配置文件包含
MM_CAMERA += imx258_bear_chromatix.xml
上述这些库和chromatix配置文件的包含配置必须写到 device-vendor.mk 中。
4、 前摄、景深和主摄的添加流程一致。
根据不同的sensor规格,有的需要的是24MHz的mclk时钟,有的则是37.125、75.25MHz的时钟等等。
但平台配置的是默认24MHz输出。
那么改如何修改呢?
参考文档:
kba-170619002148_3_[camera]change_to_avoid_camera_mclk_jitter_issue.pdf
kba-170619002148_3_[camera]change_to_avoid_camera_mclk_jitter_issue.pdf
有时由于MCLK抖动问题(抖动太大),我们可能会在摄像机预览中在黑暗场景中看到线噪声,因此需要解决此类问题,如果从传感器侧调整PLL仍无法解决问题,
我们需要使用 xo时钟作为产生MCLK(更好的抖动)的源。
路径:kernel\msm-4.9\arch\arm64\boot\dts\xxx\xxx_msm8953-camera-sensor-qrd.dtsi
修改为37.125MHz示例:
status = "ok";
clocks = <&clock_gcc clk_mclk0_clk_src>,
<&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";
// qcom,clock-rates = <24000000 0>;
qcom,clock-rates = <37125000 0>;
};
2. Kernel clk src部分
路径: kernel\msm-4.9\drivers\clk\msm\clock-gcc-8953.c
修改方法,前摄37.125例:
static struct clk_freq_tbl ftbl_mclk1_clk_src[] = {
F( 24000000, gpll6_main_div2, 1, 2, 45),
F( 33330000, gpll0_main_div2, 12, 0, 0 ),
F( 36610000, gpll6, 1, 2, 59),
+ F( 37200000, gpll0, 1, 2, 43), // set 37.125 Mhz
F( 66667000, gpll0, 12, 0, 0 ),
F_END
};
主摄修改:
主摄修改:
static struct clk_freq_tbl ftbl_mclk0_clk_src[] = {
F( 24000000, gpll6_main_div2, 1, 2, 45),
F( 33330000, gpll0_main_div2, 12, 0, 0 ),
F( 36610000, gpll6, 1, 2, 59),
+ F( 37200000, gpll0, 1, 2, 43), // set 37.125 Mhz
F( 66667000, gpll0, 12, 0, 0 ),
F_END
};
3. Vendor Camera lib文件修改
路径:vendor\qcom\proprietary\mm-camera\mm-camera2\media-controller\modules\sensors\sensor\libs\xxx\xxx_lib.h
修改方法:
.seq_type = CAMERA_POW_SEQ_CLK,
.seq_val = CAMERA_MCLK,
// .config_val = 24000000,
.config_val = 37200000,
.delay = 20,
参考文档:KBA_170619001341_3__Camera_How_to_change_MCLK_driv.pdf
修改方式:
/*sensors */
cam_sensor_mclk0_default: cam_sensor_mclk0_default {
/* MCLK0 */
mux {
/* CLK, DATA */
pins = "gpio26";
function = "cam_mclk";
};
config {
pins = "gpio26";
bias-disable; /* No PULL */
// 2 mA, change to 4mA, 2, 4, 6, 8, 10… max is 16mA
// 默认2ma,最大可修改为16ma
drive-strength = <2>; /* 2 MA */
};
};
版本需要是debug 版本,需要root和remount
@echo on
adb root
adb remount
adb push out\target\product\M11\vendor\lib\libmmcamera_imx307.so /vendor/lib/
adb push out\target\product\M11\vendor\lib\libmmcamera_imx307_face.so /vendor/lib/
adb sync
adb reboot
效果so库的单刷验证同上。