Skip to content

移植-Camera

以 IMX577 为例,说明 Camera Sensor 的完整移植流程。

1. 设备树配置

  • 供电相关,默认不需要修改。如供电与参考设计有区别,需修改:
src/vendor/qcom/proprietary/camera-devicetree/kalama-camera-sensor-rb5gen2-evt.dtsi
  • 参数详细描述可参考 src/vendor/qcom/proprietary/camera-devicetree/bindings/msm-cam-cci.txt
&cam_cci0 {                                             // 对应的硬件 cci0
    /* CAM 0 IMX577 */
    qcom,cam-sensor0 {
        cell-index = <0>;                               // camera 在内核设备树中的 ID
        compatible = "qcom,cam-sensor";
        csiphy-sd-index = <1>;                          // 对应的 CSI 物理 ID,此处相当于使用 CSI1
        sensor-position-roll = <0>;
        sensor-position-pitch = <0>;
        sensor-position-yaw = <0>;
        cam_clk-supply = <&cam_cc_titan_top_gdsc>;
        regulator-names = "cam_clk";
        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_mclk1_active
                 &cam_sensor_active_enble1>;
        pinctrl-1 = <&cam_sensor_mclk1_suspend
                 &cam_sensor_suspend_enble1>;
        gpios = <&tlmm 101 0>,                          // 自定义 GPIO 配置,可用于 driver 做 sensor 的 power 操作
            <&tlmm 7 0>,
            <&tlmm 117 0>;
        gpio-custom1 = <1>;
        gpio-custom2 = <2>;
        gpio-req-tbl-num = <0 1 2>;
        gpio-req-tbl-flags = <1 0 0>;
        gpio-req-tbl-label = "CAMIF_MCLK1",
                    "CAM_CUSTOM1",
                    "CAM_CUSTOM2";
        cci-master = <CCI_MASTER_0>;
        status = "ok";
        clocks = <&camcc CAM_CC_MCLK1_CLK>;
        clock-names = "cam_clk";
        clock-cntl-level = "nominal";
        clock-rates = <24000000>;                       // MCLK 频率设置
    };
};

2. Camera List 配置

src/vendor/qcom/proprietary/chi-cdk/oem/qcom/multicamera/chimcxcameraconfig/configs/kailua/kailua_dualcamera.xml
xml
<PhysicalDevice name="WidePhysicalCam0" slotId="0" cameraId="0" sensorName="aidlux_imx577_cam0"/>

提醒

  • slotId 必须与 aidlux_imx577_cam0_module.xml 中的 cameraId 和 dtsi 中的 cell-index 保持一致。
  • cameraId 定义了逻辑相机 ID 分配给相机传感器的顺序
src/vendor/qcom/proprietary/chi-cdk/oem/qcom/module/aidlux_imx577_cam0_module.xml

3. Camera 驱动代码

上电时序、I2C 参数、初始化参数等:

src/vendor/qcom/proprietary/chi-cdk/oem/qcom/sensor/aidlux_imx577_cam0/aidlux_imx577_cam0_sensor.xml

固定的接口和格式,照着修改即可:

src/vendor/qcom/proprietary/chi-cdk/oem/qcom/sensor/aidlux_imx577_cam0/aidlux_imx577_cam0_sensor.cpp

4. Sensor Tuning 工程

src/vendor/qcom/proprietary/chi-cdk/oem/qcom/tuning/sm8550_aidlux_imx577/Scenario.Default/XML/BPS/bgtm10_bps_v2.xml

5. 编译配置

src/vendor/qcom/proprietary/camx/build/infrastructure/linuxembedded/CMakeLists.txt
src/vendor/qcom/proprietary/chi-cdk/oem/qcom/buildbins/build/linuxembedded/binary_kalama/com.qti.sensormodule.aidlux_imx577_cam0.cmake
src/vendor/qcom/proprietary/chi-cdk/oem/qcom/buildbins/buildbins.cmake

6. 启动 Camera

bash
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! fakesink

调试总结

  1. 先确定硬件连接:设备树中的配置必须与硬件连接一致。
  2. 参考相近型号:找一个型号接近的 sensor,复制其代码和配置,修改为上电和初始化参数即可。例如要调试 IMX586 但系统中无对应代码,复制 IMX577 的代码,再将参数修改为实际配置即可。