基于DM6467T的高清攝像頭驅(qū)動設(shè)計
摘要 為滿足高清視頻監(jiān)控的需求,針對目前raw格式傳感器的驅(qū)動支持尚不完善的問題。文中基于TI公司的DM6467T芯片硬件平臺,利用芯片提供的VPIF接口,對高清攝像頭進行驅(qū)動程序的設(shè)計。分析了V4L2驅(qū)動結(jié)構(gòu),并分別對V4L2核心驅(qū)動、VPIF接口驅(qū)動以及傳感器驅(qū)動進行修改及設(shè)計。編寫了驅(qū)動測試程序,實驗結(jié)果表明,該設(shè)計能成功采集到raw格式的圖像數(shù)據(jù),對同類傳感器驅(qū)動設(shè)計具有一定參考價值。
隨著數(shù)字視頻技術(shù)成為安防監(jiān)控與視頻會議不可缺少的一部分,人們對視頻穩(wěn)定性、圖像清晰度以及數(shù)據(jù)實時性的要求也逐步提高。為得到更清晰的圖像,TI(德州儀器)推出了達芬奇系列芯片。該系列芯片善于處理多媒體數(shù)據(jù),支持多種視頻格式的輸入和高清視頻的輸入。對于YUV格式的視頻圖像輸入,目前已有較為成熟的驅(qū)動可直接使用,然而常見的傳感器通常輸出raw格式的視頻數(shù)據(jù),raw格式的是最原始的視頻數(shù)據(jù),其信息量最大,現(xiàn)階段對傳感器的驅(qū)動支持尚不完善。本文基于Linux環(huán)境,介紹了V4L2、VPIF和傳感器驅(qū)動之間的關(guān)系,完成視頻采集設(shè)備驅(qū)動的設(shè)計及簡單測試程序的編寫。
1 硬件平臺架構(gòu)介紹
在進行驅(qū)動程序設(shè)計之前,首先要了解相關(guān)硬件設(shè)備的信息。
1.1 DM6467T介紹
DM6467T是TI公司推出的一款達芬奇系列的雙核芯片。達芬奇技術(shù)的基礎(chǔ)是集成了DSP與ARM雙內(nèi)核的片上系統(tǒng),ARM內(nèi)核可加載操作系統(tǒng),主要起控制和管理作用,DSP內(nèi)核相當于一個只負責處理編解碼算法的協(xié)處理器。DM6467T擁有1 GHz主頻的DSP內(nèi)核,500 MHz主頻的ARM926E—JS內(nèi)核以及2個HDVICP硬件協(xié)處理器?;诙嗝襟w背景提出的DM646 7T,不僅運算能力高,且具有較強的控制能力。
DM6467T擁有VPIF(Video Port Interface)視頻接口功能模塊,VPIF模塊管理著視頻數(shù)據(jù)的輸入輸出功能,可滿足各種視頻輸入輸出設(shè)備的格式。該模塊有4路可配置的數(shù)據(jù)通道,每路為8 bit的數(shù)據(jù)寬度,其中兩路用于視頻輸出,另兩路用于視頻輸入。VPIF支持ITU—BT.656、ITU—BT.1120格式的視頻,也可支持數(shù)據(jù)寬度為8/10/12 bit的raw格式圖像數(shù)據(jù)。
1.2 MT9P031傳感器
MT9P031傳感器是Aptina公司推出的一款高清傳感器,最高可支持2 592×1 944像素的視頻采集。在720p的視頻格式下,每秒可采集60幀視頻圖像。MT9P031利用I2C(Inter-Integrated Circuit)總線進行通信,通過I2C設(shè)置傳感器內(nèi)部寄存器,即可控制傳感器的工作模式及工作參數(shù)。I2C總線是由Philips公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。
傳感器端連接示意圖如圖1所示。傳感器的數(shù)據(jù)接口與DM6467T的VPIF接口相連接。MT9P031傳感器采集輸出的是12位寬度的原始數(shù)據(jù),需要占用VPIF接口中兩路8 bit的數(shù)據(jù)通道,傳感器利用行同步信號與幀同步信號進行同步,其同步信號與VPIF接口相連接。
2 視頻驅(qū)動設(shè)計
2.1 V4L2驅(qū)動
V4L2(Video for Linux two)是Linux下開發(fā)視頻采集設(shè)備驅(qū)動程序的一套規(guī)范,這套規(guī)范使用分層的方法為驅(qū)動程序的開發(fā)提供了清晰的模型和一致的接口。V4L2本身是一個字符設(shè)備,具有字符設(shè)備的所有特性,直接將接口暴露給用戶。當視頻設(shè)備連接到主機后,驅(qū)動程序會首先注冊一個主設(shè)備號為81的字符設(shè)備,其是硬件唯一的身份標識。
圖2展示了V4L2的驅(qū)動結(jié)構(gòu)。驅(qū)動正常加載完畢后,會在/dev目錄下產(chǎn)生/dev/videoX設(shè)備節(jié)點。圖中的V4L2驅(qū)動核心構(gòu)建一個內(nèi)核中標準視頻設(shè)備驅(qū)動的框架,為視頻操作提供統(tǒng)一的接口函數(shù)。平臺V4L2驅(qū)動部分,根據(jù)平臺自身的特性實現(xiàn)與平臺相關(guān)的驅(qū)動,平臺驅(qū)動用于控制視頻接收端的相關(guān)操作。本文采用DM6467T處理器,使用DM6467T的VPIF接口,該平臺驅(qū)動即VPIF驅(qū)動。用戶在利用接口進行操作時,V4L2調(diào)用平臺驅(qū)動所提供的功能對DM6467T進行操作。用戶需要采集傳感器數(shù)據(jù)時,利用V4L2驅(qū)動核心提供的接口進行操作,驅(qū)動核心將負責下層驅(qū)動的調(diào)用,完成數(shù)據(jù)采集工作。
2.2 VPIF接口驅(qū)動
VPIF(Video Port Interface)是DM6467視頻接口功能模塊,VPIF接口共4路數(shù)據(jù)通道,兩路8位視頻輸入通道,兩路輸出通道,其4路通道擁有相同的硬件結(jié)構(gòu)。DM6467T通過VPIF接口接收傳感器采集的視頻數(shù)據(jù),并將所有輸入數(shù)據(jù)都緩存在片內(nèi)Flash中。
首先需設(shè)計驅(qū)動初始化程序,在加載驅(qū)動過程中,VPIF需要進行初始化工作,主要包括分配緩沖,檢測設(shè)備類型,分配內(nèi)存給通道對象,將設(shè)備注冊為V4l2_dev,申請視頻數(shù)據(jù)接收時的中斷,該中斷表示一幀視頻數(shù)據(jù)接收完成。注冊相關(guān)的控制類函數(shù),該類函數(shù)將實現(xiàn)用戶層接口的控制操作。
余下的VPIF驅(qū)動函數(shù)設(shè)計可分為3部分:(1)用戶控制相關(guān)的操作函數(shù),該類函數(shù)實現(xiàn)V4L2中ioctl函數(shù)的具體操作。用戶可通過V4L2對VPIF進行查詢設(shè)備能力、設(shè)置像素、設(shè)置標準格式、申請緩沖區(qū)、對緩沖區(qū)進行操作和開啟或停止視頻采集等操作。(2)字符設(shè)備操作相關(guān)的函數(shù),包括設(shè)備打開的實現(xiàn),設(shè)備被關(guān)閉時資源釋放以及內(nèi)存映射的實現(xiàn)。(3)實現(xiàn)中斷服務(wù)程序。采集視頻數(shù)據(jù)階段,每接收到一幀完整數(shù)據(jù)后,系統(tǒng)會產(chǎn)生一個中斷,跳轉(zhuǎn)到中斷服務(wù)程序。產(chǎn)生中斷表示緩存區(qū)域已被接收到的圖像數(shù)據(jù)填滿,中斷服務(wù)程序中需要實現(xiàn)緩存輪換的操作,即將緩存指針指向下一個空白區(qū)域。
2.3 MT9P031驅(qū)動
MT9P031傳感器驅(qū)動首先需要實現(xiàn)初始化功能。傳感器驅(qū)動需要作為v4l2_subdev進行注冊,注冊完成后可在VPIF驅(qū)動中利用v4l2_subdev_call函數(shù)對其進行操作。MT9P031的內(nèi)部控制寄存器由I2C總線進行控制,傳感器驅(qū)動在初始化時還需注冊為I2C設(shè)備,并利用I2C總線進行探測,讀取傳感器的設(shè)備號,檢測傳感器芯片是否正常。
由于MT9P031是V4L2子設(shè)備,驅(qū)動需要實現(xiàn)供上層平臺驅(qū)動調(diào)用的控制函數(shù),包括設(shè)置及獲取當前視頻格式,設(shè)置及獲取視頻參數(shù)以及實現(xiàn)傳感器數(shù)據(jù)采集與停止功能的函數(shù)。
最后需要在芯片相關(guān)的設(shè)置文件中,加入VPIF與傳感器的文件的配置,配置基本參數(shù),如I2C地址、VPIF通道的連接情況等信息。
3 驅(qū)動測試程序
3.1 驅(qū)動程序編寫
本文編寫的驅(qū)動程序直接編譯在內(nèi)核中,在Linux內(nèi)核啟動的過程中,視頻驅(qū)動進行初始化。內(nèi)核加載完畢后,在/dev目錄下產(chǎn)生/dev/vide0設(shè)備節(jié)點,用戶空間通過調(diào)用Open函數(shù)即可打開設(shè)備,進行視頻采集操作。具體流程如圖3所示。
用戶打開設(shè)備后,利用Ioctrl函數(shù)進行操作,通過VIDIOC_QUERTCAP控制命令可查詢驅(qū)動支持格式,并利用其他控制命令進行相應(yīng)設(shè)置。Linux操作系統(tǒng)和驅(qū)動程序運行在內(nèi)核空間,應(yīng)用程序運行在用戶空間,兩者不能直接使用指針傳遞數(shù)據(jù),需通過VIDIOC_REQBUFS命令和Malloc函數(shù)分別在內(nèi)核空間和用戶空間分配內(nèi)存緩沖區(qū),最后通過Mmap函數(shù)進行內(nèi)存映射。利用VIDIOC_QBUF命令將分配到的緩沖加入緩沖隊列,該隊列將用于存放接收到的視頻數(shù)據(jù)。利用VIDIOC_STREAMON命令開始視頻采集,從緩沖隊列中取到視頻數(shù)據(jù),并保存在SDRAM中,保存完畢后將緩沖區(qū)放回隊列。采集完畢后需先停止視頻采集,調(diào)用Close函數(shù)關(guān)閉視頻設(shè)備,并且釋放申請的內(nèi)存空間。
3.2 測試結(jié)果
最終采集到的視頻數(shù)據(jù)存放在SDRAM中,傳感器采集到的視頻圖像是raw格式的數(shù)據(jù),其數(shù)據(jù)格式為紅綠/綠藍交錯的值,需要利用差值算法將其轉(zhuǎn)換成RGB圖像再進行顯示,最終呈現(xiàn)了較為清晰的圖像,驗證了驅(qū)動程序的正確性。
由于raw格式的數(shù)據(jù)量較大,在實際應(yīng)用中并不適合將該數(shù)據(jù)直接存儲至存儲器中,需要對數(shù)據(jù)進行轉(zhuǎn)碼壓縮,隨后再存儲或通過網(wǎng)絡(luò)進行傳輸。利用該驅(qū)動程序進行網(wǎng)絡(luò)攝像頭的設(shè)計,由于轉(zhuǎn)碼運算量大,在720P的格式下,目前實時的采集播放速率可達到10 fip·s-1。雖未達到傳感器的標準,但驗證了驅(qū)動的正確性,且基本滿足使用需求。對DSP算法進行優(yōu)化后,視頻每秒的幀數(shù)將可進一步提升。
4 結(jié)束語
本文介紹了V4L2驅(qū)動的設(shè)計架構(gòu),利用DM6467T的VPIF接口,設(shè)計了基于DM6467T的高清攝像頭驅(qū)動?,F(xiàn)有基于VPIF接口設(shè)計的驅(qū)動僅支持YUV分量格式的視頻數(shù)據(jù),本文實現(xiàn)了在VPIF下針對raw格式視頻數(shù)據(jù)采集的驅(qū)動,采集數(shù)據(jù)也達到了預(yù)期的效果。raw格式圖像數(shù)據(jù)量大,根據(jù)需求進行處理后,用途廣泛。