最近整理 HDMI 热插拔相关问题,发现这类故障经常不是“HDMI 完全不能用”,而是冷启动能亮、插拔后不亮,或者换显示器后 mode 没更新。这里把排查思路记一下,后面遇到类似问题可以少绕一点。
HDMI 热插拔的第一信号是 HPD。显示器插上后,HPD 电平应该变化,驱动再去读 EDID、选择 mode、重新 enable 输出。
如果插拔时系统完全没反应,优先查:
HDMI HPD 引脚是否接对;
DTS/pinctrl 里 HPD 是否配置;
是否有 GPIO/IRQ 被别的功能占用;
HDMI 5V 是否正常输出;
线材/转接头是否把 HPD 断了。
很多“热插拔不生效”其实还没走到 EDID 阶段,HPD 事件就丢了。
插入显示器后,正常流程应该是读取 EDID,再根据显示器支持的分辨率选择输出模式。
如果 HPD 有变化,但插上后仍然黑屏,可以重点看:
DDC 的 SCL/SDA 是否正常;
I2C 上拉、电平转换是否合适;
EDID 是否读取失败或读到全 0/错误数据;
是否复用了错误的旧 EDID;
是否 fallback 到显示器不支持的 mode。
有条件的话,逻辑分析仪看 DDC 很直观。软件层面可以看 dmesg 里有没有 EDID read failed、mode invalid 之类信息。
有些板子开机前 HDMI 已经插着能亮,但运行中拔插就不行。这个时候说明基本显示链路没问题,问题更可能在:
HPD 中断没有配置好;
驱动没有处理 disconnect/connect;
用户态没有重新 modeset;
framebuffer/DRM 没有重新绑定输出;
HDMI PHY 没有在拔插后重新 enable。
所以调试时建议分别测三种场景:
开机前插着 HDMI;
开机后再插 HDMI;
显示中拔掉再插回。
这三种能暴露不同问题。
如果是老 BSP/disp2,一般看 disp/hdmi 相关 log,以及 sys_config/dts 里的 hdmi_used、screen 输出配置。
如果是主线 DRM/KMS,可以用:
modetest -M sun4i-drm看 connector 状态是否从 disconnected 变成 connected,mode 列表是否刷新。也可以用用户态程序重新 set mode,确认是不是内核已识别但应用没处理。
热插拔调试阶段不要一开始就依赖自动 EDID 选最高分辨率。可以先固定 720p60 或 1080p60 中较稳的模式,确认拔插后能重新出图。
如果固定模式能亮,自动模式不亮,大概率是 EDID/mode 选择问题;如果固定模式也不亮,就回头查 HPD、PHY、TCON/DE 重新 enable。
我一般会这样排:
量 HDMI 5V 和 HPD 电平;
看插拔时内核有没有 HPD/connector 事件;
看 EDID 是否重新读取成功;
固定 720p60 测输出;
看拔插后 HDMI PHY/TCON/DE 是否重新 enable;
最后再查应用层是否重新 modeset 或刷新 framebuffer。
简单说,HDMI 热插拔要拆成三步:检测到插拔、读到显示器、重新出图。只要按这三层分开验证,基本能定位是硬件 HPD/DDC 问题、驱动热插拔流程问题,还是用户态没有重新设置显示模式。
离线