2. 基础知识
在 Linux 显示子系统里,encoder 是连接 CRTC(像素流水线输出端)与 connector(物理接口/显示终端)之间的“信号翻译与驱动适配层”。它负责把 CRTC 产生的并行像素数据、时序信号(HSYNC/VSYNC/DE)转换成某种物理接口所需的电信号格式,例如 TMDS、LVDS、DP 链路、DSI 或 VGA 模拟信号。理解 encoder 的工作方式,是后续排查“黑屏、花屏、分辨率不对、热插拔无响应”等故障的基础。
Framebuffer → CRTC(扫描时序) → Encoder(编码/串行化/电平转换) → Connector(物理插座) → 显示器
2.1 encoder 的核心工作原理
encoder 的本质是“时序到物理信号”的转换器。它从 CRTC 接收已经按显示模式生成的像素流,并完成三类关键工作:
- 编码(Encoding):把 RGB 像素转换为接口规定的码流。例如 HDMI 使用 TMDS 编码,把 8bit 像素转为 10bit 最小化跳变的差分码流;DP 使用 8b/10b 或 128b/132b 编码并打包成链路符号。
- 串行化与时钟恢复:并行像素数据经 SerDes 转为高速串行差分对,同时生成随路时钟或嵌入式时钟,供接收端恢复采样点。
- 时序与状态管理:根据 CRTC 的 mode 配置像素时钟、极性、色深、链路速率,并管理 DPMS 电源状态、热插拔检测(HPD)与 EDID 读取。
在 DRM 框架中,encoder 由 struct drm_encoder 表示,它通过 possible_crtcs 与 CRTC 建立约束关系,通过 drm_encoder_helper_funcs 提供 mode_set、enable、disable、atomic_check 等回调。内核在 modeset 时按“CRTC → encoder → connector”的顺序下发配置,因此 encoder 的 mode_set 是否被正确调用,直接决定物理接口是否输出信号。
2.2 常见 encoder 类型与接口标准
不同接口标准对应不同的 encoder 实现,常见类型如下表所示。排查故障时,先确认“当前 connector 对应哪种 encoder”,再检查其链路参数是否与显示器能力匹配。
| 接口标准 | 典型 encoder 类型 | 信号特征 | 常见故障点 |
|---|---|---|---|
| HDMI | TMDS encoder | 4 对差分:3 数据 + 1 时钟,TMDS 编码 | HPD、EDID、TMDS 时钟比、色深 |
| DisplayPort | DP 链路 encoder | 主链路 + AUX 通道,8b/10b 或 128b/132b | 链路训练失败、AUX 超时、速率不匹配 |
| MIPI DSI | DSI host encoder | 1~4 条数据 lane + 1 条时钟 lane,差分 | lane 数、时序参数、panel 初始化序列 |
| LVDS | LVDS encoder | 4/5/8 对差分,低摆幅 | 通道映射、双路奇偶、像素时钟 |
| VGA | DAC encoder | RGB 模拟 + HSYNC/VSYNC | DAC 时钟、负载检测、同步极性 |
从内核视角看,这些 encoder 通常由 SoC 显示控制器(如 i915、amdgpu、msm、rockchip)或桥接芯片(如 Lontium LT8912、ITE IT66121)驱动。桥接芯片场景下,encoder 与 connector 之间还可能存在 drm_bridge 链,故障定位需要沿桥链逐级检查。
2.3 方法流程:从 mode 到物理信号
一次成功的 encoder 配置通常经历以下流程,理解它有助于在日志中定位失败环节:
- 读取 EDID:通过 DDC/AUX 读取显示器能力,得到支持的分辨率、刷新率、色深。
- 模式选择:DRM 根据 EDID 与用户配置选择 mode,计算像素时钟与链路带宽。
- atomic_check:校验 CRTC、encoder、connector 三者约束,例如
possible_crtcs是否匹配、链路速率是否足够。 - mode_set:encoder 写入像素时钟、极性、编码参数、lane 映射。
- enable:使能 SerDes、PLL、输出驱动,启动链路训练(DP)或 TMDS 输出(HDMI)。
- HPD 与状态回读:确认显示器已锁定信号,读取链路状态寄存器。
下面是一段典型的内核日志片段,展示了 encoder 与链路训练相关的输出:
[drm] Connector HDMI-A-1: EDID read ok, modes: 1920x1080@60
[drm] Encoder TMDS-1: mode_set pixclk=148500 kHz, bpc=8
[drm] DP-1: link training start, rate=HBR2, lanes=4
[drm] DP-1: link training failed at CR phase, retry 1
[drm] Encoder DSI-1: lane=4, format=RGB888, panel init done
2.4 案例与场景:HDMI 无输出的排查思路
假设一台设备通过 HDMI 连接显示器,系统识别到 connector 但屏幕无输出。按 encoder 视角可这样排查:
- 确认
/sys/class/drm/card0-HDMI-A-1/status是否为connected,若为disconnected,优先查 HPD 电路与 EDID。 - 检查 encoder 是否绑定到正确 CRTC:
cat /sys/kernel/debug/dri/0/encoder或查看drm_state。 - 核对像素时钟与 TMDS 时钟比:1080p60 需要 148.5MHz 像素时钟,TMDS 时钟为其 1/10 或按色深调整。
- 查看内核日志中
mode_set是否执行、PLL 是否锁定、是否有timeout或no signal报错。
2.5 常见误区与复盘
初学者容易把 encoder 与 connector 混为一谈,或认为“分辨率设置正确就一定能出图”。实际上,encoder 的链路参数、lane 映射、编码方式、PLL 配置都可能独立导致失败。另一个常见误区是忽略 possible_crtcs 约束,导致 encoder 被分配到不支持的 CRTC 上,表现为 atomic_check 失败但日志不直观。
1. 先确认 connector 状态与 EDID,再查 encoder 配置;
2. 区分“模式设置失败”与“链路训练失败”,两者日志位置不同;
3. 桥接芯片场景要沿 drm_bridge 链逐级验证,不要只看最终 connector。