[嵌入式Linux] 【避坑指南】T527 HDMI热插拔失效?手把手教你定位解决

[复制链接]
167|0
gztwdz4379 发表于 2025-10-17 09:20 | 显示全部楼层 |阅读模式
失效, , , ,
本帖最后由 gztwdz4379 于 2025-10-17 09:28 编辑

前言:

在嵌入式开发中,一个小小的接口问题往往会卡壳半天,尤其是像 HDMI 热插拔这种和硬件、内核驱动都挂钩的场景。最近调试 T527板卡时,就遇到了 HDMI 热插拔失灵的麻烦,经过一番排查终于解决,今天把整个过程整理成笔记,希望能帮到有同样困扰的朋友。


一、明确HDMI “失效” 现象


在开始排查前,得先把问题现象摸透。这次遇到的HDMI 问题主要集中在 “插拔检测” 上,具体分为两种典型场景:


1.1 场景一:上电前插线,热插拔后失效


给 T527 板子上电前,先把 HDMI 线插到底板接口,启动后能正常显示界面。

但之后拔下再重新插上,不仅没画面,系统还完全检测不到 “插拔动作”,相当于 HDMI 接口 “**” 了。


图 1 上电后热插拔HDMI日志截图

1.2 景二:上电后插线,直接无检测


先启动 T527 板子,进入系统后再插 HDMI 线,系统同样没反应 —— 既不弹出 “新设备接入” 的提示,也无法输出画面,仿佛没插线一样。


图 2 系统运行后热入HDMI日志截图
二、“三步曲”分析过程


遇到这类硬件或驱动的还不明朗的问题,不能上来就改代码,得按“看状态、查日志、终定位”的步骤来,避免思路不明走弯路。

2.1   检查 HDMI 实时状态
在 Linux 系统中,HDMI 的热插拔状态可以通过以下节点查看:
  1. cat  /sys/class/drm/card0-HDMI-A-1/status
  • 如果显示 “connected”,说明系统识别到 HDMI 已连接
  • 如果显示 “disconnected”,则表示系统未检测到设备

这次排查时,两种故障场景下执行该命令,结果均为 “disconnected”,说明问题出在 “系统检测逻辑”,而非硬件接口损坏。

2.2 扒内核日志,找关键异常

内核启动日志藏着很多线索,尤其是 HDMI 驱动初始化的过程。通过查看日志,发现了一个关键异常:


图 3 插着 HDMI 再上电日志截图
由于是插入 HDMI 再上电的,正常来说,不应该出现:
  1. 3.54686] [drm] sunxi-hdmi: drm hdmi detect: disconnect
这说明系统在初始化 HDMI 驱动时,错误地判断了 HDMI 的连接状态。

2.3 定位核心问题:驱动逻辑判断错误

顺着日志找到 T527 的 HDMI 驱动代码,发现了关键的判断逻辑:

驱动会通过sunxi_hdmi_get_hpd()函数读取 HDMI 插拔寄存器的值,决定是否调用_sunxi_drv_hdmi_hpd_set函数设置“连接状态”。

  1. static int sunxi_hdmi_bind(struct device *dev,struct device *master,void *data)
  2. {
  3.     ret = _sunxi_hdmi_init_drm(hdmi);
  4.     if (ret != 0) {
  5.         hdmi_err("sunxi hdmi init creat connect failed\n");
  6.         goto bind_ng;
  7.     }

  8.     printk("------------->%d\n", sunxi_hdmi_get_hpd());
  9.     printk("------------->%d\n", boot_state ? 2 : 3);

  10.     if (boot_state && sunxi_hdmi_get_hpd())
  11.         _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);
  12.     else
  13.         _sunxi_drv_hdmi_hpd_set(hdmi, 0x0);

  14.     if (IS_ERR_OR_NULL(hdmi->hpd_task)) {
  15.         goto bind_ng;
  16.     } else {
  17.         wake_up_process(hdmi->hpd_task);
  18.         printk("------------->11111111111\n");
  19.         hdmi_trace("hdmi init start hpd detect task\n");
  20. }

但实际测试发现,在系统启动初期,HPD 硬件状态可能尚未稳定,sunxi_hdmi_get_hpd()在“先插线后上电”的场景下,会误返回“未连接”的值,导致驱动初始化时就把 HDMI 状态设为“disconnect”。后续即使热插拔,系统也因为初始状态错误,无法正常检测。


三、解决方案:修正驱动逻辑


找到问题根源后,解决起来其实简单了 —— 既然sunxi_hdmi_get_hpd()的判断存在误差,那我们就取消对硬件状态的依赖,直接强制让驱动初始化时将 HPD 状态为已连接:

  1. /* 注释掉原有的判断逻辑,避免误判 */
  2. // if (boot_state && sunxi_hdmi_get_hpd())
  3. //     _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);
  4. // else
  5. //     _sunxi_drv_hdmi_hpd_set(hdmi, 0x0);
  6. /* 直接强制设置为“已连接”,让后续热插拔检测正常工作 */
  7. _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);

这样修改后,HDMI会从初始状态就开始正常检测热插拔事件,而不是被错误的初始状态“锁死”。


四、总结


通过本次问题的排查与修复,我们可以得出以下经验:

硬件状态读取时机很重要,在驱动初始化阶段,硬件可能还未完全就绪,此时读取的状态可能不可靠,初始状态的正确设置对后续检测十分重要。

该方案在眺望电子T527平台上验证通过,HDMI功能与热插拔均恢复正常。


广州眺望电子科技有限公司专注于嵌入式处理器模组的研发与应用,提供从硬件设计到驱动开发,系统解决方案的全流程技术支持。欢迎关注我们的公众号,获取更多嵌入式项目开发实战经验。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部