高碧松
(冠捷顯示科技(廈門)有限公司,福建 廈門 361111)
隨著視頻技術的飛速發(fā)展,人們對視頻播放的清晰度及流暢性要求越來越高,導致視頻數據量越來越大,這就要求傳輸介質上的數據傳輸速率必須越來越快。因此,促進視頻、音頻信號從模擬傳輸轉向到數字傳輸;多媒體接口經歷了從CVBS(復合視頻)接口、S-Video接口、YPbPr接口到HDMI接口的升級換代過程。目前,HDMI接口是最廣泛應用于消費類家用電器上的接口。HDMI(High-Definition Multimedia Interface),高清晰度多媒體接口,它是專用于數字視頻/音頻的傳輸標準接口,由HDMI組織制定,是一種全數字化視頻和音頻傳輸接口,可以發(fā)送未壓縮的視頻及音頻信號,支持高動態(tài)范圍成像(HDR)視頻的傳輸,帶寬高達18 Gbps[1]。
在某個大型顯示設備的設計項目中,因客戶需求的HDMI接口個數多于該設備CPU能提供的HDMI接口數。因此,需要在該項目中引進一款HDMI擴展芯片(型號為IT66341),把一個HDMI接口擴展成多個HDMI接口。該芯片具備把一個CPU上的HDMI RX接口擴展成多個HDMI RX接口,這些HDMI RX接口都具備與外圍信號源進行數據通信的功能。而CPU只需要通過一條I2C總線向該擴展芯片發(fā)送相應的控制命令,即可實現在這些擴展的HDMI口間進行選擇切換,被選中的HDMI RX接口可與CPU上的HDMI RX通道連接。CPU還可以通過I2C總線訪問該擴展芯片,獲取芯片上擴展的HDMI接口與信號源的連接狀態(tài)。
在系統(tǒng)上電開機后,掛載到該I2C總線上的其他功能模塊相繼開始工作,對I2C總線的訪問更加頻繁,導致讀/寫總線沖突的概率大大提高,同時大量的功能集成在同一塊電路板上,電磁環(huán)境更為復雜,使得HDMI接口擴展芯片IT66341在工作過程中,概率性出現信號檢測管腳的電平因電磁干擾而發(fā)生抖動誤報現象。這兩種現象都會導致CPU讀到代表信號檢測管腳電平狀態(tài)的錯誤數據,而系統(tǒng)中很多功能模塊把這些數據作為自身運行的狀態(tài)依據,導致這些功能模塊工作狀態(tài)錯誤,甚至不能正常工作。為了提高產品的穩(wěn)定性及可靠性,必須實現HDMI擴展芯片的I2C通信過程的容錯功能,完成檢測管腳上的電平的防抖處理,這也是本文章所要研究的內容[2]。
在該項目中,用IT66341芯片把CPU上的HDMI2模塊擴展成四個HDMI接口,為了方便連接示意圖繪制,省略IT66341芯片上的HDMI1RX和HDMI3RX接口。CPU用I2C2總線給IT66341芯片發(fā)送命令,控制其進行信號源切換、EDID版本切換、HDCP開/關、檢測連接到該芯片的JP001、JP002接口的信號狀態(tài)。其他擴展的HDMI RX擴展接口省略。
HDMI接口擴展芯片IT66341的擴展HDMI接口的硬件接口和標準HDMI接口定義相同。
HDMI的連接與斷開信號狀態(tài)檢測主要是通過讀取HDMI接口的Pin18管腳電平來確定的。正常情況下,當HDMI接口有線纜接入時,Pin18管腳的電平是+5V高電平;當HDMI接口無線纜接入時,Pin18管腳的電平為0 V低電平。
CPU與IT66341的連接,如圖1所示:IT66341會不斷檢測諸如JP001和JP002等接口的+5V管腳(HDMI接口的Pin18管腳),如果該管腳上的電平為0 V,則表示此HDMI接口沒有接入任何HDMI線纜;如果該管腳上的電平為+5 V,則表示此HDMI接口有HDMI線纜接入。
圖1 CPU與IT66341的連接示意圖
當CPU需要獲取IT66341上指定HDMI接口的信號狀態(tài)時,必須通過I2C2總線給IT66341擴展芯片發(fā)送獲取指定接口狀態(tài)的命令信號,之后再通過I2C2總線讀取該接口的狀態(tài)值。
因I2C2總線在整個電路中還掛載著其他多個功能模塊,當硬件系統(tǒng)開機后,這些功能模塊也全部開始工作。CPU需要頻繁地往該總線寫入控制這些功能模塊的命令,或者通過總線讀取功能模塊的相關數據。頻繁地總線讀/寫操作,容易造成總線沖突。當總線沖突時,CPU從該總線上讀取的數據為臟數據。
當CPU通過I2C總線向IT66341芯片發(fā)送讀取HDMI接口狀態(tài)命令,IT66341向CPU返回指定HDMI接口狀態(tài)數據包時,與其他模塊的控制命令的傳輸發(fā)生沖突,表示該HDMI接口的狀態(tài)表示位數據可能從原來的1變成0,或者可能從原來的0變成1。那么,在依賴于該狀態(tài)值的信號源列表中,信號源選項狀態(tài)顯示狀態(tài)就會是錯誤的。例如,如果當前IT66341上HDMI接口實際上是處于接入狀態(tài),但因為總線沖突,數據包中表示HDMI狀態(tài)的值從1變成0,那么信號列表中HDMI選項會變成灰色(沒有信號接入狀態(tài));如果當前IT66341上HDMI接口實際上是處于斷開狀態(tài),但因為總線沖突,數據包中表示HDMI的狀態(tài)值從0變成1,那么信號列表中HDMI選項會變成高亮色(有信號接入狀態(tài)),從而造成依賴于信號狀態(tài)的功能狀態(tài)出現混亂[3]。
抖動是指數字信號在短時間內瞬間發(fā)生變化。隨著同一電路板上功能模塊的增加,線路愈加密集,相鄰線路很容易因電磁輻射的影響,造成電磁干擾,導致某些器件管腳上的電壓狀態(tài)發(fā)生變化,如果原來低電平/高電平的狀態(tài),因受到干擾而變成高電平/低電平狀態(tài),造成抖動的電氣特性,本項目中的IT66341的擴展芯片上的HDMI接口的信號檢測管腳Pin18的電平就會出現抖動現象。
該現象的主要表現是:當IT66341檢測JP001接口或者JP002接口的信號狀態(tài)時,就會出現JP001/JP002在沒有HDMI電纜接入時,其Pin18管腳為高電平狀態(tài)(錯誤),狀態(tài)值為1,正常的情況是該管腳要處于低電平狀態(tài),狀態(tài)值為0;或者JP001/JP002在有HDMI電纜接入時,其Pin18管腳為低電平狀態(tài)(錯誤),其正常情況是該管腳要處于高電平狀態(tài)。因此,CPU通過I2C2總線讀取到IT66341給出的檢測結果數據是錯誤的。
系統(tǒng)中的信號檢測功能是一個在系統(tǒng)啟動時就開始運行,直到系統(tǒng)關機才會退出的線程。在該線程中,每隔1秒時間就會通過訪問I2C總線,往總線上發(fā)送命令,控制HDMI擴展芯片IT66341返回擴展HDMI接口的信號狀態(tài)。設一次的對HDMI擴展芯片IT66341獲取的HDMI接口的信號狀態(tài)為S,那么線程中不斷對HDMI接口的檢測過程為S1,S2,S3,…Sn-1,Sn,Sn+1狀態(tài)檢測序列。
讀/寫I2C總線出現的沖突和信號抖動的現象是概率性瞬間變化的,不會連續(xù)出現。在S1,S2,S3,…Sn-1,Sn,Sn+1的狀態(tài)檢測序列中,如果當前HDMI接口處于斷開狀態(tài),那么狀態(tài)序列對應的值是S1=0, S2=0,S3=0,…Sn-1=0, Sn=0, Sn+1=0;如果出現讀/寫I2C總線錯誤或者是信號抖動,那么可能出現的是隨機的狀態(tài)值為1,S1=0, S2=1, S3=0,…Sn-1=1, Sn=0, Sn+1=0,且不是連續(xù)出現錯誤狀態(tài)值;如果當前HDMI接口處于連接狀態(tài),那么狀態(tài)序列對應的值是S1=1, S2=1, S3=1,…Sn-1=1,Sn=1, Sn+1=1;如果出現讀/寫I2C總線錯誤或者是信號抖動,那么可能出現的是隨機的狀態(tài)值為1,S1=1, S2=0,S3=1,…Sn-1=0, Sn=1, Sn+1=1。
讀/寫I2C總線沖突或者是信號抖動都會導致信號檢測功能模塊通過對獲取到的臟數據分析,誤判為HDMI硬件接口出現狀態(tài)變化,并把變化信息通過廣播或者通知的方式傳遞給應用層中依賴于信號狀態(tài)的其他功能模塊,使得這些功能模塊突然短暫地改變當前邏輯狀態(tài)后,又恢復到之前的狀態(tài),從而造成整個系統(tǒng)的不穩(wěn)定。
根據上述描述的讀/寫I2C總線沖突及信號抖動現象,可確認現象的出現是概率性、瞬間發(fā)生的,不是兩個或者兩個以上連續(xù)的錯誤狀態(tài)出現。當接口狀態(tài)發(fā)生改變時,信號檢測功能模塊才會通知依賴于狀態(tài)的其他功能模塊更新邏輯狀態(tài)。例如,在S1=1, S2=0,S3=1狀態(tài)序列中,S1=1表示上一個檢測到的HDMI接口處于連接狀態(tài),S2=0表示當前檢測到的HDMI接口處于斷開狀態(tài),可以判斷HDMI從連接變成斷開狀態(tài),也就意味著HDMI線被拔掉。
S2=0表示當前檢測到的HDMI接口處于斷開狀態(tài),S3=1則表示HDMI接口處于連接狀態(tài),意味著HDMI線被插上,HDMI接口從斷開變?yōu)檫B接狀態(tài)。整個S1=1, S2=0, S3=1序列體現的是HDMI線先被拔掉,然后立即又被插上。但實際上,HDMI線一直保持連接狀態(tài)。
因此,需要在信號檢測功能模塊在發(fā)現接口狀態(tài)變化時,進行容錯和防抖處理。
為了防止讀/寫I2C總線錯誤,使用到讀取到的臟數據,引發(fā)對HDMI信號源狀態(tài)的錯誤判斷,導致系統(tǒng)中與該功能相關的模塊的異常工作,必須防止該現象的出現,對擴展HDMI信號源的狀態(tài)確認關鍵節(jié)點做容錯處理。
在此,我們必須考慮不對整個信號源檢測的輪詢機制產生大的變動,在不對每一輪的信號源檢測時間產生明顯延遲的前提下,引入容錯處理方案。
如果必須在本輪線程中完成信號結果確認,那么當沖突出現后,放棄當前總線控制權,在進行適當延遲后,再次確認信號源狀態(tài)的方法進行容錯補救處理。
因為抖動是瞬間發(fā)生的,且不連續(xù)?;谠撉疤釛l件,對每一個接口狀態(tài)進行多次信號源狀態(tài)確認,且對相鄰兩次讀取檢測結果時間做適當延遲,將多次確認的信號源狀態(tài)作為綜合判定的依據。例如,S1作為上一輪接口狀態(tài)檢測結果,S2,S3作為本輪兩次獲取的接口狀態(tài)。
如果S1=1,S2=0,S3=1,S1到S2狀態(tài)變化:1到0的跳變,信號檢測功能會把它判定為HDMI接口從連接狀態(tài)變?yōu)閿嚅_狀態(tài),即HDMI線纜被拔除。S2到S3狀態(tài)變化:0到1的跳變,信號檢測功能會把它判定為HDMI接口從斷開狀態(tài)變?yōu)檫B接狀態(tài),即HDMI接口有線纜插入。但是,如果S2=0狀態(tài)是信號抖動引起的,那么上述HDMI接口的線纜拔出和插入操作就是系統(tǒng)的誤判??梢姡眠B續(xù)兩次獲取的HDMI接口狀態(tài)來判定狀態(tài)變化,還是會因為信號抖動引起系統(tǒng)誤判的。
因此,需要對圍繞S2,S3哪個狀態(tài)發(fā)生變化以及該變化是否是抖動引起做排列組合分析和處理。如果兩次獲取的狀態(tài)值不足以確認最終狀態(tài),那么還需要額外獲取一次當前接口狀態(tài),以加強結果判斷。
在信號源檢測功能模塊中,導入上述的容錯和防抖措施后,通過測試、抓取log數據分析,可發(fā)現在讀/寫總線出現沖突和信號抖動時,可很好地起到過濾、防護效果。
在讀/寫I2C總線錯誤時,采用上述補充讀/寫I2C總線方法雖然可以較好確認結果,但是會增加線程在本輪信號檢測過程中的處理時間及代碼的復雜度。如果需要簡化處理過程,那么可以采用當讀/寫I2C總線錯誤時,可以用上一輪的檢測結果作為本次檢測結果,跳過本次檢測與判定。
同理,當在HDMI接口的信號狀態(tài)發(fā)生變化時,為防止抖動引起。在出現頻率較低或者響應的實時性不高的情況下,也可以采用上一輪的信號檢測結果為作本次檢測結果,跳過本次檢測與判定。
根據本項目中的讀/寫I2C總線沖突現象出現的頻率及特點以及分析抖動出現的次數據及特征,制定此容錯及防抖動方法,實驗結果表明,該方法產生效果達到預期,可用于當前I2C總線的讀/寫沖突的容錯以及HDMI信號檢測的防抖處理?!?/p>