本帖最后由 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 的热插拔状态可以通过以下节点查看: - cat /sys/class/drm/card0-HDMI-A-1/status
这次排查时,两种故障场景下执行该命令,结果均为 “disconnected”,说明问题出在 “系统检测逻辑”,而非硬件接口损坏。 2.2 扒内核日志,找关键异常 内核启动日志藏着很多线索,尤其是 HDMI 驱动初始化的过程。通过查看日志,发现了一个关键异常:
图 3 插着 HDMI 再上电日志截图 由于是插入 HDMI 再上电的,正常来说,不应该出现: - 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函数设置“连接状态”。 - static int sunxi_hdmi_bind(struct device *dev,struct device *master,void *data)
- {
- ret = _sunxi_hdmi_init_drm(hdmi);
- if (ret != 0) {
- hdmi_err("sunxi hdmi init creat connect failed\n");
- goto bind_ng;
- }
- printk("------------->%d\n", sunxi_hdmi_get_hpd());
- printk("------------->%d\n", boot_state ? 2 : 3);
- if (boot_state && sunxi_hdmi_get_hpd())
- _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);
- else
- _sunxi_drv_hdmi_hpd_set(hdmi, 0x0);
- if (IS_ERR_OR_NULL(hdmi->hpd_task)) {
- goto bind_ng;
- } else {
- wake_up_process(hdmi->hpd_task);
- printk("------------->11111111111\n");
- hdmi_trace("hdmi init start hpd detect task\n");
- }
但实际测试发现,在系统启动初期,HPD 硬件状态可能尚未稳定,sunxi_hdmi_get_hpd()在“先插线后上电”的场景下,会误返回“未连接”的值,导致驱动初始化时就把 HDMI 状态设为“disconnect”。后续即使热插拔,系统也因为初始状态错误,无法正常检测。
三、解决方案:修正驱动逻辑
找到问题根源后,解决起来其实简单了 —— 既然sunxi_hdmi_get_hpd()的判断存在误差,那我们就取消对硬件状态的依赖,直接强制让驱动初始化时将 HPD 状态为已连接: - /* 注释掉原有的判断逻辑,避免误判 */
- // if (boot_state && sunxi_hdmi_get_hpd())
- // _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);
- // else
- // _sunxi_drv_hdmi_hpd_set(hdmi, 0x0);
- /* 直接强制设置为“已连接”,让后续热插拔检测正常工作 */
- _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);
这样修改后,HDMI会从初始状态就开始正常检测热插拔事件,而不是被错误的初始状态“锁死”。
四、总结
通过本次问题的排查与修复,我们可以得出以下经验: 硬件状态读取时机很重要,在驱动初始化阶段,硬件可能还未完全就绪,此时读取的状态可能不可靠,初始状态的正确设置对后续检测十分重要。 该方案在眺望电子T527平台上验证通过,HDMI功能与热插拔均恢复正常。
广州眺望电子科技有限公司专注于嵌入式处理器模组的研发与应用,提供从硬件设计到驱动开发,系统解决方案的全流程技术支持。欢迎关注我们的公众号,获取更多嵌入式项目开发实战经验。
|