OV2715驱动
摘 要: 為了實(shí)現(xiàn)嵌入式 Linux 對(duì) CMOS 圖像傳感器 OV2715 的支持,對(duì) OV2715 的工作原理進(jìn)行深入的研究,針對(duì) OV2715 功能復(fù)雜和驅(qū)動(dòng)編寫困難的問(wèn)題,提出一種模塊化設(shè)計(jì) OV2715 驅(qū)動(dòng)的方法。在 DM3730 硬件平臺(tái)下,將 OV2715 驅(qū)動(dòng)分為 I2C 設(shè)備驅(qū)動(dòng)和 V4L2 接口驅(qū)動(dòng)并分別進(jìn)行了實(shí)現(xiàn),最后,設(shè)計(jì)視頻采集程序并對(duì)驅(qū)動(dòng)進(jìn)行了測(cè)試。測(cè)試結(jié)果表明,輸出視頻圖像質(zhì)量清晰穩(wěn)定,該實(shí)現(xiàn)在高清數(shù)字監(jiān)控系統(tǒng)中有較好的應(yīng)用前景。
關(guān)鍵詞: OV2715 驅(qū)動(dòng); V4L2; I2C 總線; 嵌入式 Linux; 高清數(shù)字視頻監(jiān)控
中圖分類號(hào): TN957.52?34; TP316 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2016)22?0071?0
0 引 言
隨著人們安全意識(shí)的提高,視頻監(jiān)控系統(tǒng)在眾多行業(yè)中得到了大范圍的普及。高清數(shù)字視頻監(jiān)控系統(tǒng)更以其儲(chǔ)存信息量大、系統(tǒng)功能完善、控制靈活和智能化等顯著優(yōu)點(diǎn),在安防領(lǐng)域得到越來(lái)越多的應(yīng)用[1]。高清數(shù)字視頻監(jiān)控系統(tǒng)主要由前端采集設(shè)備、視頻傳輸系統(tǒng)和主控顯示存儲(chǔ)系統(tǒng)組成,而前端攝像機(jī)采集芯片類型的選擇直接影響著監(jiān)控端輸出數(shù)字視頻信號(hào)的好壞,從而決定著視頻監(jiān)控系統(tǒng)的整體效果。
OV2715 是 TI 公司針對(duì)高清視頻監(jiān)控領(lǐng)域推出的全高清 1080P 的 CMOS 圖像傳感器芯片,具有成本小、低功耗和輸出圖像質(zhì)量高等特點(diǎn),選取該芯片作為前端采集芯片。由于 Linux 2.6.32 內(nèi)核版本沒(méi)有提供該芯片驅(qū)動(dòng),需要手動(dòng)編寫該驅(qū)動(dòng)實(shí)現(xiàn)對(duì) OV2715 的支持。同時(shí),以往的視頻設(shè)備驅(qū)動(dòng)往往存在結(jié)構(gòu)層次不明晰等缺點(diǎn),針對(duì) OV2715 功能復(fù)雜和驅(qū)動(dòng)開發(fā)難度大等特點(diǎn),提出了模塊化的思想編寫該驅(qū)動(dòng)。首先,深入研究了 OV2715 的工作原理,對(duì) Linux 系統(tǒng)中的 I2C 驅(qū)動(dòng)體系和 V4L2 驅(qū)動(dòng)體系進(jìn)行了全面的介紹;其次,針對(duì)特定的硬件平臺(tái),基于模塊化方法對(duì) OV2715 驅(qū)動(dòng)程序進(jìn)行了設(shè)計(jì)并給出了關(guān)鍵代碼實(shí)現(xiàn)。最后,設(shè)計(jì)了視頻采集程序?qū)︱?qū)動(dòng)進(jìn)行了測(cè)試和分析,實(shí)現(xiàn)了視頻采集和顯示功能。
1 OV2715 芯片
1.1 OV2715 功能介紹
OV2715 是一款 1/2.7 英寸的低電壓、高性能和能提供輸出 1080P 高清分辨率的 CMOS 圖像傳感器,支持通過(guò) DVP 和 MIPI 接口輸出 RAW/RGB 格式的圖像,還提供了 SCCB 接口來(lái)控制傳感器的運(yùn)行[2]。此外,OV2715 集成了自動(dòng)聚焦濾波器,PLL 電路和 1.5 V 穩(wěn)壓器,可以保證其運(yùn)行的穩(wěn)定;OV2715 的自動(dòng)圖形控制電路使其支持 AEC,AGC,AWB,ABLC 和 LENC 等功能,因而輸出圖像質(zhì)量較其他傳感器有明顯的提高;OV2715 圖像傳感器主要應(yīng)用于高清數(shù)字視頻監(jiān)控?cái)z像機(jī)的前端采集模塊中。
1.2 OV2715 寄存器介紹
OV2715 內(nèi)部寄存器主要包括三部分:用來(lái)控制輸入輸出的寄存器、用來(lái)實(shí)現(xiàn)具體圖像功能的寄存器和用來(lái)輔助傳感器正常工作的寄存器。視頻監(jiān)控系統(tǒng)中,處理器模塊對(duì) OV2715 寄存器的訪問(wèn)通常有兩種方式,其一為并行訪問(wèn)模式,通過(guò) OV2715 的 DVP 接口進(jìn)行訪問(wèn);其二為串行訪問(wèn)方式,經(jīng)過(guò)系統(tǒng)提供的 I2C 接口來(lái)控制 OV2715 芯片。I2C 總線是一種串行總線,主要由數(shù)據(jù)線和時(shí)鐘線組成,其用途是完成微控制器模塊和外圍模塊間通信的工作。OV2715 通過(guò) I2C 訪問(wèn)時(shí)硬件資源占用率小并且訪問(wèn)速度較快,故本次驅(qū)動(dòng)實(shí)現(xiàn)中處理器和 OV2715 通信采用 I2C 總線方式。
1.3 OV2715 工作過(guò)程
OV2715 視頻數(shù)據(jù)采集主要經(jīng)過(guò)圖像數(shù)據(jù)產(chǎn)生、圖像數(shù)據(jù)處理和圖像數(shù)據(jù)輸出三個(gè)過(guò)程,采集工作過(guò)程如圖 1 所示。
圖像數(shù)據(jù)產(chǎn)生階段,OV2715 傳感器內(nèi)核根據(jù)引腳 HREF,VSYNC 和 PCLK 信號(hào)以固定的幀速率產(chǎn)生像素流數(shù)據(jù)。其中,定時(shí)產(chǎn)生器可以同步圖片陣列的行數(shù)據(jù),每個(gè)陣列中的像素經(jīng)過(guò)模擬電路抽樣、增益控制和 ADC 轉(zhuǎn)換后產(chǎn)生 10 b 的數(shù)據(jù);圖像數(shù)據(jù)處理階段,需要對(duì)采集到的數(shù)字信號(hào)進(jìn)行圖像增強(qiáng)、鏡頭控制和視頻格式的設(shè)置等功能,主要配置的寄存器如表 1 所示;圖像輸出階段,主要對(duì)圖像數(shù)據(jù)進(jìn)行編碼,然后進(jìn)行通道選擇,輸出符合要求的 YUV/RGB 數(shù)字信號(hào)。
2 硬件平臺(tái)結(jié)構(gòu)
無(wú)人機(jī)基站勘測(cè)系統(tǒng)中,前端采集系統(tǒng)硬件結(jié)構(gòu)如圖 2 所示。
嵌入式硬件系統(tǒng)處理模塊采用 TMS320DM3730 片上系統(tǒng),操作系統(tǒng)內(nèi)核版本采用 Linux 2.6.32。DM3730 為 TI 公司的 OMAP 系列雙核架構(gòu)處理器,ARM 端負(fù)責(zé)運(yùn)行操作系統(tǒng)控制系統(tǒng)的工作流程和 DSP 負(fù)責(zé)處理大量高清視頻數(shù)據(jù),并且該處理器內(nèi)部具有 3D Image?Processor 和 IVA 等,支持高清 720P,1080P 視頻解碼。該處理器實(shí)時(shí)處理視頻速度可達(dá) 60 f/s,具有優(yōu)秀的編解碼能力,最高能達(dá)到每秒 500 萬(wàn)像素,具有 VPSS 和支持包括 3A 在內(nèi)的眾多功能[3]。
OV2715 圖像傳感器通過(guò) I2C 總線接入 DM3730 平臺(tái)的 ISP 模塊中;WiFi 模塊負(fù)責(zé)發(fā)送視頻數(shù)據(jù)和基本通信功能,SD 卡模塊負(fù)責(zé)視頻數(shù)據(jù)的存儲(chǔ)和系統(tǒng)升級(jí)存儲(chǔ)功能,電源管理模塊為給系統(tǒng)提供可靠、穩(wěn)定的電源輸入,調(diào)試模塊主要負(fù)責(zé)控制系統(tǒng)更新升級(jí)等。
3 OV2715 驅(qū)動(dòng)程序?qū)崿F(xiàn)
高清數(shù)字視頻監(jiān)控系統(tǒng)中,視頻采集的過(guò)程:OV2715 將模擬電路產(chǎn)生的圖像信號(hào)經(jīng)過(guò) A/D 控制器轉(zhuǎn)換成 8 b 的數(shù)字信號(hào),其次通過(guò) V4L2 驅(qū)動(dòng)支持的 MIPI 接口進(jìn)行視頻捕捉,此后 DM3730 平臺(tái) DSP 模塊進(jìn)行 H.264 編碼,最后將視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)發(fā)送或者進(jìn)行本地存儲(chǔ)。在此過(guò)程中,OV2715 驅(qū)動(dòng)程序負(fù)責(zé)初始化 OV2715 相關(guān)寄存器,同時(shí)接收用戶空間的命令完成對(duì)傳感器工作狀態(tài)的操控,將視頻信號(hào)傳送到 V4L2 視頻驅(qū)動(dòng)接口;OV2715 驅(qū)動(dòng)結(jié)構(gòu)如圖 3 所示。
OV2715 驅(qū)動(dòng)被加載到內(nèi)核后,向系統(tǒng)注冊(cè)成功后會(huì)生成對(duì)應(yīng)的設(shè)備節(jié)點(diǎn);用戶空間應(yīng)用程序通過(guò)操作該節(jié)點(diǎn)使用 V4L2 驅(qū)動(dòng)實(shí)現(xiàn)的 API 完成視頻采集的工作。在此過(guò)程中基于模塊化方法,OV2715 驅(qū)動(dòng)分為 I2C 設(shè)備驅(qū)動(dòng)和 V4L2 設(shè)備接口層驅(qū)動(dòng)兩部分,進(jìn)行分別設(shè)計(jì)和實(shí)現(xiàn)。
3.1 OV2715 的 I2C 設(shè)備驅(qū)動(dòng)
DM3730 平臺(tái)通過(guò) I2C 總線向 OV2715 發(fā)送控制命令,完成相關(guān)寄存器的配置。Linux 系統(tǒng)平臺(tái)下,I2C 驅(qū)動(dòng)體系由 I2C 總線驅(qū)動(dòng)、I2C 核心以及 I2C 設(shè)備驅(qū)動(dòng) 3 個(gè)部分組成。I2C 核心集成了與具體設(shè)備無(wú)關(guān)的統(tǒng)一的設(shè)備注冊(cè)和注銷的方法,用于管理 I2C 總線驅(qū)動(dòng)和 I2C 設(shè)備驅(qū)動(dòng);I2C 總線驅(qū)動(dòng)提供硬件系統(tǒng)中 I2C Adaper 和 Slave 設(shè)備通信的功能。I2C 設(shè)備驅(qū)動(dòng)主要進(jìn)行總線上的具體設(shè)備驅(qū)動(dòng)的實(shí)現(xiàn),主要完成設(shè)備的具體操控方法和初始化探測(cè)功能[4]。
在 OV2715 的 I2C 驅(qū)動(dòng)模塊設(shè)計(jì)中,內(nèi)核版本 Linux 2.6.32 對(duì) I2C 核心和 I2C 總線驅(qū)動(dòng)已經(jīng)進(jìn)行了實(shí)現(xiàn),只需對(duì)具體的 I2C 設(shè)備驅(qū)動(dòng)進(jìn)行實(shí)現(xiàn)。OV2715 的 I2C 設(shè)備驅(qū)動(dòng)完成的主要任務(wù)是讀寫 OV2715 芯片的相關(guān)寄存器,傳送并接收控制命令,完成對(duì)硬件的初始化控制。在此驅(qū)動(dòng)模塊實(shí)現(xiàn)中,不僅要實(shí)現(xiàn) I2C 核心相關(guān)接口,還要實(shí)現(xiàn)應(yīng)用程序?qū)咏涌凇?/p>
3.1.1 I2C 核心接口實(shí)現(xiàn)
該模塊實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)包括 struct i2c_driver 和 struct i2c_client 兩個(gè)結(jié)構(gòu)體;其中 i2c_driver 對(duì)應(yīng)于 OV2715 設(shè)備的具體驅(qū)動(dòng)方法,實(shí)現(xiàn)代碼如下:
ov2715_probe 負(fù)責(zé)將 OV2715 傳感器以 I2C 客戶端設(shè)備的身份注冊(cè)到系統(tǒng),同時(shí)調(diào)用 V4L2 體系相關(guān)接口建立設(shè)備節(jié)點(diǎn),最終完成對(duì)設(shè)備的初始化工作;ov2715_remove 注銷相關(guān)設(shè)備節(jié)點(diǎn)將設(shè)備移除,完成清空緩沖區(qū)和系統(tǒng)資源回收的任務(wù);ov2715_id 結(jié)構(gòu)中儲(chǔ)存了設(shè)備 ID 相關(guān)信息,OV2715 上電啟動(dòng)后會(huì)根據(jù)此信息進(jìn)行匹配驅(qū)動(dòng);ov2715_probe( )函數(shù)具體實(shí)現(xiàn)如下:
結(jié)構(gòu)體 i2c_client 用于描述具體的物理設(shè)備,總線上的 I2C 設(shè)備均要用一個(gè)各自的 i2c_client 來(lái)描述;i2c_client 信息通過(guò)開發(fā)板的板級(jí)支持包 i2c_board_info 結(jié)構(gòu)體填充描述。
ov2715_i2c_driver 結(jié)構(gòu)內(nèi)的函數(shù)實(shí)現(xiàn)完成后,利用 i2c_add_driver( )函數(shù)將接口層驅(qū)動(dòng)添加到設(shè)備驅(qū)動(dòng)鏈表;其中,注冊(cè)函數(shù)采用 i2c_register_driver( )函數(shù);I2C 設(shè)備驅(qū)動(dòng)被成功注冊(cè)進(jìn)入內(nèi)核后,驅(qū)動(dòng)程序可以通過(guò) I2C 接口對(duì) OV2715 傳感器進(jìn)行操控,此過(guò)程需實(shí)現(xiàn)的函數(shù)如下:
OV2715 寄存器讀函數(shù):static int ov2715_read_reg(struct i2c_client *client, unsigned short data_length, unsigned short reg,unsigned int *val);
OV2715 寄存器寫函數(shù):static int ov2715_write_reg(struct i2c_client *client, unsigned int addr, unsigned int val);
3.1.2 應(yīng)用程序用戶層接口
上層應(yīng)用程序通過(guò)相關(guān)的文件接口訪問(wèn)底層硬件,OV2715 應(yīng)用程序用戶層接口模塊主要實(shí)現(xiàn)此功能。需要實(shí)現(xiàn)的文件接口如表 2 所示。表 2 中主要文件操作采用 struct file_operations 結(jié)構(gòu)體描述。內(nèi)核版本 Linux 2.6.32 封裝了該接口并提供了 struct v4l2_file_operations 結(jié)構(gòu)體,該結(jié)構(gòu)體提供了標(biāo)準(zhǔn)的成員接口等,因此,將主要實(shí)現(xiàn)具體需要的函數(shù)和標(biāo)準(zhǔn)接口相連即可。具體實(shí)現(xiàn)代碼如下:
3.2 OV2715 的 V4L2 視頻接口驅(qū)動(dòng)
V4L2 框架為 Linux 系統(tǒng)視頻設(shè)備底層驅(qū)動(dòng)規(guī)定了一致的接口,使用戶層程序無(wú)須關(guān)心底層驅(qū)動(dòng)細(xì)節(jié)使用統(tǒng)一的 API 操作具體的物理設(shè)備,主要用于操控視頻設(shè)備和視頻采集處理,給相關(guān)開發(fā)人員的操作和維護(hù)帶來(lái)了極大方便[5?6]。
表 2 常用文件操作接口
V4L2 體系結(jié)構(gòu)支持多種設(shè)備,向底層驅(qū)動(dòng)提供了視頻采集接口、視頻輸出接口和直接視頻傳輸接口等。本文將采用 V4L2 框架中的 Video Capture Interface 并在 OV2715 傳感器的 MIPI 接口獲取采集數(shù)據(jù)。在 V4L2 視頻接口驅(qū)動(dòng)中,Video 核心層調(diào)用 v4l2_int_device_register( )函數(shù)將 OV2715 以 V4L2 從設(shè)備向系統(tǒng)進(jìn)行注冊(cè),最終在 dev 目錄下創(chuàng)建 Video0 設(shè)備節(jié)點(diǎn),向用戶層提供訪問(wèn)接口;Video 核心模塊底層為視頻設(shè)備的具體實(shí)現(xiàn),可以有多個(gè) slave 設(shè)備,V4L2 視頻接口驅(qū)動(dòng)框架如圖 4 所示。
V4L2 接口驅(qū)動(dòng)調(diào)用流程:用戶層調(diào)用標(biāo)準(zhǔn)的 V4L2 的接口時(shí),經(jīng)過(guò) Video 核心層處理后傳遞到 slave 設(shè)備實(shí)現(xiàn)的具體操作函數(shù)中。其中,v4l2_int_ioctl_desc 中包含針對(duì)具體設(shè)備實(shí)現(xiàn)的 ioctl 函數(shù),主要用于視頻采集過(guò)程中設(shè)置視頻格式和對(duì)采集進(jìn)行操作功能。主要代碼實(shí)現(xiàn)如下:
//供應(yīng)用層調(diào)用的 v4l2 ioctl 命令
4.1 OV2715 采集測(cè)試程序
OV2715 采集測(cè)試程序基于 V4L2 接口設(shè)計(jì),直接調(diào)用以上章節(jié)實(shí)現(xiàn)的接口采用順序執(zhí)行的方式,將 OV2715 前端采集到的數(shù)據(jù)傳輸?shù)?DM3730 的 ISP 模塊進(jìn)行處理,主要通過(guò) ioctl()命令來(lái)獲取并配置視頻采集參數(shù),如申請(qǐng)緩沖區(qū)、設(shè)置視頻采集參數(shù)等。循環(huán)采集圖像時(shí),read 和 write 由于直接將大量數(shù)據(jù)從內(nèi)核空間復(fù)制到用戶空間,耗內(nèi)存并且效率低下[7],本文采用內(nèi)存映射的方式,直接申請(qǐng)緩沖區(qū)并對(duì)其操作,效率有很大提高,不會(huì)出現(xiàn)卡機(jī)現(xiàn)象。OV2715 視頻采集程序流程圖如圖 5 所示。
4.2 OV2715 驅(qū)動(dòng)測(cè)試結(jié)果
為了測(cè)試的靈活性,本文采用動(dòng)態(tài)加載模塊的方式;將編譯好的 OV2715 驅(qū)動(dòng)模塊 ov2715.ko 拷貝到 DM3730 開發(fā)板中,使用 insmod 命令將驅(qū)動(dòng)加載到內(nèi)核:程序執(zhí)行過(guò)程中打印出芯片 PID、寄存器設(shè)置和時(shí)鐘頻率信息均與真實(shí)值一致,最終注冊(cè)成功后在 dev 目錄下創(chuàng)建 Video0 設(shè)備文件節(jié)點(diǎn)。調(diào)試信息如圖 6 所示。
無(wú)人機(jī)基站勘測(cè)攝像機(jī)實(shí)物圖如圖 7 所示。
測(cè)試程序調(diào)用本文實(shí)現(xiàn)的 V4L2 的相關(guān) API 接口進(jìn)行采集,采用 mmap 的方式,每次采集 200 幀圖像,捕捉到的視頻為 YUV 格式,使用 YUV Player 軟件播放所采集到的視頻文件。OV2715 驅(qū)動(dòng)方案經(jīng)過(guò)實(shí)際測(cè)試,采集到的視頻輸出效果如圖 8 所示。
5 結(jié) 語(yǔ)
本文采用模塊化的方法基于 DM3730 平臺(tái)對(duì) OV2715 驅(qū)動(dòng)進(jìn)行了實(shí)現(xiàn),同時(shí),對(duì) Linux 下 I2C 設(shè)備驅(qū)動(dòng)體系和 V4L2 驅(qū)動(dòng)體系進(jìn)行詳細(xì)的闡述,提出兩者實(shí)現(xiàn)的一般方法;該驅(qū)動(dòng)結(jié)構(gòu)層次清晰,對(duì) Linux 系統(tǒng)中其他視頻采集芯片驅(qū)動(dòng)編寫具有很強(qiáng)的參考價(jià)值;集成 OV2715 作為采集前端的無(wú)人機(jī)基站勘測(cè)系統(tǒng)在基站勘察領(lǐng)域中具有廣闊的市場(chǎng)前景。
參考文獻(xiàn)
[1] 于海彬,張雪,陳興林.基于 Linux 的 TW2835 的驅(qū)動(dòng)程序設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2013(9):3068?3073.
[2] Omni Vision Technologies, Inc. OV2715 product specification, version 2.03 [S]. [S.l.]: Omni Vision Technologies, Inc, 2011.
[3] Texas Instruments. AM/DM37x multimedia device technical reference manual 1.0 [S]. USA: Texas Instruments, 2012.
[4] CORBET Jonathan,KROAH?HARTMAN Greg,RUBINI Alessandro.Linux 設(shè)備驅(qū)動(dòng)程序[M].北京:中國(guó)電力出版社,2006.
[5] 劉升,趙晶晶,范秀麗.基于 V4L2 的嵌入式視頻監(jiān)控系統(tǒng)[J].網(wǎng)絡(luò)新媒體技術(shù),2011,32(1):37?42.
[6] 郝俊,孟傳良.基于 V4L2 的 ARM11 USB 視頻采集終端的設(shè)計(jì)與實(shí)現(xiàn)[J].貴州大學(xué)學(xué)報(bào)(自然科學(xué)版),2011(4):74?78.
[7] 張輝,李新華,劉波,等.基于 V4L2 視頻采集緩存機(jī)制應(yīng)用與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),2010,33(20):54?56.
總結(jié)
- 上一篇: IDC脚本介绍
- 下一篇: 腾讯企业邮箱十大优势特点 (浅谈腾讯企业