Skip to content

移植-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),可通过下面对应关系确定(后续依次类推):

CCICCI busMaster
cci000
cci101
cci210
cci311
cci420

2. Driver 部分

2.1 编译部分

chi-cdk-ktCMakeLists.txt 中添加 Sensor 编译子目录:

text
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/CMakeLists.txt
cmake
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.cmake

2.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.xml
xml
<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.xml
xml
<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.xml
xml
<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_imx577
  • cmk_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>0x348bit I2C 地址
<sensorIdRegAddr>0x0016Sensor ID 寄存器
<sensorId>0x0577Sensor ID
powerUpSequence上电相关配置,configType 和 Kernel DTS 中的 GPIO 配置对应
<colorFilterArrangement>BAYER_RGGB实际的颜色格式
<dt>43数据类型
<is3Phase>0如果是 C-phy 摄像头,此值需配置成 1