国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于S5PV210的1080P網(wǎng)絡(luò)攝像頭設(shè)計

2014-12-23 01:06李宇成黃堂猛
計算機工程與設(shè)計 2014年11期
關(guān)鍵詞:共享內(nèi)存內(nèi)核內(nèi)存

李宇成,黃堂猛

(北方工業(yè)大學 機電工程學院,北京100144)

0 引 言

隨著人們對視頻監(jiān)控的需求增加,嵌入式視頻監(jiān)控系統(tǒng)正日益得到廣泛應用。但受技術(shù)和成本的約束,市場上的高清的IP Camera較為少見,以往僅TI的多媒體芯片功能較為突出,如TM320DM365[1]能夠?qū)崿F(xiàn)720p視頻拍攝;TM320DM368[2]能夠?qū)崿F(xiàn)1080p拍攝。隨著智能多媒體芯片的發(fā)展,高通、三星高性能多媒體芯片也在市場出現(xiàn)[3],且具有價格低廉、軟件開放的優(yōu)點,但鮮見高清網(wǎng)絡(luò)攝像機方面的研究論文。本文設(shè)計一款基于三星高性能多媒體芯片的高清IP 攝像頭。處理器采用三星公司CORTEXA8[4]芯片S5PV210,該芯片主頻1 GHZ,支持1080P/30 fps H264[5]硬件編解碼,支持CCD 和CMOS[6]攝像頭。本文采用OmniVision 公司生產(chǎn)的500 萬像素、功能強大的OV5642CMOS傳感器,進行了S5PV210的攝像頭接口設(shè)計與驅(qū)動設(shè)計。操作系統(tǒng)采用Linux 組織近年發(fā)布的Linux-3.8內(nèi)核,對其新特性尤其在基于三星的多媒體框架方面進行了深入的研究,并用UML[7]語言進行描述;通過對驅(qū)動間共享內(nèi)存探索與研究,將視頻壓縮參數(shù),逼近S5PV210芯片的提供的最大參數(shù)1080P/30fps。

1 系統(tǒng)硬件設(shè)計

系統(tǒng)硬件架構(gòu)如圖1 所示,嵌入式處理器S5PV210接收來自視頻采集模塊采集的視頻數(shù)據(jù),同時利用內(nèi)部硬件編碼器進行H.264 高速壓縮編碼,然后將H.264 碼流通過RTP 協(xié)議上傳,客戶端可通過VLC 播放器實時播放。其中,S5PV210 具有低功耗、高性能、低價格的特點,使用ARM V7指令集,64/32位內(nèi)部總線結(jié)構(gòu),32/32KB的數(shù)據(jù)/指令一級緩存,512KB的二級緩存,可以實現(xiàn)2000DMIPS (每秒運算2 億條指令)的高性能運算能力[8]。

圖1 系統(tǒng)架構(gòu)

1.1 視頻采集模塊

OV5642采用1.4 微米×1.4 微米的像素具有高靈 敏度,低串擾,低噪音等性能。具備自動圖像控制功能:自動曝光 (AEC),自動白平衡 (AWB)、自動帶式過濾器(ABF)、鏡像和翻轉(zhuǎn)、裁剪、窗口和平移等;以及圖像質(zhì)量控制功能:色彩飽和度、色調(diào)、清晰度 (邊緣增強)、鏡頭校正、缺陷像素消除、噪音消除、防抖等。擁有標準串行接口 (SCCB),數(shù)字視頻端口 (DVP)并行輸出、雙通道MIPI輸出等接口。支持500萬像素圖像、支持自動對焦控制 (AFC)、AF VCM 驅(qū)動器。還支持60fps 的720p高清視頻以及30fps的1080p高清視頻[9]。

本文設(shè)計的OV5642 應用電路采用了雙電源,分別為OV5642內(nèi)部核心提供1.5 V、為IO 口提供2.8 V 電壓,這樣能保證與S5PV210的CAMERA 3.3V 接口直接相連。為了增強攝像頭模塊坑干擾能力和提高時鐘信號的完整性,采用了有源晶振來提供時鐘信號。

1.2 系統(tǒng)可行性分析

一般認為,內(nèi)存帶寬=內(nèi)存時鐘頻率×內(nèi)存總線位數(shù)×倍增系數(shù)/8。三星的S5PV210的最高的內(nèi)存時鐘頻率是200M,內(nèi)存總線位數(shù)32,倍增系數(shù)為1,可得內(nèi)存寬帶800 M。1080P一幀YUV420圖像大小為3M,如果幀率為25fps,數(shù)據(jù)從OV5642 到內(nèi)存需要75 M/s,從內(nèi)存到MFC編碼器需要75 M/s,共需要的內(nèi)存帶寬為150 M,因此,內(nèi)存運行速度足夠滿足要求。攝像頭設(shè)計的PLCK 頻率96 M/s,8位數(shù)據(jù)線,可滿足75 M/s的需求。S5PV210標稱支持1080P/30fps的H264 的內(nèi)部硬件壓縮,但是,實測下來,在這個速度上運行不太穩(wěn)定。因此,本系統(tǒng)設(shè)計幀率為25fps。

2 SCCB驅(qū)動程序設(shè)計

SCCB是簡化的I2C 協(xié)議,因此SCCB驅(qū)動設(shè)計本質(zhì)就是I2C[10]的 驅(qū) 動 設(shè) 計。隨 著Linux 內(nèi) 核[11,12]的 不 斷 發(fā) 展,I2C設(shè)備的架構(gòu)也在不斷的改進和完善。

Linux內(nèi)核虛擬了一條I2C總線,盡管其上掛的I2C 設(shè)備跟物理的I2C 設(shè)備一一對應,但是,虛擬的I2C 總線與硬件總線有所不同。物理I2C 總線的數(shù)量與處理器I2C 適配器數(shù)量相等,有多個。而在虛擬的I2C 總線上,同時掛載了系統(tǒng)全部的I2C設(shè)備。比如OV5642設(shè)備描述符 “0-003C”,“-”前面的0表示該設(shè)備掛載在S5PV210的0號I2C接口上,003C 表示OV5642 的物理地址,其余類推。例如在本系統(tǒng)中,是音頻編解碼芯片wm8580 設(shè)備描述符為0-001B,E2PROM 非易失數(shù)據(jù)存儲器24c08設(shè)備描述符為0-0050。

圖2表示了I2C_client設(shè)備和驅(qū)動匹配后生成的整個I2C設(shè)備數(shù)據(jù)結(jié)構(gòu)信息。設(shè)備I2C_client由i2c_new_device()函數(shù)創(chuàng)建,并通過device_register()函數(shù)掛載到i2c_bus上。這樣在/sys/bus/i2c目錄下生成文件名為0-003C文件。一旦OV5642驅(qū)動與設(shè)備名匹配成功后,將執(zhí)行對應的ov5642_probe ()函數(shù),并為如圖2 所示的OV5642數(shù)據(jù)結(jié)構(gòu)分配內(nèi)存,同時,初始化與攝像頭屬性相關(guān)的數(shù)據(jù)變量。

Linux老版本內(nèi)核Clients驅(qū)動中xxxx_attach ()和xxxx_detach ()函數(shù)被新的內(nèi)核中的xxxx_probe()函數(shù)代替,從而簡化了驅(qū)動的架構(gòu),方便了用戶對驅(qū)動的移植和編寫。

通過i2c_set_clientdata (),將I2C_client 設(shè)備的driver_data指針指向v4L2_subdev視頻系統(tǒng)子設(shè)備,并通過v4l2_set_subdevdata ()函數(shù),將v4L2_subdev視頻子設(shè)備的driver_data指針指向i2c_client設(shè)備。這樣就在OV5642設(shè)備與v4L2_subdev視頻子設(shè)備之間建立了對應聯(lián)系。

雖然Linux-3.8內(nèi)核在多媒體設(shè)備驅(qū)動中提供了攝像頭的設(shè)備掛載接口,但OV5642驅(qū)動中沒有實現(xiàn)與之對應的接口。為此,作者在圖2 中的OV5642 設(shè)備數(shù)據(jù)結(jié)構(gòu)里增加定義了media_pad變量pad。

如圖3所示,pad在ov5642_probe()函數(shù)中被初始化。pad.flags=MEDIA_PAD_FL_SOURCE,說明該media_pad為數(shù)據(jù)源。v4l2_subdev中的entity:media_entity也在probe函數(shù)中被初始化,entity.type=MEDIA_ENT_T_V4L2_SUBDEV_SENSOR,指明entity為攝像頭類。通過注冊函數(shù)media_device_register_entity(),將entity掛載到media_device中的設(shè)備鏈表上。

與OV5642掛載到FIMC 上類似,作者也通過添加變量pad后,將MFC設(shè)備掛載到media_device設(shè)備鏈表上。以便實現(xiàn)FIMC,MFC 和OV5642 這3 個設(shè)備之間數(shù)據(jù)的高速訪問。

圖2 OV5642整體數(shù)據(jù)結(jié)構(gòu)

圖3 Entity圖

當FIMC、MFC和OV5642 的設(shè)備中的media_entity都被初始化后,fimc_md_probe函數(shù)中的fimc_md_create_links()函數(shù)將把3個設(shè)備捆綁在一起,執(zhí)行關(guān)系如圖4所示。

經(jīng)過圖4連接后,F(xiàn)IMC,MFC和OV5642這3個設(shè)備“融合”成為一個設(shè)備。根據(jù)Linux內(nèi)核編程機制,在同一設(shè)備中,數(shù)據(jù)可以共享,由此,能較好地解決各設(shè)備之間數(shù)據(jù)的高速互訪。

在應用層open (“/dev/video1”)函數(shù)執(zhí)行過程中,將會調(diào)用__fimc_pipeline_open ()函數(shù)中的fimc_pipeline_prepare()函數(shù),此函數(shù)中的media_entity_remote_source()函數(shù)用于獲取與參數(shù)pad連接的OV5642設(shè)備的media_pad。根據(jù)圖4,通過media_entity_remote_sink (pad)函數(shù)獲取MFC設(shè)備中media_pad。media_entity_to_v4l2_subdev (pad->entity)函數(shù)通過設(shè)備鏈表,查找到MFC設(shè)備中v4l2_subdev視頻子設(shè)備。這樣,如圖5所示,F(xiàn)IMC設(shè)備就可以直接調(diào)用v4l2_subdev了。

圖4 Link圖

圖6 OV5642設(shè)備訪問流程

圖6是用戶程序通過視頻設(shè)備結(jié)點/dev/video1訪問OV5642設(shè)備流程。借助于所做的media_entity初始化和media_pad連接,我們實現(xiàn)了通過一個設(shè)備結(jié)點同時訪問3個設(shè)備,從而在加速數(shù)據(jù)處理的同時,也簡化了程序步驟。

3 MFC驅(qū)動程序設(shè)計

如圖7所示,MFC 設(shè)備本身是一個ADT 抽象數(shù)據(jù)結(jié)構(gòu),本文利用V4L2接口,將原有的MFC 驅(qū)動加入多媒體框架中。與OV5642 中的media_pad 注冊類似,在MFC驅(qū)動中主要設(shè)計了內(nèi)存塊的分配,其中包括FIMC 驅(qū)動中用的幀緩沖,相關(guān)內(nèi)存參數(shù)保存在的mfc_men_alloc_arg和mfc_enc_exe_arg這2 個數(shù)據(jù)結(jié)構(gòu)中供MFC 驅(qū)動和FIMC驅(qū)動訪問。在mfc_probe()函數(shù)中通過執(zhí)行platform_set_drvdata (pdev,mfc)函數(shù),將dev->p->driver_data指針指向MFC (mfc_dev),從而為第4節(jié)中通過MFC驅(qū)動的dev獲取mfc_dev做好準備。

圖7 MFC設(shè)備

4 FIMC驅(qū)動程序設(shè)計

本系統(tǒng)中,很關(guān)鍵的是實現(xiàn)FIMC驅(qū)動和MFC 驅(qū)動共享內(nèi)存。如果不使用FIMC和MFC共享內(nèi)存,就會多一次內(nèi)存拷貝,導致大大降低運行速度。如圖8所示,V4L2設(shè)備內(nèi)存是由vb2_queue結(jié)構(gòu)中的vb2_mem_ops結(jié)構(gòu)體操作分配的。

在Linux-3.8 中 的videobuf2-dma-contig.c文 件 中 提 供了vb2_mem_ops結(jié)構(gòu)體。關(guān)鍵函數(shù)部分代碼如下:

圖8 多媒體驅(qū)動架構(gòu)

因為alloc_ctx=fimc->alloc_ctx,所以conf->dev為FIMC 設(shè)備;可見dma_alloc_coherent僅僅能為設(shè)備FIMC分配內(nèi)存,無法與mfc設(shè)備共享內(nèi)存。

經(jīng)過前述節(jié)2處理,F(xiàn)IMC 設(shè)備與MFC 設(shè)備已經(jīng)捆綁在一起?,F(xiàn)在,需要為兩設(shè)備分配共享內(nèi)存。為此,需要重新實現(xiàn)vb2_men_ops結(jié)構(gòu)體。下面是關(guān)鍵函數(shù)*vb2_dma_contig_alloc()中的修改情況,其中黑體字部分為新增加的內(nèi)容。 void*fimc_vb2_dma_contig_alloc(void*alloc_ctx,unsigned long size)

{ struct vb2_dc_conf*conf= (struct vb2_dc_conf*)alloc_ctx;

struct mfc_dev*mfc =dev_get_drvdata (conf->dev);//獲取MFC設(shè)備

buf=kzalloc(sizeof*buf,GFP_KERNEL);

call_mfcsubdevcore (mfc->subdev,ioctl,IOCTL_MFC_GET_IN_BUF,&in_param);//為MFC 分配內(nèi)存

buf->vaddr=in_param.args.mem_alloc.v_addr;

//將MFC內(nèi)存的虛擬地址傳遞給FIMC設(shè)備

buf->dma_addr =in_param.args.mem_alloc.p_addr;

//將MFC內(nèi)存的物理地址傳遞給FIMC設(shè)備

其中,call_mfcsubdevcore定義如下:

#define call_mfcsubdevcore(sd,op,args...)\

(((sd)->ops->core->op)?((sd)->ops->core->op (args)):0)

圖9 應用層程序流程

如上所示,進行初始化內(nèi)存分配時,首先分配MFC 內(nèi)存,然后將MFC內(nèi)存參數(shù)傳遞給FIMC 設(shè)備,使得FIMC設(shè)備能夠與MFC設(shè)備實現(xiàn)內(nèi)存共享。

本系統(tǒng)中,各個驅(qū)動程序之間具有順序依賴關(guān)系,因此,必須依次加載。首先注冊MFC 驅(qū)動,其次注冊FIMC驅(qū)動,然后是加載多媒體驅(qū)動。OV5642驅(qū)動由多媒體驅(qū)動中的probe()函數(shù)完成。下面是實現(xiàn)這一過程的代碼:

5 應用程序設(shè)計

如 圖9 示,應 用 程 序 調(diào) 用open 函 數(shù) 打 開 “/dev/video1”,獲取該設(shè)備的句柄。待各個驅(qū)動初始化完,應用程序調(diào)用ioctl(VIDIOC_REQBUF)函數(shù)分配4幀視頻緩沖內(nèi)存供FIMC和MFC設(shè)備共享。接著初始化輸入、輸出隊列。在運行的過程中,空白 (或舊)數(shù)據(jù)幀內(nèi)存排在輸入隊列里,準備接收來自攝像頭的采集數(shù)據(jù);新鮮數(shù)據(jù)幀內(nèi)存排在輸出隊列里,供MFC設(shè)備壓縮處理。

接著初始化socket通信,傳輸層使用UDP協(xié)議,應用層基于RTP協(xié)議,然后,調(diào)用STREAMING_ON 開始采集 數(shù) 據(jù) 流。此 后,F(xiàn)IMC 驅(qū) 動 通 過ITU-601 協(xié) 議 接 收OV5642傳來的數(shù)據(jù),存入待處理隊列,內(nèi)核通知應用層POLL ()函數(shù),數(shù)據(jù)接收成功;然后從共享內(nèi)存的輸出隊列中獲取索引,再調(diào)用VIDIOC_ENCODER_CMD 進行壓縮。壓縮完畢后,將舊數(shù)據(jù)幀內(nèi)存重新放回輸入隊列。同時,將壓縮好的數(shù)據(jù)打包發(fā)送到上位機,再由上位機存儲和實時播放。

6 實驗結(jié)果

測試平臺是戴爾OPTIPLEX 330,雙核處理器1.8 GHz,內(nèi) 存1.98 GB,播 放 器 采 用 的 是vlc-media-player-0.9.8a-win32.exe。圖10為S5PV210開發(fā)板將OV5642攝像頭圖像數(shù)據(jù)壓縮成H264格式,再由Linux應用程序打包成RTP包并發(fā)送給PC機,最后由VLC media player在PC上實時播放的快照。實測VLC media player播放網(wǎng)絡(luò)攝像頭發(fā)送過來實時視頻流時的參數(shù):視頻流編碼格式為H264,分辨率為1920*1088即1080P,比特率為3 Mb/s。

圖10 VLC media player播放時的快照

7 結(jié)束語

本文提出了一種基于S5PV210的1080PIP Camera設(shè)計方案。首先描述了該系統(tǒng)的總體硬件架構(gòu)及可行性分析,介紹作者自行設(shè)計制作的OV5642 攝像頭。然后,詳細給出了基于Linux-3.8內(nèi)核的多媒體架構(gòu)設(shè)計,其中,重點介紹了作者設(shè)計的設(shè)備驅(qū)動之間共享內(nèi)存的解決方案,以及Linux應用層程序設(shè)計。經(jīng)過VLC media player播放測試,本系統(tǒng)可實現(xiàn)1080P/25fbs流暢、穩(wěn)定、動態(tài)的視頻流。本系統(tǒng)具有低成本、高性能的特點,在高清視頻監(jiān)控市場上具有較好應用潛力。

[1]YU Xiao,LIU Xiaowen,LIU Zhongyu,et al.The design of underground multimedia environmental awareness node based on WIFI[J].The Computer Measurement and Control,2012,20 (9):2520-2522 (in Chinese). [俞嘯,劉曉文,劉忠育,等.基于WIFI的井下多媒體環(huán)境感知節(jié)點設(shè)計 [J].計算機測量與控制,2012,20 (9):2520-2522.]

[2]LI Yucheng,LI Cong.The video processing and software design based on DM368 [J].The Computer Measurement and Control,2013,21 (10):2865-2867 (in Chinese).[李宇成,李聰.基于DM368的視頻處理及軟件設(shè)計 [J].計算機測量與控制,2013,21 (10):2865-2867.]

[3]TONG Fangyuan,YU Qiang.Real-time video transmission system based on Android [J].Computer Engineering and Design,2012,33 (12):4639-4642 (in Chinese).[童方圓,于強.基于Android的實時視頻流傳輸系統(tǒng) [J].計算機工程與設(shè)計,2012,33 (12):4639-4642.]

[4]LIU Hongtao,ZOU Nan.Development design based on ARM cortex-A8 [M].Electronic industry press,2012 (in Chinese).[劉洪濤,鄒南.基于ARM Cortex-A8處理器的開發(fā)設(shè)計 [M].電子工業(yè)出版社,2012.]

[5]International telecommunication union. ITU-T H.264[S].2009.

[6]XIONG Ping.The contrast between CCD and CMOS image sensor[J].Semiconductor Optoelectronic,2004,25 (1):1-4 (in Chinese).[熊平.CCD 與CMOS圖像傳感器特點比較[J].半導體光電,2004,25 (1):1-4.]

[7]XIE Benju,LI Xiaona,GONG Shengwen.UML and Rational Rose 2003from entry to the master[M].Electronic Industry Press,2010 (in Chinese).[解本巨,李曉娜,宮生文.UML與Rational Rose 2003 從 入 門 到 精 通 [M].電 子 工 業(yè) 出 版社,2010.]

[8]Samsung electronics company limited S5PV210RISC microprocessor.S5PV210_UM _REV1.1.pdf [EB/OL].http://www.samsungsemi.com,2011.

[9]Omni vision technologies,Inc OV5642color 5megapixel image sensor with OmniBSITMand embedded True FocusTMtechnology.OV5642_CSP _DS_1.11 _OVT.pdf [EB/OL].http://www.ovt.com/support/datasheet.php,2009.

[10]FAN Enkui,CHEN Yajun.Embedded Linux2.6the I2Cbus and device driver analysis and implementation [J].Microcomputer Application,2009,30 (6):71-75 (in Chinese). [范恩魁,陳亞軍.嵌入式Linux2.6I2C 總線及設(shè)備的驅(qū)動分析與實現(xiàn) [J].微計算機應用,2009,30 (6):71-75.]

[11]WANG Honghui.Practical guide of embedded systems Linux kernel development:ARM platform [M].Electronic Industry Press,2009 (in Chinese). [王洪輝.嵌入式系統(tǒng)Linux內(nèi)核開發(fā)實戰(zhàn)指南:ARM 平臺 [M].電子工業(yè)出版社,2009.]

[12]Li Quanxi,Liu Peiqian,Li Changyou.Research on embedded video monitoring system based on Linux [J].International Conference on Computer Engineering and Technology,2009.

猜你喜歡
共享內(nèi)存內(nèi)核內(nèi)存
多內(nèi)核操作系統(tǒng)綜述①
強化『高新』內(nèi)核 打造農(nóng)業(yè)『硅谷』
活化非遺文化 承啟設(shè)計內(nèi)核
筆記本內(nèi)存已經(jīng)在漲價了,但幅度不大,升級擴容無須等待
通過QT實現(xiàn)進程間的通信
“春夏秋冬”的內(nèi)存
Linux內(nèi)核mmap保護機制研究
基于Linux內(nèi)核的文件服務(wù)器模型的研究與構(gòu)建
基于PCI總線的多處理器協(xié)同機制研究
內(nèi)存搭配DDR4、DDR3L還是DDR3?
南开区| 蒙山县| 阿鲁科尔沁旗| 威信县| 广丰县| 怀远县| 板桥市| 大渡口区| 连平县| 和林格尔县| 抚松县| 新宁县| 措美县| 新绛县| 晋江市| 南昌市| 邵武市| 德兴市| 滁州市| 长葛市| 顺昌县| 大石桥市| 大洼县| 延边| 博客| 彭泽县| 镇沅| 雷州市| 泰宁县| 贡嘎县| 丹阳市| 遵义市| 河间市| 赤壁市| 吴江市| 道孚县| 河西区| 大宁县| 乌海市| 嘉善县| 南通市|