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