摘要
本文詳細(xì)介紹了title="DM368" target="_blank">DM368 視頻前端支持的輸入數(shù)字信號格式。并以MT9D131 和PC VGA 信號為例,將兩者的時序和 DM368 視頻前端配置參數(shù)一一匹配。同時介紹了如何合理配置和使用 VD 中斷,為 DM368 用戶正確采集數(shù)據(jù)提供了參考。本文內(nèi)容也可以給 DM8127、DM385 芯片的用戶在使用視頻攝像并行輸入口采集時提供幫助。
1 前言
DM368 是TI 達芬奇系列芯片中的一顆,被廣泛的使用在IPNC(IP net camera 網(wǎng)絡(luò)攝像機)的應(yīng)用領(lǐng)域里。對于IPNC 應(yīng)用,首先就需要將視頻信號送入DM368 里面,這就需要使用到DM368 的視頻前端(VPFE - Video Processing Front End)。DM368 的視頻前端主要包含了IPIPEIF(Image Pipe Interface 圖像管道接口),ISIF(Image Signal Interface 圖像信號接口),IPIPE (Image Pipe 圖像管道),Resizer(縮放器)四個部分。IPIPEIF 功能是數(shù)據(jù)通路連接,以及把數(shù)據(jù)整合成后端模塊接口可以接入的格式/大小。ISIF 是視頻信號的輸入口,可以支持Bayer 格式的RAW 數(shù)據(jù)(原始數(shù)據(jù))或者是YUV 的數(shù)據(jù)的輸入。IPIPE 主要是做ISP 的處理。Resizer 起到了對圖像縮放和圖像存儲格式轉(zhuǎn)換的作用。本文是基于IPIPEIF 將外部并口輸入數(shù)據(jù)送入ISIF 處理的基礎(chǔ)上展開討論。
圖 1. 視頻處理前端[1]
如何將輸入信號和DM368 視頻前端參數(shù)一一對應(yīng)?如何獲取外部的RAW 數(shù)據(jù)以及RAW 轉(zhuǎn)換成的對應(yīng)的YUV 數(shù)據(jù)?如何只采集或者處理圖像中的一部分區(qū)域?如何配置VD 中斷觸發(fā)的時機?在VD 中斷里面我們應(yīng)該處理什么?希望在閱讀完本文后,你可以找到相應(yīng)的答案。
2 DM368 的前端信號輸入
如果用戶外接傳感器(sensor)輸出RAW 數(shù)據(jù)或者YUV 數(shù)據(jù)到DM368,為了采集到正確的數(shù)據(jù),我們需要了解DM368 的視頻前端是如何解讀信號,以獲得正確的數(shù)據(jù)。如果用戶使用的是FPGA 輸出信號到DM368,那就更需要了解DM368 視頻前端支持的信號格式,正確輸出DM368可以接收的信號。
2.1 輸入信號的物理連接
DM368 視頻前端支持并口的信號輸入,包括PCLK(像素時鐘),8 到16 位數(shù)據(jù)線,HD(行同步)信號,VD(場同步)信號??梢灾С肿疃?6 位的Bayer 格式的RAW 數(shù)據(jù)輸入。也可以支持內(nèi)嵌同步或者外部信號同步的8 位或者16 位的YUV422 信號輸入。如果是內(nèi)嵌同步,則不需要接入HD 信號和VD 信號。對于輸入內(nèi)嵌同步的信號,DM368 硬件可以自動解析出數(shù)據(jù)上嵌入的同步信息給芯片內(nèi)部使用。DM368 的PCLK 最高可支持120MHz,可以支持720p60、 1080p30 等分辨率的輸入,也可以支持較大分辨率,例如五百萬、八百萬等分辨率,但幀率是非實時(小于30 幀)的。
DM368 的視頻前端ISIF 可以支持master(主) 模式或者slave (從)模式。所謂master 模式就是PCLK、VD 和HD 由DM368 向外發(fā)出。而slave 模式是外部設(shè)備提供PCLK、VD 和HD 信號給DM368。在實際的應(yīng)用里面絕大部分的情況都使用采slave 模式。
2.2 DM368 視頻前端對輸入信號的解析
2.2.1 ISIF 對信號的解析
無論是master 模式還是slave 模式,DM368 的視頻前端接口ISIF 對于信號的處理是一樣的。
圖 2. 幀圖像格式[1]
圖2 的時序通常認(rèn)為水平同步和垂直同步信號都為高電平有效,需要配置ISIF 的MODESET. HDPOL=MODESET.VDPOL=0。在這種情況下,水平同步信號寬度為HDW (HD pulse width),以像素為單位。垂直同步信號寬度為 VDW (VD pulse width) ,以行數(shù)為單位。 PLLN(Pixels per line)是每行的像素個數(shù),也就是相鄰兩個行同步信號間的像素個數(shù)。LPFR 是Lines per frame 的縮寫,表示每幀數(shù)據(jù)有多少行,也是相鄰兩個場同步信號之間的行數(shù)。在slave 模式下,PLCK/HD/VD 都是外部輸入的,ISIF 寄存器HDW/VDW/PLLN 是不需要配置的。圖2 中的灰色區(qū)域我們叫做有效數(shù)據(jù)區(qū)域,也就是用戶希望獲得的有效數(shù)據(jù)。而斜線陰影區(qū)域就是消隱區(qū)域。消隱區(qū)域在視頻前端處理中也是必不可少的部分,關(guān)于這點我們會在第3 節(jié)詳細(xì)介紹。
如果你使用的是單次(one shot)模式,或者在連續(xù)(continuous)模式下,你需要保存RAW 數(shù)據(jù),那你就需要配置 SPH( Start pixel horizontal 水平方向起始像素),SLV0/1 (Start line vertical - field 0/1 垂直方向奇偶場起始行),LNH( Number of pixels in line 每行像素個數(shù)),LNV (Number of lines vertical 垂直方向行數(shù))。這是為了告訴DM368 你需要把輸入的圖像的哪部分寫到DDR。也就是說你可以選擇只輸出有效數(shù)據(jù)里面的某一部分到DDR。
SPH 告訴硬件在同步信號有效以后從哪個像素開始寫入DDR。請注意這里的HD 信號有效起始點是指同步信號有效的沿,不是從同步信號脈沖結(jié)束后作為計數(shù)像素的起點。例如,如果HD 信號高電平有效,就是HD 上升沿后開始計數(shù),LNH 個PCLK(也就是像素)后將接收到的數(shù)據(jù)寫入DDR。同樣 SLV0/1 告訴硬件從哪行數(shù)據(jù)開始需要寫入 DDR,LNV 決定了寫多少行數(shù)據(jù)到 DDR。所以調(diào)整ISIF 的SPH,SLV0/1, LNH 和LNV 就可以調(diào)整保存到DDR 上的RAW 數(shù)據(jù)在原圖中的位置,以及 RAW 數(shù)據(jù)段大小(長寬)。如果不需要寫入 RAW 到DDR,那就不需要配置 SPH, SLV0/1 ,LNH 和LNV。
圖2 的時序如果配置為同步信號低電平有效也是可以的。但是如果配置為低電平有效,相關(guān)的參數(shù)就發(fā)生了變化。例如水平同步信號寬度就變?yōu)?nbsp;PPLN-HDW,垂直同步信號寬度為 LPFR- VDW。SPH 和 SLV0/1 都變成了 0。所以在配置 ISIF 相關(guān)寄存器前首先需要把同步信號的極性確定下來。 要采集到正確的數(shù)據(jù),DM368 采樣數(shù)據(jù)時機必須和傳感器輸出數(shù)據(jù)的時機匹配。在DM368 上默認(rèn)是PCLK 的下降沿采樣數(shù)據(jù)。用戶可以通過修改SYSTEM module 寄存器VPSS_CLK_CTRL的PCLK_INV[2] 位來改變 PCLK 采樣沿。
2.2.2 IPIPE 和Resizer 對信號的解析和處理
如果ISIF 直接通過IPIPEIF 連接到IPIPE,那所有的圖像數(shù)據(jù),也就是圖2 里的global frame 都會傳輸?shù)絀PIPE。在IPIPE 里面 用戶需要配置SRC_HPS (Horizontal Start Position ),SRC_VPS(Vertical Start Position),SRC_HSZ( Horizontal Processing Size)和SRC_VSZ( Vertical Processing Size),來確認(rèn)global frame 里面的哪一部分需要IPIPE 來處理。
在resizer 的模塊里面,也有SRC_HPS,SRC_VPS,SRC_HSZ 和SRC_VSZ 可以配置resizer處理的圖像的區(qū)域。如果IPIPE 的輸出到resizer 已經(jīng)是需要處理的區(qū)域,那SRC_HPS,SRC_VPS 就可以配置為0,而resizer 的SRC_HSZ,SRC_VSZ 等于IPIPE 的SRC_HSZ,SRC_VSZ。如果ISIF 的輸出是通過IPIPEIF 直接到resizer(沒有經(jīng)過IPIPE),resizer 的SRC_HPS,SRC_VPS 就不能配置為0 了,需要用戶根據(jù)需要處理的圖像合理的配置resizer 的SRC_HPS,SRC_VPS 寄存器。
2.2.3 RAW 數(shù)據(jù)和YUV 數(shù)據(jù)的匹配
在連續(xù)模式下,用戶同時獲得resizer 輸出的YUV 和ISIF 輸出的RAW,時常有用戶發(fā)現(xiàn)自己保存的RAW 數(shù)據(jù)和Resizer 輸出的YUV 數(shù)據(jù)不匹配,有一定的偏移。這種問題的原因是IPIPE,Resizer 里面的SRC_HPS,SRC_VPS,SRC_HSZ 和SRC_VSZ 和ISIF 里面的寫入DDR 時候配置的偏移和大小不匹配。IPIPE/Resizer 和ISIF 的寄存器本身是沒有直接關(guān)系的,這就需要用戶將它們一一對應(yīng),匹配起來。例如ISIF 輸出的數(shù)據(jù)輸入給IPIPE,為了讓RAW 和YUV 匹配,需要ISIF 的SPH 等于IPIPE 的SRC_HPS,ISIF 的SLV0/1 等于IPIPE 的SRC_VPS,ISIF 的LNH 等于IPIPE 的SRC_ HSZ,ISIF 的LNV 等于IPIPE 的SRC_ VSZ。而Resizer 的SRC_HPS,SRC_VPS 需要配置為0,而resizer 的SRC_HSZ,SRC_VSZ 要等于IPIPE 的SRC_HSZ,SRC_VSZ。
在單次模式下,也就是數(shù)據(jù)通路ISIF->DDR->IPIPEIF->IPIPE(Resizer),由于IPIPE 的輸入是DDR 上的RAW 數(shù)據(jù),有效數(shù)據(jù)的獲取已經(jīng)在ISIF 輸出到DDR 配置里面實現(xiàn)了,IPIPE 里面的處理數(shù)據(jù)的起始位置就可以是(0,0)了。
這樣無論是在連續(xù)模式還是在單次模式下,RAW 數(shù)據(jù)和RAW 輸出轉(zhuǎn)換出的YUV 數(shù)據(jù)就可以完全匹配了。
2.3 DM368 接入傳感器輸出
2.3.1 MT9D131 同步信號極性
圖 3. MT9D131 時序圖 [3]
圖3 是美光的MT9D131 傳感器的時序圖。圖3 中FRAME_VALID 表示VD(垂直同步),
LINE_VALID 表示HD(水平同步)。
在DM368 IPNC v3.1 的軟件(av_capture\framework\drv\usermod\src\imgs_mt9d131_2mp\drv_imgsIsifCfg_MT9D131_2MP.c)里面對于同步信號的極性有如下的配置,設(shè)定同步信號都是高有效。
圖3 中的HD 信號寬度是比較寬的,不是個脈沖,而是一行數(shù)據(jù)的個數(shù)。所以HD 信號的寬度可長可短,可以是幾個像素(如圖2),或者是一行數(shù)據(jù)的個數(shù)(如圖3)。VD 信號的寬度也是同理。無論同步信號是寬是窄,最重要的是先定義好同步型號的極性,因為ISIF 參數(shù)的配置都要以這點為基礎(chǔ)。
2.3.2 MT9D131 的一幀數(shù)據(jù)分析
圖 4. MT9D131 像素陣列描述 [3]
MT9D131 最大可以輸出兩百萬像素的圖像。從圖4 可以看出MT9D131 的sensor 輸出實際上是1688x1256 個像素(起始像素是0,0),是大于兩百萬的。原因是其中包含了黑色區(qū)域和無效區(qū)域,有效的圖像大小是1632x1216,一般使用的兩百萬分辨率為1600x1200。
表 1. MT9D131 時序和DM368 的ISIF 參數(shù)對應(yīng)表
所以,根據(jù)表1 可以得到對于MT9D131 的輸出的RAW 數(shù)據(jù):
PPLN =右側(cè)black column 列數(shù)+水平方向有效像素點+左側(cè)black column 列數(shù)=52+1632+4=1688
LPFR=上部black row 行數(shù)+垂直方向有效像素點+下部上部black row 行數(shù)=20+1216+20=1256
但由于MT9D131 對外輸出VD/HD,這兩個參數(shù)在ISIF 里面無需配置。
如果需要采集圖像正中間的1600x1200 數(shù)據(jù),ISIF 需要如表2 的配置:
表 2. MT9D131 采集1600x1200 時DM368 的ISIF 參數(shù)對應(yīng)表
如果數(shù)據(jù)通路是ISIF->IPIPEIF->IPIPE->Resizer, 要得到匹配的YUV 數(shù)據(jù)就需要配置:
IPIPE 相關(guān)寄存器:
SRC_HPS=SPH=68
SRC_VPS=SLVx=28
SRC_HSZ=LNH=1599
SRC_VSZ=LNV=1199
Resizer 相關(guān)寄存器:
SRC_HPS=0
SRC_VPS=0
ZHCA600
8 DM368 視頻前端信號采集詳解
SRC_HSZ=LNH=1599
SRC_VSZ=LNV=1199
MT9D131 上電后默認(rèn)會禁止dark 區(qū)域輸出,也就是Show Dark Rows 和Show Dark Columns 寄存器位默認(rèn)值為0,右側(cè)black column 列數(shù)=0,上部black row 行數(shù)=0,這樣傳感器在同步信號有效后會立即輸出有效數(shù)據(jù),也就是圖3 中 MT9D131 時序圖顯示的情況。這種情況下如果要獲取中心1600x1200 的數(shù)據(jù),就需要修改配置ISIF.SPH=16, ISIF. SLV0/1=8,IPIPE. SRC_HPS=16,IPIPE.SRC_VPS=8,其他參數(shù)配置不變。
2.4 DM368 接入PC VGA 信號
DM368 的視頻前端是數(shù)字接口,無法直接接入PC 的VGA 信號的,因為PC 的VGA 信號是模擬信號。這需要有像TVP7002 的視頻AD 芯片將PC 的VGA 信號轉(zhuǎn)換為YUV 的數(shù)字信號,再輸入到DM368。
參考VESA 的標(biāo)準(zhǔn),用戶會看到一些術(shù)語,如Addr Time, front porch,back porch 等,下面我們把這些術(shù)語和DM368 的視頻前端的輸入時序來對應(yīng)一下。
圖 5. PC VGA 輸出時序簡圖
對于圖5,假設(shè)top/left border 和bottom/right border 為0(關(guān)于top/left border 和bottom/right border 請參考VESA 時序標(biāo)準(zhǔn)),設(shè)定HD 低有效,VD 高有效。
表 3. VGA 時序和DM368 的ISIF 參數(shù)對應(yīng)表
有了表3 的對應(yīng),用戶就可以很方便的根據(jù)VESA 標(biāo)準(zhǔn),配置好ISIF 相關(guān)的寄存器了。
3 VD 中斷的配置和使用
在討論這個問題前,用戶需要分清楚外部VD 信號(或者由內(nèi)嵌同步解析出來的VD 信號)和ISIF 內(nèi)部的VD 中斷的關(guān)系。
圖 6. VD 中斷重定位 [1]
在DM368 中VD 中斷和外部的VD 信號不一定是一致的。一般來說軟件會根據(jù)外部的VD 信號,對內(nèi)部使用的VD 中斷進行重定位。下面的代碼可以在DM36x IPNCV3.1 的軟件(av_capture\framework\drv\usermod\src\ Drv_isif.c)里面找到。以DM368 采集RAW 數(shù)據(jù)為例,VD 中斷重定位到傳感器輸出圖像高度(包括有效數(shù)據(jù)和消隱期高度)減去64 行。也即是當(dāng)VD中斷產(chǎn)生的時候,認(rèn)為當(dāng)前幀的數(shù)據(jù)已經(jīng)經(jīng)Resizer 寫入到DDR,目前處于消隱期,可以更新下一幀數(shù)據(jù)需要修改的寄存器例如IPIPE 寄存器,Resizer 輸出和地址寄存器值等,這樣在下一個外部 VD 信號到來的的時候,這些寄存器就可以真正更新到硬件里面,使得下一幀輸出的數(shù)據(jù)正確,而用戶也可以采集到正確的數(shù)據(jù)。這就是VD 中斷需要處理的內(nèi)容和觸發(fā)的時機。
通常來說如果有效數(shù)據(jù)后(無論是每一行后面,或者是一幀數(shù)據(jù)結(jié)束后面)有較多的消隱期區(qū)域,這對于DM368 的ISP 處理和輸出是有利的。這點對于設(shè)計FPGA 輸出時序給DM368 的時候需要特別注意。
由于不同的傳感器或者是FPGA 的輸出時序有所不同,該值是需要根據(jù)實際應(yīng)用來調(diào)整的。即使是同樣的傳感器,如果由于系統(tǒng)負(fù)荷的問題,使得DDR 占有率增加,導(dǎo)致Reszier 輸出DDR 變慢,這時候就需要增大 VDINT 的值,以保證當(dāng)前幀數(shù)據(jù)完全寫入。使能 Resizer 輸出的 flip 功能,會增加DDR 的訪問量,在垂直和水平方向flip 同時開啟的時候就有可能導(dǎo)致圖像右側(cè)輸出不正常而需要增大VDINT 的值。
4 結(jié)束語
了解輸入 DM368 的信號的時序格式同時了解 DM368 如何解析輸入的數(shù)據(jù)并且合理使用 VD 中斷,就可以正確采集到需要的數(shù)據(jù)。由于DM8127、DM385 的并口和DM368 的類似,本文的內(nèi)容可以作為參考。
參考文獻
1. TMS320DM36x Digital Media System-on-Chip (DMSoC) Video Processing Front End (VPFE) (SPRUFG8B)
2. TMS320DM36x Digital Media System-on-Chip (DMSoC) ARM Subsystem User's Guide (SPRUFGA)
3. MT9D131 Data Sheet (www.aptina.com/products/soc/mt9d131c12stc/ )
4. DM36x IPNC SW v3.1