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 指针建立双向关联。

DRM 显示管道:CRTC → Encoder → Connector CRTC 像素生成 时序控制 Encoder 信号编码 协议转换 Connector 物理接口 热插拔检测 像素流 编码信号 关键关系 一个 CRTC 可连接多个 Encoder(多路复用),一个 Encoder 通常只连接一个 Connector

三者之间的关联在驱动初始化时通过以下 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 类型与接口映射 CRTC TMDS LVDS DSI DisplayPort 每种 Encoder 类型对应一种物理层编码标准,驱动需实现对应的编码器硬件初始化
驱动开发提示:在设备树中,Encoder 类型通常由 compatible 字符串隐含,驱动在 probe 时根据硬件版本选择正确的 encoder_type。例如,fsl,imx6q-hdmi 对应 DRM_MODE_ENCODER_TMDS。