4. Camera设备树配置:编写与修改高通平台Camera设备树(dtsi/dts)
在高通Camera子系统移植中,设备树(Device Tree)是连接硬件与驱动软件的核心桥梁。本章将深入讲解如何编写与修改高通平台的Camera设备树节点,涵盖CSI、CSID、PHY、ISP及电源域的配置方法。正确的设备树配置是确保Camera链路正常枚举、流控稳定、图像质量达标的前提。
核心原则:高通Camera设备树配置遵循“分层描述、逐级引用”的规则。主控芯片的.dtsi文件定义IP核的通用资源与中断,板级.dts文件则负责管脚复用、电源分配与时钟频率的定制化配置。
4.1 高通Camera设备树层级架构
高通平台Camera设备树通常由以下层级组成,每一层负责不同粒度的硬件描述:
| 层级 | 文件类型 | 描述内容 | 示例 |
|---|---|---|---|
| SoC级 | .dtsi | 定义Camera IP核(ISP、CSID、CCI等)的寄存器基址、中断号、时钟ID | sm8550-camera.dtsi |
| 平台级 | .dtsi | 定义CSI/PHY的lane映射、电源域(GDSC)关联、总线带宽 | sm8550.dtsi |
| 板级 | .dts | 定义具体sensor节点、上电时序、复位GPIO、I2C地址、时钟频率 | sm8550-mtp.dts |
移植要点:在移植过程中,SoC级.dtsi通常由芯片厂商提供,无需修改;板级.dts是开发者主要的工作区域,需要根据实际硬件原理图调整管脚与电源配置。
4.2 CSI与CSID节点配置
CSI(Camera Serial Interface)和CSID(CSI Decoder)是Camera数据接收的前端模块。设备树中需要配置lane映射、时钟源以及中断关联。
4.2.1 CSI PHY节点配置
CSI PHY负责物理层的串行数据接收与时钟恢复。关键属性包括:
- lane-mapping:定义物理lane到逻辑lane的映射关系,通常为数组形式。
- clocks:引用CSI PHY的参考时钟,通常为XO或PLL输出。
- vdda-supply:PHY模拟电源,通常为1.2V或1.8V。
/* 示例:sm8550.dtsi 中 CSI PHY 节点 */
&cam_cci0 {
csi_phy0: qcom,csi-phy@0 {
cell-index = <0>;
reg = <0x0 0x0ac4a000 0x0 0x1000>;
reg-names = "csiphy";
#address-cells = <2>;
#size-cells = <2>;
ranges;
clocks = <&camcc CAM_CC_CSIPHY0_CLK>,
<&camcc CAM_CC_CSIPHY0_CPHY_RX_CLK>;
clock-names = "csiphy", "csiphy_cphy_rx";
vdda-supply = <&pm8550_l5>;
/* Lane 映射:物理 lane 0-3 映射到逻辑 lane 0-3 */
lane-mapping = <0 1 2 3>;
};
};
4.2.2 CSID节点配置
CSID负责将CSI-2协议数据解包为ISP可识别的格式。配置时需指定接口类型(DPHY/CPHY)以及中断号。
/* 示例:sm8550.dtsi 中 CSID 节点 */
&cam_cci0 {
csid0: qcom,csid@0 {
cell-index = <0>;
reg = <0x0 0x0acb3000 0x0 0x1000>;
reg-names = "csid";
interrupts = <GIC_SPI 464 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "csid";
clocks = <&camcc CAM_CC_CSID_CLK>,
<&camcc CAM_CC_CSIPHY0_CLK>;
clock-names = "csid", "csiphy";
/* 支持 DPHY 与 CPHY 模式 */
csi-phy = <&csi_phy0>;
supports-cphy;
};
};
常见错误:lane-mapping配置错误会导致图像错位或无法同步。务必对照原理图确认物理lane序号,例如Sensor输出lane0连接SoC的CSI PHY lane2,则lane-mapping应为<2 1 0 3>。
4.3 ISP与电源域配置
ISP(Image Signal Processor)节点配置涉及时钟频率、总线带宽以及电源域(GDSC)的使能。高通平台使用power-domains属性关联ISP的电源域。
4.3.1 ISP节点配置
/* 示例:sm8550.dtsi 中 ISP 节点 */
&cam_isp {
cell-index = <0>;
reg = <0x0 0x0acb0000 0x0 0x10000>;
reg-names = "isp";
interrupts = <GIC_SPI 465 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "isp";
clocks = <&camcc CAM_CC_ISP_CLK>,
<&camcc CAM_CC_ISP_AHB_CLK>;
clock-names = "isp", "isp_ahb";
/* 关联电源域 */
power-domains = <&camcc CAM_CC_ISP_GDSC>;
/* 总线带宽配置 */
interconnects = <&gem_noc MASTER_AMPSS_M0 &config_noc SLAVE_CAMERA>;
interconnect-names = "camera";
};
4.3.2 电源域配置
电源域(GDSC)在设备树中通过power-domains属性引用。板级.dts中需要确保对应的regulator在Camera上电前被正确使能。
/* 示例:板级.dts 中 Camera 电源域配置 */
&cam_cci0 {
/* 引用 PMIC 的 LDO 输出 */
vdd-cam-io-supply = <&pm8550_l6>; /* 1.8V IO 电源 */
vdd-cam-a2-supply = <&pm8550_l7>; /* 1.2V 模拟电源 */
vdd-cam-dig-supply = <&pm8550_s1>; /* 0.9V 数字电源 */
/* 上电时序控制 */
gpios = <&tlmm 105 GPIO_ACTIVE_HIGH>; /* MCLK 使能 */
gpio-reset = <&tlmm 106 GPIO_ACTIVE_HIGH>; /* Sensor 复位 */
};
性能验证要点:配置完成后,通过
cat /sys/kernel/debug/regulator/regulator_summary检查电源域状态;通过cat /sys/kernel/debug/clk/cam_cc_summary确认时钟频率是否与设备树配置一致。
4.4 设备树配置验证流程
完成设备树编写后,需经过以下步骤验证配置的正确性:
- 编译检查:使用
make dtbs编译设备树,检查语法错误。 - 反编译验证:使用
dtc -I dtb -O dts反编译生成的.dtb文件,确认节点属性正确。 - 内核日志检查:启动后通过
dmesg | grep camera查看驱动加载日志,确认无probe失败。 - 电源域状态检查:通过
cat /sys/kernel/debug/pm_genpd/pm_genpd_summary确认GDSC状态为"on"。 - CSI链路测试:使用高通工具
cam_test发送简单的stream on/off命令,检查中断计数是否增长。
| 验证项 | 命令/方法 | 预期结果 |
|---|---|---|
| 设备树编译 | make dtbs |
无错误输出,生成.dtb文件 |
| 驱动加载 | dmesg | grep "cam_probe" |
显示"cam_probe: probe success" |
| 电源域使能 | cat /sys/kernel/debug/pm_genpd/pm_genpd_summary |
cam_isp_gdsc 状态为 "on" |
| CSI中断 | cat /proc/interrupts | grep csid |
中断计数在stream on后增加 |
避坑指南:如果设备树中电源域引用错误,驱动probe时会出现
-EPROBE_DEFER错误。此时应检查power-domains属性中的phandle是否正确指向GDSC节点,以及对应的regulator是否在PMIC设备树中定义。
4.5 常见问题与调试技巧
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 驱动probe返回-EPROBE_DEFER | 电源域或时钟未就绪 | 检查power-domains和clocks属性中的phandle |
| 图像数据错位 | lane-mapping配置错误 | 对照原理图修正lane映射数组 |
| CSI无中断 | PHY时钟未使能或频率错误 | 检查clock-frequency属性,确保与Sensor匹配 |
| ISP无法启动 | GDSC电源域未使能 | 通过regulator强制上电,检查PMIC配置 |
调试利器:使用
trace-cmd跟踪Camera驱动的probe流程,可以精确定位设备树解析失败的位置。命令示例:trace-cmd record -e "camera:*" -e "regulator:*"。