亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于cortexA8 的V4L2 視頻采集驅(qū)動(dòng)設(shè)計(jì)

        2015-09-19 03:42:50澤,陳洋,陳
        電視技術(shù) 2015年23期
        關(guān)鍵詞:驅(qū)動(dòng)程序內(nèi)核線程

        劉 澤,陳 洋,陳 林

        (重慶郵電大學(xué),重慶400065)

        嵌入式視頻采集系統(tǒng)軟件平臺(tái)大多用的是Linux 系統(tǒng),V4L2 是Linux 內(nèi)核采用的視頻采集基本框架,相比于V4L,V4L2 更靈活,擴(kuò)展性也更好一些,由于V4L2 對(duì)V4L 的改動(dòng)較大,兩者并不兼容[1]。V4L2 支持多種設(shè)備,并且支持視頻采集接口、視頻輸出接口等。視頻采集采用的流水線方式使得V4L2 的操作極其簡(jiǎn)單方便。V4L2 中還提供大量API 來(lái)對(duì)攝像頭進(jìn)行基本操作,這些操作主要通過(guò)調(diào)用ioctl 來(lái)實(shí)現(xiàn)設(shè)備打開(kāi)、關(guān)閉,以及圖像格式、曝光、增益等操作[2],一般V4L2 驅(qū)動(dòng)是讓CPU 通過(guò)I2C 總線對(duì)圖像傳感器進(jìn)行讀寫操作,I2C 總線包括數(shù)據(jù)總線和時(shí)鐘總線,主要由三部分構(gòu)成:I2C 總線驅(qū)動(dòng)、I2C 設(shè)備驅(qū)動(dòng)和I2C 核心[3]。

        本文采用MT9M001 圖像傳感器,開(kāi)發(fā)出支持曝光、增益以及圖片尺寸大小等參數(shù)設(shè)置的驅(qū)動(dòng)程序,CPU 采用TI 公司的AM3354,由于該芯片并沒(méi)有標(biāo)準(zhǔn)的攝像頭接口,硬件方案采用CPLD+SRAM 方式對(duì)CMOS 傳感器采集數(shù)據(jù)進(jìn)行預(yù)處理和緩存,并參照Linux 自帶虛擬攝像頭ViVi,設(shè)計(jì)出具有兩個(gè)線程的驅(qū)動(dòng)程序,詳細(xì)給出了非標(biāo)準(zhǔn)攝像頭接口的V4L2驅(qū)動(dòng)程序的設(shè)計(jì)過(guò)程,最后調(diào)用動(dòng)態(tài)庫(kù)API 來(lái)實(shí)現(xiàn)抓圖。

        1 V4L2 介紹

        Linux 提供了虛擬攝像頭驅(qū)動(dòng)程序ViVi,其框架也是基于V4L2 標(biāo)準(zhǔn),V4L2 主要包括V4L2 驅(qū)動(dòng)核心、字符設(shè)備驅(qū)動(dòng)核心、平臺(tái)V4L2 驅(qū)動(dòng)以及具體傳感器驅(qū)動(dòng),見(jiàn)圖1。

        圖1 V4L2 驅(qū)動(dòng)框架

        V4L2 作為兩層驅(qū)動(dòng)系統(tǒng),在videodev 頂層模塊,初始化時(shí)會(huì)被注冊(cè)為主設(shè)備號(hào)為81 的字符設(shè)備,底層則是以videodevice 為核心的V4L2 驅(qū)動(dòng),該結(jié)構(gòu)主要包含了功能函數(shù)以及視頻設(shè)備的屬性。此外videodev 模塊還提供video_device_register 函數(shù)API 來(lái)注冊(cè)V4L2 驅(qū)動(dòng),生成視頻設(shè)備節(jié)點(diǎn),比如/dev/video1 等。V4L2 驅(qū)動(dòng)源碼位于內(nèi)核目錄/driver/media/video 下面,主要核心代碼文件有[4]:

        1)v4l2-dev.c 視頻捕捉接口,主要數(shù)據(jù)結(jié)構(gòu)為:struct video-device,主要用于射頻設(shè)備的注冊(cè)。

        2)v4l2-device.c v4l2 提供設(shè)備描述,主要用于注冊(cè)v4l2設(shè)備。

        3)v4l2-ioctl.c 為ioctl 提供了通用框架,主要是為了實(shí)現(xiàn)結(jié)構(gòu)體v4l2_ioctl_ops 視頻操作相關(guān)聯(lián)下的API。

        4)v4l2-mem2mem.c 內(nèi)存之間的操作函數(shù),是內(nèi)核和視頻設(shè)備緩沖之間的框架。

        5)v4l2-common.c 通用視頻的設(shè)備接口,此文件替換videodevice.c 文件配備常規(guī)內(nèi)核分配。

        在V4L2 核心中,提供了一套標(biāo)準(zhǔn)API 來(lái)用于視頻處理緩沖器,這些API 允許驅(qū)動(dòng)程序用自己的方式實(shí)現(xiàn)read()、mmap()等[5]。

        目前設(shè)備上的視頻緩沖器,支持線性存取DMA 的方式。Videobuf 層實(shí)現(xiàn)了用戶空間與驅(qū)動(dòng)程序之間數(shù)據(jù)傳輸?shù)恼澈闲裕饕糜趲彌_管理和分配。Videobuf 層的更多相關(guān)信息,在內(nèi)核目錄的Documentation/video4linux/videobuf 中有詳細(xì)說(shuō)明。

        2 系統(tǒng)平臺(tái)

        2.1 MT9M001 圖像傳感器

        圖像傳感器采用的是micron 公司的MT9M001 CMOS 圖像傳感器,該傳感器幀率最大為30 f/s(幀/秒),即1 s 最大可以采集30 幀圖像數(shù)據(jù),最大支持130 萬(wàn)像素。性能優(yōu)異,由于圖像傳感器采集的數(shù)據(jù)是10 位的灰度值,實(shí)際采集使用時(shí)舍去兩位,保存為8 位位圖格式來(lái)降低存儲(chǔ)空間。

        2.2 cortex A8 硬件平臺(tái)

        主控芯片采用的是cortex A8 系列的ARM 處理器AM3354,工作時(shí)鐘最大為800 MHz,具有抗高溫、抗干擾等特點(diǎn),完全可以滿足高清工業(yè)相機(jī)對(duì)CPU 的要求。

        3 V4L2 驅(qū)動(dòng)設(shè)計(jì)

        3.1 驅(qū)動(dòng)程序執(zhí)行流程

        在主線程中,會(huì)注冊(cè)I2C 設(shè)備,通過(guò)檢查設(shè)備的名字,若有相同名字的設(shè)備probe 函數(shù)便會(huì)被調(diào)用,在驅(qū)動(dòng)探測(cè)函數(shù)中需要使能圖像傳感器。通過(guò)傳感器的ID 號(hào)0x8431 來(lái)完成初始化。

        reg_write(cmos_mt9m001_client,MT9M001_CHIP_ENABLE,1);

        mid=reg_read(cmos_mt9m001_client,MT9M001_CHIP_VERSION);

        if(mid!=0x8431)return ENXIO;

        若能識(shí)別傳感器ID 號(hào),說(shuō)明傳感器被正確連接。應(yīng)用程序調(diào)用open 打開(kāi)注冊(cè)的視頻設(shè)備節(jié)點(diǎn)時(shí),驅(qū)動(dòng)中的open 函數(shù)會(huì)被執(zhí)行,在open 函數(shù)中會(huì)創(chuàng)建一個(gè)負(fù)責(zé)讀取傳感器數(shù)據(jù)的子線程,在子線程被創(chuàng)建后會(huì)一直休眠。

        kthread_run(cmos_buffer,dev,dev->v4l2_dev.name);

        set_current_state(TASK_INTERRUPTIBLE);

        wait_for_completion(&thread_completion);

        此處采用CPLD 來(lái)預(yù)處理一幀的圖像數(shù)據(jù),當(dāng)CPLD 完成一幀數(shù)據(jù)的預(yù)處理后,通過(guò)CPLD 產(chǎn)生邊沿觸發(fā)信號(hào)來(lái)對(duì)視頻數(shù)據(jù)進(jìn)行讀取,同時(shí)在open 函數(shù)中會(huì)申請(qǐng)cpld_int 內(nèi)核中斷函數(shù):

        ret =request_irq(CPLD_IRQ,cpld_int,IRQF_TRIGGER_FALLING,"frame_interrupt",NULL);

        CPLD 完成預(yù)處理后會(huì)向CPU 發(fā)出中斷,中斷函數(shù)會(huì)被調(diào)用,在中斷處理函數(shù)中會(huì)調(diào)用完成量喚醒創(chuàng)建的子線程。

        子線程會(huì)對(duì)緩沖區(qū)隊(duì)列數(shù)據(jù)進(jìn)行處理,其運(yùn)行結(jié)束后會(huì)喚醒應(yīng)用程序采集,一幀圖像數(shù)據(jù)處理完成,總結(jié)主次線程流程見(jiàn)圖2。

        圖2 主次線程執(zhí)行流程

        在內(nèi)核下的video_buf.c 中提供了V4L2 視頻緩沖區(qū)內(nèi)存管理的函數(shù),視頻的數(shù)據(jù)隊(duì)列通過(guò)videobuf_queue 結(jié)構(gòu)體來(lái)管理,在此結(jié)構(gòu)體中通過(guò)videobuf_queue_ops 結(jié)構(gòu)體來(lái)進(jìn)行相關(guān)視頻緩沖區(qū)操作,數(shù)據(jù)結(jié)構(gòu)里主要提供API 來(lái)進(jìn)行緩存區(qū)的具體操作。buffer_prepare 用來(lái)準(zhǔn)備好隊(duì)列中的幀緩沖,buffer_queue 用來(lái)將buffer 加入對(duì)列,buffer_cleanup 則用來(lái)清除對(duì)列[6]。

        3.2 采集流程

        視頻采集主要基于ioctl 操作集來(lái)實(shí)現(xiàn),Linux 內(nèi)核專門提供v4l2_ioctl_ops 結(jié)構(gòu)體來(lái)管理緩沖區(qū)數(shù)據(jù)。常用函數(shù)說(shuō)明如表1。

        表1 v4l2_ioctl_ops 操作集

        表中每一個(gè)ioctl 對(duì)應(yīng)一個(gè)API 接口,這些API 需要手動(dòng)實(shí)現(xiàn)[7]。視頻采集一幀數(shù)據(jù)流程如圖3 所示。

        圖3 視頻采集基本流程

        在對(duì)圖像數(shù)據(jù)進(jìn)行采集時(shí),在沒(méi)有DMA 情況下,直接read 和write 方式從內(nèi)核空間拷貝大量數(shù)據(jù)到用戶空間的方式,不僅耗費(fèi)大量?jī)?nèi)存,效率也十分低下[8]。本驅(qū)動(dòng)采用內(nèi)存映射的方式,向內(nèi)和空間申請(qǐng)2 ~4 個(gè)緩沖區(qū),當(dāng)應(yīng)用程序調(diào)用mmap 函數(shù)時(shí),驅(qū)動(dòng)程序不再是直接拷貝數(shù)據(jù)到用戶空間,而是利用mmap 來(lái)建立緩沖區(qū)和用戶空間的映射,即直接對(duì)用戶空間進(jìn)行操作,效率大大提高。驅(qū)動(dòng)程序建立映射只需對(duì)數(shù)據(jù)結(jié)構(gòu)v4l2_file_operations 成員函數(shù)mmap 填充即可。

        3.3 高級(jí)功能

        本驅(qū)動(dòng)中還支持設(shè)置采集圖片尺寸大小以及曝光、增益等的設(shè)置。其中v4l2_ctrl_ops 結(jié)構(gòu)體中的成員函數(shù)s_ctrl 用來(lái)設(shè)置曝光增益值,而g_volatile_ctrl 用來(lái)獲取曝光值。

        4 測(cè)試

        硬件環(huán)境搭載好后,通過(guò)makefile 將驅(qū)動(dòng)程序生成.ko 文件,將.ko 文件用insmod 命令安裝驅(qū)動(dòng)。會(huì)在文件目錄/dev下自動(dòng)生成video1 文件,此文件就是V4L2 驅(qū)動(dòng)掛載點(diǎn),對(duì)驅(qū)動(dòng)程序進(jìn)行測(cè)試時(shí),將測(cè)試程序封裝為動(dòng)態(tài)庫(kù),動(dòng)態(tài)庫(kù)中各個(gè)API 說(shuō)明如表2。

        表2 動(dòng)態(tài)庫(kù)API 功能說(shuō)明

        上述API 中,CameraImageProcess 比較關(guān)鍵,因?yàn)槠漕A(yù)留出圖像數(shù)據(jù)數(shù)組指針,實(shí)際需要對(duì)圖像進(jìn)行分析處理時(shí),只需獲得該API 參數(shù)指針進(jìn)行操作即可,圖4 和圖5 為調(diào)用封裝動(dòng)態(tài)庫(kù)采集圖片。

        5 結(jié)束語(yǔ)

        本文針對(duì)cortexA8 硬件平臺(tái)以及cmos 圖像傳感器mt9m001,實(shí)現(xiàn)一款針對(duì)非標(biāo)準(zhǔn)攝像頭接口的V4L2 驅(qū)動(dòng),詳細(xì)闡述了程序的設(shè)計(jì)思路以及實(shí)現(xiàn)應(yīng)用程序動(dòng)態(tài)庫(kù)的封裝,并在驅(qū)動(dòng)程序中實(shí)現(xiàn)了對(duì)曝光、增益值得設(shè)置。最后通過(guò)調(diào)用應(yīng)用程序封裝的動(dòng)態(tài)庫(kù)采集圖片來(lái)驗(yàn)證驅(qū)動(dòng)的正確性,對(duì)沒(méi)有標(biāo)準(zhǔn)攝像頭接口的平臺(tái)開(kāi)發(fā)具有一定借鑒意義。

        圖4 未設(shè)置曝光增益采集的圖片

        圖5 加入曝光增益設(shè)置采集的圖片

        [1]王飛,孔聰. 基于V4L2 的Linux 攝像頭驅(qū)動(dòng)的實(shí)現(xiàn)[J]. 電子科技,2012,25(2):86-87.

        [2]黃俊偉,巴義. 基于V4L2 移動(dòng)視頻監(jiān)控系統(tǒng)的研究與設(shè)計(jì)[J]. 電視技術(shù),2012,36(17):159-162.

        [3]宋寶華.Linux 設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:人民郵電出版社,2008.

        [4]蔡小偉.基于ARM cortex A8 的嵌入式視頻監(jiān)控系統(tǒng)設(shè)計(jì)[D].南昌:南昌大學(xué),2013.

        [5]廖夢(mèng)云,趙利,莫金旺.基于CMOS 圖像傳感器的嵌入式視頻采集系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2009(5):194-197.

        [6]余臣.高分辨率高速CMOS 相機(jī)的硬件設(shè)計(jì)[D].成都:電子科技大學(xué),2011.

        [7]劉登誠(chéng),沈蘇彬,李莉. 基于V4L2 的視頻驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2011,27(10):56-58.

        [8]叢培超.高幀高清CMOS 工業(yè)攝像機(jī)設(shè)計(jì)與實(shí)現(xiàn)[D].大連:大連理工大學(xué),2013.

        猜你喜歡
        驅(qū)動(dòng)程序內(nèi)核線程
        萬(wàn)物皆可IP的時(shí)代,我們當(dāng)夯實(shí)的IP內(nèi)核是什么?
        強(qiáng)化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
        基于嵌入式Linux內(nèi)核的自恢復(fù)設(shè)計(jì)
        Linux內(nèi)核mmap保護(hù)機(jī)制研究
        淺談linux多線程協(xié)作
        Linux線程實(shí)現(xiàn)技術(shù)研究
        么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
        驅(qū)動(dòng)程序更新與推薦
        驅(qū)動(dòng)程序更新與推薦
        驅(qū)動(dòng)程序更新與推薦
        国产在线视频网站不卡| 免费视频爱爱太爽了| 男女爽爽无遮挡午夜视频| 18黑白丝水手服自慰喷水网站| 美女把尿囗扒开让男人添| 国产精品人妻一区夜夜爱| 国偷自产av一区二区三区| 亚洲欧美性另类春色| 午夜无码熟熟妇丰满人妻| 亚洲国产日韩精品综合| 水蜜桃网站视频在线观看| 大地资源网在线观看免费官网 | 日本一区二区日韩在线| 国产伦精品一区二区三区| 蕾丝女同一区二区三区| 国产在线一区二区三区四区不卡| 亚洲综合极品美女av| 亚洲熟妇久久国产精品| 日本丰满熟妇bbxbbxhd| 免费av片在线观看网站| 波多野结衣一区二区三区视频| 一个人的视频免费播放在线观看| 亚洲av高清一区二区| 亚洲综合在线观看一区二区三区 | 国产免费人成视频在线播放播| 国产麻豆一区二区三区在线播放| 在线久草视频免费播放| 国产99一区二区三区四区| 女人被弄到高潮的免费视频| 亚洲av理论在线电影网| av在线免费播放网站| 极品精品视频在线观看| 久久青青草原国产毛片| 男人边做边吃奶头视频| 99精品一区二区三区无码吞精| 国产精品美女久久久久久久| 白色橄榄树在线免费观看| 免费毛片一区二区三区女同 | 国产91九色视频在线播放| 国产视频在线观看一区二区三区| 亚洲一区二区日韩专区|