提示:高通平台 qcom camera dtsi
目录
前言
本文介绍camera dtsi配置相关内容。
参考平台:qcom sdm660
一、CCI介绍
高通平台camera 也是一个I2C设备,但其封装了一个相机控制接口,成为CCI(Camera Control Interface)。
CCI与I2C基本一致,是一个双线、双向、半双工、串行接口。
CCI可支持的clk速率(Hz)有四种:100K 400K 定制 和1M
一般高通平台一路CCI会配置两组I2C 可通过cci-master<0/1>选择不同的I2C。例如:sdm660-camera.dtsi
gpios = <&tlmm 36 0>,<&tlmm 37 0>,<&tlmm 38 0>,<&tlmm 39 0>;
有时我们可以根据硬件原理图上的camera i2c 对应的gpio号,找到平台代码上对应的CCI,添加调试的camera的硬件信息配置。
cci: qcom,cci@ca0c000 {
cell-index = <0>;
compatible = "qcom,cci";
reg = <0xca0c000 0x4000>;
#address-cells = <1>;
#size-cells = <0>;
reg-names = "cci";
interrupts = <0 295 0>;
interrupt-names = "cci";
status = "ok";
mmagic-supply = <&gdsc_bimc_smmu>;
gdscr-supply = <&gdsc_camss_top>;
qcom,cam-vreg-name = "mmagic", "gdscr";
clocks = <&clock_rpmcc RPM_SMD_MMSSNOC_AXI_CLK>,
<&clock_mmss MMSS_MNOC_AHB_CLK>,
<&clock_mmss MMSS_BIMC_SMMU_AHB_CLK>,
<&clock_mmss MMSS_BIMC_SMMU_AXI_CLK>,
<&clock_mmss MMSS_CAMSS_AHB_CLK>,
<&clock_mmss MMSS_CAMSS_TOP_AHB_CLK>,
<&clock_mmss CCI_CLK_SRC>,
<&clock_mmss MMSS_CAMSS_CCI_AHB_CLK>,
<&clock_mmss MMSS_CAMSS_CCI_CLK>;
clock-names = "mmssnoc_axi", "mnoc_ahb", "smmu_ahb", "smmu_axi",
"camss_ahb_clk", "camss_top_ahb_clk",
"cci_src_clk", "cci_ahb_clk", "camss_cci_clk";
qcom,clock-rates = <0 0 0 0 0 0 19200000 0 0>,
<0 0 0 0 0 0 37500000 0 0>;
pinctrl-names = "cci_default", "cci_suspend";
pinctrl-0 = <&cci0_active &cci1_active>;
pinctrl-1 = <&cci0_suspend &cci1_suspend>;
gpios = <&tlmm 36 0>,
<&tlmm 37 0>,
<&tlmm 38 0>,
<&tlmm 39 0>;
qcom,gpio-tbl-num = <0 1 2 3>;
qcom,gpio-tbl-flags = <1 1 1 1>;
qcom,gpio-tbl-label = "CCI_I2C_DATA0",
"CCI_I2C_CLK0",
"CCI_I2C_DATA1",
"CCI_I2C_CLK1";
i2c_freq_100Khz: qcom,i2c_standard_mode {
status = "disabled";
};
i2c_freq_400Khz: qcom,i2c_fast_mode {
status = "disabled";
};
i2c_freq_custom: qcom,i2c_custom_mode {
status = "disabled";
};
i2c_freq_1Mhz: qcom,i2c_fast_plus_mode {
status = "disabled";
};
};
二、CAMERA DTSI
1.AF 部分
如下(示例):sdm660-camera-sensor-qrd.dtsi
&soc {//regulator/fixed.c 通常用来定义电压固定的regulator,或者定义由某个gpio开关控制的regulator
cam_vaf_gpio_regulator:cam_vaf_fixed_regulator {//AF电源配置的节点名
compatible = "regulator-fixed";//driver/regulator/fixed.c驱动probe使用
regulator-name = "cam_vaf_gpio_regulator";
regulator-min-microvolt = <2800000>;
regulator-max-microvolt = <2800000>;
enable-active-high;
gpio = <&pm660l_gpios 5 0>;//使用pmic芯片的gpio5来使能该电源
pinctrl-names = "default";
pinctrl-0 = <&cam_sensor_eldo5_default>;
vin-supply = <&pm660l_bob>;
};
}
&cci {
actuator0: qcom,actuator@0 {//一般@0对应camera sensor index 0
cell-index = <0>;//也对应vendor下sensor xml配置中的sensor ID 0,表示是sensor id0的AF
reg = <0x0>;
compatible = "qcom,actuator";//用于平台msm_actuator.c驱动probe匹配
qcom,cci-master = <0>;//使用CCI master 0也就是上述提到的CCI_I2C_DATA0和CCI_I2C_CLK0
cam_vaf-supply = <&cam_vaf_gpio_regulator>;//AF的电源配置,使用regulator-fixed
qcom,cam-vreg-name = "cam_vaf";
qcom,cam-vreg-min-voltage = <2800000>;
qcom,cam-vreg-max-voltage = <2800000>;
qcom,cam-vreg-op-mode = <0>;
};
};
2.SENSOR部分
如下(示例):sdm660-camera-sensor-qrd.dtsi
&cci {
qcom,camera@0 {
cell-index = <0>;//对应snesor ID 0
compatible = "qcom,camera";//msm_sensor_driver.c probe匹配
reg = <0x0>;
qcom,csiphy-sd-index = <0>;//选择cphy0,对应/dev/subdev*中的第0路csi
qcom,csid-sd-index = <0>;//同上也对应原理图中的csi0
qcom,mount-angle = <90>;//sensor的摆放角度,与出图方向有关
qcom,led-flash-src = <&led_flash0>;//闪光灯配置
qcom,actuator-src = <&actuator0>;//AF配置
//qcom,ois-src = <&ois0>;//光学防抖
//qcom,eeprom-src = <&eeprom0>;//otp
cam_vio-supply = <&pm660_l11>;//IOVDD 1.8v
cam_vana-supply = <&cam_avdd_gpio_regulator>;//AVDD 2.8V
cam_vdig-supply = <&cam_rear_dvdd_gpio_regulator>;//DVDD 1~1.2V
cam_vaf-supply = <&cam_vaf_gpio_regulator>;//AF供电2.8V
qcom,cam-vreg-name = "cam_vio", "cam_vana", "cam_vdig","cam_vaf";
qcom,cam-vreg-min-voltage = <1780000 0 0 2800000>;
qcom,cam-vreg-max-voltage = <1950000 0 0 2800000>;
qcom,cam-vreg-op-mode = <105000 0 0 100000>;
qcom,gpio-no-mux = <0>;
pinctrl-names = "cam_default", "cam_suspend";
pinctrl-0 = <&cam_sensor_mclk0_active
&cam_sensor_rear_active>;
pinctrl-1 = <&cam_sensor_mclk0_suspend
&cam_sensor_rear_suspend>;
gpios = <&tlmm 32 0>,
<&tlmm 47 0>;
qcom,gpio-reset = <1>;//reset gpio 47
qcom,gpio-req-tbl-num = <0 1>;
qcom,gpio-req-tbl-flags = <1 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK0",
"CAM_RESET0";//这里可配置自定义gpio,在gpios中添加即可
qcom,sensor-position = <0>;//区分前后摄
qcom,sensor-mode = <0>;//区分前后摄
qcom,cci-master = <0>;//选择CCI MASTER 0
status = "ok";
clocks = <&clock_mmss MCLK0_CLK_SRC>,
<&clock_mmss MMSS_CAMSS_MCLK0_CLK>;
clock-names = "cam_src_clk", "cam_clk";
qcom,clock-rates = <24000000 0>;//与要求的MCLK速率一致
};
};
3.OTP部分
与SENSOR部分基本一致,跳过
4.FLASH部分
如下(示例):sdm660-camera-sensor-qrd.dtsi
&soc {//使用的是pmic芯片驱动的led闪光灯
led_flash0: qcom,camera-flash@0 {
cell-index = <0>;//与sensor ID 0一致
compatible = "qcom,camera-flash";//msm flash驱动probe使用
qcom,flash-source = <&pm660l_flash0 &pm660l_flash1>;//闪光灯的pmic电源配置节点
qcom,torch-source = <&pm660l_torch0 &pm660l_torch1>;//手电筒模式
qcom,switch-source = <&pm660l_switch0>;
status = "ok";
};
};
如下(示例):pm660l.dtsi
关于pmic led的相关部分,后续补充。 pmic flash的电流,持续时间,还有电压相关的可在此改动
pm660l_3: qcom,pm660l@3 {
compatible ="qcom,spmi-pmic";
reg = <0x3 SPMI_USID>;
#address-cells = <2>;
#size-cells = <0>;
flash_led: qcom,leds@d300 {
compatible = "qcom,qpnp-flash-led-v2";
reg = <0xd300 0x100>;
label = "flash";
... ...
pm660l_flash0: qcom,flash_0 {
... ...
};
... ...
};
};
5.MIPI部分
如下(示例):sdm660-camera.dtsi
省略的都是clk相关的配置。
可以看出这个平台有3个csiphy模块,和4个csid模块。注:csi(camera serial interface)
CSIPHY:处理mipi接收器的物理层,每个CSIPHY模块都可以连接一个单独的摄像头传感器。连接的具体sensorID主要看cell-index的值。
CSID:处理MIPI接收器的协议和应用层。每个CSID都可以解码来自任何CSIPHY的数据流。通过对应的cell-index的值配置具体的camera sensor。
&soc {
qcom,csiphy@c824000 {
cell-index = <0>;
compatible = "qcom,csiphy-v3.5", "qcom,csiphy";
reg = <0xc824000 0x1000>,
<0xca00120 0x4>;
reg-names = "csiphy", "csiphy_clk_mux";
... ...
status = "ok";
};
qcom,csiphy@c825000 {
cell-index = <1>;
compatible = "qcom,csiphy-v3.5", "qcom,csiphy";
reg = <0xc825000 0x1000>,
<0xca00124 0x4>;
reg-names = "csiphy", "csiphy_clk_mux";
... ...
status = "ok";
};
qcom,csiphy@c826000 {
cell-index = <2>;
compatible = "qcom,csiphy-v3.5", "qcom,csiphy";
reg = <0xc826000 0x1000>,
<0xca00128 0x4>;
reg-names = "csiphy", "csiphy_clk_mux";
... ...
status = "ok";
};
qcom,csid@ca30000 {
cell-index = <0>;
compatible = "qcom,csid-v5.0", "qcom,csid";
reg = <0xca30000 0x400>;
reg-names = "csid";
... ...
status = "ok";
};
qcom,csid@ca30400 {
cell-index = <1>;
compatible = "qcom,csid-v5.0", "qcom,csid";
reg = <0xca30400 0x400>;
reg-names = "csid";
... ...
status = "ok";
};
qcom,csid@ca30800 {
cell-index = <2>;
compatible = "qcom,csid-v5.0", "qcom,csid";
reg = <0xca30800 0x400>;
reg-names = "csid";
... ...
status = "ok";
};
qcom,csid@ca30c00 {
cell-index = <3>;
compatible = "qcom,csid-v5.0", "qcom,csid";
reg = <0xca30c00 0x400>;
reg-names = "csid";
... ...
status = "ok";
};
};
6.ISP VFE JPEG部分
暂时没太关注,后续接触到会补充
总结
整个camera模块的dtsi配置主要集中在两个文件中
一个是sdm660-camera-sensor-xxx.dtsi,比较偏向于具体器件的配置,比如AF,flash,sensor,OTP等
另一个是sdm660-camera.dtsi,主要在于CAMERA平台相关的模块配置,像CSID, ISP, CCI, csiphy等
平时驱动修改最多的集中于器件这块