前言:
在嵌入式開發中,一個小小的接口問題往往會卡殼半天,尤其是像 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函數設置“連接狀態”。
staticintsunxi_hdmi_bind(structdevice *dev,structdevice *master,void*data){ ret = _sunxi_hdmi_init_drm(hdmi); if(ret !=0) { hdmi_err("sunxi hdmi init creat connect failed\n"); gotobind_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)) { gotobind_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功能與熱插拔均恢復正常。
廣州眺望電子科技有限公司專注于嵌入式處理器模組的研發與應用,提供從硬件設計到驅動開發,系統解決方案的全流程技術支持。歡迎關注我們的公眾號,獲取更多嵌入式項目開發實戰經驗。
-
嵌入式
+關注
關注
5189文章
20192瀏覽量
329552 -
HDMI
+關注
關注
34文章
1876瀏覽量
158993 -
熱插拔
+關注
關注
2文章
262瀏覽量
40566
發布評論請先 登錄

【避坑指南】T527 HDMI熱插拔失效?手把手教你定位解決
評論