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

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

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

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

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