高碧松
(冠捷顯示科技(廈門)有限公司,福建 廈門 361111)
隨著視頻技術(shù)的飛速發(fā)展,人們對(duì)視頻播放的清晰度及流暢性要求越來(lái)越高,導(dǎo)致視頻數(shù)據(jù)量越來(lái)越大,這就要求傳輸介質(zhì)上的數(shù)據(jù)傳輸速率必須越來(lái)越快。因此,促進(jìn)視頻、音頻信號(hào)從模擬傳輸轉(zhuǎn)向到數(shù)字傳輸;多媒體接口經(jīng)歷了從CVBS(復(fù)合視頻)接口、S-Video接口、YPbPr接口到HDMI接口的升級(jí)換代過(guò)程。目前,HDMI接口是最廣泛應(yīng)用于消費(fèi)類家用電器上的接口。HDMI(High-Definition Multimedia Interface),高清晰度多媒體接口,它是專用于數(shù)字視頻/音頻的傳輸標(biāo)準(zhǔn)接口,由HDMI組織制定,是一種全數(shù)字化視頻和音頻傳輸接口,可以發(fā)送未壓縮的視頻及音頻信號(hào),支持高動(dòng)態(tài)范圍成像(HDR)視頻的傳輸,帶寬高達(dá)18 Gbps[1]。
在某個(gè)大型顯示設(shè)備的設(shè)計(jì)項(xiàng)目中,因客戶需求的HDMI接口個(gè)數(shù)多于該設(shè)備CPU能提供的HDMI接口數(shù)。因此,需要在該項(xiàng)目中引進(jìn)一款HDMI擴(kuò)展芯片(型號(hào)為IT66341),把一個(gè)HDMI接口擴(kuò)展成多個(gè)HDMI接口。該芯片具備把一個(gè)CPU上的HDMI RX接口擴(kuò)展成多個(gè)HDMI RX接口,這些HDMI RX接口都具備與外圍信號(hào)源進(jìn)行數(shù)據(jù)通信的功能。而CPU只需要通過(guò)一條I2C總線向該擴(kuò)展芯片發(fā)送相應(yīng)的控制命令,即可實(shí)現(xiàn)在這些擴(kuò)展的HDMI口間進(jìn)行選擇切換,被選中的HDMI RX接口可與CPU上的HDMI RX通道連接。CPU還可以通過(guò)I2C總線訪問(wèn)該擴(kuò)展芯片,獲取芯片上擴(kuò)展的HDMI接口與信號(hào)源的連接狀態(tài)。
在系統(tǒng)上電開(kāi)機(jī)后,掛載到該I2C總線上的其他功能模塊相繼開(kāi)始工作,對(duì)I2C總線的訪問(wèn)更加頻繁,導(dǎo)致讀/寫總線沖突的概率大大提高,同時(shí)大量的功能集成在同一塊電路板上,電磁環(huán)境更為復(fù)雜,使得HDMI接口擴(kuò)展芯片IT66341在工作過(guò)程中,概率性出現(xiàn)信號(hào)檢測(cè)管腳的電平因電磁干擾而發(fā)生抖動(dòng)誤報(bào)現(xiàn)象。這兩種現(xiàn)象都會(huì)導(dǎo)致CPU讀到代表信號(hào)檢測(cè)管腳電平狀態(tài)的錯(cuò)誤數(shù)據(jù),而系統(tǒng)中很多功能模塊把這些數(shù)據(jù)作為自身運(yùn)行的狀態(tài)依據(jù),導(dǎo)致這些功能模塊工作狀態(tài)錯(cuò)誤,甚至不能正常工作。為了提高產(chǎn)品的穩(wěn)定性及可靠性,必須實(shí)現(xiàn)HDMI擴(kuò)展芯片的I2C通信過(guò)程的容錯(cuò)功能,完成檢測(cè)管腳上的電平的防抖處理,這也是本文章所要研究的內(nèi)容[2]。
在該項(xiàng)目中,用IT66341芯片把CPU上的HDMI2模塊擴(kuò)展成四個(gè)HDMI接口,為了方便連接示意圖繪制,省略IT66341芯片上的HDMI1RX和HDMI3RX接口。CPU用I2C2總線給IT66341芯片發(fā)送命令,控制其進(jìn)行信號(hào)源切換、EDID版本切換、HDCP開(kāi)/關(guān)、檢測(cè)連接到該芯片的JP001、JP002接口的信號(hào)狀態(tài)。其他擴(kuò)展的HDMI RX擴(kuò)展接口省略。
HDMI接口擴(kuò)展芯片IT66341的擴(kuò)展HDMI接口的硬件接口和標(biāo)準(zhǔn)HDMI接口定義相同。
HDMI的連接與斷開(kāi)信號(hào)狀態(tài)檢測(cè)主要是通過(guò)讀取HDMI接口的Pin18管腳電平來(lái)確定的。正常情況下,當(dāng)HDMI接口有線纜接入時(shí),Pin18管腳的電平是+5V高電平;當(dāng)HDMI接口無(wú)線纜接入時(shí),Pin18管腳的電平為0 V低電平。
CPU與IT66341的連接,如圖1所示:IT66341會(huì)不斷檢測(cè)諸如JP001和JP002等接口的+5V管腳(HDMI接口的Pin18管腳),如果該管腳上的電平為0 V,則表示此HDMI接口沒(méi)有接入任何HDMI線纜;如果該管腳上的電平為+5 V,則表示此HDMI接口有HDMI線纜接入。

圖1 CPU與IT66341的連接示意圖
當(dāng)CPU需要獲取IT66341上指定HDMI接口的信號(hào)狀態(tài)時(shí),必須通過(guò)I2C2總線給IT66341擴(kuò)展芯片發(fā)送獲取指定接口狀態(tài)的命令信號(hào),之后再通過(guò)I2C2總線讀取該接口的狀態(tài)值。
因I2C2總線在整個(gè)電路中還掛載著其他多個(gè)功能模塊,當(dāng)硬件系統(tǒng)開(kāi)機(jī)后,這些功能模塊也全部開(kāi)始工作。CPU需要頻繁地往該總線寫入控制這些功能模塊的命令,或者通過(guò)總線讀取功能模塊的相關(guān)數(shù)據(jù)。頻繁地總線讀/寫操作,容易造成總線沖突。當(dāng)總線沖突時(shí),CPU從該總線上讀取的數(shù)據(jù)為臟數(shù)據(jù)。
當(dāng)CPU通過(guò)I2C總線向IT66341芯片發(fā)送讀取HDMI接口狀態(tài)命令,IT66341向CPU返回指定HDMI接口狀態(tài)數(shù)據(jù)包時(shí),與其他模塊的控制命令的傳輸發(fā)生沖突,表示該HDMI接口的狀態(tài)表示位數(shù)據(jù)可能從原來(lái)的1變成0,或者可能從原來(lái)的0變成1。那么,在依賴于該狀態(tài)值的信號(hào)源列表中,信號(hào)源選項(xiàng)狀態(tài)顯示狀態(tài)就會(huì)是錯(cuò)誤的。例如,如果當(dāng)前IT66341上HDMI接口實(shí)際上是處于接入狀態(tài),但因?yàn)榭偩€沖突,數(shù)據(jù)包中表示HDMI狀態(tài)的值從1變成0,那么信號(hào)列表中HDMI選項(xiàng)會(huì)變成灰色(沒(méi)有信號(hào)接入狀態(tài));如果當(dāng)前IT66341上HDMI接口實(shí)際上是處于斷開(kāi)狀態(tài),但因?yàn)榭偩€沖突,數(shù)據(jù)包中表示HDMI的狀態(tài)值從0變成1,那么信號(hào)列表中HDMI選項(xiàng)會(huì)變成高亮色(有信號(hào)接入狀態(tài)),從而造成依賴于信號(hào)狀態(tài)的功能狀態(tài)出現(xiàn)混亂[3]。
抖動(dòng)是指數(shù)字信號(hào)在短時(shí)間內(nèi)瞬間發(fā)生變化。隨著同一電路板上功能模塊的增加,線路愈加密集,相鄰線路很容易因電磁輻射的影響,造成電磁干擾,導(dǎo)致某些器件管腳上的電壓狀態(tài)發(fā)生變化,如果原來(lái)低電平/高電平的狀態(tài),因受到干擾而變成高電平/低電平狀態(tài),造成抖動(dòng)的電氣特性,本項(xiàng)目中的IT66341的擴(kuò)展芯片上的HDMI接口的信號(hào)檢測(cè)管腳Pin18的電平就會(huì)出現(xiàn)抖動(dòng)現(xiàn)象。
該現(xiàn)象的主要表現(xiàn)是:當(dāng)IT66341檢測(cè)JP001接口或者JP002接口的信號(hào)狀態(tài)時(shí),就會(huì)出現(xiàn)JP001/JP002在沒(méi)有HDMI電纜接入時(shí),其Pin18管腳為高電平狀態(tài)(錯(cuò)誤),狀態(tài)值為1,正常的情況是該管腳要處于低電平狀態(tài),狀態(tài)值為0;或者JP001/JP002在有HDMI電纜接入時(shí),其Pin18管腳為低電平狀態(tài)(錯(cuò)誤),其正常情況是該管腳要處于高電平狀態(tài)。因此,CPU通過(guò)I2C2總線讀取到IT66341給出的檢測(cè)結(jié)果數(shù)據(jù)是錯(cuò)誤的。
系統(tǒng)中的信號(hào)檢測(cè)功能是一個(gè)在系統(tǒng)啟動(dòng)時(shí)就開(kāi)始運(yùn)行,直到系統(tǒng)關(guān)機(jī)才會(huì)退出的線程。在該線程中,每隔1秒時(shí)間就會(huì)通過(guò)訪問(wèn)I2C總線,往總線上發(fā)送命令,控制HDMI擴(kuò)展芯片IT66341返回?cái)U(kuò)展HDMI接口的信號(hào)狀態(tài)。設(shè)一次的對(duì)HDMI擴(kuò)展芯片IT66341獲取的HDMI接口的信號(hào)狀態(tài)為S,那么線程中不斷對(duì)HDMI接口的檢測(cè)過(guò)程為S1,S2,S3,…Sn-1,Sn,Sn+1狀態(tài)檢測(cè)序列。
讀/寫I2C總線出現(xiàn)的沖突和信號(hào)抖動(dòng)的現(xiàn)象是概率性瞬間變化的,不會(huì)連續(xù)出現(xiàn)。在S1,S2,S3,…Sn-1,Sn,Sn+1的狀態(tài)檢測(cè)序列中,如果當(dāng)前HDMI接口處于斷開(kāi)狀態(tài),那么狀態(tài)序列對(duì)應(yīng)的值是S1=0, S2=0,S3=0,…Sn-1=0, Sn=0, Sn+1=0;如果出現(xiàn)讀/寫I2C總線錯(cuò)誤或者是信號(hào)抖動(dòng),那么可能出現(xiàn)的是隨機(jī)的狀態(tài)值為1,S1=0, S2=1, S3=0,…Sn-1=1, Sn=0, Sn+1=0,且不是連續(xù)出現(xiàn)錯(cuò)誤狀態(tài)值;如果當(dāng)前HDMI接口處于連接狀態(tài),那么狀態(tài)序列對(duì)應(yīng)的值是S1=1, S2=1, S3=1,…Sn-1=1,Sn=1, Sn+1=1;如果出現(xiàn)讀/寫I2C總線錯(cuò)誤或者是信號(hào)抖動(dòng),那么可能出現(xiàn)的是隨機(jī)的狀態(tài)值為1,S1=1, S2=0,S3=1,…Sn-1=0, Sn=1, Sn+1=1。
讀/寫I2C總線沖突或者是信號(hào)抖動(dòng)都會(huì)導(dǎo)致信號(hào)檢測(cè)功能模塊通過(guò)對(duì)獲取到的臟數(shù)據(jù)分析,誤判為HDMI硬件接口出現(xiàn)狀態(tài)變化,并把變化信息通過(guò)廣播或者通知的方式傳遞給應(yīng)用層中依賴于信號(hào)狀態(tài)的其他功能模塊,使得這些功能模塊突然短暫地改變當(dāng)前邏輯狀態(tài)后,又恢復(fù)到之前的狀態(tài),從而造成整個(gè)系統(tǒng)的不穩(wěn)定。
根據(jù)上述描述的讀/寫I2C總線沖突及信號(hào)抖動(dòng)現(xiàn)象,可確認(rèn)現(xiàn)象的出現(xiàn)是概率性、瞬間發(fā)生的,不是兩個(gè)或者兩個(gè)以上連續(xù)的錯(cuò)誤狀態(tài)出現(xiàn)。當(dāng)接口狀態(tài)發(fā)生改變時(shí),信號(hào)檢測(cè)功能模塊才會(huì)通知依賴于狀態(tài)的其他功能模塊更新邏輯狀態(tài)。例如,在S1=1, S2=0,S3=1狀態(tài)序列中,S1=1表示上一個(gè)檢測(cè)到的HDMI接口處于連接狀態(tài),S2=0表示當(dāng)前檢測(cè)到的HDMI接口處于斷開(kāi)狀態(tài),可以判斷HDMI從連接變成斷開(kāi)狀態(tài),也就意味著HDMI線被拔掉。
S2=0表示當(dāng)前檢測(cè)到的HDMI接口處于斷開(kāi)狀態(tài),S3=1則表示HDMI接口處于連接狀態(tài),意味著HDMI線被插上,HDMI接口從斷開(kāi)變?yōu)檫B接狀態(tài)。整個(gè)S1=1, S2=0, S3=1序列體現(xiàn)的是HDMI線先被拔掉,然后立即又被插上。但實(shí)際上,HDMI線一直保持連接狀態(tài)。
因此,需要在信號(hào)檢測(cè)功能模塊在發(fā)現(xiàn)接口狀態(tài)變化時(shí),進(jìn)行容錯(cuò)和防抖處理。
為了防止讀/寫I2C總線錯(cuò)誤,使用到讀取到的臟數(shù)據(jù),引發(fā)對(duì)HDMI信號(hào)源狀態(tài)的錯(cuò)誤判斷,導(dǎo)致系統(tǒng)中與該功能相關(guān)的模塊的異常工作,必須防止該現(xiàn)象的出現(xiàn),對(duì)擴(kuò)展HDMI信號(hào)源的狀態(tài)確認(rèn)關(guān)鍵節(jié)點(diǎn)做容錯(cuò)處理。
在此,我們必須考慮不對(duì)整個(gè)信號(hào)源檢測(cè)的輪詢機(jī)制產(chǎn)生大的變動(dòng),在不對(duì)每一輪的信號(hào)源檢測(cè)時(shí)間產(chǎn)生明顯延遲的前提下,引入容錯(cuò)處理方案。
如果必須在本輪線程中完成信號(hào)結(jié)果確認(rèn),那么當(dāng)沖突出現(xiàn)后,放棄當(dāng)前總線控制權(quán),在進(jìn)行適當(dāng)延遲后,再次確認(rèn)信號(hào)源狀態(tài)的方法進(jìn)行容錯(cuò)補(bǔ)救處理。
因?yàn)槎秳?dòng)是瞬間發(fā)生的,且不連續(xù)?;谠撉疤釛l件,對(duì)每一個(gè)接口狀態(tài)進(jìn)行多次信號(hào)源狀態(tài)確認(rèn),且對(duì)相鄰兩次讀取檢測(cè)結(jié)果時(shí)間做適當(dāng)延遲,將多次確認(rèn)的信號(hào)源狀態(tài)作為綜合判定的依據(jù)。例如,S1作為上一輪接口狀態(tài)檢測(cè)結(jié)果,S2,S3作為本輪兩次獲取的接口狀態(tài)。
如果S1=1,S2=0,S3=1,S1到S2狀態(tài)變化:1到0的跳變,信號(hào)檢測(cè)功能會(huì)把它判定為HDMI接口從連接狀態(tài)變?yōu)閿嚅_(kāi)狀態(tài),即HDMI線纜被拔除。S2到S3狀態(tài)變化:0到1的跳變,信號(hào)檢測(cè)功能會(huì)把它判定為HDMI接口從斷開(kāi)狀態(tài)變?yōu)檫B接狀態(tài),即HDMI接口有線纜插入。但是,如果S2=0狀態(tài)是信號(hào)抖動(dòng)引起的,那么上述HDMI接口的線纜拔出和插入操作就是系統(tǒng)的誤判??梢?jiàn),用連續(xù)兩次獲取的HDMI接口狀態(tài)來(lái)判定狀態(tài)變化,還是會(huì)因?yàn)樾盘?hào)抖動(dòng)引起系統(tǒng)誤判的。
因此,需要對(duì)圍繞S2,S3哪個(gè)狀態(tài)發(fā)生變化以及該變化是否是抖動(dòng)引起做排列組合分析和處理。如果兩次獲取的狀態(tài)值不足以確認(rèn)最終狀態(tài),那么還需要額外獲取一次當(dāng)前接口狀態(tài),以加強(qiáng)結(jié)果判斷。
在信號(hào)源檢測(cè)功能模塊中,導(dǎo)入上述的容錯(cuò)和防抖措施后,通過(guò)測(cè)試、抓取log數(shù)據(jù)分析,可發(fā)現(xiàn)在讀/寫總線出現(xiàn)沖突和信號(hào)抖動(dòng)時(shí),可很好地起到過(guò)濾、防護(hù)效果。
在讀/寫I2C總線錯(cuò)誤時(shí),采用上述補(bǔ)充讀/寫I2C總線方法雖然可以較好確認(rèn)結(jié)果,但是會(huì)增加線程在本輪信號(hào)檢測(cè)過(guò)程中的處理時(shí)間及代碼的復(fù)雜度。如果需要簡(jiǎn)化處理過(guò)程,那么可以采用當(dāng)讀/寫I2C總線錯(cuò)誤時(shí),可以用上一輪的檢測(cè)結(jié)果作為本次檢測(cè)結(jié)果,跳過(guò)本次檢測(cè)與判定。
同理,當(dāng)在HDMI接口的信號(hào)狀態(tài)發(fā)生變化時(shí),為防止抖動(dòng)引起。在出現(xiàn)頻率較低或者響應(yīng)的實(shí)時(shí)性不高的情況下,也可以采用上一輪的信號(hào)檢測(cè)結(jié)果為作本次檢測(cè)結(jié)果,跳過(guò)本次檢測(cè)與判定。
根據(jù)本項(xiàng)目中的讀/寫I2C總線沖突現(xiàn)象出現(xiàn)的頻率及特點(diǎn)以及分析抖動(dòng)出現(xiàn)的次數(shù)據(jù)及特征,制定此容錯(cuò)及防抖動(dòng)方法,實(shí)驗(yàn)結(jié)果表明,該方法產(chǎn)生效果達(dá)到預(yù)期,可用于當(dāng)前I2C總線的讀/寫沖突的容錯(cuò)以及HDMI信號(hào)檢測(cè)的防抖處理?!?/p>