摘要:針對(duì)視頻接口接收視頻格式單一的問題,,設(shè)計(jì)了一種多格式視頻輸入接口的視頻編碼模塊,。由于采用CH7024視頻編碼芯片,,所以在接口即可接收RGB565和RGB666格式的視頻信號(hào),。在Linux環(huán)境下,,對(duì)芯片寄存器和視頻格式進(jìn)行配置,編譯芯片驅(qū)動(dòng)程序,,通過超級(jí)終端下栽到芯片中,,通過CH7024編碼芯片將不同格式的輸入信號(hào)統(tǒng)一轉(zhuǎn)換成CVBS視頻的信號(hào)輸出,這樣可減少電路的硬件設(shè)計(jì),,并通過對(duì)軟件的修改來接收不同視頻格式的信號(hào),。實(shí)驗(yàn)結(jié)果表明,設(shè)計(jì)的模塊能夠適應(yīng)多種視頻格式的信號(hào),,且編碼后的CVBS視頻信號(hào)輸出距離遠(yuǎn),,抗干擾性強(qiáng)。
關(guān)鍵詞:嵌入式Linux,;視頻編碼,;視頻輸出;驅(qū)動(dòng)程序
0 引言
在無人機(jī)視頻采集系統(tǒng)中,,對(duì)于視頻信號(hào)的要求比較高,,采集到的模擬視頻信號(hào)在ARM9處理器中經(jīng)過A/D轉(zhuǎn)換,視頻壓縮編碼后通過無線傳輸?shù)降孛婊?,通過視頻編碼芯片將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào),,輸出到顯示設(shè)備上,。由于目前數(shù)字視頻具有多種格式,然而,,普通的視頻編碼模塊的輸入接口比較單一,,不能很好地兼容多格式的視頻輸入信號(hào),故輸出的模擬信號(hào)抗干擾性和傳輸距離都不是太好,。
針對(duì)上述問題,,本文提出了一種基于Freescale的MX27處理器,以Linux 2.6.19為內(nèi)核操作系統(tǒng)的多格式視頻輸入編碼模塊設(shè)計(jì)方案,。硬件方面,,以CH7024為主芯片進(jìn)行電路板設(shè)計(jì);軟件方面,,在Linux環(huán)境下,,根據(jù)芯片的特點(diǎn),編寫相應(yīng)的驅(qū)動(dòng)程序和寄存器配置,。通過加載驅(qū)動(dòng)程序,,將不同格式的數(shù)字視頻信號(hào)轉(zhuǎn)換為CVBS復(fù)合視頻信號(hào),相比其他的模擬視頻輸出信號(hào),,CVBS復(fù)合視頻信號(hào)將亮度,、色度,、同步和色彩脈沖信息整合到一根電纜內(nèi),,具有傳輸距離遠(yuǎn),抗干擾能力強(qiáng)等優(yōu)點(diǎn),。
1 設(shè)計(jì)方案
1. 1 系統(tǒng)硬件結(jié)構(gòu)
硬件連接如圖1所示,,將MX27中LCD控制器輸出的標(biāo)準(zhǔn)數(shù)字視頻信號(hào)(包括像素?cái)?shù)據(jù)LD[17:0]、像素時(shí)鐘LSCLK,,行同步信號(hào)LP/HSYNC,、場(chǎng)同步信號(hào)pLM/VSYNC,數(shù)據(jù)使能信號(hào)ACD/OE)接入CH7024的數(shù)字輸入接口,。此外,,將MX27中I2C控制器的SPC,SPD線直接與CH7024相應(yīng)的信號(hào)線連接,。
1.2 視頻輸出接口設(shè)計(jì)
由于以前的芯片輸入數(shù)據(jù)只有16位,,接口兼容性不好,而選擇的CH7024有24位視頻數(shù)據(jù)信號(hào)線,,可接收不同的數(shù)據(jù)格式,,包括RGB和YC-rCb(如RGB565,RGB666,,RGB888,,像ITU656的YCrCb),,可接收24b/18b/15b/12b/8b等多路復(fù)用數(shù)字輸入。為了能在系統(tǒng)運(yùn)行出現(xiàn)故障時(shí)方便地進(jìn)行復(fù)位,,設(shè)計(jì)中添加了人工復(fù)位電路,,這也是以前芯片所沒有的。應(yīng)用CH7024芯片設(shè)計(jì)的編碼器,,具有很好的兼容性和通用性,,所以選擇用CH7024主芯片進(jìn)行設(shè)計(jì)。
CH7024視頻編碼芯片的輸入接口最多能接收到的視頻信號(hào)位數(shù)為24位,,輸入格式為RGB888,。這樣RGB每個(gè)通道用8 b來表示,但是對(duì)于RGB 666和RGB565等格式的視頻信號(hào)就涉及到每個(gè)通道用幾位來表示某個(gè)顏色的問題,。對(duì)于RGB666來說,,每個(gè)通道用6b來表示;對(duì)于RGB565來說,,R和B每通道用5 b表示,,G通道用6 b表示。對(duì)于RGB666和RGB565格式的視頻信號(hào),,在設(shè)計(jì)中芯片上的24位數(shù)據(jù)線分配情況如圖2所示,。通過對(duì)相關(guān)寄存器的配置,實(shí)現(xiàn)對(duì)不同格式視頻信號(hào)的接收,,使其具有較好的兼容性,。該方案是以MX27處理器為平臺(tái)進(jìn)行設(shè)計(jì)的,MX27輸出的視頻信號(hào)為18位數(shù)據(jù),,這樣MX27處理器發(fā)出的RGB666和RGB565格式的視頻,,都能通過該方案設(shè)計(jì)的編碼器進(jìn)行編碼。
2 視頻編碼器軟件設(shè)計(jì)
2.1 I2C總線
I2C總線是一種兩線式串行總線,,用于連接微控制器及其外圍設(shè)備,。由于接口直接在組件之上,因此I2C總線占用的空間非常小,,減少了電路板的空間和器件引腳的數(shù)量,,降低了互聯(lián)成本。I2C總線可支持多主機(jī)控制,,其中任何能夠進(jìn)行發(fā)送和接收的設(shè)備都可以成為主控端,。
I2C總線的串行總線由數(shù)據(jù)線SDA和時(shí)鐘SCL構(gòu)成,可用于發(fā)送和接收數(shù)據(jù),,并可在CPU與被控IC之間,、IC與IC之間進(jìn)行雙向傳送。在數(shù)據(jù)傳送過程中共有3種信號(hào),,分別是開始信號(hào),、結(jié)束信號(hào)和應(yīng)答信號(hào),。其中,開始信號(hào)是在SCL為高電平時(shí),,SDA由高電平向低電平跳變,,開始傳送數(shù)據(jù);結(jié)束信號(hào)是在SCL為低電平時(shí),,SDA由低電平向高電平跳變,,結(jié)束傳送數(shù)據(jù);應(yīng)答信號(hào)是接收數(shù)據(jù)的IC在接收到8 b數(shù)據(jù)后,,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,,表示己收到數(shù)據(jù)。CPU向受控單元發(fā)出一個(gè)信號(hào)后,,等待受控單元發(fā)出一個(gè)應(yīng)答信號(hào),,CPU接收到應(yīng)答信號(hào)后,根據(jù)實(shí)際情況判斷是否繼續(xù)傳輸信號(hào),。若未收到應(yīng)答信號(hào),,則認(rèn)為受控單元出現(xiàn)故障,如圖3所示,。
2.2 視頻數(shù)據(jù)的傳輸
在該設(shè)計(jì)中,,視頻數(shù)據(jù)經(jīng)過MX27處理器后轉(zhuǎn)換為RGB輸送到LCDC中,通過CH7024輸入接口接收數(shù)據(jù),,數(shù)據(jù)傳輸?shù)姆绞饺鐖D4所示,。當(dāng)場(chǎng)同步信號(hào)(VSYNC)產(chǎn)生低電平時(shí),說明新的一幀數(shù)據(jù)需要采集,,這時(shí)采集到的是有效視頻信號(hào),;當(dāng)場(chǎng)同步信號(hào)再次產(chǎn)生低電平時(shí),一幀數(shù)據(jù)采集完成,,等待進(jìn)入下一幀數(shù)據(jù)的采集。在場(chǎng)同步信號(hào)之間有n行數(shù)據(jù),,現(xiàn)以其中一行數(shù)據(jù)來分析,,只要開始采集和采集完一行數(shù)據(jù)就會(huì)產(chǎn)生行同步信號(hào)(HSYNC),當(dāng)行同步信號(hào)產(chǎn)生低電平時(shí),,說明要采集的一行為有效數(shù)據(jù),,在等待中斷采集;即當(dāng)OE為下降沿時(shí),,開始采集一行數(shù)據(jù),;當(dāng)OE變?yōu)樯仙貢r(shí),一行數(shù)據(jù)采集完畢,。圖中給出的LINE[1:n]是說一幀圖像有n行,,每行有m個(gè)像素,,也就說一幀圖像的大小為n×m。
2.3 寄存器配置
在完成對(duì)CH7024的硬件電路設(shè)計(jì)后,,需要在軟件上對(duì)相應(yīng)的寄存器進(jìn)行配置,,在CH7024.C驅(qū)動(dòng)程序中將相應(yīng)寄存器地址后面的值進(jìn)行配置,如視頻輸入格式,、輸出格式,、分辨率大小等。CH7024寄存器的初始化相關(guān)程序代碼如下:
2.4 驅(qū)動(dòng)程序編譯加載
由于應(yīng)用環(huán)境是在Linux操作系統(tǒng)下,,開發(fā)板中用的是Linux 2.6.19內(nèi)核,,在內(nèi)核中并沒有CH7024相關(guān)的驅(qū)動(dòng)模塊,這就需要把編寫好的驅(qū)動(dòng)程序加載到內(nèi)核中,,生成需要的模塊形式,,重新編譯內(nèi)核,下載到開發(fā)板上,。
向內(nèi)核中添加TVOUT CH7024驅(qū)動(dòng)的流程如下:
(1)選擇一個(gè)放置驅(qū)動(dòng)代碼的位置:drivers/video/mxc/把代碼放到這個(gè)目錄中,。
(2)在drivers/video/mxc/添加Kconfig文件,內(nèi)容如下:
(3)編寫makefile,,內(nèi)容為:
(4)修改上一級(jí)Makefile和Kconfig,,即video目錄下的Makefile和Kconfig,在Makefile中添加:
(5)在arch/arm的Kconfig中添加:
至此,,修改完畢,。此時(shí)可以使用make menuconfig。出現(xiàn)內(nèi)核配置的窗口如圖5所示,。
選擇device drivers→graphics support可以看到,,出現(xiàn)了TVOUT CH7024 driver support→選項(xiàng),進(jìn)入選擇“M”,,即將驅(qū)動(dòng)程序編譯成動(dòng)態(tài)加載模塊,,然后通過“make modules”命令生成了CH7024.ko文件。將CH7024編碼器的輸入端連接到PC機(jī),,輸出端連接到監(jiān)視器上,,上電后,將生成的模塊文件由超級(jí)終端下載到開發(fā)板上,,在終端中用insmod CH7024.ko加載驅(qū)動(dòng),。CH7024.ko驅(qū)動(dòng)加載時(shí),會(huì)通過I2C讀CH7024的寄存器信息,,并打印它的ID號(hào)“Chip version ID(0x22)=0x22”,,如果等式右邊的值與左邊括號(hào)里的值不等,則說明I2C有問題,或者沒有加載其驅(qū)動(dòng),,TVOUT則不能正常工作,。在I2C正確的情況下,加載相關(guān)視頻采集驅(qū)動(dòng)程序,,通過CCD攝像頭采集到的視頻就能在監(jiān)視器上看到,。
3 結(jié)果分析
在實(shí)驗(yàn)中該方案能夠通過攝像頭采集視頻數(shù)據(jù),并能在監(jiān)視器上實(shí)時(shí)看到采集的視頻圖像,。由于輸入接口設(shè)計(jì)成了接收不同格式的視頻信號(hào),,使其能夠接收多種格式的視頻信號(hào),編碼器不用更改硬件,,只需要在軟件方面做相應(yīng)的修改就能實(shí)現(xiàn)不同格式視頻的接收,。
4 結(jié)語
通過對(duì)視頻編碼芯片的軟硬件設(shè)計(jì),使CH7024芯片能夠接收多種格式的視頻信號(hào),,由于CVBS信號(hào)傳輸距離遠(yuǎn),,抗干擾性強(qiáng),將不同格式的視頻信號(hào)轉(zhuǎn)換成CVBS復(fù)合視頻信號(hào),。隨著技術(shù)的發(fā)展,,處理器芯片的輸出視頻數(shù)據(jù)為24位,該設(shè)計(jì)的編碼器也能應(yīng)用,,節(jié)省設(shè)計(jì)成本,,縮短開發(fā)周期,具有一定的實(shí)用性,。