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是开发者主要的工作区域,需要根据实际硬件原理图调整管脚与电源配置。
Camera设备树层级架构 SoC级 .dtsi IP核寄存器基址 中断号 / 时钟ID 平台级 .dtsi CSI/PHY Lane映射 电源域 GDSC 板级 .dts Sensor节点 GPIO / I2C / 上电时序 设备树覆盖规则 • 板级.dts 中的属性会覆盖平台级.dtsi 中的同名属性 • 平台级.dtsi 中的 &cam_cc 引用用于添加子节点或修改状态 • 电源域配置必须在板级.dts 中显式声明 regulator 关联

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>。
CSI/CSID数据流与设备树配置关联 Sensor MIPI CSI-2 CSI PHY lane-mapping CSID DPHY/CPHY ISP 图像处理 设备树配置关联 • CSI PHY 节点通过 csi-phy 属性被 CSID 引用 • CSID 的 supports-cphy 属性决定解包模式 • 所有时钟与电源必须在对应节点中显式声明

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 设备树配置验证流程

完成设备树编写后,需经过以下步骤验证配置的正确性:

  1. 编译检查:使用make dtbs编译设备树,检查语法错误。
  2. 反编译验证:使用dtc -I dtb -O dts反编译生成的.dtb文件,确认节点属性正确。
  3. 内核日志检查:启动后通过dmesg | grep camera查看驱动加载日志,确认无probe失败。
  4. 电源域状态检查:通过cat /sys/kernel/debug/pm_genpd/pm_genpd_summary确认GDSC状态为"on"。
  5. 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设备树中定义。
设备树配置验证流程 编译检查 make dtbs 反编译验证 dtc -I dtb -O dts 内核日志 dmesg | grep camera 电源域检查 pm_genpd_summary CSI测试 cam_test 失败处理策略 • 编译错误:检查节点语法、属性名称拼写 • Probe失败:检查电源域phandle、regulator定义 • 无中断:检查lane-mapping、时钟频率配置 失败回退

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:*"。