• 正文
  • 相关推荐
申请入驻 产业图谱

【避坑指南】T527 HDMI热插拔失效?手把手教你定位解决

10/17 10:27
522
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

前言:

嵌入式开发中,一个小小的接口问题往往会卡壳半天,尤其是像 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

如果显示 “connected”,说明系统识别到 HDMI 已连接

如果显示 “disconnected”,则表示系统未检测到设备

这次排查时,两种故障场景下执行该命令,结果均为 “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 failedn");
        goto bind_ng;
    }

    printk("------------->%dn", sunxi_hdmi_get_hpd());
    printk("------------->%dn", 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("------------->11111111111n");
        hdmi_trace("hdmi init start hpd detect taskn");
}

但实际测试发现,在系统启动初期,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功能与热插拔均恢复正常。

相关推荐