李云,劉德慶
(重慶郵電大學(xué),重慶 400065)
?
基于ARM11與OV7675的CMOS相機(jī)設(shè)計
李云,劉德慶
(重慶郵電大學(xué),重慶 400065)
工業(yè)上對于攝像頭模塊的大小需求各不相同。本文以ARM11為核心自行設(shè)計了核心板,基于CMOS攝像頭OV7675進(jìn)行啟動開發(fā)工作,進(jìn)而設(shè)計出和實(shí)現(xiàn)了多種通信接口和可擴(kuò)展性強(qiáng)的相機(jī)。設(shè)計采用了S3C6410XH-66的CPU,移植了內(nèi)核版本為linux-2.6.38的操作系統(tǒng),同時為了提高性能改進(jìn)了緩存區(qū)的機(jī)制。
ARM11;Linux操作系統(tǒng);CMOS攝像頭;驅(qū)動
隨著社會的發(fā)展,攝像頭模塊越來越多地在工業(yè)上得到應(yīng)用,如攝影測量、物體跟蹤、零件分揀、遠(yuǎn)程監(jiān)控等領(lǐng)域。本文設(shè)計是針對商家在工業(yè)上二維碼的掃描使用,在已給定的模具大小下,充分考慮了需求、成本以及功耗等因素,采用OV7675攝像頭模塊和S3C6410XH-66的CPU,移植了Linux內(nèi)核版本為Linux-2.6.38的操作系統(tǒng),同時為了提高性能,改進(jìn)了緩存區(qū)的機(jī)制。
如圖1所示,相機(jī)主要由CPU、系統(tǒng)電源、通信接口、CMOS傳感器以及I/O接口等硬件組成。由于面向的是低端市場,為了控制成本,采用了S3C6410XH-66的CPU。這款CPU內(nèi)部集成了強(qiáng)大的多媒體資源,具有較強(qiáng)的視頻處理能力,同時主時鐘可以穩(wěn)定運(yùn)行在533 MHz。
CMOS傳感器采用的是OmniVision公司的OV7675攝像頭,該傳感器鏡頭尺寸為1/9″,感光陣列大小為640×480,幀率達(dá)到30 fps,封裝尺寸為2 797 μm×2 800 μm。支持YCbCr422、Raw RGB、RGB565、ITU656等多種圖像輸出格式,包含自動曝光控制、自動增益控制、自動白平衡、自動黑級校準(zhǔn)等功能。在tiny6410的開發(fā)板上設(shè)計的是10×2的軟排插槽攝像頭接口,接口模塊電路如圖2所示,除了CAMERA信號外,還有I2C信號用于對攝像頭寄存器的讀寫,從而能夠配置攝像頭相關(guān)參數(shù),另外增加了GPIO信號,用于協(xié)助攝像頭實(shí)現(xiàn)電源管理[1]。CPU通過I2C接口來初始化OV7675內(nèi)部寄存器,OV7675內(nèi)部有8位A/D轉(zhuǎn)換器,對應(yīng)8為數(shù)據(jù)輸出CAMDATA[7:0],而設(shè)計中輸出的圖像格式是經(jīng)過內(nèi)部的DSP轉(zhuǎn)化的YCbCr。同時為了滿足尺寸的大小需求,SDRAM采用的是256 MB的三星K4X2G323PD,NAND FLASH采用的為256 MB的三星K9F2G08U0C。
圖1 系統(tǒng)硬件結(jié)構(gòu)圖
圖2 攝像頭接口模塊電路圖
2.1 V4L2驅(qū)動
V4L2全稱為video for linux two,是V4L的改進(jìn)版,是linux內(nèi)核中用于圖片采集、視頻和音頻數(shù)據(jù)的API接口[2]。如圖3所示,字符設(shè)備驅(qū)動核心、V4L2驅(qū)動核心、平臺V4L2設(shè)備驅(qū)動和具體的sensor驅(qū)動構(gòu)成了V4L2驅(qū)動框架[3]。V4L2是兩層驅(qū)動系統(tǒng)組成的,上層驅(qū)動是平臺V4L2驅(qū)動,即video_dev模塊驅(qū)動,當(dāng)video_dev初始化時會被注冊為字符設(shè)備驅(qū)動,主設(shè)備號為81,同時會注冊相關(guān)的功能函數(shù)[4]。下層驅(qū)動為V4L2驅(qū)動,video_dev通過V4L2來訪問設(shè)備。當(dāng)V4L2驅(qū)動初始化時,V4L2將會傳遞一個包含V4L2的驅(qū)動方式、子設(shè)備號等數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)給video_dev[4]。
圖3 V4L2驅(qū)動框架
在初始化程序cmos_ov7675_drv_init()中,通過i2c_add_driver(& cmos_ov7675_drv),向i2c-core注冊驅(qū)動,通過cmos_ov7675_drv調(diào)用cmos_ov7675_probe函數(shù),在cmos_ov7675_probe里,將GPIO-F設(shè)置成對應(yīng)的攝像頭模式,使用request_mem_region(),為攝像頭申請內(nèi)存空間。接著初始化攝像頭時鐘,設(shè)置時鐘,將時鐘設(shè)置為24 MHz,并通過list_add_tail將攝像頭結(jié)構(gòu)添加到設(shè)備鏈表中,并通過video_register_device(&cmos_ov7675_vdev, VFL_TYPE_GRABBER, -1) 進(jìn)行設(shè)備注冊。在cmos_ov7675_vdev中,cmos_ov7675_fops()提供了應(yīng)用層使用的,包括cmos_ov7675_open、cmos_ov7675_read、cmos_ov7675_close、video_ioctl2,video_ioctl2由V4L2提供框架,涉及到的關(guān)鍵處理程序在驅(qū)動中具體實(shí)現(xiàn)。在cmos_ov7675_vdev結(jié)構(gòu)中還需要實(shí)現(xiàn)的函數(shù)包括cmos_ov7675_vidioc_enum_fmt_vid_cap(列舉支持那些格式)、cmos_ov7675_vidioc_g_fmt_vid_cap(返回當(dāng)前格式)、cmos_ ov7675_vidioc_try_fmt_vid_cap(測試驅(qū)動程序是否支持某種格式)、cmos_ov7675_vidioc_s_fmt_vid_cap(設(shè)置圖像輸出格式)等。
本文采集圖片的像素大小為640×480,圖片格式為YUV,本階段系統(tǒng)只需要采集4幀圖片。將采集的圖片映射到內(nèi)存中,并把對應(yīng)的地址傳送給應(yīng)用層,進(jìn)行讀取和處理后,循環(huán)采集實(shí)現(xiàn)圖像的更新,形成動態(tài)圖。
2.2 應(yīng)用程序
Liunx-2.6.38內(nèi)核提供了用于編寫視頻的V4L2核心API文件操作結(jié)構(gòu): v4l2_file_operations,用此函數(shù)進(jìn)行設(shè)備操作。通過定義cmos_ov7675_fops為v4l2_file_operations編寫用于上層驅(qū)動調(diào)用的函數(shù):
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所示,應(yīng)用程序首先通過dev_fd=open(cam_name, O_RDWR)、fb_fd=open("/dev/fb0",O_RDWR)來打開video和FB設(shè)備,然后通過ioctl(cam_fp, VIDIOC_S_FBUF,&fb)設(shè)置攝像頭格式,通過應(yīng)用程序調(diào)用read,將會調(diào)用內(nèi)核層驅(qū)動提供的函數(shù)cmos_ov7675_read,該函數(shù)將會注冊一個名為cmos_ov7675_camif_irq_p的內(nèi)核中斷函數(shù),當(dāng)完成一幀圖像的數(shù)據(jù)緩沖后,將會進(jìn)行喚醒,然后會映射到用戶空間里。本文通過fb_show(dev_fd,fbmem,preview_frame)實(shí)現(xiàn)預(yù)覽功能,將采集到的數(shù)據(jù)傳送到framebu ffer緩存區(qū)。在結(jié)束預(yù)覽后,調(diào)用set_capture()更改格式,最后捕捉圖片并保存。由于無法直接預(yù)覽和處理YUYV的格式圖片,需通過算法將YUYV格式轉(zhuǎn)化為RGB彩色格式圖片,隨后對其進(jìn)行相應(yīng)的處理[6]。
圖4 圖片采集流程圖
2.3 緩存機(jī)制的改進(jìn)
在所做的項(xiàng)目中,我們對于傳統(tǒng)的環(huán)形緩存區(qū)進(jìn)行了改進(jìn),設(shè)緩存區(qū)的個數(shù)為N,在視頻數(shù)據(jù)需要填充的情況下,只要空的緩存區(qū)個數(shù)不小于(N-1),就能喚醒任務(wù)使其能夠填充數(shù)據(jù)到緩存區(qū)中。
假設(shè)需要傳輸M倍于單個緩存區(qū)的個數(shù),緩存區(qū)的個數(shù)為N(2 假設(shè)在環(huán)形緩存區(qū)的設(shè)計中,環(huán)形緩存區(qū)由若干個單緩存區(qū)組成,每個緩存區(qū)的大小為2 KB,即若環(huán)形緩存區(qū)由N個單緩存區(qū)構(gòu)成,則環(huán)形緩存區(qū)的大小為2N KB。設(shè)CPU的工作頻率為fc,攝像頭的時鐘采樣頻率為fm,位時鐘信號速率最大為: 式中,fbclk為位時鐘速率;Bn為采樣位數(shù);fm為采樣頻率。 CPU處理一個字節(jié)的時間關(guān)系滿足下式[7]: 式中,t為處理一個字節(jié)的時間;fc為CPU主頻;Bwidth為總線寬度。 若環(huán)形緩存區(qū)有M個單緩存區(qū),在進(jìn)行視頻數(shù)據(jù)傳輸時不會影響其他任務(wù)的正常執(zhí)行,即CPU填充(M-1)個緩存區(qū)的時間要少于視頻接口傳輸一個緩存區(qū)的時間。 式中,K為字節(jié)單位系數(shù),即常量1024;T為處理一個字節(jié)的時間;fbclk為位時鐘速率。由式(1)~(3)可得出M必須滿足式(3),才能滿足設(shè)計要求。 ARM11的CPU頻率為533 MHz,地址總線的帶寬為32位,采樣位數(shù)最大為12位,采樣頻率最大為24 MHz,由式(4)可得M最大可為6。由于存儲的照片是4張,因此本論文中將M的值設(shè)置為4。 圖5 相機(jī)的硬件實(shí)物圖 相機(jī)的核心板與攝像頭的轉(zhuǎn)接板是分開的,方便以后攝像頭硬件進(jìn)行升級。由于使用的場景限制,對于模塊的大小有著嚴(yán)格的要求,導(dǎo)致整個板子并不能用USB、SD卡來燒寫,只能通過J-LINK來燒寫程序。將SDRAM初始化程序ddr.bin燒寫進(jìn)去,然后運(yùn)行程序,在確定SDRAM能夠被正常的初始化后,再次通過J-LINK將u-boot.bin文件燒寫到DDR中,并運(yùn)行u-boot。由于,J-LINK只能燒寫二進(jìn)制文件,所以內(nèi)核和根文件是無法通過J-LINK燒寫的。串口在u-boot界面中,將u-boot、內(nèi)核以及根文件燒寫進(jìn)FLASH中,這樣掉電后不會丟失內(nèi)容。由于整個模塊并沒有網(wǎng)口,使得板子無法與PC進(jìn)行掛載,只能將驅(qū)動程序以及測試程序編譯進(jìn)根文件系統(tǒng)中,由于根文件是jffs2格式的,所以在進(jìn)入到系統(tǒng)前,需要通過u-boot界面改動系統(tǒng)的啟動參數(shù)。當(dāng)進(jìn)入到系統(tǒng)后,在mnt文件夾下通過insmod命令加載攝像頭驅(qū)動模塊,運(yùn)行測試程序,保存拍攝的照片。然后,將保存的照片通過串口從板子的FLASH下載到PC上,如圖5所示。 [1] 楊東瓊,云利軍,王坤.Linux和 OK6410 環(huán)境下視頻圖像的采集與顯示[J].云南師范大學(xué)學(xué)報,2016(2):48-53. [2] 徐家,陳奇.基于V4L2的視頻設(shè)備驅(qū)動開發(fā)[J].計算機(jī)工程與設(shè)計,2007,19(5):539-542. [3] 宋寶華.Linux設(shè)備驅(qū)動開發(fā)詳解[M].北京:人民郵電出版社,2012. [4] 曹占中.基于 s3c2440 的 Linux 攝像頭驅(qū)動開發(fā)[J].電子測量技術(shù),2009,32(2):108-111. [5] 樊國棟, 石紅瑞.嵌入式 Linux下CMOS攝像頭驅(qū)動的設(shè)計與實(shí)現(xiàn)[J].工業(yè)儀表與自動化裝置,2010(3):68-94. [6] 段東波, 靳天玉. 基于 ARM11 的視頻采集系統(tǒng)及二維碼識別[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. 李云(教授),主要研究方向?yàn)闊o線網(wǎng)絡(luò);劉德慶(碩士),主要研究方向?yàn)榍度胧津?qū)動。 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 測試結(jié)果
結(jié) 語