前言:
在嵌入式開發(fā)中,一個小小的接口問題往往會卡殼半天,尤其是像 HDMI 熱插拔這種和硬件、內(nèi)核驅(qū)動都掛鉤的場景。最近調(diào)試 T527板卡時,就遇到了 HDMI 熱插拔失靈的麻煩,經(jīng)過一番排查終于解決,今天把整個過程整理成筆記,希望能幫到有同樣困擾的朋友。
一、明確HDMI “失效” 現(xiàn)象
在開始排查前,得先把問題現(xiàn)象摸透。這次遇到的HDMI問題主要集中在 “插拔檢測” 上,具體分為兩種典型場景:
1.1場景一:上電前插線,熱插拔后失效
給 T527 板子上電前,先把 HDMI 線插到底板接口,啟動后能正常顯示界面。
但之后拔下再重新插上,不僅沒畫面,系統(tǒng)還完全檢測不到 “插拔動作”,相當于 HDMI 接口 “罷工” 了。

圖 1 上電后熱插拔HDMI日志截圖
1.2場景二:上電后插線,直接無檢測
先啟動 T527 板子,進入系統(tǒng)后再插 HDMI 線,系統(tǒng)同樣沒反應(yīng) —— 既不彈出 “新設(shè)備接入” 的提示,也無法輸出畫面,仿佛沒插線一樣。

圖 2 系統(tǒng)運行后熱入HDMI日志截圖
二、“三步曲”分析過程
遇到這類硬件或驅(qū)動的還不明朗的問題,不能上來就改代碼,得按“看狀態(tài)、查日志、終定位”的步驟來,避免思路不明走彎路。
2.1檢查 HDMI 實時狀態(tài)
在 Linux 系統(tǒng)中,HDMI 的熱插拔狀態(tài)可以通過以下節(jié)點查看:
cat /sys/class/drm/card0-HDMI-A-1/status
如果顯示 “connected”,說明系統(tǒng)識別到 HDMI 已連接
如果顯示 “disconnected”,則表示系統(tǒng)未檢測到設(shè)備
這次排查時,兩種故障場景下執(zhí)行該命令,結(jié)果均為 “disconnected”,說明問題出在 “系統(tǒng)檢測邏輯”,而非硬件接口損壞。
2.2扒內(nèi)核日志,找關(guān)鍵異常
內(nèi)核啟動日志藏著很多線索,尤其是 HDMI 驅(qū)動初始化的過程。通過查看日志,發(fā)現(xiàn)了一個關(guān)鍵異常:

圖 3 插著 HDMI 再上電日志截圖
由于是插入 HDMI 再上電的,正常來說,不應(yīng)該出現(xiàn):
3.54686][drm] sunxi-hdmi: drm hdmi detect: disconnect
這說明系統(tǒng)在初始化 HDMI 驅(qū)動時,錯誤地判斷了 HDMI 的連接狀態(tài)。
2.3定位核心問題:驅(qū)動邏輯判斷錯誤
順著日志找到 T527 的 HDMI 驅(qū)動代碼,發(fā)現(xiàn)了關(guān)鍵的判斷邏輯:
驅(qū)動會通過sunxi_hdmi_get_hpd()函數(shù)讀取 HDMI 插拔寄存器的值,決定是否調(diào)用_sunxi_drv_hdmi_hpd_set函數(shù)設(shè)置“連接狀態(tài)”。
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");}
但實際測試發(fā)現(xiàn),在系統(tǒng)啟動初期,HPD 硬件狀態(tài)可能尚未穩(wěn)定,sunxi_hdmi_get_hpd()在“先插線后上電”的場景下,會誤返回“未連接”的值,導(dǎo)致驅(qū)動初始化時就把 HDMI 狀態(tài)設(shè)為“disconnect”。后續(xù)即使熱插拔,系統(tǒng)也因為初始狀態(tài)錯誤,無法正常檢測。
三、解決方案:修正驅(qū)動邏輯
找到問題根源后,解決起來其實簡單了 —— 既然sunxi_hdmi_get_hpd()的判斷存在誤差,那我們就取消對硬件狀態(tài)的依賴,直接強制讓驅(qū)動初始化時將 HPD 狀態(tài)為已連接:
/* 注釋掉原有的判斷邏輯,避免誤判 */// if (boot_state && sunxi_hdmi_get_hpd())// _sunxi_drv_hdmi_hpd_set(hdmi, 0x1);// else// _sunxi_drv_hdmi_hpd_set(hdmi, 0x0);/* 直接強制設(shè)置為“已連接”,讓后續(xù)熱插拔檢測正常工作 */_sunxi_drv_hdmi_hpd_set(hdmi,0x1);
這樣修改后,HDMI會從初始狀態(tài)就開始正常檢測熱插拔事件,而不是被錯誤的初始狀態(tài)“鎖死”。
四、總結(jié)
通過本次問題的排查與修復(fù),我們可以得出以下經(jīng)驗:
硬件狀態(tài)讀取時機很重要,在驅(qū)動初始化階段,硬件可能還未完全就緒,此時讀取的狀態(tài)可能不可靠,初始狀態(tài)的正確設(shè)置對后續(xù)檢測十分重要。
該方案在眺望電子T527平臺上驗證通過,HDMI功能與熱插拔均恢復(fù)正常。
廣州眺望電子科技有限公司專注于嵌入式處理器模組的研發(fā)與應(yīng)用,提供從硬件設(shè)計到驅(qū)動開發(fā),系統(tǒng)解決方案的全流程技術(shù)支持。歡迎關(guān)注我們的公眾號,獲取更多嵌入式項目開發(fā)實戰(zhàn)經(jīng)驗。
-
嵌入式
+關(guān)注
關(guān)注
5186文章
20133瀏覽量
328394 -
HDMI
+關(guān)注
關(guān)注
34文章
1871瀏覽量
158797 -
熱插拔
+關(guān)注
關(guān)注
2文章
262瀏覽量
40492
發(fā)布評論請先 登錄
手把手教你安裝Quartus II
手把手教你學LabVIEW視覺設(shè)計
手把手教你開關(guān)電源PCB排板

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