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 配置通常经历以下流程,理解它有助于在日志中定位失败环节:

  1. 读取 EDID:通过 DDC/AUX 读取显示器能力,得到支持的分辨率、刷新率、色深。
  2. 模式选择:DRM 根据 EDID 与用户配置选择 mode,计算像素时钟与链路带宽。
  3. atomic_check:校验 CRTC、encoder、connector 三者约束,例如 possible_crtcs 是否匹配、链路速率是否足够。
  4. mode_set:encoder 写入像素时钟、极性、编码参数、lane 映射。
  5. enable:使能 SerDes、PLL、输出驱动,启动链路训练(DP)或 TMDS 输出(HDMI)。
  6. 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 报错。
排查 encoder 问题时,优先区分“逻辑链路问题”与“物理信号问题”:前者看 DRM 状态与日志,后者用示波器/协议分析仪测差分对、时钟与 HPD 电平。

2.5 常见误区与复盘

初学者容易把 encoder 与 connector 混为一谈,或认为“分辨率设置正确就一定能出图”。实际上,encoder 的链路参数、lane 映射、编码方式、PLL 配置都可能独立导致失败。另一个常见误区是忽略 possible_crtcs 约束,导致 encoder 被分配到不支持的 CRTC 上,表现为 atomic_check 失败但日志不直观。

复盘要点:
1. 先确认 connector 状态与 EDID,再查 encoder 配置;
2. 区分“模式设置失败”与“链路训练失败”,两者日志位置不同;
3. 桥接芯片场景要沿 drm_bridge 链逐级验证,不要只看最终 connector。
Encoder 工作原理与接口链路 Framebuffer 像素数据 CRTC 扫描时序 HS/VS/DE Encoder 编码 / 串行化 / 电平转换 PLL · Lane 映射 · 链路训练 Connector HDMI / DP / DSI / LVDS drm_encoder mode_set / enable / atomic_check EDID / HPD 显示器能力与热插拔 DDC / AUX 通道 链路参数 像素时钟 · 色深 · Lane 数 速率 · 极性 · 编码方式 常见故障 HPD 丢失 · EDID 读取失败 链路训练失败 · PLL 未锁定