基于TMS320DM642視頻采集驅動開發(fā)
關鍵詞:TMS320DM642芯片; 視頻采集;同步;類/微驅動
TMS320DM642 是一款針對視頻和圖像解決方案的高性能數(shù)字多媒體處理器,具有極強的處理性能" 高度的靈活性和可編程性。因此主要用于視頻信號處理和通信。結合合適的編碼器控制算法,具有較高運算速度的TMS320DM642DSP 芯片可以作新一帶視頻壓縮標準H.264編、解碼器的硬件平臺,實現(xiàn)滿足應用需求的H.264 編碼器【1】。
驅動程序位于計算機軟件的最低層(HAL 為硬件抽象層) , 直接與硬件設備的特性聯(lián)系在一起。編寫驅動程序不僅要了解設備的特性, 而且還要了解操作系統(tǒng)的結構難度較大【2】。本文結合TMS320DM642芯片特點詳細介紹了視頻采集驅動開發(fā)。并詳細討論了驅動中幀緩存管理、同步及數(shù)據(jù)搬運等關鍵技術的實現(xiàn)。
1 TMS320DM642DSP芯片性能特點
DM642[3]是TI公司推出的一款針對多媒體處理領域應用的DSP,它是在C64x的基礎上,增加了很多外圍設備和接口。主要的片上外設有:三個可配置的視頻接口,可以和視頻輸入,輸出或傳輸流輸入無縫連接,VCXO 內插控制端口(VIC), I2C總線模塊等。這些接口和外設使得DM642比C6416更適合處理視頻碼流。
TI針對C64x系列的DSP提出了一種類/微型驅動模型[4],這種模型在功能上將設備驅動程序分為依賴硬件層(微型驅動)和不依賴硬件層(類驅動兩層),兩層之間使用標準的接口進行通信。類驅動為設備驅動的頂層,向應用程序提供統(tǒng)一的API接口,是應用程序與微驅動之間的接口。微驅動為設備驅動的底層,它直接處理所有外部設備的控制和初始化工作。類、微驅動程序的模型如圖1所示。
2 視頻采集驅動硬件配置
本文采用類/微驅動模型編寫DM642芯片視頻端口的視頻采集驅動程序,充分利用片上的VP視頻端口[5]和EDMA。經過A/D轉換后的視頻數(shù)據(jù)首先緩存到視頻端口的FIFO中,F(xiàn)IFO寫滿之后通知EDMA將這些數(shù)據(jù)按照一定的規(guī)則搬運到SDRAM中。應用程序通過類驅動向微型驅動提交I/O請求,類驅動根據(jù)微型驅動的返回參數(shù)實現(xiàn)同步I/O請求。本文詳細討論按幀采集8 bit ITU-R BT.656視頻數(shù)據(jù)驅動的實現(xiàn)方法。
2.1視頻端口配置
TMS320DM642有三個可配置的視頻端口:VP0、VP1和VP2,與視頻采集芯片連接,無需外加邏輯控制電路和FIFO緩存,只需編程者編寫相關驅動程序,就可實現(xiàn)圖像采集或顯示。每個視頻端口各有20根數(shù)據(jù)輸入輸出管腳;每個端口又可以分為A和B兩個通道,分別處理一路視頻的采集或顯示;各端口又可以配置為8/10-bit ITU-R BT.656模式、8/10-bit Raw 模式、8/10-bit Y/C模式、16/20-bit Raw模式和TSI模式等。
視頻端口配置為雙通道視頻采集時,0~9bit管腳分配給通道A,10~19bit管腳分配給通道B。由于采樣后的數(shù)據(jù)按8bit量化,所以僅使用每個通道的后8個管腳,即將VPxD2~9,VPxD12~19(x對應三個端口0,1,2)直接與A/D芯片的8根輸出管腳相連。輸入的PAL/NTSC模擬信號經過視頻解碼芯片A/D后形成的數(shù)字視頻信號直接進入相應的視頻端口中。
當采集8 bit ITU-R BT.656數(shù)據(jù)時,視頻端口接收A/D的亮度與色度的復合數(shù)據(jù)流(YUV422,稱為packet格式:Cb,Y,Cr,Y,Cb,Y,Cr ),然后將它分解成三個單獨的數(shù)據(jù)流(planar格式),分別是Y,U,V,再將分離后的數(shù)據(jù)打包存放到各自的FIFO中。
將FIFO分成3部分,其中為亮度數(shù)據(jù)分量分配的FIFO為1280B,為每個色度數(shù)據(jù)分量分配FIFO為640B;每個FIFO都有相關的存儲器映射地址:YSRC,CBSRC和CRSRC;EDMA將使用這些地址作為數(shù)據(jù)搬運操作的源地址。每個視頻端口最多可以使用六個EDMA通道,當某個FIFO的計數(shù)器到達VCTHRLDn寄存器設置的數(shù)值時,就可以觸發(fā)相應的EDMA(增強的直接存儲器存取控制器)事件。
圖1 驅動程序模型 |
圖2 EDMA配置 |
2.2 EDMA配置
EDMA配置是為了從FIFO搬運數(shù)據(jù)到SDRAM中,采用1D/2D傳輸,即源地址不變,而目的地址則在每次傳輸后按索引值自動更新。我們?yōu)槊恳粓鲈O置一個EDMA參數(shù),并將這些參數(shù)連接起來,一次傳輸任務的結束會自動從參數(shù)RAM中裝載下一次傳輸需要的參數(shù),從而實現(xiàn)某些復雜數(shù)據(jù)流的傳輸。
設置時首先打開與VP口相關的三個EDMA通道并申請12組參數(shù)RAM(hRld[0]~ hRld[11]),同時為每個通道申請一個中斷號,留給EDMA中斷服務程序使用;然后依次配置12個EDMA參數(shù),并用hRld[0]、hRld[4]、hRld[8]三個參數(shù)初始化三個EDMA通道,準備數(shù)據(jù)搬運。
初始EDMA參數(shù)設置:數(shù)據(jù)源地址:YSRC;數(shù)據(jù)目的地址:一行起始地址;數(shù)據(jù)單元計數(shù):一行的采樣點數(shù);陣列計數(shù):一場的采樣行數(shù);陣列索引:一場采樣點數(shù)的兩倍(兩場按行交叉存放);參數(shù)連接地址:下一組EDMA參數(shù),各組參數(shù)連接關系如圖2所示。
可選參數(shù)設置:優(yōu)先級:用戶設置;數(shù)據(jù)單元子長:32bit;1D/2D源/目的地址傳輸;源/目的地址更新模式:源地址不更新,目的地址按陣列索引更新;傳輸結束中斷:使能每幀的底場結束中斷,并設置中斷碼;頂場禁止;EDMA事件連接:使能所有EDMA參數(shù)的連接。
通過以上參數(shù)設置后三個EDMA通道分別負責從視頻端口FIFO中搬運Y、Cb和Cr三個分量到SDRAM中;EDMA每啟動一次,從FIFO中搬運一行的采集數(shù)據(jù)到SDRAM中,并在搬運完畢后自動更新目的地址;EDMA陣列計數(shù)值到0后啟動參數(shù)連接,從參數(shù)RAM中裝載下一次傳輸需要的參數(shù),若使用了傳輸結束中斷,則執(zhí)行EDMA中斷服務程序。
3 視頻采集驅動的關鍵技術
在視頻采集過程中,最重要的是對視頻數(shù)據(jù)進行實時控制和有效的傳輸,因此在程序設計中需要使用硬件中斷,應用程序之間要同步,在中斷服務程序中,根據(jù)視頻端口內部FIFO的狀態(tài)通過EDMA完成視頻數(shù)據(jù)的讀入SDRAM,并要考慮讀入的數(shù)據(jù)的緩存管理。
3.1中斷設置
中斷服務函數(shù)用來處理外部設備的觸發(fā)事件。對于視頻采集應用, 每采集完一幀數(shù)據(jù)將觸發(fā)EDMA中斷。
EDMA中斷設置:在中斷服務表(IST)中添加EDMA_intDispatcher(),作為EDMA中斷服務取指包(ISTP),然后使用EDMA_intHook()將兩個亮度底場EDMA的傳輸結束代碼與中斷服務程序建立連接。
設置64個EDMA通道共享一個中斷號,中斷發(fā)生時,EDMA_intDispatcher()首先檢測CIER和CIPR寄存器中的被置位的位,然后再調用由EDMA_intHook()連接的中斷服務程序。中斷發(fā)生后,通過傳輸結束代碼進行區(qū)分當前中斷是哪個EDMA通道觸發(fā)的。
一幀數(shù)據(jù)采集完畢后,EDMA啟動其中斷服務程序。中斷服務程序首先檢查目前有無被掛起的請求任務,如果有,則微型驅動將當前幀的首地址等信息打包,并調用GIO模塊的回調函數(shù),回調函數(shù)喚醒被掛起的任務同時將該包傳遞給應用程序,實現(xiàn)應用程序與微型驅動之間的同步;最后更新下一幀的EDMA目的地址,準備采集下一幀。
3.2緩存管理
微驅動在中斷服務函數(shù)中管理幀緩沖區(qū),視頻數(shù)據(jù)的讀入SDRAM在SDRAM中申請兩塊緩存A和B,采樣乒乓緩存的方式進行管理。
模擬視頻輸入PAL或NTSC都是按場隔行掃描,因此數(shù)據(jù)可以按照場模式進行存儲,即先存儲頂場再存儲底場,在存儲器中是單獨的兩場圖像;或者按幀模式進行存儲,即頂場和底場按行交叉存儲,將兩場圖像拼成一幀圖像。
按幀模式存儲時,在SDRAM中申請兩幀緩存,得到兩幀的首地址;然后為每一幀中的每一場的亮度和色度分量指定存儲地址,兩場地址相差一個象素行,如圖3所示:首先采集頂場,然后采集底場,兩場按行交叉存放形成完整的一幀。
3.3同步
類驅動使用DSP/BIOS的GIO模塊,該模塊需提供必要的同步讀寫API函數(shù)及其擴展函數(shù),同時需簡化代碼和使用數(shù)據(jù)緩存的大小。
應用程序通過調用GIO的API函數(shù)直接與微型驅動交換數(shù)據(jù)。應用程序與微型驅動同時對乒乓緩存A和B進行處理,即應用程序對A進行處理的同時微型驅動將當前采集到的數(shù)據(jù)保存到B;而微型驅動只有在采集完一幀之后才能將本緩存的控制權交給應用程序,因此應用程序與微型驅動之間必須實現(xiàn)同步。應用程序、類驅動程序、微型驅動程序之間的關系如圖4所示。
|
圖4應用程序、類驅動與微型驅動 |
程序通過調用SEM旗語模塊實現(xiàn)同步。在DSP/BIOS配置工具中使用SEM_pend、SEM_post等函數(shù)配置GIO模塊的pend和post函數(shù)。應用程序通過調用GIO的API向微型驅動申請緩存,GIO模塊將應用程序的請求信息打包并傳遞給微型驅動,微型驅動首先檢查當前幀是否采集完,若當前幀即將采集完畢,則微型驅動將當前幀的地址返回給GIO模塊,否則向GIO模塊返回一個掛起信號,通過調用GIO的pend函數(shù),將應用程序的當前任務掛起,強制其進入阻塞狀態(tài),等待EDMA中斷服務程序將其喚醒。
在應用程序中為了更方便的調用驅動程序,可以將GIO的API重新封裝成更易使用的形式。對數(shù)據(jù)采集程序來說用的最多的操作就是放棄當前幀,并從驅動程序中獲取另一幀的控制權,同時調用此函數(shù)實現(xiàn)視頻同步,這些操作封裝后可以用簡單的一個函數(shù)調用實現(xiàn)。
4 結論
在某些工程應用中僅要求對亮度分量進行處理,此中情況下可以去掉后兩個EDMA通道,為應用程序節(jié)省更多的RAM空間。
本文作者創(chuàng)新點:充分利用TMS320DM642的硬件資源及開發(fā)工具,結合視頻采集驅動的特點,利用類、微驅動模型降低系統(tǒng)中軟件和硬件間的耦合性。本文設計的驅動程序可以接口不同的設備,當更換設備時,應用程序只需做很小的修改。提高了程序的可重用性和可移植性。
按此方法設計的視頻采集驅動已用到實際的視頻壓縮編碼的工程項目中,實踐證明,采用這些方法編寫的驅動程序運行穩(wěn)定,與應用程序可以實現(xiàn)無縫連接,可以為各種視頻處理算法提供了穩(wěn)定的底層支持。
參考文獻
[1] 安向陽, 沈庭芝. 基于DSP TMS320DM642的H.264視頻編碼的實現(xiàn)和優(yōu)化[J]. 微計算機信息. 2005,21 (7-2): 128-130.
[2] 靳輝, 周培源. 視頻采集卡驅動程序的設計與實現(xiàn)[J]. 計算機應用. 2001, 27(2): 7-9.
[3] Texas Instruments. TMS320DM642 Video/Imaging Fixed-Point Digital Signal Processor[EB/OL].Http//focus.ti.com/lit/ds/sprs200e/sprs200e.pdf. March 2004
[4] DSP/BIOS Device Driver Developer's Guide[Z]. Literature Number: SPRU616. Texas Instruments Incorporated. November 2002
[5] The TMS320DM642 Video Port Mini-Driver[Z],Literature Number: SPRU918A. Texas Instruments Incorporated. August 2003