李云,劉德慶
(重慶郵電大學,重慶 400065)
?
基于ARM11與OV7675的CMOS相機設計
李云,劉德慶
(重慶郵電大學,重慶 400065)
工業上對于攝像頭模塊的大小需求各不相同。本文以ARM11為核心自行設計了核心板,基于CMOS攝像頭OV7675進行啟動開發工作,進而設計出和實現了多種通信接口和可擴展性強的相機。設計采用了S3C6410XH-66的CPU,移植了內核版本為linux-2.6.38的操作系統,同時為了提高性能改進了緩存區的機制。
ARM11;Linux操作系統;CMOS攝像頭;驅動
隨著社會的發展,攝像頭模塊越來越多地在工業上得到應用,如攝影測量、物體跟蹤、零件分揀、遠程監控等領域。本文設計是針對商家在工業上二維碼的掃描使用,在已給定的模具大小下,充分考慮了需求、成本以及功耗等因素,采用OV7675攝像頭模塊和S3C6410XH-66的CPU,移植了Linux內核版本為Linux-2.6.38的操作系統,同時為了提高性能,改進了緩存區的機制。
如圖1所示,相機主要由CPU、系統電源、通信接口、CMOS傳感器以及I/O接口等硬件組成。由于面向的是低端市場,為了控制成本,采用了S3C6410XH-66的CPU。這款CPU內部集成了強大的多媒體資源,具有較強的視頻處理能力,同時主時鐘可以穩定運行在533 MHz。
CMOS傳感器采用的是OmniVision公司的OV7675攝像頭,該傳感器鏡頭尺寸為1/9″,感光陣列大小為640×480,幀率達到30 fps,封裝尺寸為2 797 μm×2 800 μm。支持YCbCr422、Raw RGB、RGB565、ITU656等多種圖像輸出格式,包含自動曝光控制、自動增益控制、自動白平衡、自動黑級校準等功能。在tiny6410的開發板上設計的是10×2的軟排插槽攝像頭接口,接口模塊電路如圖2所示,除了CAMERA信號外,還有I2C信號用于對攝像頭寄存器的讀寫,從而能夠配置攝像頭相關參數,另外增加了GPIO信號,用于協助攝像頭實現電源管理[1]。CPU通過I2C接口來初始化OV7675內部寄存器,OV7675內部有8位A/D轉換器,對應8為數據輸出CAMDATA[7:0],而設計中輸出的圖像格式是經過內部的DSP轉化的YCbCr。同時為了滿足尺寸的大小需求,SDRAM采用的是256 MB的三星K4X2G323PD,NAND FLASH采用的為256 MB的三星K9F2G08U0C。

圖1 系統硬件結構圖

圖2 攝像頭接口模塊電路圖
2.1 V4L2驅動
V4L2全稱為video for linux two,是V4L的改進版,是linux內核中用于圖片采集、視頻和音頻數據的API接口[2]。如圖3所示,字符設備驅動核心、V4L2驅動核心、平臺V4L2設備驅動和具體的sensor驅動構成了V4L2驅動框架[3]。V4L2是兩層驅動系統組成的,上層驅動是平臺V4L2驅動,即video_dev模塊驅動,當video_dev初始化時會被注冊為字符設備驅動,主設備號為81,同時會注冊相關的功能函數[4]。下層驅動為V4L2驅動,video_dev通過V4L2來訪問設備。當V4L2驅動初始化時,V4L2將會傳遞一個包含V4L2的驅動方式、子設備號等數據的數據結構給video_dev[4]。

圖3 V4L2驅動框架
在初始化程序cmos_ov7675_drv_init()中,通過i2c_add_driver(& cmos_ov7675_drv),向i2c-core注冊驅動,通過cmos_ov7675_drv調用cmos_ov7675_probe函數,在cmos_ov7675_probe里,將GPIO-F設置成對應的攝像頭模式,使用request_mem_region(),為攝像頭申請內存空間。接著初始化攝像頭時鐘,設置時鐘,將時鐘設置為24 MHz,并通過list_add_tail將攝像頭結構添加到設備鏈表中,并通過video_register_device(&cmos_ov7675_vdev, VFL_TYPE_GRABBER, -1) 進行設備注冊。在cmos_ov7675_vdev中,cmos_ov7675_fops()提供了應用層使用的,包括cmos_ov7675_open、cmos_ov7675_read、cmos_ov7675_close、video_ioctl2,video_ioctl2由V4L2提供框架,涉及到的關鍵處理程序在驅動中具體實現。在cmos_ov7675_vdev結構中還需要實現的函數包括cmos_ov7675_vidioc_enum_fmt_vid_cap(列舉支持那些格式)、cmos_ov7675_vidioc_g_fmt_vid_cap(返回當前格式)、cmos_ ov7675_vidioc_try_fmt_vid_cap(測試驅動程序是否支持某種格式)、cmos_ov7675_vidioc_s_fmt_vid_cap(設置圖像輸出格式)等。
本文采集圖片的像素大小為640×480,圖片格式為YUV,本階段系統只需要采集4幀圖片。將采集的圖片映射到內存中,并把對應的地址傳送給應用層,進行讀取和處理后,循環采集實現圖像的更新,形成動態圖。
2.2 應用程序
Liunx-2.6.38內核提供了用于編寫視頻的V4L2核心API文件操作結構: v4l2_file_operations,用此函數進行設備操作。通過定義cmos_ov7675_fops為v4l2_file_operations編寫用于上層驅動調用的函數:
static const struct v4l2_file_operations cmos_ov7675_fops ={
.owner=THIS_MODULE,
.open=cmos_ov7675_open,
.read=cmos_ov7675_read,
.release=cmos_ov7675_close,
.unlocked_ioctl=video_ioctl2,
};
如圖4所示,應用程序首先通過dev_fd=open(cam_name, O_RDWR)、fb_fd=open("/dev/fb0",O_RDWR)來打開video和FB設備,然后通過ioctl(cam_fp, VIDIOC_S_FBUF,&fb)設置攝像頭格式,通過應用程序調用read,將會調用內核層驅動提供的函數cmos_ov7675_read,該函數將會注冊一個名為cmos_ov7675_camif_irq_p的內核中斷函數,當完成一幀圖像的數據緩沖后,將會進行喚醒,然后會映射到用戶空間里。本文通過fb_show(dev_fd,fbmem,preview_frame)實現預覽功能,將采集到的數據傳送到framebu ffer緩存區。在結束預覽后,調用set_capture()更改格式,最后捕捉圖片并保存。由于無法直接預覽和處理YUYV的格式圖片,需通過算法將YUYV格式轉化為RGB彩色格式圖片,隨后對其進行相應的處理[6]。

圖4 圖片采集流程圖
2.3 緩存機制的改進
在所做的項目中,我們對于傳統的環形緩存區進行了改進,設緩存區的個數為N,在視頻數據需要填充的情況下,只要空的緩存區個數不小于(N-1),就能喚醒任務使其能夠填充數據到緩存區中。
假設需要傳輸M倍于單個緩存區的個數,緩存區的個數為N(2 假設在環形緩存區的設計中,環形緩存區由若干個單緩存區組成,每個緩存區的大小為2 KB,即若環形緩存區由N個單緩存區構成,則環形緩存區的大小為2N KB。設CPU的工作頻率為fc,攝像頭的時鐘采樣頻率為fm,位時鐘信號速率最大為: 式中,fbclk為位時鐘速率;Bn為采樣位數;fm為采樣頻率。 CPU處理一個字節的時間關系滿足下式[7]: 式中,t為處理一個字節的時間;fc為CPU主頻;Bwidth為總線寬度。 若環形緩存區有M個單緩存區,在進行視頻數據傳輸時不會影響其他任務的正常執行,即CPU填充(M-1)個緩存區的時間要少于視頻接口傳輸一個緩存區的時間。 式中,K為字節單位系數,即常量1024;T為處理一個字節的時間;fbclk為位時鐘速率。由式(1)~(3)可得出M必須滿足式(3),才能滿足設計要求。 ARM11的CPU頻率為533 MHz,地址總線的帶寬為32位,采樣位數最大為12位,采樣頻率最大為24 MHz,由式(4)可得M最大可為6。由于存儲的照片是4張,因此本論文中將M的值設置為4。 圖5 相機的硬件實物圖 相機的核心板與攝像頭的轉接板是分開的,方便以后攝像頭硬件進行升級。由于使用的場景限制,對于模塊的大小有著嚴格的要求,導致整個板子并不能用USB、SD卡來燒寫,只能通過J-LINK來燒寫程序。將SDRAM初始化程序ddr.bin燒寫進去,然后運行程序,在確定SDRAM能夠被正常的初始化后,再次通過J-LINK將u-boot.bin文件燒寫到DDR中,并運行u-boot。由于,J-LINK只能燒寫二進制文件,所以內核和根文件是無法通過J-LINK燒寫的。串口在u-boot界面中,將u-boot、內核以及根文件燒寫進FLASH中,這樣掉電后不會丟失內容。由于整個模塊并沒有網口,使得板子無法與PC進行掛載,只能將驅動程序以及測試程序編譯進根文件系統中,由于根文件是jffs2格式的,所以在進入到系統前,需要通過u-boot界面改動系統的啟動參數。當進入到系統后,在mnt文件夾下通過insmod命令加載攝像頭驅動模塊,運行測試程序,保存拍攝的照片。然后,將保存的照片通過串口從板子的FLASH下載到PC上,如圖5所示。 [1] 楊東瓊,云利軍,王坤.Linux和 OK6410 環境下視頻圖像的采集與顯示[J].云南師范大學學報,2016(2):48-53. [2] 徐家,陳奇.基于V4L2的視頻設備驅動開發[J].計算機工程與設計,2007,19(5):539-542. [3] 宋寶華.Linux設備驅動開發詳解[M].北京:人民郵電出版社,2012. [4] 曹占中.基于 s3c2440 的 Linux 攝像頭驅動開發[J].電子測量技術,2009,32(2):108-111. [5] 樊國棟, 石紅瑞.嵌入式 Linux下CMOS攝像頭驅動的設計與實現[J].工業儀表與自動化裝置,2010(3):68-94. [6] 段東波, 靳天玉. 基于 ARM11 的視頻采集系統及二維碼識別[J]. 電子測試,2013(20):81-82. [7] Lei Rao, Jian Huazhao, Zhan Xizhao,et al. Marco and Micro structure Evolution of 5CrNiMo Steel Ingots during Electroslag Remelting Process[J]. Journal of Iron and Steel Re search, 2014,21(7):644-652. 李云(教授),主要研究方向為無線網絡;劉德慶(碩士),主要研究方向為嵌入式驅動。 CMOS Camera Design Based on ARM11 and OV7675 Li Yun,Liu Deqing (Chongqing University of Posts and Telecommunications,Chongqing 400065,China) In order to meet the needs of different size module of camera.In this paper,the core board is designed using ARM11.The system starts the development work based on CMOS camera OV7675.The variety of communication interfaces and scalable camera are designed.The design uses the S3C6410XH-66 CPU,and transplants the linux-2.6.38 operating system.While in order to the performance,the cache mechanism is improved. ARM11;Linux operating system;CMOS camera;driver TN949.6 A ?迪娜 2016-09-01)3 測試結果

結 語
