霍淑珍
(天津職業(yè)大學(xué), 天津 300402)
車載多媒體系統(tǒng)融合了語音識別、衛(wèi)星定位、語音通話、藍(lán)牙、WIFI 等現(xiàn)代技術(shù),可以進(jìn)行實(shí)時(shí)監(jiān)控、人機(jī)對話、導(dǎo)航服務(wù)、行車記錄等功能,用于對汽車的現(xiàn)代化的智能管理,是汽車必不可少的系統(tǒng)設(shè)備,為汽車駕駛?cè)撕统俗颂峁┝艘欢ǖ陌踩U虾蛫蕵贩?wù)等[1,2]。 現(xiàn)代車載多媒體系統(tǒng)普遍采用了液晶顯示技術(shù), 而且屏幕本身的尺寸越來越大,分辨率和刷新頻率越來越高,為駕乘人提供了更好的視覺體驗(yàn)。 本系統(tǒng)中采用先進(jìn)的i.MX6 處理器,設(shè)計(jì)了基于LVDS 視頻顯示技術(shù)及Linux 系統(tǒng)下的多媒體系統(tǒng),LVDS 通訊方式聯(lián)結(jié)使得系統(tǒng)與屏幕分離,可以通過軟件配置以適應(yīng)不同屏幕尺寸的需求, 較傳統(tǒng)系統(tǒng)解決了針對不同用戶屏幕需要單獨(dú)設(shè)計(jì)產(chǎn)品硬件的問題,擴(kuò)展了系統(tǒng)應(yīng)用范圍。 本文主要介紹該多媒體系統(tǒng)下的視頻處理模塊。
系統(tǒng)主核心處理器使用了以ARM Cortex A9 為核心的雙核處理器i.MX6,該處理器工作頻率達(dá)到800MHz,工作溫度范圍-40~125℃,是專用于汽車儀表以及信息娛樂的處理器,具有2D 和3D 引擎,擁有非常強(qiáng)的2D,3D 圖形加速和硬件編解碼能力。 i.MX6 視頻處理單元(VPU)是一種高性能的多標(biāo)準(zhǔn)視頻編解碼器引擎, 能夠執(zhí)行多種標(biāo)準(zhǔn)的編碼和解碼操作,完全支持MJPG,MPEG-4,H.263和H.264 編碼格式,編碼的速率最高可達(dá)30f/s[3]。IPU 單元能夠連接多種接口形式的視頻設(shè)備,可以進(jìn)行圖像處理,信號轉(zhuǎn)換,圖像增強(qiáng)等算法操作。
系統(tǒng)的內(nèi)存系統(tǒng)采用四片Micron 公司生產(chǎn)的DDR3L型的SDRAM 同步動態(tài)隨機(jī)存取存儲器, 型號為MT41K256M16,組成系統(tǒng)2G 容量64 位寬的內(nèi)存系統(tǒng),該內(nèi)存單元為Linux 系統(tǒng)的運(yùn)行提供了快速運(yùn)行解決方案。系統(tǒng)存儲介質(zhì)采用Micron 公司生產(chǎn)的NAND 存儲器MT29F8G08,NAND 型存儲器相比于NOR 存儲器具有存儲容量大,價(jià)格便宜,擦除速度快等優(yōu)點(diǎn)。 在具有操作系統(tǒng),地圖導(dǎo)航等大容量存儲需求的系統(tǒng)中,NAND 存儲器提供了高性價(jià)比解決方案。
系統(tǒng)采用了R7F7010233 系列單片機(jī)作為系統(tǒng)的外圍管理處理器SOC,負(fù)責(zé)與車輛其他系統(tǒng)進(jìn)行通訊,電源管理,外設(shè)及I/O 操作管理等功能。 系統(tǒng)具有雙LVDS 接口,支持雙屏幕操作。 結(jié)構(gòu)圖如圖1 所示。
圖1 系統(tǒng)結(jié)構(gòu)圖Fig.1 System architecture
LVDS 技術(shù)采用極低的電壓擺幅高速差動傳輸數(shù)據(jù),可以實(shí)現(xiàn)點(diǎn)對點(diǎn)或一點(diǎn)對多點(diǎn)的連接,遠(yuǎn)距離傳輸信號。具有低功耗、低誤碼率、低串?dāng)_和低輻射等特點(diǎn)。其傳輸介質(zhì)可以是銅質(zhì)的PCB 連線,也可以是平衡電纜[4,5]。將LVDS 技術(shù)應(yīng)用到數(shù)字視頻傳輸系統(tǒng)中,通過合理的方案設(shè)計(jì)使系統(tǒng)能滿足圖像數(shù)據(jù)實(shí)時(shí)、穩(wěn)定、高速傳輸?shù)囊蟆?/p>
圖2 視頻輸出電路圖Fig.2 Video output
本系統(tǒng)中使用的i.MX6 處理器具有兩套LVDS 接口, 將系統(tǒng)的IPU 處理單元與外部顯示相連接。 每套LVDS 接口具有一個(gè)時(shí)鐘接口及4 個(gè)數(shù)據(jù)接口,i.MX6 系統(tǒng)內(nèi)的串行化器將24 位RGB 數(shù)據(jù)和4 組控制數(shù)據(jù)串行化為4 組串行LVDS 數(shù)據(jù),并輸出到具有LVDS 接口的顯示屏上。本車載視頻應(yīng)用中,系統(tǒng)要求顯示器與視頻主機(jī)分離, 這使得系統(tǒng)即使使用了LVDS 規(guī)范的線纜進(jìn)行數(shù)據(jù)傳輸,依然不能夠滿足系統(tǒng)對于線纜的要求。系統(tǒng)采用了并轉(zhuǎn)串芯片MAX9249,該芯片允許最大串行數(shù)據(jù)載荷達(dá)到2.5Gbps,可以使用屏蔽雙絞線作為介質(zhì),通訊線纜長度可達(dá)15m。 在4 通道LVDS 模式下通訊時(shí)鐘達(dá)到78MHz。MAX9249 與i.MX6 的LVDS 硬件連接如圖2 所示, 圖中MAX9249 的4 對RXIN 數(shù)據(jù)輸入端分別與LVDS 的TX輸出端相連接,LVDS 的時(shí)鐘信號提供給MAX9249 的數(shù)據(jù)時(shí)鐘輸入端RXCLK。MAX9249 的輸出端OUT 通過系統(tǒng)的輸出連接器, 屏蔽線纜連接到具有串轉(zhuǎn)并LVDS 信號的顯示器相連接,實(shí)現(xiàn)視頻信號的輸出。 該芯片初始化通過i.MX6 的I2C 總線進(jìn)行控制。
本系統(tǒng)應(yīng)用于汽車多媒體領(lǐng)域,系統(tǒng)采用模擬CVBS差分?jǐn)z像頭,相較于數(shù)字?jǐn)z像頭具有價(jià)格便宜,傳輸距離遠(yuǎn),線路簡單等優(yōu)點(diǎn)。 i.MX6 處理器提供了CSI2/MIPI 接口,CSI(COMS Sensor Interface)接口通常從COMS 傳感器,視頻編碼器和其它視頻輸出設(shè)備收集數(shù)據(jù), 其能夠支持多種制式的攝像頭標(biāo)準(zhǔn)。 系統(tǒng)采用了ADV7182 視頻模擬數(shù)字轉(zhuǎn)換芯片, 該芯片將模擬攝像頭的模擬信號轉(zhuǎn)換成適用于CSI2 接口的數(shù)字信號交由i.MX6 進(jìn)行視頻處理,CSI2 接口可接受多種模式的視頻輸入, 如BT.656,BT1120,YUV422,RGB888,YUV444 等。ADV7182 具有四路輸入信號,可以支持Y/C (S-Video)和YPrPb 視頻信號及差分或偽差分CVBS 信號等多種信號模式。 當(dāng)采用差分信號輸入時(shí)ADV7182 與i.MX6 的硬件電路如圖3 所示, 輸入端AIN1 與AIN2 分別與攝像頭輸出正負(fù)端相連接, 數(shù)字視頻像素?cái)?shù)據(jù)輸出端P0-P8 與i.MX6 的視頻輸入端CSI0_D[12]-CSI0D[19]相連接,行信號與場信號輸出與i.MX6 對應(yīng)的輸入信號相連。本系統(tǒng)中該芯片的輸出為8-bit ITUR BT.656 YCrCb 4:2:2 數(shù)字視頻流,i.MX6 的CSI 視頻接口配置成該模式的輸入信號。
圖3 攝像頭硬件電路圖Fig.3 Camera input schematic
系統(tǒng)移植Linux 操作系統(tǒng)作為其軟件平臺,V4L2(Video For Linux 2) 是Linux 2.6 內(nèi)核中廣泛采用的內(nèi)核視頻驅(qū)動模型[6]。 V4L2 在Linux 中被設(shè)計(jì)成一個(gè)字符設(shè)備,使用字符設(shè)備的操作函數(shù)對其進(jìn)行操作, 通過統(tǒng)一的接口函數(shù)該框架為視頻設(shè)備提供了Linux 標(biāo)準(zhǔn)操作框架。 為了將ADV7182 的驅(qū)動函數(shù)與V4L2 視頻驅(qū)動框架結(jié)合, 需要根據(jù)本系統(tǒng)的使用的視頻數(shù)字轉(zhuǎn)換芯片提供用于該芯片的一組核心硬件驅(qū)動函數(shù),然后在編譯系統(tǒng)時(shí)將該芯片的驅(qū)動編譯到Linux 內(nèi)核中。 驅(qū)動程序與V4L2 的驅(qū)動框架如圖4 所示,驅(qū)動程序在系統(tǒng)啟動時(shí)完成注冊,應(yīng)用程序通過V4L2 調(diào)用攝像頭驅(qū)動。ADV7182 攝像頭驅(qū)動程序主要操作函數(shù)包括兩部分,如Linux 中結(jié)構(gòu)體定義:
static const struct v4l2_subdev_ops sensor_ops = {
.core = &sensor_core_ops,
.video = &sensor_video_ops,
};
圖4 攝像頭驅(qū)動框架圖Fig.4 Camera driver structure
sensor_core_ops 結(jié)構(gòu)體其中包括ADV7182 的初始化,復(fù)位,電源管理,ioctl 的具體實(shí)現(xiàn)等操作。
sensor_video_ops 結(jié)構(gòu)體實(shí)現(xiàn)圖像數(shù)據(jù)格式,幀頻率等參數(shù)信息。
在驅(qū)動程序被調(diào)用時(shí),首先完成ADV7182 芯片的初始化、 攝像頭接口的初始化、視頻數(shù)據(jù)幀內(nèi)存緩沖區(qū)的申請,并將其映射到用戶空間。 通過ioctl 命令VIDIOC_STREAMON 開始視頻數(shù)據(jù)的采集。
Linux 中使用Framebuffer 幀緩沖接口作為顯示設(shè)備的驅(qū)動接口。 這種接口使用戶可以將它看成為用于顯示的一段內(nèi)存,映射到進(jìn)程用戶空間后,可以直接進(jìn)行讀寫操作,而寫操作可以立即反應(yīng)在屏幕上。Framebuffer 調(diào)用由驅(qū)動源碼廠家提供的IPU FB Driver 驅(qū)動程序,該驅(qū)動程序?qū)崿F(xiàn)圖像的旋轉(zhuǎn),格式轉(zhuǎn)化,圖像融合等操作接口,并且將合成的最終顯示數(shù)據(jù)發(fā)送給MXC Display Driver去相應(yīng)配置的顯示器實(shí)現(xiàn)圖像顯示。 MXC Display Driver驅(qū)動函數(shù)提供了一組供IPU 調(diào)用的驅(qū)動函數(shù), 使得不同的顯示接口對于IPU 具有相同的調(diào)用接口。 驅(qū)動顯示的相互調(diào)用框架如圖5 所示。本系統(tǒng)使用了單LVDS 顯示器或雙LVDS 顯示器, 所以需要在系統(tǒng)的uboot 中配置LVDS 參數(shù)及匹配顯示屏參數(shù)。
video=mxcfb0:dev=ldb,LDB-XGA,if=RGB666
video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666
若要正確的顯示圖像, 需要將顯示器信息正確的傳遞給Linux 系統(tǒng), 該參數(shù)的設(shè)置用到ldb.c 中關(guān)于顯示參數(shù)設(shè)置的結(jié)構(gòu)體fb_videomode,該結(jié)構(gòu)體包含分辨率,像素時(shí)鐘頻率,行掃描脈沖寬度,幀掃描脈沖寬度,顯示模式等顯示模式的關(guān)鍵參數(shù)。 在顯示圖像時(shí), 打開/dev/fbx 設(shè)備,將Framebuffer 的內(nèi)存空間映射到用戶空間, 用戶向該空間寫如圖像數(shù)據(jù),IPU 經(jīng)過設(shè)置的圖像轉(zhuǎn)換等操作并將處理后數(shù)據(jù)傳輸?shù)斤@示器實(shí)現(xiàn)顯示。
圖5 LVDS 顯示驅(qū)動框架圖Fig.5 LVDS video driver structure
QT 開發(fā)環(huán)境具有跨平臺, 通用的C++編程語言,特有的信號與槽機(jī)制等優(yōu)點(diǎn), 因此在嵌入式開發(fā)領(lǐng)域內(nèi)得到了較為廣泛的應(yīng)用[7]。 在本系統(tǒng)中使用了QT5.5 版本,下載QT 的源碼, 編譯并配置QT 支持Imx6 平臺-make libs-device imx6。 通過./app -platform linuxfb 使得QT5 支持Linux 視頻緩沖區(qū)Framebuffer。 在QT 內(nèi)使用QPainter類在Qimage 窗口中繪制所要顯示的圖像。 并通過Updata()函數(shù)重新繪制圖像。
QImage img;
img.loadFromData(rdc_from_Fb);
label->setPixmap(QPixmap::fromImage(img));
當(dāng)Linux 守候程序通過IPC 硬件聯(lián)結(jié)收到來自片上SOC 單片機(jī)R7F7010233 監(jiān)控到的CAN 總線倒車命令時(shí),該倒車影像程序被喚醒執(zhí)行,程序中啟動定時(shí)函數(shù),該定時(shí)函數(shù)每33ms 被執(zhí)行一次,將Camera 的視頻信息顯示到屏幕上,該定時(shí)函數(shù)通過超時(shí)觸發(fā)槽函數(shù)ShowFrame()定時(shí)讀取攝像頭驅(qū)動得到的視頻數(shù)據(jù),通過QIamge 類更新倒車影像圖像。 通過槽函數(shù)定時(shí)調(diào)用如下面程序片段所示。
QTimer*timer=new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(ShowFrame()));timer->start(33);
經(jīng)過產(chǎn)品的硬件及軟件的不斷優(yōu)化改進(jìn), 整機(jī)系統(tǒng)滿足系統(tǒng)設(shè)計(jì)的各項(xiàng)指標(biāo), 攝像及顯示系統(tǒng)能夠清楚的捕捉并且顯示圖像,LVDS 數(shù)據(jù)輸出端波形正常,LVDS 信號及串行化芯片具有抗干擾能力強(qiáng),屏幕顯示清新,經(jīng)過不同的軟件配置,實(shí)現(xiàn)了對于不同規(guī)格顯示屏的驅(qū)動,其中包括1024×768 的標(biāo)準(zhǔn)七寸屏,1920×1080 的十寸高清屏等。 產(chǎn)品模塊化設(shè)計(jì),適應(yīng)不同用戶的需求。