Camera Porting
This document uses the IMX577 as an example to describe the process of porting a Camera sensor on Rhino Pi A1R (QCS6490 platform), covering hardware configuration, device tree modifications, and driver compilation and configuration.
1. Hardware Configuration
The hardware interfaces involved in Camera porting mainly include three parts:
- Power control (GPIO): Controls sensor power-on and reset
- I2C (CCI): The camera-dedicated I2C bus, used to read and write sensor registers
- CSI: The MIPI CSI interface, used to transmit image data
1.1 Device Tree Configuration
Device tree modifications mainly target root hardware binding: if the hardware is unchanged, no modifications are needed when debugging other sensors later. One hardware interface is configured for one sensor; for example, if there are 2 CSI hardware interfaces, two sensor configs are required. The following uses the configuration of one IMX577 as an example:
&cam_cci0 { // cci bus 0
/* CAM 0 IMX577 */
cam_slot0: qcom,cam-sensor0 {
cell-index = <0>; // This ID must not be duplicated; it matches the cameraId in the camx module with the device in the kernel
compatible = "qcom,cam-sensor";
csiphy-sd-index = <1>; // The CSI ID, corresponding to the csi2 hardware interface here
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 pin configuration
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>; // Each CCI controller has 2 masters (0,1); this corresponds to 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 frequency
};
};CCI mapping: Each CCI controller has 2 masters (0, 1), which can be determined using the following mapping (and so on for the rest):
| CCI | CCI bus | Master |
|---|---|---|
cci0 | 0 | 0 |
cci1 | 0 | 1 |
cci2 | 1 | 0 |
cci3 | 1 | 1 |
cci4 | 2 | 0 |
2. Driver Section
2.1 Compilation
Add the sensor build subdirectory to CMakeLists.txt of chi-cdk-kt:
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/CMakeLists.txtadd_subdirectory (${CAMX_CHICDK_SENSOR_PATH}/sensor/cmk_imx577/build/linuxembedded ${CAMX_OUT_PATH}/sensor/cmk_imx577)Add the XML build configuration:
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 Mapping
Add the SOC-to-sensor-bin mapping in socid_sensorbin_map.xml:
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/module/socid_sensorbin_map.xml<socIdInfo>
<!--SOC ID or list of SOC Ids comma seperated-->
<socId>QCM6490</socId>
<binName>cmk_imx577_cam1</binName>
</socIdInfo>Add the probe list in kodiak_dc.xml:
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/multicamera/chimcxcameraconfig/configs/kodiak/kodiak_dc.xml<PhysicalDevice name="RearPhysicalCam0" slotId="0" cameraId="0" sensorName="cmk_imx577"/>2.3 Module Configuration
Configuration file:
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/module/cmk_imx577_module_cam1.xml<cameraId>0</cameraId><cameraId>: This ID must be consistent with thecell-indexof the corresponding hardware configuration in the DTS.<chromatixName>kodiak_cmk_imx577</chromatixName>: Configures the tuning (ISP) effect; if not available, copy one from another sensor and modify it.
2.4 Sensor Configuration
Sensor configuration file directory:
layers/meta-qcom-extras/recipes-multimedia/camx/files/chi-cdk-kt/oem/qcom/sensor/cmk_imx577cmk_imx577_sensor.cpp: Refer to other sensors and just change the name accordingly.
Key configuration items of cmk_imx577_sensor.xml:
<slaveAddress>0x34</slaveAddress>
<sensorIdRegAddr>0x0016</sensorIdRegAddr>
<sensorId>0x0577</sensorId>
<colorFilterArrangement>BAYER_RGGB</colorFilterArrangement>
<dt>43</dt>
<is3Phase>0</is3Phase>| Configuration item | Value | Description |
|---|---|---|
<slaveAddress> | 0x34 | 8-bit I2C address |
<sensorIdRegAddr> | 0x0016 | Sensor ID register |
<sensorId> | 0x0577 | Sensor ID |
powerUpSequence | — | Power-up related configuration; configType corresponds to the GPIO configuration in the kernel DTS |
<colorFilterArrangement> | BAYER_RGGB | Actual color format |
<dt> | 43 | Data type |
<is3Phase> | 0 | If it is a C-PHY camera, this value must be set to 1 |