基于Linux操作系統(tǒng)的視頻采集卡驅(qū)動(dòng)程序設(shè)計(jì)
DMA結(jié)構(gòu):
struct saa7146_video_dma {
u32 base_odd;
u32 base_even;
u32 prot_addr;
u32 pitch;
u32 base_page;
u32 num_line_byte;
};
工作流程
v4l2_extension調(diào)用v4l2_register_device()函數(shù)注冊(cè)設(shè)備,V4l2_register_device()函數(shù)進(jìn)而調(diào)用v4l2_init_done()函數(shù)(v4l2_device結(jié)構(gòu)中的int(*initialize)()字段已被初始化為該函數(shù))通過寫 I/O地址空間具體的初始化設(shè)備,設(shè)置采集圖像的默認(rèn)參數(shù)等。這時(shí)候設(shè)備已經(jīng)做好了采集圖像的準(zhǔn)備工作。
下面通過典型的read一楨圖像來分析具體的工作流程:
應(yīng)用程序首先調(diào)用系統(tǒng)調(diào)用open()來打開設(shè)備,v4l2將該調(diào)用映射為初始化設(shè)備時(shí)已經(jīng)設(shè)置好的v4l2_device結(jié)構(gòu)中的 int(*open)(),在本文中即為v4l2_open();打開設(shè)備成功read一楨圖像數(shù)據(jù)的命令,此時(shí)系統(tǒng)通過v4l2_device結(jié)構(gòu)中已經(jīng)設(shè)置好的int(*open)()字段調(diào)用相應(yīng)的函數(shù)v4l2_read(),該調(diào)用負(fù)責(zé)分配內(nèi)核內(nèi)存緩沖區(qū),并將采集到的數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間,這樣應(yīng)用程序就獲得了一楨數(shù)據(jù);
當(dāng)v4l2_capability結(jié)構(gòu)中的V4L2_CAP_STREAMING標(biāo)志被設(shè)置時(shí),這表明設(shè)備支持流采集。V4L2 的流驅(qū)動(dòng)程序維護(hù)兩個(gè)組織成FIFO的緩沖區(qū)隊(duì)列:發(fā)送隊(duì)列和接收隊(duì)列。由于應(yīng)用程序受到網(wǎng)絡(luò)延遲,進(jìn)程搶占或隨機(jī)磁盤存儲(chǔ)的影響,維護(hù)兩個(gè)隊(duì)列就可以把異步的視頻采集或輸出操作與應(yīng)用程序分離開,從而降低丟失數(shù)據(jù)的可能性。設(shè)備采集到圖像后可以用DMA 方式直接將數(shù)據(jù)放入應(yīng)用程序分配好的緩沖區(qū)中,這就大大提升了整個(gè)系統(tǒng)的性能。
4.2.3 測(cè)試驅(qū)動(dòng)程序[6]
首先編譯上述模塊,然后通過命令insmod鏈接進(jìn)內(nèi)核。用于測(cè)試的簡(jiǎn)單應(yīng)用程序主體部分如下所示:
vid = open(device, O_RDONLY);/*打開設(shè)備*/
err = ioctl(vid, VIDIOC_QUERYCAP, cap); /*查詢?cè)O(shè)備支持的功能*/
err = ioctl(vid, VIDIOC_G_FMT, fmt);/*設(shè)置采集圖像的格式*/
data = malloc(fmt.fmt.pix.sizeimage);/*分配用戶空間緩沖區(qū)*/
n = read(vid, data, fmt.fmt.pix.sizeimage);/*獲取一楨數(shù)據(jù)*/
該應(yīng)用程序運(yùn)行后經(jīng)檢查得到了預(yù)期的結(jié)果,并且在基于該驅(qū)動(dòng)程序的CDMA無線視頻傳輸系統(tǒng)中滿足了應(yīng)用的需要,獲得了理想的效果。
5 結(jié)論
本文作者創(chuàng)新點(diǎn):詳細(xì)闡述了Linux環(huán)境下利用V4L2API開發(fā)視頻采集設(shè)備驅(qū)動(dòng)程序的流程,并將該驅(qū)動(dòng)程序?qū)嶋H的應(yīng)用到我們自己研發(fā)的CDMA無線視頻傳輸系統(tǒng)中,獲得了滿意的實(shí)時(shí)效果,在此也希望對(duì)從事同類開發(fā)的人員有所裨益。
參考文獻(xiàn)
1 Alessandro Rubini Jonathan Corbet,Linux device driver,2nd Edition,O’Reilly,2001.7
2 Philip SAA7146A datasheet,1998.4
3 Philip SAA7111A datasheet,1998.5
4 http://linux.bytesex.org/v4l2/
5 PCI SIG,PCI Local Bus Specification Revision 2.2,1998.12
6 王多智,嵌入式linux下sram驅(qū)動(dòng)程序的開發(fā)原理及應(yīng)用,微計(jì)算機(jī)信息,2005年第5期
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評(píng)論