基于DM6467T的高清攝像頭驅動設計
摘要 為滿足高清視頻監控的需求,針對目前raw格式傳感器的驅動支持尚不完善的問題。文中基于TI公司的DM6467T芯片硬件平臺,利用芯片提供的VPIF接口,對高清攝像頭進行驅動程序的設計。分析了V4L2驅動結構,并分別對V4L2核心驅動、VPIF接口驅動以及傳感器驅動進行修改及設計。編寫了驅動測試程序,實驗結果表明,該設計能成功采集到raw格式的圖像數據,對同類傳感器驅動設計具有一定參考價值。
本文引用地址:http://www.j9360.com/article/201610/307177.htm隨著數字視頻技術成為安防監控與視頻會議不可缺少的一部分,人們對視頻穩定性、圖像清晰度以及數據實時性的要求也逐步提高。為得到更清晰的圖像,TI(德州儀器)推出了達芬奇系列芯片。該系列芯片善于處理多媒體數據,支持多種視頻格式的輸入和高清視頻的輸入。對于YUV格式的視頻圖像輸入,目前已有較為成熟的驅動可直接使用,然而常見的傳感器通常輸出raw格式的視頻數據,raw格式的是最原始的視頻數據,其信息量最大,現階段對傳感器的驅動支持尚不完善。本文基于Linux環境,介紹了V4L2、VPIF和傳感器驅動之間的關系,完成視頻采集設備驅動的設計及簡單測試程序的編寫。
1 硬件平臺架構介紹
在進行驅動程序設計之前,首先要了解相關硬件設備的信息。
1.1 DM6467T介紹
DM6467T是TI公司推出的一款達芬奇系列的雙核芯片。達芬奇技術的基礎是集成了DSP與ARM雙內核的片上系統,ARM內核可加載操作系統,主要起控制和管理作用,DSP內核相當于一個只負責處理編解碼算法的協處理器。DM6467T擁有1 GHz主頻的DSP內核,500 MHz主頻的ARM926E—JS內核以及2個HDVICP硬件協處理器。基于多媒體背景提出的DM646 7T,不僅運算能力高,且具有較強的控制能力。
DM6467T擁有VPIF(Video Port Interface)視頻接口功能模塊,VPIF模塊管理著視頻數據的輸入輸出功能,可滿足各種視頻輸入輸出設備的格式。該模塊有4路可配置的數據通道,每路為8 bit的數據寬度,其中兩路用于視頻輸出,另兩路用于視頻輸入。VPIF支持ITU—BT.656、ITU—BT.1120格式的視頻,也可支持數據寬度為8/10/12 bit的raw格式圖像數據。
1.2 MT9P031傳感器
MT9P031傳感器是Aptina公司推出的一款高清傳感器,最高可支持2 592×1 944像素的視頻采集。在720p的視頻格式下,每秒可采集60幀視頻圖像。MT9P031利用I2C(Inter-Integrated Circuit)總線進行通信,通過I2C設置傳感器內部寄存器,即可控制傳感器的工作模式及工作參數。I2C總線是由Philips公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。
傳感器端連接示意圖如圖1所示。傳感器的數據接口與DM6467T的VPIF接口相連接。MT9P031傳感器采集輸出的是12位寬度的原始數據,需要占用VPIF接口中兩路8 bit的數據通道,傳感器利用行同步信號與幀同步信號進行同步,其同步信號與VPIF接口相連接。

2 視頻驅動設計
2.1 V4L2驅動
V4L2(Video for Linux two)是Linux下開發視頻采集設備驅動程序的一套規范,這套規范使用分層的方法為驅動程序的開發提供了清晰的模型和一致的接口。V4L2本身是一個字符設備,具有字符設備的所有特性,直接將接口暴露給用戶。當視頻設備連接到主機后,驅動程序會首先注冊一個主設備號為81的字符設備,其是硬件唯一的身份標識。
圖2展示了V4L2的驅動結構。驅動正常加載完畢后,會在/dev目錄下產生/dev/videoX設備節點。圖中的V4L2驅動核心構建一個內核中標準視頻設備驅動的框架,為視頻操作提供統一的接口函數。平臺V4L2驅動部分,根據平臺自身的特性實現與平臺相關的驅動,平臺驅動用于控制視頻接收端的相關操作。本文采用DM6467T處理器,使用DM6467T的VPIF接口,該平臺驅動即VPIF驅動。用戶在利用接口進行操作時,V4L2調用平臺驅動所提供的功能對DM6467T進行操作。用戶需要采集傳感器數據時,利用V4L2驅動核心提供的接口進行操作,驅動核心將負責下層驅動的調用,完成數據采集工作。

2.2 VPIF接口驅動
VPIF(Video Port Interface)是DM6467視頻接口功能模塊,VPIF接口共4路數據通道,兩路8位視頻輸入通道,兩路輸出通道,其4路通道擁有相同的硬件結構。DM6467T通過VPIF接口接收傳感器采集的視頻數據,并將所有輸入數據都緩存在片內Flash中。
首先需設計驅動初始化程序,在加載驅動過程中,VPIF需要進行初始化工作,主要包括分配緩沖,檢測設備類型,分配內存給通道對象,將設備注冊為V4l2_dev,申請視頻數據接收時的中斷,該中斷表示一幀視頻數據接收完成。注冊相關的控制類函數,該類函數將實現用戶層接口的控制操作。
余下的VPIF驅動函數設計可分為3部分:(1)用戶控制相關的操作函數,該類函數實現V4L2中ioctl函數的具體操作。用戶可通過V4L2對VPIF進行查詢設備能力、設置像素、設置標準格式、申請緩沖區、對緩沖區進行操作和開啟或停止視頻采集等操作。(2)字符設備操作相關的函數,包括設備打開的實現,設備被關閉時資源釋放以及內存映射的實現。(3)實現中斷服務程序。采集視頻數據階段,每接收到一幀完整數據后,系統會產生一個中斷,跳轉到中斷服務程序。產生中斷表示緩存區域已被接收到的圖像數據填滿,中斷服務程序中需要實現緩存輪換的操作,即將緩存指針指向下一個空白區域。
2.3 MT9P031驅動
MT9P031傳感器驅動首先需要實現初始化功能。傳感器驅動需要作為v4l2_subdev進行注冊,注冊完成后可在VPIF驅動中利用v4l2_subdev_call函數對其進行操作。MT9P031的內部控制寄存器由I2C總線進行控制,傳感器驅動在初始化時還需注冊為I2C設備,并利用I2C總線進行探測,讀取傳感器的設備號,檢測傳感器芯片是否正常。
由于MT9P031是V4L2子設備,驅動需要實現供上層平臺驅動調用的控制函數,包括設置及獲取當前視頻格式,設置及獲取視頻參數以及實現傳感器數據采集與停止功能的函數。
最后需要在芯片相關的設置文件中,加入VPIF與傳感器的文件的配置,配置基本參數,如I2C地址、VPIF通道的連接情況等信息。
3 驅動測試程序
3.1 驅動程序編寫
本文編寫的驅動程序直接編譯在內核中,在Linux內核啟動的過程中,視頻驅動進行初始化。內核加載完畢后,在/dev目錄下產生/dev/vide0設備節點,用戶空間通過調用Open函數即可打開設備,進行視頻采集操作。具體流程如圖3所示。

用戶打開設備后,利用Ioctrl函數進行操作,通過VIDIOC_QUERTCAP控制命令可查詢驅動支持格式,并利用其他控制命令進行相應設置。Linux操作系統和驅動程序運行在內核空間,應用程序運行在用戶空間,兩者不能直接使用指針傳遞數據,需通過VIDIOC_REQBUFS命令和Malloc函數分別在內核空間和用戶空間分配內存緩沖區,最后通過Mmap函數進行內存映射。利用VIDIOC_QBUF命令將分配到的緩沖加入緩沖隊列,該隊列將用于存放接收到的視頻數據。利用VIDIOC_STREAMON命令開始視頻采集,從緩沖隊列中取到視頻數據,并保存在SDRAM中,保存完畢后將緩沖區放回隊列。采集完畢后需先停止視頻采集,調用Close函數關閉視頻設備,并且釋放申請的內存空間。
3.2 測試結果
最終采集到的視頻數據存放在SDRAM中,傳感器采集到的視頻圖像是raw格式的數據,其數據格式為紅綠/綠藍交錯的值,需要利用差值算法將其轉換成RGB圖像再進行顯示,最終呈現了較為清晰的圖像,驗證了驅動程序的正確性。
由于raw格式的數據量較大,在實際應用中并不適合將該數據直接存儲至存儲器中,需要對數據進行轉碼壓縮,隨后再存儲或通過網絡進行傳輸。利用該驅動程序進行網絡攝像頭的設計,由于轉碼運算量大,在720P的格式下,目前實時的采集播放速率可達到10 fip·s-1。雖未達到傳感器的標準,但驗證了驅動的正確性,且基本滿足使用需求。對DSP算法進行優化后,視頻每秒的幀數將可進一步提升。
4 結束語
本文介紹了V4L2驅動的設計架構,利用DM6467T的VPIF接口,設計了基于DM6467T的高清攝像頭驅動。現有基于VPIF接口設計的驅動僅支持YUV分量格式的視頻數據,本文實現了在VPIF下針對raw格式視頻數據采集的驅動,采集數據也達到了預期的效果。raw格式圖像數據量大,根據需求進行處理后,用途廣泛。
評論