隨著視頻技術的高速發展,人們對視頻質量的要求也越來越高。從最初的黑白或者彩色模擬視頻,到現在主流的高清1080p、以及正在推廣的超高清4K數字視頻,各種新技術不斷的出現,形成了多代設備、各種技術標準共存的局面。
在享受各種視頻的同時,不同的設備也給人們的工作和生活帶來了很多不便。通常一種設備支持的視頻接口有限,如果視頻接口不匹配,就會造成諸多問題,嚴重影響用戶體驗。因此本文設計的視頻接口轉換器的解決方案具有重要意義。
接口轉換器顧名思義就是能夠實現不同視頻接口之間的對接匹配,將一種視頻接口標準的視頻信號轉換成為另外一種視頻接口標準信號,轉換過程中還可以實現視頻分辨率、色彩空間、色深等轉換,以滿足不同設備對視頻信號的要求。本文主要實現HDMI接口轉LVDS接口,音頻輸出選用I2S接口協議,系統控制選用了I2C接口來控制專用芯片。
HDMI接口是一種支持高質量的高速傳輸高清視頻和多聲道數字音頻數據的專用數字化接口,帶有數字視頻版權保護功能(HDCP)。目前通用的HDMI 2.0接口標準相比于上代HDMI1.4標準增強了對4K視頻的支持,線纜速率由10.2Gbit/s增加到18Gbit/s,能夠支持RGB 4:4:4的4K@60Hz的視頻傳輸。
LVDS接口是一種低電壓的差分信號傳輸模式,也是一種電平標準,它可以讓信號在差分PCB線或者平衡電纜上面以幾百Mbit/s的速率傳輸,具有低電壓、低功耗、低噪聲、高速傳輸等特點。
I2S總線是飛利浦公司定制的音頻數據傳輸的一種總線標準,它采用三線制,由位時鐘線(SCK)、聲道選擇線(WS)、串行數據線(SD)組成。該接口將數據信號和時鐘信號分開傳輸,避免由于時差造成的失真。
視頻接口轉換器的實現是通過STM32主控模塊來控制視頻專用芯片實現輸入HDMI信號轉換成一路視頻信號(LVDS信號)和一路音頻信號(I2S信號),同時STM32檢測端口輸入視頻格式信息,并在LCD屏幕上面顯示出來,并檢測按鍵輸入情況,根據輸入指令配置視頻專用芯片的輸出音視頻格式和選擇輸出的接口,STM32通過I2C接口實現與視頻專用芯片通信。
該系統由交互部分、STM32主控部分、視頻處理芯片部分、輸入輸出部分組成,系統整體框圖如圖1所示。
圖1 系統整體框圖
系統的主控主要是對視頻處理芯片進行一些初始化寄存器配置,檢測按鍵輸入和視頻輸入信號格式,獲取相關數據進行判斷,根據輸入要求進行配置芯片輸出。所以選用ST公司的STM32F103系列芯片作為本系統主控。
該系列芯片是基于Cortex-M3內核的32位嵌入式處理器,而RBT6屬于該系列中容量芯片,片內Flash為128kB,片內SRAM為20kB,系統主頻可以達到72MHz,具有豐富的外設資源,滿足本系統設計需求,并選用I2C2(GPIOB.10、GPIOB.11)接口作為芯片控制通信接口。
系統的輸入輸出部分由HDMI_RX接口、LVDS_TX接口、I2S_TX接口組成。
系統的視頻數據轉換處理部分采用專門的視頻處理芯片來完成,選用的視頻處理芯片要求如下:芯片帶有HDM2.0標準輸入接口、支持Hot-plug、支持HDCP1.4/2.2、支持多種視頻格式輸入并能對輸入視頻格式進行檢測反饋、最高可支持到4K分辨率的視頻輸入、能夠將一路HDMI信號轉換成一路LVDS視頻信號和一路I2S音頻信號輸出。因此,系統選用日本索喜公司生產的某款高性能、低功耗的視頻專用處理芯片,該芯片廣泛應用于數字電視、數字機頂盒等,相對于其他視頻專用處理芯片,價格較低,可以降低系統硬件設計成本。
系統交互部分由按鍵部分和LCD顯示部分組成,按鍵部分選用4×4矩陣鍵盤,通過GPIOA.2- GPIOA.5口和主控模塊相連,主控模塊分析按鍵輸入的指令,對視頻處理芯片做出相應的配置。LCD顯示部分選用2.8寸的TFTLCD屏幕作為顯示,分辨率為320×240,顯示屏驅動模塊是ILI9320,16位的80并行接口,支持65k色顯示,用FSMC接口連接控制。用來顯示當前輸入的信號源端口號、輸入視頻參數、音頻參數和輸出的視頻參數、音頻參數等系統狀態信息。
市面上常用的嵌入式ARM平臺開發環境主要有兩種,分別是Keil MDK和IAR。而Keil MDK v5是目前針對ARM系列的微控制器,尤其對ARM Cortex-M系列內核微控制器性能最佳的一款集成開發工具。所以本次系統設計選用Keil uVision5為軟件開發環境,系統整體軟件設計分為初始化和控制兩個部分。
3.1 系統初始化部分軟件設計
系統初始化主要是對STM32和視頻專用芯片進行初始化,調用的初始化關鍵函數見表1。
表1 系統初始化關鍵函數
STM32的初始化:在Keil MDK v5建立的工程中可以直接使用ST公司編寫的啟動代碼文件startup_ STM32f10x_md.s來進行控制芯片初始化,這個文件已經配置好芯片系統堆棧的初始化、中斷向量表、配置系統時鐘等,用戶只需配置自己使用的相關模塊。
此次使用的STM32資源有GPIOA、GPIOB、中斷控制、systick定時器、I2C2接口等。首先進行NVIC_PriorityGroupConfig( )函數調用,設置系統中斷優先級為分組4,子優先級為0,16個搶占優先級。配置systick計時器的參數,調用SysTick_Init( )函數并設置中斷時間間隔為1ms,用于延時函數計時。
調用RCC_APB1PeriphClockCmd( )和RCC_ APB2PeriphClockCmd( )函數對掛載在APB1和APB2總線上面的外設I2C2和GPIOA、GPIOB口的時鐘進行使能。然后調用KEY_Init( )和LCD_Init( )函數初始化按鍵和LCD顯示模塊,最后調用Hi_I2C_ Init( )函數,對控制通信接口I2C2進行初始化。
視頻專用芯片初始化:由STM32通過I2C控制接口,對視頻專用芯片的寄存器進行讀寫操作完成芯片的初始化配置。主要有系統時鐘、鎖相環、開機復位、接口物理參數配置等。之后調用hdmirx_ init( )、lvdstx_init( )、i2stx_init( )三個SDK庫函數,分別對芯片的輸入和輸出端口進行初始化,從而完成整個系統的初始化操作。
3.2 系統控制部分軟件設計
系統的控制部分代碼包括端口狀態檢測、音視頻格式檢測、鍵盤檢測、輸出控制四個模塊。
1)端口狀態檢測
(1)端口狀態檢測模塊。
在系統初始化完成之后,由于HDMI接口要求即插即用和系統配置需自適應輸出,所以系統設計要求實時檢測輸入端口狀態,為后續的數據處理和輸出配置提供參數。端口狀態檢測模塊流程圖如圖2所示。
圖2 端口檢測流程圖
(2)端口狀態檢測方法。
首先,將當前端口輸入狀態now_port_status和前一個時間的端口輸入狀態pre_port_status都置零,并定義一個端口計時變量port_status_tick,該變量隨著時鐘信號,每1ms自動增加1(由系統systick定時器中斷觸發),每200ms循環一次端口檢測時間判斷。
然后調用庫函數getrx_port_status(&port_status)來獲取當前端口輸入狀態,如果當前端口有信號接入則置now_port_ status=1,將now_port_status和上一個時間端口輸入狀態pre_port_status進行比較;如果不相等,則說明當前端口輸入狀態發生變化,對LCD顯示的系統輸入狀態進行更新,并通知主控模塊做相應的處理。
最后將now_port_status賦值給pre_port_status,同時更新端口的port_status_tick變量,等待下一次端口狀態檢測來臨。四個輸入端口都做同樣的端口狀態檢測處理。
2)音視頻格式檢測
(1)音視頻檢測模塊。
在實際應用中,用戶會隨機進行音視頻格式切換操作,因此在端口狀態檢測之后,需要同步進行輸入音視頻格式狀態的檢測。音視頻格式狀態檢測中涉及的庫函數見表2。
表2 音視頻狀態檢測相關庫函數
(2)音視頻格式檢測的方法和端口檢測方法類似。
首先構造兩個結構體system_video和system_ audio,system_video用來存放輸入視頻的端口號、分辨率、采樣格式、幀率以及色彩空間信息;system_audio用來存放音頻的端口號、采樣頻率、量化位數、聲道數等。定義一個音視頻狀態時間標志變量av_status_tick,該變量隨著系統時鐘信號每1ms自動增加1,每200ms音視頻格式檢測一次。
然后調用庫函數getrx_av_status (&rx_av_ status)函數來獲取當前輸入的音視頻狀態rx_av_ status,將rx_av_status. video_format和上個輸入的音視頻狀態變量pre_rx_av_status.video_format進行比較,如果不相等,則表示輸入的音視頻狀態發生了改變,這時將音視頻狀態標志變量rx_av_status_change置1,同時調用getrx_video_ format((hdmirx_video*)&(vform.htx))函數獲取當前輸入的視頻格式信息并更新LCD狀態顯示;將rx_av_status.audio_format和上個音頻標志狀態變量pre_rx_av_status.audio_format進行比較。
如果不相等,則表示輸入的音頻狀態發生了改變,將音頻狀態標志變量rx_av_status_change置1,調用hdmirx_get_audio_format(((hdmirx_video*)&(vform. htx))函數獲取當前輸入的音頻格式信息并更新LCD狀態顯示。接下來將rx_av_status賦值給pre_rx_av_status,等待下一次音頻檢測來臨。
3)鍵盤檢測
鍵盤設置16個按鍵,分為0—9數字鍵十個、lvds功能鍵、i2s功能鍵、取消鍵、確認鍵、上下鍵。STM32的所有GPIO口都支持外部中斷功能,鍵盤檢測采用外部中斷方式觸發。中斷處理函數解析鍵盤輸入視頻格式指令并賦值給結構體成員vform.sys,解析視頻和音頻端口選擇指令并分別賦值給變量lvds、i2s。
4)輸出控制檢測
輸出控制模塊根據一些標志變量取值,來調用庫函數實現輸出功能,使用的庫函數列表見表3。當rx_av_change_status=1、lvds=0、i2s=0時,調用庫函數lvdstx_set_video_for-mat ((lvdstx_video*)& (vform.sys))設置lvds視頻輸出格式,調用庫函數lvdstx_video_mute(&tx_mute)和i2stx_audio_mute (&tx_mute)開啟系統的LVDS接口和I2S接口輸出并更新LCD顯示狀態信息;當rx_av_change_status=1、lvds=1、i2s=1時,即系統關閉LVDS接口和I2S接口輸出并更新LCD顯示狀態信息。
表3 系統輸出控制相關函數
系統整體流程圖如圖3所示,開機之后,首先系統對STM32和HV2芯片進行初始化操作,STM32通過I2C接口讀寫HV2的端口狀態寄存器來檢測輸入端口變化情況,接下來檢測輸入音視頻格式狀態,并更新LCD顯示的輸入格式信息。然后根據狀態標志變量和按鍵輸入決定輸出端口,并配置輸出格式;最后開啟輸出并更新LCD顯示的輸出格式信息。
首先搭建測試環境,用一個機頂盒播放不同的測試碼流進行測試。選用一個4K/60p的測試碼流用機頂盒進行播放并通過HDMI接口輸出,將其接入轉換器的HDMI接口輸入端,輸入音頻采樣頻率為48kHz,采樣位數為20bit。用示波器測試輸出端口的波形。實際測得的音頻I2S接口輸出波形和視頻LVDS接口輸出波形如圖4和圖5所示。
圖3 系統整體流程圖
圖4 LVDS輸出數據波形圖
圖5 I2S輸出數據波形圖
接下來,按著LVDS數據格式和I2S數據格式標準解析波形圖得到輸出的數據,與輸入的音視頻數據格式進行對比,得到輸出分辨率4K/ 60P,輸出音頻采樣率為48kHz,采樣位數為20bit,對比輸入的音視頻數據可知轉換器系統正常工作,然后換用4K/30p、4K/25p、4K/24p等不同碼流進行測試并分析對比。
本次系統設計方案芯片選用意法半導體公司的STM32F103RBT6芯片、索喜公司的某款視頻專用處理芯片、按鍵模塊,LCD顯示模塊、接口模塊等,完成視頻接口轉換器的系統設計。
經過一系列測試對比,該方案實現HDMI接口轉LVDS接口輸出以及音視頻的分離輸出,支持各種常用分辨率輸入最高支持至4K分辨率。在進行接口轉換的同時該轉換器還能夠實現不同接口之間的音視頻制式參數轉換,從而更好的解決接口匹配問題,達到預期設計的目標。
該轉換器可靠性高、使用方便、功能強大,能有效解決數字電視應用中視頻接口的兼容性問題,在數字電視方面應用廣泛,值得深入研究與推廣。