3、显示控制器设备树绑定:常见显示控制器设备树节点模板
显示控制器(Display Controller)是 DRM 驱动与硬件显示管道之间的关键桥梁。设备树节点描述了显示控制器的寄存器地址、中断、时钟、接口以及输出端口的拓扑关系。本章以 Rockchip VOP、Allwinner DE2、NXP DCSS 三种典型控制器为例,提供可直接参考的设备树节点模板,并解析各字段的绑定含义。
Documentation/devicetree/bindings/display/ 下的内核绑定文档。实际移植时,务必以对应 SoC 的 dtsi 文件为基准,本模板仅展示通用结构与关键差异。
3.1 显示控制器设备树节点通用结构
所有显示控制器的设备树节点均遵循以下核心结构:
- compatible:驱动匹配字符串,必须与内核驱动中的
of_device_id表一致。 - reg:寄存器地址范围,通常包含控制寄存器、帧缓冲寄存器等。
- interrupts:显示控制器中断号,用于 VSYNC、错误等事件。
- clocks / clock-names:时钟源列表,包括 AXI、AHB、像素时钟等。
- ports:输出端口描述,定义与 HDMI、DSI、eDP 等外部桥接芯片的连接。
ports 节点是 DRM 链路调试的核心,错误的端口映射会导致无显示输出或链路枚举失败。
3.2 Rockchip VOP 设备树节点模板
Rockchip VOP(Video Output Processor)常见于 RK3288、RK3399、RK3568 等 SoC。VOP 支持多图层叠加、AFBC 压缩、多输出接口(HDMI、DP、MIPI DSI、eDP)。
/* Rockchip RK3568 VOP 节点示例 */
vop: vop@fe040000 {
compatible = "rockchip,rk3568-vop";
reg = <0x0 0xfe040000 0x0 0x3000>,
<0x0 0xfe044000 0x0 0x1000>;
reg-names = "vop", "gamma-lut";
interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru ACLK_VOP>,
<&cru HCLK_VOP>,
<&cru DCLK_VOP0>,
<&cru DCLK_VOP1>;
clock-names = "aclk", "hclk", "dclk_vp0", "dclk_vp1";
power-domains = <&power RK3568_PD_VO>;
iommus = <&vop_mmu>;
status = "disabled";
vop_out: ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
vop_out_hdmi: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_vop>;
};
};
port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
vop_out_mipi_dsi: endpoint@0 {
reg = <0>;
remote-endpoint = <&dsi_in_vop>;
};
};
};
};
dclk_vp0 和 dclk_vp1 分别对应两个视频端口的像素时钟。如果只使用一个输出接口,未使用的时钟可以省略,但 clock-names 必须与驱动期望一致。
3.3 Allwinner DE2 设备树节点模板
Allwinner DE2(Display Engine 2.0)用于 H3、H5、A64、H6 等 SoC。DE2 采用混合流水线架构,包含前端(Frontend)和后端(Backend)两个子模块。
/* Allwinner H3 DE2 节点示例 */
de: display-engine {
compatible = "allwinner,sun8i-h3-display-engine";
allwinner,pipelines = <&mixer0>;
status = "disabled";
};
mixer0: mixer@1100000 {
compatible = "allwinner,sun8i-h3-de2-mixer-0";
reg = <0x01100000 0x100000>;
clocks = <&ccu CLK_BUS_DE>,
<&ccu CLK_DE>;
clock-names = "bus", "mod";
resets = <&ccu RST_BUS_DE>;
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
mixer0_out: port@1 {
#address-cells = <1>;
#size-cells = <0>;
reg = <1>;
mixer0_out_tcon0: endpoint@0 {
reg = <0>;
remote-endpoint = <&tcon0_in_mixer0>;
};
};
};
};
tcon0: lcd-controller@1c0c000 {
compatible = "allwinner,sun8i-h3-tcon-tv";
reg = <0x01c0c000 0x1000>;
interrupts = <GIC_SPI 86 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_BUS_TCON0>,
<&ccu CLK_TCON0>;
clock-names = "ahb", "tcon-ch0";
resets = <&ccu RST_BUS_TCON0>;
reset-names = "lcd";
status = "disabled";
ports {
#address-cells = <1>;
#size-cells = <0>;
tcon0_in: port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
tcon0_in_mixer0: endpoint@0 {
reg = <0>;
remote-endpoint = <&mixer0_out_tcon0>;
};
};
tcon0_out: port@1 {
reg = <1>;
#address-cells = <1>;
#size-cells = <0>;
tcon0_out_hdmi: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_tcon0>;
};
};
};
};
remote-endpoint 将 Mixer 输出连接到 TCON 输入,再将 TCON 输出连接到外部编码器。
3.4 NXP DCSS 设备树节点模板
NXP DCSS(Display Controller SubSystem)用于 i.MX8M Plus 等平台,支持 4Kp60 显示、AFBC 解压缩、HDR10 处理。DCSS 包含 Context Scheduler(CTX)、Display Engine(DE)、Frame Generator(FG)三个子模块。
/* NXP i.MX8M Plus DCSS 节点示例 */
dcss: display-controller@32e00000 {
compatible = "nxp,imx8mp-dcss";
reg = <0x32e00000 0x30000>;
interrupts = <GIC_SPI 109 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 110 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "ctx", "dtg";
clocks = <&clk IMX8MP_CLK_DISP_AXI_ROOT>,
<&clk IMX8MP_CLK_DISP_APB_ROOT>,
<&clk IMX8MP_CLK_DISP_RTRM_ROOT>;
clock-names = "axi", "apb", "rtrm";
assigned-clocks = <&clk IMX8MP_CLK_DISP_AXI_ROOT>,
<&clk IMX8MP_CLK_DISP_APB_ROOT>;
assigned-clock-parents = <&clk IMX8MP_SYS_PLL1_800M>,
<&clk IMX8MP_SYS_PLL1_400M>;
assigned-clock-rates = <800000000>,
<400000000>;
status = "disabled";
port {
#address-cells = <1>;
#size-cells = <0>;
dcss_out: endpoint@0 {
reg = <0>;
remote-endpoint = <&hdmi_in_dcss>;
};
};
};
assigned-clock-rates 必须与显示分辨率匹配。例如 4Kp60 需要 AXI 时钟 ≥ 800MHz,APB 时钟 ≥ 400MHz。错误的时钟频率会导致显示撕裂或黑屏。
3.5 三种显示控制器设备树对比
| 特性 | Rockchip VOP | Allwinner DE2 | NXP DCSS |
|---|---|---|---|
| compatible 格式 | rockchip,<soc>-vop |
allwinner,sun8i-<soc>-de2-mixer-0 |
nxp,imx8mp-dcss |
| 子模块数量 | 单 VOP 核心 | Mixer + TCON 分离 | CTX + DE + FG 三级流水 |
| 端口数量 | 2~4 个 video port | Mixer 1 个输出,TCON 1 个输入 + 1 个输出 | 1 个输出 port |
| 时钟数量 | 4~6 个 | 2~3 个 | 3 个 + assigned-clocks |
| IOMMU 支持 | 是(iommus 属性) | 否(直接 DMA) | 是(通过系统 SMMU) |
| 典型输出接口 | HDMI, DP, MIPI DSI, eDP | HDMI, TV Encoder, RGB LCD | HDMI, MIPI DSI, LVDS |
3.6 显示链路调试:端口连接验证
设备树中 remote-endpoint 的正确性是显示链路调试的第一步。以下 SVG 图展示了从显示控制器到外部编码器的完整端口连接拓扑。
3.7 常见设备树绑定错误与调试方法
| 错误类型 | 现象 | 排查方法 |
|---|---|---|
| compatible 不匹配 | 驱动 probe 失败,dmesg 显示 No driver found |
检查 cat /sys/firmware/devicetree/base/.../compatible 与驱动 of_match_table |
| 时钟缺失或顺序错误 | 显示控制器时钟使能失败,系统挂起或黑屏 | 使用 clk_summary 调试节点确认时钟状态 |
| remote-endpoint 指向错误 | DRM 链路枚举失败,drm_bridge 无法连接 |
检查 drm_dp_aux 或 drm_bridge_attach 返回值 |
| reg 地址范围重叠 | 设备树编译报错或驱动 ioremap 失败 | 使用 dtc -I dtb -O dts 反编译确认地址范围 |
| 中断号错误 | VSYNC 中断不触发,显示无刷新 | 检查 /proc/interrupts 确认中断计数 |
dt-validate 工具对设备树进行绑定检查,或在内核启动参数中添加 drm.debug=0x1e 打开 DRM 核心日志,可以快速定位显示链路问题。
3.8 显示控制器设备树绑定总结
设备树绑定是 DRM 驱动移植的基础。Rockchip VOP、Allwinner DE2、NXP DCSS 三种控制器在设备树结构上存在明显差异:
- Rockchip VOP:单节点多端口,适合多输出场景,需要配置 IOMMU。
- Allwinner DE2:Mixer + TCON 分离架构,端口连接链较长,需注意时钟域隔离。
- NXP DCSS:三级流水线结构,时钟频率与分辨率强相关,需要 assigned-clocks 精确配置。
在实际移植过程中,建议先使用 SoC 官方 dtsi 文件中的节点作为起点,然后根据具体硬件设计裁剪端口和时钟。每次修改设备树后,务必使用 dtc 编译验证,并在内核启动日志中确认节点状态。