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