从硬件到内核:彻底理解 HDMI 在 DRM 显示驱动中的连接机制
在嵌入式 Linux 系统中,HDMI 是最常见的显示输出方式之一。在 NXP i.MX8M Plus 平台中,HDMI 显示通路既涉及硬件电路(PHY、ESD、DDC 等)也涉及内核 DRM 子系统的多级抽象(Plane、CRTC、Encoder、Connector)。
本文将围绕以下几个维度,彻底讲清楚 HDMI 在 DRM 架构中的角色与实现方式:
- HDMI 相关的硬件组成
- DRM/KMS 显示架构关键概念
- 设备树 + 驱动如何实现连接
- GPU 与 DRM 的协同关系
并在文末附带面试高频问答,帮助你加深记忆与理解。
一、HDMI 显示系统的硬件组成
HDMI 接口不只是几根线,它涉及多个支持模块。下面是常见的 HDMI 显示电路组成:
模块 | 功能 | 原理图中体现 |
---|---|---|
HDMI PHY | 将图像数据转为 TMDS 信号 | hdmiphy 模块,SoC 内部或外置 |
ESD 防护 | 保护差分信号通道 | PCMF2HDMI2S 等器件 |
Level Shifter | 转换 DDC I2C 信号电平 | PCA9306 等 |
HDMI CEC | 支持远程控制协议的低速通道 | GPIO 控制电路或专用芯片 |
HDMI Connector | TYPE A/D 接口 | J17 物理连接器 |
此外:
- DDC(Display Data Channel)用于读取显示器的 EDID 信息(分辨率支持、名称等)
- HPD(Hot Plug Detect)用于检测 HDMI 是否插入
二、DRM 显示架构的核心概念与结构
Linux 显示子系统采用 DRM(Direct Rendering Manager)架构,显示路径组成如下:
Framebuffer → Plane → CRTC → Encoder → Connector → 显示器
我们依次解释每一层的核心概念:
概念 | 简明解释 | i.MX8MP 中实例 |
---|---|---|
Framebuffer | 存储图像像素的一块内存,就像画布 | 分配在内存中,由 DRM/GPU 写入 |
Plane | 图层,支持多图层叠加(如字幕 + 视频) | primary plane、overlay plane |
CRTC | 显示控制器,控制刷新、VSYNC 等 | lcdif1 , lcdif3 |
Encoder | 像素编码器,将像素转为 HDMI/MIPI 信号 | HDMI encoder 内部实现 |
Connector | 显示连接器,表示实际的显示输出端 | hdmi@32fd8000 ,连接 HDMI 屏幕 |
📌 CRTC 是什么?
全称:Cathode Ray Tube Controller(历史遗留名)
实质:控制像素输出时序(VSYNC、HSYNC 等),与 Framebuffer 对接,是图像输出的“调度器”
📌 KMS 是什么?
Kernel Mode Setting:Linux 内核中的子系统,负责设置显示分辨率、图层组合、输出路径等,是 DRM 的核心部分之一。
三、设备树中的连接配置
设备树用于在启动阶段描述硬件连接关系。以 HDMI 为例:
HDMI 节点(连接器):
hdmi: hdmi@32fd8000 {
compatible = "fsl,imx8mp-hdmi";
...
port {
hdmi_from_lcdif3: endpoint {
remote-endpoint = <&lcdif3_to_hdmi>;
};
};
};
CRTC 来源(lcdif3):
&lcdif3 {
port@3 {
lcdif3_to_hdmi: endpoint {
remote-endpoint = <&hdmi_from_lcdif3>;
};
};
};
这个 port.endpoint
的互联建立了:
- 图像源(lcdif3) → HDMI 输出(connector)
- DRM 框架启动时自动识别这些连接,构建完整显示拓扑
四、驱动中 HDMI 是如何注册为 Connector 的?
在 HDMI 驱动代码中,通常会使用如下函数将 HDMI 注册为一个 drm_connector
:
struct drm_connector *connector;
drm_connector_init(dev, connector, &funcs, DRM_MODE_CONNECTOR_HDMIA);
drm_connector_helper_add(connector, &helper_funcs);
- 类型设为
DRM_MODE_CONNECTOR_HDMIA
,代表 HDMI-A 类型 - 配合 encoder、CRTC 实现完整图像输出
五、GPU 与 DRM 的协作关系
在现代图形系统中,GPU 负责图像生成,DRM 负责图像输出,两者配合如下:
- 用户空间(如 Weston/Chromium)调用 GPU API(如 OpenGL、Vulkan)绘图
- GPU 将图像渲染到 framebuffer(内存 buffer)中
- 用户层通过 DRM API(如
libdrm
)将该 framebuffer 绑定到 DRM 的 plane 上 - DRM 的 CRTC → Encoder → Connector 负责将图像输出到屏幕
GPU 渲染路径典型架构:
[App] → [Mesa/GL] → [GPU 驱动] → [Framebuffer] ↘
[DRM] → [CRTC → Encoder → HDMI]
i.MX8MP 平台说明:
- 搭载 Vivante GPU(GC7000L),通过 Etnaviv DRM 驱动与主线集成
- 使用
kmscube
可验证 GPU + DRM 全路径是否打通
总结:GPU 和 DRM 是上下游关系,一个负责画图(内容生成),一个负责输出(信号驱动)
六、调试方法建议
工具/操作 | 作用 |
---|---|
modetest -M imx-drm | 列出所有 connector、CRTC、plane 状态 |
cat /sys/class/drm/card0-HDMI-A-1/edid | edid-decode | 查看 HDMI 连接设备的 EDID 信息 |
查看 dmesg / dev_dbg 信息 | 确认是否识别到 HDMI 连接器、正确初始化 |
七、结构图总结
[Framebuffer]
↓
[Plane 图层处理]
↓
[CRTC 时序控制器: lcdif3]
↓
[Encoder: HDMI 编码模块]
↓
[Connector: hdmi@32fd8000]
↓
[显示器]
设备树中通过 endpoint 配对建立结构,驱动中注册 connector 与 encoder,最终实现显示输出。
八、核心问题问答总结(适合面试与回顾)
1. DRM 与 KMS 有什么关系?
KMS 是 DRM 的一部分,专门负责设置显示模式(分辨率、刷新率、图层)。DRM 是整个图形子系统,包括 buffer 管理、权限控制等。
2. Framebuffer 是硬件还是内存?
是内存(或显存)的一块区域,保存屏幕将显示的像素信息。
3. CRTC 是芯片吗?
不是。CRTC 是一个显示控制逻辑模块,在 SoC 中由例如
lcdif1/lcdif3
等硬件模块实现。
4. Encoder 和 Connector 有什么区别?
Encoder 负责信号转换(如 RGB 转 HDMI),Connector 表示物理输出接口(如 HDMI、DSI)。
5. Plane 有什么意义?
Plane 是图层,支持视频、字幕等分层显示,可叠加混合。
6. GPU 和 DRM 什么关系?
GPU 负责图像渲染,DRM 负责显示输出。GPU 渲染的 framebuffer 交由 DRM 显示。
九、结束语
HDMI 不只是插上就能用的接口,它背后是一整套显示系统架构的协同工作。从 framebuffer 到 Connector,每一级都承担着不同的职责。
掌握这些结构与概念,是你迈向 显示驱动高手 的第一步。尤其是在车载、消费电子、图形中间件等行业中,懂显示 = 抓核心。
愿你彻底吃透 DRM/KMS 显示通道,成为下一位能讲清硬件 + 驱动 + GPU 的图形专家。