3、设备树配置:SA8155显示相关设备树节点解析、DPU/HDMI/DSI接口的DTS配置实战
在高通SA8155平台上,显示与GPU驱动的初始化、时钟管理、中断绑定以及接口配置,全部依赖于设备树(Device Tree Source, DTS)的描述。本章将深入解析SA8155显示子系统相关的设备树节点结构,并手把手完成DPU(Display Processing Unit)、HDMI和DSI接口的DTS配置实战。
3.1 SA8155显示子系统设备树层级总览
SA8155的显示子系统在设备树中通常挂载在 soc 总线节点下,以 mdss(Mobile Display Subsystem)为顶层容器。其层级关系如下:
soc -> mdss -> mdss_mdp (DPU) -> mdss_dsi0/1 (DSI控制器) -> mdss_hdmi_tx (HDMI发送器)
下面的SVG图展示了SA8155显示子系统在设备树中的主要节点及其依赖关系:
3.2 DPU(mdss_mdp)节点关键属性解析
DPU节点是显示处理的核心,负责图层混合、色彩管理、显示时序生成。以下是一个典型的SA8155 DPU节点配置片段:
mdss_mdp: qcom,mdss_mdp@ae00000 {
compatible = "qcom,sdm845-mdss-mdp";
reg = <0 0x0ae00000 0 0x900000>,
<0 0x0ac90000 0 0x300>;
reg-names = "mdp_phys", "vbif_phys";
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
interrupt-controller;
#interrupt-cells = <1>;
clocks = <&gcc GCC_DISP_AHB_CLK>,
<&gcc GCC_DISP_AXI_CLK>,
<&gcc GCC_DISP_MDP_CLK>;
clock-names = "iface", "bus", "core";
power-domains = <&disp_domain>;
/* DPU 内部接口端口定义 */
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
dpu_intf0_out: endpoint {
remote-endpoint = <&dsi0_in>;
};
};
port@1 {
reg = <1>;
dpu_intf1_out: endpoint {
remote-endpoint = <&dsi1_in>;
};
};
port@2 {
reg = <2>;
dpu_intf2_out: endpoint {
remote-endpoint = <&hdmi_in>;
};
};
};
};
| 属性 | 值示例 | 说明 |
|---|---|---|
compatible | qcom,sdm845-mdss-mdp | 驱动匹配字符串,用于绑定对应的DPU驱动 |
reg | 0x0ae00000, 0x900000 | DPU寄存器基地址和大小,包含MDP和VBIF两个区域 |
interrupts | GIC_SPI 83 | DPU全局中断,用于VSYNC、错误处理等 |
clocks | iface, bus, core | 三路核心时钟:AHB接口时钟、AXI总线时钟、MDP核心时钟 |
power-domains | disp_domain | 显示电源域,控制DPU的电源状态 |
ports | port@0/1/2 | 输出端口,分别连接到DSI0、DSI1和HDMI |
reg 地址必须与芯片手册的物理地址严格一致。如果 vbif_phys 地址配置错误,会导致DPU无法访问VBIF(Virtual Bus Interface FIFO),出现图层无法提交的故障。
3.3 DSI接口DTS配置实战
DSI(Display Serial Interface)控制器负责将DPU输出的并行数据转换为串行MIPI DSI协议数据。SA8155通常包含两个DSI控制器,支持双通道或级联模式。以下是 mdss_dsi0 的完整配置示例:
mdss_dsi0: qcom,mdss_dsi@ae94000 {
compatible = "qcom,sdm845-dsi-ctrl";
reg = <0 0x0ae94000 0 0x400>;
reg-names = "dsi_ctrl";
interrupt-parent = <&mdss_mdp>;
interrupts = <4 0>;
clocks = <&gcc GCC_DISP_AHB_CLK>,
<&gcc GCC_DISP_AXI_CLK>,
<&gcc GCC_DISP_MDP_CLK>,
<&gcc GCC_DISP_DSI0_CLK>;
clock-names = "iface", "bus", "core", "core_mmss";
assigned-clocks = <&gcc GCC_DISP_DSI0_CLK>;
assigned-clock-rates = <192000000>;
phys = <&dsi0_phy>;
phy-names = "dsi";
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
dsi0_in: endpoint {
remote-endpoint = <&dpu_intf0_out>;
};
};
port@1 {
reg = <1>;
dsi0_out: endpoint {
remote-endpoint = <&panel0_in>;
data-lanes = <0 1 2 3>;
};
};
};
};
3.3.1 DSI PHY配置
DSI PHY负责MIPI D-PHY物理层信号转换,必须与DSI控制器配对配置:
dsi0_phy: qcom,dsi-phy@ae94400 {
compatible = "qcom,sdm845-dsi-phy-10nm";
reg = <0 0x0ae94400 0 0x200>,
<0 0x0ae94600 0 0x280>,
<0 0x0ae94900 0 0x180>;
reg-names = "dsi_phy", "dsi_phy_lane", "dsi_pll";
#clock-cells = <1>;
#phy-cells = <0>;
clocks = <&gcc GCC_DISP_AHB_CLK>;
clock-names = "iface";
vdda-supply = <&pm8150_l5>;
vddio-supply = <&pm8150_l12>;
};
data-lanes 属性必须与硬件走线顺序一致。如果硬件使用了4条数据通道,但配置为 <0 1 2>(3条),则屏幕无法点亮。建议在硬件原理图中确认lane映射关系。
3.4 HDMI接口DTS配置实战
SA8155的HDMI发送器通过 mdss_hdmi_tx 节点配置,支持HDMI 2.0输出。核心配置包括时钟、PHY、HDCP和音频接口:
mdss_hdmi_tx: qcom,hdmi-tx@ae90000 {
compatible = "qcom,sdm845-hdmi-tx";
reg = <0 0x0ae90000 0 0x10000>,
<0 0x0ae00000 0 0x1000>;
reg-names = "core_physical", "mdp_physical";
interrupt-parent = <&mdss_mdp>;
interrupts = <8 0>, <9 0>;
interrupt-names = "hpd", "irq";
clocks = <&gcc GCC_DISP_AHB_CLK>,
<&gcc GCC_DISP_AXI_CLK>,
<&gcc GCC_DISP_MDP_CLK>,
<&gcc GCC_DISP_HDMI_CLK>;
clock-names = "iface", "bus", "core", "core_mmss";
assigned-clocks = <&gcc GCC_DISP_HDMI_CLK>;
assigned-clock-rates = <297000000>;
phys = <&hdmi_phy>;
phy-names = "hdmi_phy";
hdcp {
compatible = "qcom,sdm845-hdcp";
qcom,hdmi-tx-hdcp = <&mdss_hdmi_tx>;
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
hdmi_in: endpoint {
remote-endpoint = <&dpu_intf2_out>;
};
};
port@1 {
reg = <1>;
hdmi_out: endpoint {
remote-endpoint = <&hdmi_connector_in>;
};
};
};
};
| 属性 | DSI | HDMI |
|---|---|---|
| 时钟频率 | 192 MHz(典型) | 297 MHz(HDMI 2.0 4K@60) |
| 中断数量 | 1个(DSI控制器中断) | 2个(HPD热插拔 + IRQ) |
| PHY类型 | MIPI D-PHY | HDMI TMDS PHY |
| 特殊功能 | data-lanes配置 | HDCP加密模块 |
| 电源域 | 通常与DPU共享 | 独立HDMI电源域 |
3.5 显示接口与DPU的端口连接实战
设备树中,显示接口与DPU的连接通过 remote-endpoint 属性实现。以下是一个完整的端口连接示意图:
3.6 常见配置错误与调试方法
- 时钟未使能:如果
assigned-clock-rates设置的值超出硬件范围,DSI或HDMI将无法输出时钟,导致无显示。检查clk_summary确认时钟频率。 - PHY电源缺失:DSI PHY和HDMI PHY需要独立的LDO供电。如果
vdda-supply或vddio-supply未正确配置,PHY初始化会失败。 - 端口连接断裂:如果
remote-endpoint的phandle引用错误(例如拼写错误或节点不存在),内核会在dmesg中输出EPROBE_DEFER或of_graph_get_remote_endpoint错误。 - 中断号冲突:DPU和HDMI的中断号必须在
interrupts属性中正确指定。使用cat /proc/interrupts验证中断是否注册成功。
# 查看设备树节点是否被正确解析ls /sys/firmware/devicetree/base/soc/mdss/# 查看DPU时钟状态cat /sys/kernel/debug/clk/gcc_disp_mdp_clk/clk_rate# 查看DSI控制器状态cat /sys/kernel/debug/dsi0/status
3.7 本章小结
本章详细解析了SA8155显示子系统的设备树配置,从顶层 mdss 节点到底层 DSI 和 HDMI 接口,涵盖了DPU的端口连接、时钟分配、PHY配置以及中断绑定。掌握这些DTS配置技巧,是后续驱动开发和显示调试的基础。在实际项目中,建议始终对照芯片参考手册和原理图进行设备树编写,避免因地址或属性错误导致显示异常。