嵌入式Linux系統下MPEG-4專用編碼器驅動設計

來源:互聯網
上載者:User

摘要:嵌入式視頻監控的方案設計已有眾多論述,但針對實現過程中Linux下視頻MPEG-4編碼的驅動設計鮮有提及。本文以視頻編碼晶片IME6410的驅動設計為執行個體,主要論述了基於Video for Linux (V4L) 規範的視頻驅動實現方法,包括硬體介面、裝置初始化、檔案操作實現等,並著重分析了V4L規範、視頻驅動及核心之間的內在聯絡。
關鍵詞:嵌入式Linux,Video4Linux,驅動, IME6410

AbstractThere are many researches on the design of embedded video surveillance system already. However, the method of design about Linux driver for MPEG-4 Codec has rarely been reported. In this paper, Linux driver for video Codec is discussed and an example of driver design for IME6410 is presented. The implement of driver based on V4L interface was introduced, of which the hardware interface, device initialization, file operations etc are involved as well. The fundamental relations between V4L interface, video drivers and linux kernel are analyzed deeply.

Key wordsEmbedded Linux,Video4Linux,driver, IME6410


1 引言

隨著嵌入式技術與流媒體技術的蓬勃發展,視頻監控系統正由基於PC的監控方案轉為嵌入式的視頻監控方案。由於嵌入式的數字監控系統有著布控地區廣泛、可組成非常複雜的監控網路且效能穩定可靠等優點,因此更具發展前景[1]。目前,基於MPEG-2壓縮標準的嵌入式視頻監控已經得到廣泛應用,即便如此,使用者和環境對視頻監控的要求越來越苛刻,尋求一種更好的壓縮方法和傳輸方式成為新的目標。基於該目標,本文以一種專用MPEG-4編碼晶片IME6410為例,從視頻壓縮的角度改進視頻監控方案。其中,主要描述了視頻編碼部分在嵌入式Linux下的驅動程式設計與實現。

本文首先介紹了本系統硬體結構,之後深入剖析了V4L規範,在此規範基礎上以IME6410為例具體闡述驅動程式的設計開發過程,包括晶片初始化,裝置註冊等,最後給出結論。

 

2 視頻系統硬體設計

在本系統中,MPEG-4編碼晶片採用IME6410。它是一款單路音視頻壓縮器件,其外圍整合了多種外設控制器和介面,如SDRAM控制器、I2C介面、I2S介面、主機控制器等。IME6410內部帶有RAM,可存放供晶片啟動並執行Firmware程式。根據晶片特性,設計其外圍電路1所示。

 

1 視頻伺服器編碼部分硬體圖

編碼晶片IME6410在音視頻壓縮過程中產生的大量中間資料則須放置在大容量的32位外部SDRAM中,IME6410的視頻介面符合CCIR-601 16位標準,對外支援YUV422,對內採用YUV420採樣。外部視

頻Decoder採用SAA7111,支援NTSC/PAL制式,SAA7111的片內寄存器可通過其外部I2C介面設定。在視頻伺服器系統中,有的ARM處理器內建I2C匯流排,有的則沒有,而壓縮晶片IME6410片內帶有I2C匯流排控制器,提供作為master的訪問方式,因而可以通過用IME6410間接控制SAA7111。單路視頻編碼輸出的資料量不超過14.745Mbps,應用16位匯流排的ARM 9系統負荷量不大。

視頻採集及壓縮部分的大致資料流如下:從網路攝影機採集的類比訊號通過A/D傳送給IME6410,IME6410將視頻資料在SDRAM中進行即時編碼壓縮,併合成音頻編碼(可選),將編碼後的資料送往片內1K的FIFO中,當FIFO半滿或者全滿時,產生外部訊號nfull,ARM控制器可通過中斷方式或者查詢方式獲知FIFO狀態,在需要時讀取FIFO資料,將其放在自己的RAM儲存空間中以備後處理。

 

3 驅動程式設計

驅動程式介於作業系統與硬體之間,與硬體底層聯絡緊密。Linux下的視頻採集及壓縮系統中,一般都需要用到Video for Linux(V4L)驅動規範[2],該模組是底層驅動程式與應用程式之間的介面。它為Linux下的視頻裝置提供了一套API 和相關的標準,按照V4L規定的介面訪問方式控制和讀寫裝置,即可完成視頻編碼及相關參數的採集或設定。

 

1.V4L規範的深入剖析

V4L 將視頻裝置分為四類[3],規定所有視頻裝置檔案的主裝置號都是一致的都是81 ,但是,對於不同的硬體類型,其特殊檔案的次裝置號不一致,且各類裝置都有一段獨立的次裝置號範圍。通過這種方式,可以從裝置檔案的次裝置號中判斷該裝置到底屬於那種類型。V4L 和特定的裝置驅動是通過它定義的一些資料結構和相關的函數關聯起來的,其中關鍵的資料結構是video_device 結構,其定義如下: 

struct video_device

{

char name[32];     //裝置名稱

int type;    // 裝置類型

int minor;   //次裝置號

devfs_handle_t devfs_handle;   //裝置控制代碼

/*以下為重要成員指標,有刪減*/

int (*open)(struct video_device *, int mode);

void (*close)(struct video_device *);

long (*read)(struct video_device *, char *, unsigned long, int noblock);

long (*write)(struct video_device*,char *, unsigned long, int noblock);

int (*ioctl)(struct video_device *, unsigned int , void *);

int (*mmap)(struct video_device *, const char*, unsigned long);

int (*initialize)(struct video_device *);

};

該結構對應於驅動程式控制的一個裝置,其中的minor 成員代表該裝置對應的次裝置號,其他的open,close,read,write,ioctl等成員都代表相應的函數指標,這些函數指標都是指示特定裝置的相關操作,V4L 利用統一的介面註冊了另一個裝置操作結構,這個統一的裝置操作結構裡的驅動介面函數根據被開啟特殊裝置檔案的次裝置號,來定位該裝置檔案對應的struct video_device ,從而實現對特定裝置的控制。為了實現這種定位,V4L 定義了一個靜態數組static struct video_device *video_device[256],每個特定的裝置都在該數組裡佔據一項。設計驅動程式時,需要通過V4L 提供的一個裝置註冊函數video_register_device 將每個所要控制的硬體裝置資料結構填充到該靜態數組中,調用該函數的時候,應該提供裝置特定資料結構以及裝置類型。

video_register_device函數在videodev.c中實現,事實上V4L規範的主要實現都在該檔案中,檔案位於/driver/media/video/目錄下。videodev.c本身也是一個驅動模組,一般通過menuconfig選項在核心編譯時間靜態載入。載入V4L模組的初始化函數module_init() 主要完成了字元型裝置註冊的功能,過程如下:首先註冊一個主裝置號為81的字元型裝置驅動,通過次裝置號區分每個特定裝置的驅動程式。註冊成功後,如果存在proc檔案系統,則在/proc檔案目錄下建立專用目錄/proc/video/dev/,當實際裝置檔案被註冊後,將在該目錄下產生一個裝置檔案[4]。

當註冊一個實際裝置,調用註冊函數video_register_device時,註冊要求的三個參數分別為裝置結構體(device struct),裝置類型,次裝置號。類型決定了次裝置號的起始位址區段,當註冊次裝置號為-1時,系統自動為裝置分配一個可用的最小裝置號,若指定的裝置還存在initialize函數,則亦在此運行,然後執行devfs_register,自動建立/dev目錄下的裝置檔案如video0,掛載檔案操作file_operations指標,該指標地址同樣指向V4L模組載入時定義的檔案指標,最後在/proc/video/dev/下建立裝置檔案(上已提及)。所以,V4L與具體驅動裝置註冊之間的掛鈎主要就是通過devfs_register 函數實現。

在剖析V4L介面規範後,根據其結構體,最重要的工作是模組初始化, module_init系統調用載入video_IME_init函數,完成硬體初始化及裝置結構填充工作。

 

2.完成IME6410和SAA7111的初始化

首先需要對IME6410及SAA7111分別初始化,在硬體設計中,設定SAA7111寄存器所採用的I2C介面通過IME6410輸出,所以必須先對IME6410初始化。

不同於一般的晶片,IME6410的晶片需要先下載Firmware程式然後才能正常工作,此時再初始化其片內寄存器,配置成要求的參數。根據硬體設計,首先配置ARM處理器的外部匯流排介面(EBI),從時序、延遲、電平有效等多方面滿足IME6410的時序要求。其次,根據圖2流程初始化IME6410,IME6410下載Firmware較為特殊,在硬體選擇Host下載後,片內ROM檢測外部匯流排類型及寬度,隨即等候Host端向其發送資料,其接收資料的方式類似於flash燒寫的有限狀態機器:先接收下載程式待存放的基地址和位移地址;再接收Firmware的一個半字(half word)資料;然後,再次從Host連接埠等待一個傳送命令,並開始真正的將資料存到片內RAM中,主機可通過查詢狀態寄存器獲知傳送情況,並迴圈以上過程完成下載過程,下載完畢後的IME6410將自動置位版本寄存器及各種編碼方式寄存器,查詢版本寄存器獲知Firmware下載是否成功。

 

2 視頻外設初始化流程圖

Firmware使能片內I2C模組,對ARM控制器而言就是一個外部I2C控制器,在Linux中利用宏抽象I2C讀寫操作。IME6410的片內I2C匯流排只支援最多四位元組的塊寫操作,這給SAA7111的寄存器初始化增添了麻煩,但因為SAA7111內部待設定的寄存器不多,通過幾次操作即可完成。

 

3.實現視頻裝置註冊和中斷程式註冊

視頻裝置註冊調用的源函數包含了模組計數增1,因而無需調用MOD_INC_USE_COUNT宏計數[4]。在視頻註冊調用時引用的video_device 資料結構應填充完畢,其檔案操作指標通過回呼函數指定,如:

static struct video_device IME_template =

{     ……

open:      video_IME_open,

read:       video_IME _read,

ioctl:       video_IME _ioctl,

 ……

};

該結構體中各檔案操作指標回呼函數的功能按實際需求定義,這裡列出本系統中的部分功能分配。

open:open操作使能IME6410的工作,首先查詢IME6410的狀態寄存器,當一切正常時,使能IME6410寄存器開始映像編碼。

read:讀取IME6410的FIFO,每次讀取一包(512位元組)的緩衝區,對於每一包資料,其前4個位元組標註了包大小及類型等資訊,供應用程式層使用。

write:IME6410不需要實現寫資料操作,因而基本不起作用。

mmap:映射視頻裝置緩衝到本地記憶體緩衝。

ioctl:不同於一般的裝置檔案,符合V4L的視頻檔案操作一般都通過ioctl函數設定、擷取各類參數甚至映像資料。V4L列出了所有的相關操作[5],對於本視頻編碼只實現一部分實用操作,如表1,視頻採集或編碼的操作差異較大,需要實現各自的控制方式。有些通過ARM設定的參數就直接在本地訪問了。

視頻編碼控制操作

VIDIOCGPICT

擷取映像參數,包括解析度,畫面播放速率,位元速率控制等

VIDIOCSPICT

設定映像參數

VIDIOCGMBUF

擷取本機對應緩衝的參數,主要是其地址和大小

VIDIOCMCAPTURE

擷取映像編碼到映射緩衝區

VIDIOCSYNC

擷取幀結束標誌

 

中斷程式的註冊採用request_irq系統調用,在本程式中,採用外部IO中斷,鬚根據ARM晶片硬體設定選擇中斷向量號。中斷控制代碼指向了中斷處理常式,該程式在核心態執行。當IME6410的FIFO半滿或全滿時,ARM處理器產生IO中斷,Linux核心相應中斷控制代碼,從而進入中斷處理常式,程式讀取一包資料後,通過訊息機制通知上層應用。

編譯後的驅動程式在/dev目錄下產生名為v4lvideo0的inode節點檔案。至此,完成整個驅動程式的設計與編寫。

 

4 結束語

本文深入剖析了V4L規範與視頻驅動的上下關係,以編碼晶片IME6410為例,介紹了基於視頻編碼模組的驅動開發的具體方法,針對視頻壓縮編碼選擇了合理的ioctl命令。編譯後的程式檔案其系統調用遵循V4L規範,在應用程式的測試中獲得了較好的效能。文中適用於一切符合V4L規範的視頻驅動開發。

本文作者創新點:

1.  在嵌入式Linux上設計了符合V4L規範的驅動程式,使該驅動程式有一定的通用性。

2.  提供了符合V4L規範的驅動程式設計一般方法

3.  為專用MPEG-4編碼器在嵌入式系統中的應用提供了一種參考方法

 

參考文獻:

1 南冰,李興華,荊濤. 基於MPEG-4標準和嵌入式技術的監控系統設計[J]. 微電腦資訊,2005,9-3:112-113

2 Alan Cox. Video4Linux Programming.[M] alan@redhat.com. 2000

3 李根深,邢漢承.Linux平台下PCI介面視頻採集卡的驅動程式編寫技術[J],電腦輔助工程,2003, Vol.12 No.1:12-19

4 ALESSANDRO RUBINI.魏永明等譯.LINUX 裝置驅動程式[M]. 北京 中國電力出版社,2002

5 楊繼華,嚴國萍.基於嵌入式Linux與S3C2410平台的視頻採集[J],單片機與嵌入式系統應用,2004, No.11:69-71

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.