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>;
            };
        };
    };
};
注意:Rockchip 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>;
            };
        };
    };
};
DE2 架构特点:Mixer(混合器)负责图层合成,TCON(Timing Controller)负责时序生成。设备树中必须通过 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>;
        };
    };
};
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 图展示了从显示控制器到外部编码器的完整端口连接拓扑。

显示控制器端口连接拓扑 显示控制器端口连接拓扑 显示控制器 (VOP / DE2 / DCSS) ports 节点 port@0 (VP0) port@1 (VP1) endpoint@0 HDMI / DSI / eDP endpoint@1 MIPI DSI 调试检查清单: 1. 每个 port 的 reg 值必须与驱动期望的 VP 编号一致 2. remote-endpoint 的 phandle 必须指向外部编码器的输入 endpoint 3. 未使用的 port 可以省略,但已使用的 port 必须完整描述

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 编译验证,并在内核启动日志中确认节点状态。