2. Encoder 编码器基础
Encoder(编码器)是 DRM 显示框架中连接 CRTC 与 Connector 的中间层,负责将 CRTC 输出的像素流转换为特定显示接口(如 LVDS、HDMI、DSI、VGA)所需的信号格式。理解 Encoder 的角色、关系与类型,是编写显示驱动的基础。
核心观点:Encoder 不产生图像数据,而是完成“协议转换”与“信号编码”。没有 Encoder,CRTC 的像素流无法被物理接口识别。
2.1 Encoder 在 DRM 中的作用
Encoder 在 DRM 子系统中承担以下关键职责:
- 信号编码:将 CRTC 输出的并行 RGB/数字像素流编码为特定接口协议(如 TMDS、LVDS 差分对、MIPI D-PHY)。
- 时序适配:根据 Connector 类型调整时钟极性、同步信号格式、数据通道映射。
- 电源管理:控制编码器硬件的上电/下电序列,降低待机功耗。
- 属性暴露:通过 DRM 属性(如色彩空间、HDMI 深色模式)向用户空间暴露编码器能力。
- 链路训练(部分接口):HDMI 的 TMDS 均衡、DP 的链路训练由 Encoder 驱动参与完成。
| 功能 | 说明 | 典型实现 |
|---|---|---|
| 信号编码 | 将像素数据转为接口电信号 | TMDS 编码、LVDS 串行化 |
| 时序适配 | 匹配 CRTC 输出与 Connector 时序 | H/V 同步极性调整 |
| 电源管理 | 控制编码器硬件电源状态 | DPMS 状态机 |
| 属性暴露 | 提供接口特有配置项 | HDMI 色彩深度、量化范围 |
驱动视角:在 Linux 内核中,Encoder 驱动需要实现
drm_encoder_helper_funcs 结构体中的 enable、disable、mode_valid、atomic_mode_set 等回调。
2.2 Encoder 与 CRTC / Connector 的关系
DRM 显示管道的数据流向为:CRTC → Encoder → Connector → 显示器。三者通过 drm_encoder.crtc 和 drm_connector.encoder 指针建立双向关联。
三者之间的关联在驱动初始化时通过以下 API 建立:
// 1. 初始化 Encoder
struct drm_encoder *encoder;
drm_encoder_init(drm_dev, encoder, &funcs, DRM_MODE_ENCODER_TMDS, NULL);
// 2. 将 Encoder 绑定到 CRTC(通过可能的掩码)
encoder->possible_crtcs = drm_crtc_mask(crtc);
// 3. 在 Connector 初始化时关联 Encoder
connector->encoder = encoder; // 静态绑定
// 或通过 drm_connector_attach_encoder() 动态绑定
常见错误:忘记设置
possible_crtcs 掩码会导致 Encoder 无法与任何 CRTC 连接,用户空间调用 drmModeSetCrtc 时返回 -EINVAL。
2.3 Encoder 类型
DRM 框架定义了多种 Encoder 类型,每种对应一种物理显示接口标准。类型通过 drm_encoder_init() 的 encoder_type 参数指定。
| 类型常量 | 对应接口 | 典型应用 | 编码方式 |
|---|---|---|---|
DRM_MODE_ENCODER_NONE |
无标准接口 | 内部显示、调试 | 直通 |
DRM_MODE_ENCODER_DAC |
VGA 模拟接口 | 老式显示器 | 数模转换 |
DRM_MODE_ENCODER_TMDS |
HDMI / DVI-D | 电视、显示器 | TMDS 差分编码 |
DRM_MODE_ENCODER_LVDS |
LVDS 平板接口 | 嵌入式 LCD 屏 | 低压差分串行 |
DRM_MODE_ENCODER_DSI |
MIPI DSI | 手机、平板 | D-PHY 差分串行 |
DRM_MODE_ENCODER_DP |
DisplayPort | 笔记本、高端显示器 | 微封包差分传输 |
DRM_MODE_ENCODER_VIRTUAL |
虚拟显示 | 虚拟机、远程桌面 | 内存拷贝 |
选择 Encoder 类型时需考虑以下因素:
- 硬件兼容性:SoC 内部集成的显示控制器支持哪些接口(如 i.MX6 支持 LVDS 和 HDMI)。
- 带宽需求:4K@60Hz 需要 HDMI 2.0 或 DP 1.2,LVDS 通常只支持 1080p。
- 线缆长度:LVDS 适合短距离(< 5m),HDMI/DP 支持更长距离。
- 电源效率:LVDS 和 DSI 功耗较低,适合电池供电设备。
驱动开发提示:在设备树中,Encoder 类型通常由
compatible 字符串隐含,驱动在 probe 时根据硬件版本选择正确的 encoder_type。例如,fsl,imx6q-hdmi 对应 DRM_MODE_ENCODER_TMDS。