此文主要針對利用DS09UB933/34/62/64-Q1等FPD-Link器件搭建的流媒體后視鏡/全景泊車等應(yīng)用中,由于鏈路設(shè)計、應(yīng)用環(huán)境干擾、ESD等情況,導(dǎo)致概率性出現(xiàn)屏幕顯示閃屏或者滾動的現(xiàn)象。利用解串器中的診斷/中斷功能,再配合上有幀buffer及視頻處理能力的SOC,就可以有效地應(yīng)對此類問題。
TI在ADAS應(yīng)用中的FPD-LINK器件均帶有豐富的診斷功能,包括奇偶校驗/反向通道CRC校驗/LOCK狀態(tài)/幀水平寬度檢測/幀垂直寬度檢測等,利用這些診斷功能我們可以十分便利的知道解串器接收到的數(shù)據(jù)是否有問題。同時,我們可以將以上的診斷結(jié)果映射到中斷管腳上,并將中斷腳連接到SOC,如果解串器接收的數(shù)據(jù)檢測出來有問題的話,可以通過中斷腳通知SOC去讀取相關(guān)的寄存器,從而知道具體是出現(xiàn)什么故障了。
而對于接收端帶有幀buffer或者視頻處理能力的SOC的系統(tǒng),在我們知道當前幀的數(shù)據(jù)有問題的話,可以通過清除幀buffer將這些有問題的視頻數(shù)據(jù)清除,重新接收下一幀畫面,并凍結(jié)當前的顯示畫面,那這些問題就不會在屏幕上顯示出來了。
1. 中斷指示腳INTB pin
964/962的中斷指示腳是Pin 6,它為開漏輸出腳,所以需要4.7Kohm上拉到VDDIO電平。當這個腳為低電平時,表明有中斷請求。
Figure.1 962/964的中斷指示腳
而934的中斷指示腳是Pin 25,其與GPIO_3復(fù)用,同樣也是開漏輸出腳,建議4.7Kohm上拉到VDDIO電平。
Figure.2 934的中斷指示腳
2. 962/964中斷功能的使能與配置
2.1 964/962 INTB中斷指示腳的使能
使用INTB中斷指示腳的輸出,需要先將INTERRUPT_CTL 0x23 bit_7的全局中斷使能打開,然后再打開0x23 bit5:0 的中斷源開關(guān),中斷源來自于4個獨立的RX,以及兩個獨立的TX(962/964可以理解為FPD-Link III接收器即RX,以及MIPI CSI發(fā)送器即TX的組合)的各種中斷。
但是如果全局中斷沒有使能,符合條件的中斷還是會在相應(yīng)的中斷狀態(tài)指示寄存器上置位的。例如,要在檢測到IS_RX0中斷的時候,INTB輸出中斷,需要使能IE_RX0以及INT_EN。如果只是使能了IE_RX0,但是沒有使能INT_EN的話,中斷來了只會在INTERRUPT_STS 0x24中斷狀態(tài)指示寄存器進行指示,而不會在INTB腳有指示。
而當INTB中斷指示腳由于TX或者RX的某種故障狀態(tài)而拉低之后,需要通過讀取相應(yīng)中斷源的中斷狀態(tài)指示寄存器,來清除中斷指示腳的中斷狀態(tài)。具體的中斷狀態(tài)寄存器會在稍后的篇幅中詳細介紹。
Figure.3 964/962全局中斷控制寄存器
Figure.4 964/962 0x24中斷狀態(tài)指示寄存器
示例代碼:
#0x30為964的7bit I2C地址
#使能964的全局中斷,以及TX0_1/RX0_1_2_3中斷源
Write( 0x30, 0x23, 0xBF)
#使能964的全局中斷,以及RX0中斷源
Write( 0x30, 0x23, 0x81)
2.2 964/962 各個RX Port的獨立中斷源
964/962的每一個RX Port都有多個獨立中斷源,而這些獨立中斷源都可以通過PORT_ICR_HI 0xD8和PORT_ICR_LO 0xD9寄存器進行使能。同時,在PORT_ISR_HI 0xDA和PORT_ISR_LO 0xDB中斷狀態(tài)指示寄存器,可以提供相應(yīng)的只讀中斷狀態(tài)指示。
而清除中斷指示腳,以及中斷狀態(tài)指示寄存器的中斷狀態(tài),可以通過讀RX_PORT_STS1 0x4D和RX_PORT_STS2 0x4E,以及 CSI_RX_STS 0x7A中斷狀態(tài)指示寄存器進行清除。因為PORT_ISR_HI/LO的中斷狀態(tài)位是copy 0x4D/0x4E/0x7A中斷狀態(tài)寄存器的,
所以只要清除了 0x4D/0x4E/0x7A這三個寄存器的中斷狀態(tài)指示,PORT_ISR_HI/LO的中斷狀態(tài)指示位也會相應(yīng)的清除,同時0x24的相應(yīng)中斷狀態(tài)也會清除。
使能某一個RX Port的獨立中斷源,并使能INTB中斷指示腳,可以遵循以下步驟:
a) 通過設(shè)置PORT_ICR_HI 0xD8和PORT_ICR_LO 0xD9,設(shè)定所需要的獨立中斷源
b) 在INTERRUPT_CTL 0x23 中,將相應(yīng)RX Port的中斷源使能打開
c) 在INTERRUPT_CTL 0x23 中,將全局中斷使能打開
清除某一個RX Port以及INTB腳的中斷狀態(tài)指示,可以遵循以下步驟:
a) (可選)通過INTERRUPT_STS 0x24判斷,是哪個TX port或者某一個RX Port出現(xiàn)中斷
b) (可選)通過PORT_ISR_HI 0xDA和PORT_ISR_LO 0xDB寄存器可以確定具體的中斷源
c) 通過讀取RX_PORT_STS1 0x4D和RX_PORT_STS2 0x4E狀態(tài)寄存器CSI_RX_STS 0x7A狀態(tài)寄存器,即可以清除中斷標志位。
Figure.5 964/962 各RX Port獨立中斷源
Figure.6 964/962 各RX Port獨立中斷狀態(tài)指示寄存器
示例代碼:
#0x30為964的7bit I2C地址
#使能RX_0的獨立中斷源
Write( 0x30, 0x4C, 0x01)
Write( 0x30, 0xD8, 0x07)
Write( 0x30, 0xD9, 0x77)
#使能964的全局中斷,以及RX0的中斷源
Write( 0x30, 0x23, 0x81)
INTERRUPT_STS = ReadI2C(0x30, 0x24) //讀取0x24,判斷中斷源
if ((INTERRUPT_STS & 0x80) 》》 7):
print “# GLOBAL INTERRUPT DETECTED ” //如果bit 7為1,則為全局中斷
if ((INTERRUPT_STS & 0x20) 》》 5):
print “# IS_CSI_TX1 DETECTED ” //如果bit 5為1,則為TX1中斷
if ((INTERRUPT_STS & 0x10) 》》 4):
print “# IS_CSI_TX0 DETECTED ” //如果bit 4為1,則為TX0中斷
if ((INTERRUPT_STS & 0x08) 》》 3):
print “# IS_RX3 DETECTED ” //如果bit 3為1,則為RX3中斷
if ((INTERRUPT_STS & 0x04) 》》 2):
print “# IS_RX2 DETECTED ” //如果bit 2為1,則為RX2中斷
if ((INTERRUPT_STS & 0x02) 》》 1):
print “# IS_RX1 DETECTED ” //如果bit 1為1,則為RX1中斷
if ((INTERRUPT_STS & 0x01) ):
print “# IS_RX0 DETECTED ” //如果bit 0為1,則為RX0中斷
#假如RX0中斷,通過0xDB/0xDA寄存器來判斷具體的中斷類型
Write(0x30, 0x4C,0x01) //選通RX0
PORT_ISR_LO = ReadI2C(0x30, 0xDB) //讀取0xDB狀態(tài)
PORT_ISR_HI = ReadI2C(0x30, 0xDA) //讀取0xDA狀態(tài)
if ((PORT_ISR_LO & 0x40) 》》 6):
print “# IS_LINE_LEN_CHG INTERRUPT DETECTED ” //如果bit 6為1,則為水平寬度變化故障
if ((PORT_ISR_LO & 0x20) 》》 5):
print “# IS_LINE_CNT_CHG DETECTED ” //如果bit 5為1,則為垂直寬度變化故障
if ((PORT_ISR_LO & 0x10) 》》 4):
print “# IS_BUFFER_ERR DETECTED ” //如果bit 4為1,則為RX buffer 溢出故障
if ((PORT_ISR_LO & 0x04) 》》 2):
print “# IS_FPD3_PAR_ERR DETECTED ”//如果bit 2為1,則為RX 奇偶校驗錯誤故障
if ((PORT_ISR_LO & 0x02) 》》 1):
print “# IS_PORT_PASS DETECTED ” //如果bit 1為1,則為RX Pass Fail 故障
if ((PORT_ISR_LO & 0x01) ) :
print “# IS_LOCK_STS DETECTED ” //如果bit 0為1,則為LOCK狀態(tài)變更故障
if ((PORT_ISR_HI & 0x04) 》》 2):
print “# IS_FPD3_ENC_ERR DETECTED ”//如果bit 2為1,則為RX Port 編碼失敗故障
if ((PORT_ISR_HI & 0x02) 》》 1):
print “# IS_BCC_SEQ_ERR DETECTED ”//如果bit 1為1,則為BCC時序錯誤故障
if ((PORT_ISR_HI & 0x01) ) :
print “# IS_BCC_CRC_ERR DETECTED ” //如果bit 0為1,則為BC CRC校驗錯誤故障
#通過讀取0x4D/0x4E/0x7A中斷狀態(tài)指示寄存器,清除中斷狀態(tài)
Write(0x30, 0x4C,0x01) //選通RX0
ReadI2C(0x30, 0x4D)
ReadI2C(0x30, 0x4E)
ReadI2C(0x30, 0x7A)
2.3 964/962 TX Port的獨立中斷源
964/962的MIPI CSI TX端的獨立中斷源有五個, 可以在CSI_TX_ICR 0x36中斷源控制寄存器使能,然后在CSI_TX_ISR 0x37中斷狀態(tài)指示寄存器讀取中斷狀態(tài),同時清除0x36以及INTB相應(yīng)的中斷狀態(tài)。
中斷狀態(tài)寄存器的配置以及清除中斷狀態(tài)的操作,與RX Port類似,這里不做贅述。
3. 934中斷功能的使能與配置
3.1. 934 INTB中斷指示腳的使能
與964/962類似,使用934的INTB中斷指示腳的輸出,需要先將INTERRUPT_CTL 0x23 bit_7的全局中斷使能打開,然后再打開0x23 bit 1:0 的中斷源開關(guān),中斷源來自于2個獨立的RX Port。
相應(yīng)RX Port的中斷狀態(tài)也可以通過INTERRUPT_STS 0x24中斷狀態(tài)指示寄存器進行指示。而當INTB中斷指示腳由于RX的某種故障狀態(tài)而拉低之后,需要通過讀取相應(yīng)中斷源的中斷狀態(tài)指示寄存器,來清除中斷指示腳的中斷狀態(tài)。
示例代碼:
#0x30 為934 的7bit I2C 地址
#使能934 的全局中斷,以及RX0_1 中斷源
Write( 0x30, 0x23, 0x83)
3.2. 934 各個RX Port 的獨立中斷源
934 的每一個RX Port 都有多個獨立中斷源,而這些獨立中斷源都可以通過PORT_ICR_HI 0xD8 和PORT_ICR_LO 0xD9 寄存器進行使能。同時,在PORT_ISR_HI 0xDA 和PORT_ISR_LO 0xDB 中斷狀態(tài)指示寄存器,可以提供相應(yīng)的只讀中斷狀態(tài)指示。
而清除中斷指示腳,以及中斷狀態(tài)指示寄存器的中斷狀態(tài),可以通過讀RX_PORT_STS1 0x4D 和RX_PORT_STS2 0x4E 中斷狀態(tài)指示寄存器進行清除。因為PORT_ISR_HI/LO 的中斷狀態(tài)位是copy 0x4D/0x4E 中斷狀態(tài)寄存器的,所以只要清除了 0x4D/0x4E 這三個寄存器的中斷狀態(tài)指示,PORT_ISR_HI/LO 的中斷狀態(tài)指示位也會相應(yīng)的清除,同時0x24 的相應(yīng)中斷狀態(tài)也會清除。
示例代碼請參考2.2 章節(jié)中對964/962 的操作。
4. 實際應(yīng)用配置
如本文開關(guān)所述,對于流媒體后視鏡/全景泊車等ADAS 應(yīng)用中,由于各種各樣設(shè)計及外在干擾等因素,有可能會導(dǎo)致實際顯示效果因為閃屏問題的出現(xiàn)而不及預(yù)期。為解決此類問題,我們可以利用解串器中的診斷/中斷功能,再配合上有幀buffer 及視頻處理能力的SOC,將有問題的視頻數(shù)據(jù)過濾掉。
下文以964/962 為解串器舉例,著重闡述解串器端應(yīng)該是如何進行中斷功能的使能及配置,SOC 端的處理方式請咨詢相應(yīng)SOC 的支持團隊,此處不做贅述。而934 的配置方式與964/962 十分類似,因為964/962 的獨立中斷源是比934 多的,并且有TX 端的中斷源,我們只需要將多出來的這部分中斷源不做配置,只配置934 獨有的中斷源即可,因此934 的配置方式及示例代碼請參考964/962 的配置。
4.1. 964/962 同步模式下中斷相關(guān)的配置
964/962 有三種同步輸出模式,分別是Basic Synchronized/Line-Interleave/Line- Concatenated。在同步模式下,TX Port 會將各個RX Port 輸入的視頻數(shù)據(jù),根據(jù)相應(yīng)的模式同步好之后,再進行輸出。當其中一個或者多個RX Port 的視頻數(shù)據(jù)超過一個行長度的時間還沒有輸入到buffer 里面的話,即認為當前packet 數(shù)據(jù)同步失敗,964/962 就會將buffer 里面其它RX Port 的視頻數(shù)據(jù)清除,并接收下一個video line 數(shù)據(jù),此時MIPI CSI 口會沒有數(shù)據(jù)輸出。
所以,在同步模式下,因為964/962 會將所有RX Port 的數(shù)據(jù)同步之后再進行輸出,建議只用TX 的獨立中斷源來檢測MIPI CSI 數(shù)據(jù)是否有異常,這樣做相對比較簡單,軟件處理中斷任務(wù)的時間及占用的資源相對較少。另外,因為每一個終端產(chǎn)品的設(shè)計/線束/應(yīng)用環(huán)境等參數(shù)都有所差異,造成不同的系統(tǒng)可能因不同的原因而對某種中斷源比較敏感, 所以在獨立中斷源的使能上也需要因系統(tǒng)而異,根據(jù)調(diào)試結(jié)果逐步減少獨立中斷源的使能,從而防止中斷重復(fù)上報而過多占用系統(tǒng)資源。
示例程序:
#0x30 為964 的7bit I2C 地址
#使能964 TX0_1 的獨立中斷源
Write( 0x30, 0x32, 0x01) //選通TX0
Write( 0x30, 0x36, 0x1F) //可以根據(jù)測試效果減少獨立中斷源
Write( 0x30, 0x32, 0x12) //選通TX1
Write( 0x30, 0x36, 0x1F) //可以根據(jù)測試效果減少獨立中斷源
#使能964 的全局中斷,以及TX0_1 中斷源
Write( 0x30, 0x23, 0xB0)
#當檢測到中斷事件后,通過讀取相關(guān)寄存器判斷中斷源并清除中斷
INTERRUPT_STS = ReadI2C(0x30, 0x24) //讀取0x24,判斷中斷源是來自哪個TX port
if ((INTERRUPT_STS & 0x80) 》》 7):
print “# GLOBAL INTERRUPT DETECTED ”//如果bit 7 為1,則為全局中斷
if ((INTERRUPT_STS & 0x20) 》》 5):
print “# IS_CSI_TX1 DETECTED ” //如果bit 5 為1,則為TX1 中斷
if ((INTERRUPT_STS & 0x10) 》》 4):
print “# IS_CSI_TX0 DETECTED ” //如果bit 4 為1,則為TX0 中斷
#如果是來自與TX1 的中斷,可通過0x37 判斷中斷類型并清除中斷
Write( 0x30, 0x32, 0x12) //選通TX1
CSI_TX_ISR = ReadI2C(0x30, 0x37) //讀取0x37 狀態(tài)并清除中斷
if ((CSI_TX_ISR & 0x10) 》》 4):
print “# IS_RX_PORT_INT ” //如果bit 4 為1,則為RX 出現(xiàn)中斷故障
if ((CSI_TX_ISR & 0x08) 》》 3):
print “# IS_CSI_SYNC_ERROR ” //如果bit 3 為1,則為輸入信號同步錯誤故障
if ((CSI_TX_ISR & 0x04) 》》 2):
print “# IS_CSI_SYNC ” //如果bit 2 為1,則為TX 同步時出現(xiàn)錯誤故障
if ((CSI_TX_ISR & 0x02) 》》 1):
print “# IS_CSI_PASS_ERROR ” //如果bit 1 為1,則為RX 數(shù)據(jù)不符合PASS 標準
if ((CSI_TX_ISR & 0x01)):
print “# IS_CSI_PASS ” //如果bit 0 為1,則為TX 數(shù)據(jù)不符合PASS 標準
4.2. 964/962 異步模式下中斷相關(guān)的配置
當964/962 的輸出模式配置為best-effort round robin forwarding 時,便工作在異步輸出模式。在該模式下,TX Port 使用標準的CSI-2 格式傳輸視頻流,且各個攝像頭的視頻數(shù)據(jù)的輸出沒有特定的順序,當RX Port 的數(shù)據(jù)ready 后就進行輸出,而不會等待同步完成后再輸出。而如果同一時間多個packet 都ready 的話,TX 的發(fā)送器會工作在round robin 的循環(huán)模式,逐個將RX 的數(shù)據(jù)循環(huán)進行輸出。
異步模式可以接受RX Port 的數(shù)據(jù)是不同的格式,并且不需要各個port 之間的數(shù)據(jù)同步, 但是需要接收端的SOC 能根據(jù)VC ID 和data type 來區(qū)分不同輸入源。
在異步模式下,因為962/964 不會檢測同步信號,所以為了提高系統(tǒng)處理的效率,可以不使用TX 端的獨立中斷源來進行故障的判斷,而是使能RX Port 的獨立中斷源來進行檢測。同樣的,在對系統(tǒng)進行測試的時候,如果發(fā)現(xiàn)964/962 有重復(fù)上報中斷的話,需要優(yōu)化0x23/0xD8/0xD9 的獨立中斷源使能,看系統(tǒng)對哪些中斷源比較敏感,然后關(guān)閉不必要的中斷源,避免重復(fù)上報中斷導(dǎo)致多幀畫面被丟棄。
示例程序:
#0x30為964的7bit I2C地址
#使能964 RX0_1_2_3的獨立中斷源
Write( 0x30, 0x4C, 0x01) //選通RX_0
Write( 0x30, 0xD8, 0x07) //需要根據(jù)測試效果減少獨立中斷源
Write( 0x30, 0xD9, 0x77)
Write( 0x30, 0x4C, 0x12) //選通RX_1
Write( 0x30, 0xD8, 0x07) //需要根據(jù)測試效果減少獨立中斷源
Write( 0x30, 0xD9, 0x77)
Write( 0x30, 0x4C, 0x24) //選通RX_2
Write( 0x30, 0xD8, 0x07) //需要根據(jù)測試效果減少獨立中斷源
Write( 0x30, 0xD9, 0x77)
Write( 0x30, 0x4C, 0x38) //選通RX_3
Write( 0x30, 0xD8, 0x07) //需要根據(jù)測試效果減少獨立中斷源
Write( 0x30, 0xD9, 0x77)
#使能964的全局中斷,以及RX0_1_2_3中斷源
Write( 0x30, 0x23, 0x8F)
#當檢測到中斷事件后,通過讀取相關(guān)寄存器判斷中斷源并清除中斷
INTERRUPT_STS = ReadI2C(0x30, 0x24) //讀取0x24,判斷中斷源是來自哪個RX port
if ((INTERRUPT_STS & 0x80) 》》 7):
print “# GLOBAL INTERRUPT DETECTED ” //如果bit 7為1,則為全局中斷
if ((INTERRUPT_STS & 0x08) 》》 3):
print “# IS_RX3 DETECTED ” //如果bit 3為1,則為RX3中斷
if ((INTERRUPT_STS & 0x04) 》》 2):
print “# IS_RX2 DETECTED ” //如果bit 2為1,則為RX2中斷
if ((INTERRUPT_STS & 0x02) 》》 1):
print “# IS_RX1 DETECTED ” //如果bit 1為1,則為RX1中斷
if ((INTERRUPT_STS & 0x01) ):
print “# IS_RX0 DETECTED ” //如果bit 0為1,則為RX0中斷
#假如RX0中斷,通過0xDB/0xDA寄存器來判斷具體的中斷類型。
#對RX_1_2_3的中斷施行同樣的操作。
Write(0x30, 0x4C,0x01) //選通RX0
PORT_ISR_LO = ReadI2C(0x30, 0xDB) //讀取0xDB狀態(tài)
PORT_ISR_HI = ReadI2C(0x30, 0xDA) //讀取0xDA狀態(tài)
if ((PORT_ISR_LO & 0x40) 》》 6):
print “# IS_LINE_LEN_CHG INTERRUPT DETECTED ” //如果bit 6為1,則為水平寬度變化故障
if ((PORT_ISR_LO & 0x20) 》》 5):
print “# IS_LINE_CNT_CHG DETECTED ” //如果bit 5為1,則為垂直寬度變化故障
if ((PORT_ISR_LO & 0x10) 》》 4):
print “# IS_BUFFER_ERR DETECTED ” //如果bit 4為1,則為RX buffer 溢出故障
if ((PORT_ISR_LO & 0x04) 》》 2):
print “# IS_FPD3_PAR_ERR DETECTED ” //如果bit 2為1,則為RX 奇偶校驗錯誤
if ((PORT_ISR_LO & 0x02) 》》 1):
print “# IS_PORT_PASS DETECTED ” //如果bit 1為1,則為RX Pass Fail 故障
if ((PORT_ISR_LO & 0x01) ) :
print “# IS_LOCK_STS DETECTED ” //如果bit 0為1,則為LOCK狀態(tài)變更故障
if ((PORT_ISR_HI & 0x04) 》》 2):
print “# IS_FPD3_ENC_ERR DETECTED ” //如果bit 2為1,則為RX 編碼失敗故障
if ((PORT_ISR_HI & 0x02) 》》 1):
print “# IS_BCC_SEQ_ERR DETECTED ” //如果bit 1為1,則為BC時序錯誤故障
if ((PORT_ISR_HI & 0x01) ) :
print “# IS_BCC_CRC_ERR DETECTED ”//如果bit 0為1,則為BC CRC校驗錯誤故障
#通過讀取0x4D/0x4E/0x7A中斷狀態(tài)指示寄存器,清除中斷狀態(tài)
Write(0x30, 0x4C,0x01) //選通RX0
ReadI2C(0x30, 0x4D) //清除中斷
ReadI2C(0x30, 0x4E)
ReadI2C(0x30, 0x7A)
審核編輯:郭婷
-
寄存器
+關(guān)注
關(guān)注
31文章
5359瀏覽量
120796 -
soc
+關(guān)注
關(guān)注
38文章
4188瀏覽量
218615 -
adas
+關(guān)注
關(guān)注
309文章
2189瀏覽量
208747
發(fā)布評論請先 登錄
相關(guān)推薦
評論