移植-Camera 移植
本文档以 IMX577 为例,介绍在 Rhino Pi A1R(QCS6490 平台)上移植 Camera Sensor 的流程,涵盖硬件配置、设备树修改以及 Driver 的编译与配置。
1. 硬件配置
Camera 移植涉及的硬件接口主要包括三部分:
- 电源控制(GPIO):控制 Sensor 的上电与复位
- I2C(CCI):Camera 专用 I2C 总线,用于读写 Sensor 寄存器
- CSI:MIPI CSI 接口,用于传输图像数据
1.1 设备树配置
设备树修改主要针对根硬件绑定:如果硬件没有改动,后续调试其它 Sensor 则无需修改。一个硬件接口配置一个 Sensor,例如有 2 个 CSI 硬件接口,则需要配置两个 Sensor config。以下以配置 1 个 IMX577 为例:
dts
&cam_cci0 { // cci bus 0
/* CAM 0 IMX577 */
cam_slot0: qcom,cam-sensor0 {
cell-index = <0>; // 这个 ID 不能重复,用来 camx module 部分的 cameraId 和内核中的设备对应
compatible = "qcom,cam-sensor";
csiphy-sd-index = <1>; // csi 的 ID,这里对应的是 csi2 的硬件接口
sensor-position-roll = <0>;
sensor-position-pitch = <0>;
sensor-position-yaw = <0>;
power-domains = <&camcc CAM_CC_TITAN_TOP_GDSC>;
cam_vio-supply = <&vreg_l18b_1p8>;
regulator-names = "cam_vio";
rgltr-cntrl-support;
rgltr-min-voltage = <0>;
rgltr-max-voltage = <0>;
rgltr-load-current = <0>;
gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_active_rst1>; // camera reset 脚配置
pinctrl-1 = <&cam_sensor_suspend_rst1>;
gpios = <&tlmm 94 0>, <&tlmm 21 0>;
gpio-custom1 = <0>;
gpio-custom2 = <1>;
gpio-req-tbl-num = <0 1>;
gpio-req-tbl-flags = <0 0>;
gpio-req-tbl-label = "CAM_CUSTOM1", "CAM_CUSTOM2";
cci-master = <CCI_MASTER_0>; // 每一路 CCI controller 都有 2 个 masters (0,1),这里对应的是 CCI bus:0 Master:0
status = "ok";
clocks = <&camcc CAM_CC_MCLK1_CLK>; // MCLK
clock-names = "cam_clk";
clock-cntl-level = "nominal";
clock-rates = <24000000>; // MCLK 频率
};
};CCI 对应关系:每一路 CCI controller 都有 2 个 masters(0, 1),可通过下面对应关系确定(后续依次类推):
| CCI | CCI bus | Master |
|---|---|---|
cci0 | 0 | 0 |
cci1 | 0 | 1 |
cci2 | 1 | 0 |
cci3 | 1 | 1 |
cci4 | 2 | 0 |
2. Driver 部分
2.1 编译部分
在 chi-cdk-kt 的 CMakeLists.txt 中添加 Sensor 编译子目录:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/CMakeLists.txtcmake
add_subdirectory (${CAMX_CHICDK_SENSOR_PATH}/sensor/cmk_imx577/build/linuxembedded ${CAMX_OUT_PATH}/sensor/cmk_imx577)添加 XML 编译配置:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/buildbins/build/linuxembedded/binary_yupik/com.qti.sensormodule.cmk_imx577_cam1.cmake2.2 映射
在 socid_sensorbin_map.xml 中添加 SOC 与 Sensor bin 的映射:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/module/socid_sensorbin_map.xmlxml
<socIdInfo>
<!--SOC ID or list of SOC Ids comma seperated-->
<socId>QCM6490</socId>
<binName>cmk_imx577_cam1</binName>
</socIdInfo>在 kodiak_dc.xml 中添加 Probe 的 list:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/multicamera/chimcxcameraconfig/configs/kodiak/kodiak_dc.xmlxml
<PhysicalDevice name="RearPhysicalCam0" slotId="0" cameraId="0" sensorName="cmk_imx577"/>2.3 Module 配置
配置文件:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/module/cmk_imx577_module_cam1.xmlxml
<cameraId>0</cameraId><cameraId>:这里的 ID 要和 DTS 中对应硬件配置的cell-index保持一致。<chromatixName>kodiak_cmk_imx577</chromatixName>:配置 tuning(ISP)效果部分;没有的话可以直接 copy 一份其它的修改。
2.4 Sensor 配置
Sensor 配置文件目录:
text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/sensor/cmk_imx577cmk_imx577_sensor.cpp:照着其它的 Sensor 参考改下名字即可。
cmk_imx577_sensor.xml 关键配置项:
xml
<slaveAddress>0x34</slaveAddress>
<sensorIdRegAddr>0x0016</sensorIdRegAddr>
<sensorId>0x0577</sensorId>
<colorFilterArrangement>BAYER_RGGB</colorFilterArrangement>
<dt>43</dt>
<is3Phase>0</is3Phase>| 配置项 | 值 | 说明 |
|---|---|---|
<slaveAddress> | 0x34 | 8bit I2C 地址 |
<sensorIdRegAddr> | 0x0016 | Sensor ID 寄存器 |
<sensorId> | 0x0577 | Sensor ID |
powerUpSequence | — | 上电相关配置,configType 和 Kernel DTS 中的 GPIO 配置对应 |
<colorFilterArrangement> | BAYER_RGGB | 实际的颜色格式 |
<dt> | 43 | 数据类型 |
<is3Phase> | 0 | 如果是 C-phy 摄像头,此值需配置成 1 |