陳騰
(中航航空電子有限公司 北京市 100098)
人們認知和感知外部世界的主要途徑是視覺。大量實驗心理學實驗驗證了人類約83%的信息獲取來自視覺。信息時代引發了“信息爆炸”,與視覺相關的應用更是受到用戶追捧。顯示技術在軍事、信息科技、娛樂等諸多應用領域中起到了關鍵性的作用。
機載、車載、艦載及智能眼鏡等顯示系統現已廣泛的應用在各種飛機、車輛、艦船、單兵或個人,通過像源產生的操縱指引和顯示信息與外部自然場景實時圖像相互疊加投射到組合光學鏡片上,使得駕駛員或者操作者在觀察真實外視景的同時,能夠了解飛機、車輛、艦船、個體等的可視化狀態信息,甚至不利氣象條件下或環境限制情況下的增強顯示信息。
傳統的嵌入式顯示系統一般采用OpenGL或者其他圖形API進行矢量圖形的繪制,借助GPU加速實時渲染實現外視頻格式轉換、縮放及疊加,基于并行結構的FPGA對圖像進行畸變校正處理,將顯示信息經過光學系統投射到顯示像源上進行顯示,因此傳統顯示設備需要GPU圖像處理板和FPGA處理板等多塊板卡,設備的成本高、體積和功耗大、可擴展性差。此外,由于采用Verilog等硬件描述語言進行開發,開發復雜度較高維護難且迭代周期較長。
近年來無論是軍用電子設備、民用電子設備,還是消費類可穿戴電子產品,小型化和低功耗成為主流發展趨勢。ARM架構SOC在性能和功耗上十分切合小型化嵌入式系統需求。借助多核處理器或者DSP、GPU等輔助硬件資源實現高復雜度編碼,借助通用平臺及操作系統,通過軟件實現系統控制、任務調度和顯示繪制等功能,從而有效降低開發難度,大幅削減成本,提高系統的可維護性及擴展性。
本文采用Freescale ARM Cortex-A9架構的i.MX6Q SOC,借助Linux操作系統和內嵌圖像處理單元GPU設計了一套實時字符及視頻顯示系統。
如圖1所示,基于i.MX6Q的顯示系統由視頻采集模塊、視頻存儲模塊、視頻轉換模塊、圖形繪制模塊、畸變校正模塊以及顯示控制軟件共同組成。顯示系統通過視頻采集模塊實時采集的PAL格式的模擬輸入視頻數據和DVI-D格式的數字輸入視頻數據,并轉換成YUV4:2:2格式的2路并行信號,存入視頻存儲模塊中。視頻轉換模塊讀取視頻存儲模塊中采集到的輸入視頻,并進行圖像縮放和RGB5:6:5格式轉換。圖形繪制模塊用于2D圖形、字符及顯示效果的繪制,并將繪制效果與視頻轉換模塊輸出的視頻進行疊加。疊加結果一路通過i.MX6Q集成的HDMI接口直接輸出為DVI-D格式的數字視頻,用于電子儀表顯示給駕駛員或者操作人員;另一路送畸變校正模塊,通過GPU紋理貼圖的方式將疊加的整幅圖像進行畸變校正操作,再將校正后的整幅圖像經過光學系統投射到顯示像源上進行顯示。
顯示系統硬件平臺主要由i.MX6Q核心處理器、存儲單元、調試接口、電源模塊、視頻采集芯片、信號轉換芯片、時鐘等部分構成。圖2為基于i.MX6Q平臺的顯示系統硬件部分組成示意圖。
作為顯示系統的硬件核心處理單元,i.MX6Q主要基于ARM Cortex-A9架構的高擴展性1.2GHz高速四核應用處理器,其硬件架構如圖2所示。該芯片集成了2D和3D圖形處理器,具備1080p視頻處理能力,能夠支持64-bit DDR3/DDR3L/LPDDR2內存接口,并且具有豐富的集成IO接口鏈接多種類型外設,具有較高的SOC集成度,大幅降低了設計復雜度。
i.MX6Q處理器內嵌了VIVANTE 3個相互獨立且高度集成的圖形處理單元(GPU,graphics processing units)。其中,GPU3Dv4(GC2000)負責3D圖形加速,支持顯示高達1080p的顯示分辨率,能夠支持OpenGL ES 2.0及其擴展, OpenGL ES 1.1和OpenVG 1.1。GPU2Dv2(GC320)負責2D圖形加速,支持多種2D圖形算法。GPUVGv2(GC355)負責矢量圖形加速。為了實現系統的高性能、低功耗,GPU對片上硬件資源進行了充分利用和優化設計。
顯示系統采用非易失性FLASH芯片存儲操作系統和文件系統,每次上電時從該芯片中讀取系統并加載應用程序。另有64bit帶寬、1333MHz速率的2GByte DDR3高速數據存儲芯片,對內存進行擴展及存儲業務數據。
系統設計了以太網口、USB接口、RS232串口等調試接口,用于Linux環境下,內核和文件系統的加載,顯示控制軟件和驅動的開發及調試,數據傳輸、信息輸出顯示等功能。
考慮到顯示系統的實時性,將Linux操作系統移植到i.MX6Q芯片上,在顯示控制軟件內核中編寫了視頻采集驅動模塊、FLASH驅動、DDR驅動等代碼,將外設抽象成文件系統下的“/dev/image*”設備,達到底層硬件驅動和上層應用軟件分離的目的,有利于提供系統的可擴展性,便于軟件開發。

圖1:顯示系統整體框圖
為了滿足字符及視頻顯示的高實時性,顯示系統充分借助i.MX6Q的4個內核,采用多線程軟件設計組織整個數據流水線,提高應用的整體幀率。應用程序可分為7個線程,分別為:主線程、視頻采集線程、視頻縮放線程、視頻顯示線程、畸變校正線程、SGL指令接收線程、數據接收線程。其中主線程為父線程,其它線程都由主線程創建,作為主線程的子線程。除了數據接收線程外,其余線程為同步線程,由主線程控制同步時序。通過信號量來實現多線程的同步,并將任務負載均衡的分布在4個CPU核中。顯示控制軟件架構及時序如圖3所示。
顯示控制軟件主要線程模塊設計方法實現如下:
視頻采集模塊video_capture,操作通過V4L2視頻采集框架調用函數實現,不需要關心底層采集芯片ADV7180和ADV7611具體實現。顯控軟件對V4L2編程接口做了進一步封裝以適應顯示系統調用需要。
視頻縮放模塊video_scaler,通過VIVANTE提供的GAL接口,調用FilterBlit功能,完成外視頻縮放操作變換,及YUV422格式向RGB565格式轉換。
視頻顯示模塊video_display,預先提取并存儲字體文件的參數并上傳到硬件中,再直接繪制硬件中緩存的數據。OpenGL的Truetype字體紋理生成依賴開源的SKIA程序加載Truetype字體,將SKIA畫布(SkCanvas)均勻分割成16x8個網格,通過調用measureText()函數提前解析出文本的寬度數值,將所有文本逐個繪制到每個網格中并存儲每個文本的位置坐標信息,最終由SkCanvas控制圖像的輸出。如需繪制帶黑邊的字符、反走樣、旋轉、開窗、閉塞等特殊圖形時,只需要使用工具生成特殊圖形的圖像及其參數,在繪制的時候切換到相應圖形的紋理來進行渲染即可。這種繪制需要生成特定字號的紋理畫布以獲得較好的顯示效果。
畸變校正模塊distortion_correction模塊,通過畸變字典存儲畸變后圖像的每個像素坐標與畸變前原圖像坐標的對應關系。OpenGL在繪制時采用TrangleStrip的方式,通過8x8網格將上傳到GPU中的圖像劃分為多個四邊形小窗,計算每個8x8網格四個頂點的像素值,網格中間的像素值則根據四個頂點像素值自動插值生成。繪制時指定畸變圖像四個頂點的位置、原圖像四個頂點對應的像素值,用三角形覆蓋整個畸變圖像,逐個繪制完三角形即實現了整幅畸變圖像的渲染。
本文基于Cortex-A9架構的i.MX6Q SOC,借助Linux操作系統和內嵌圖像處理單元GPU設計了一套實時字符及視頻顯示系統。該嵌入式系統的硬件部分以高性能i.MX6Q芯片為核心,進行了相關硬件電路的設計。顯示控制軟件基于 Linux操作系統,采用V4L2視頻采集框架實現兩路實時視頻采集功能,采用開源SKIA繪制2D圖形及字符,使用GPU GC320進行視頻轉換、2D圖像的旋轉、縮放、平移等操作,通過OpenGL以貼圖的方式實現畸變校正功能,最終得到兩路視頻輸出。設計結果表明,該系統實時顯示性能較高,在工程實踐中尤其是小型化、低功耗的應用需求中具有很好的應用價值。

圖2:顯示系統硬件示意圖

圖3:顯示控制軟件架構及時序圖