楊勇,劉永俊
(常熟理工學院計算機科學與工程學院,江蘇常熟 215500)
嵌入式圖像檢測系統(tǒng)的設計與應用
楊勇,劉永俊
(常熟理工學院計算機科學與工程學院,江蘇常熟 215500)
基于Linux2.6內核下的最新標準Video For Linux 2(簡稱V4L2),介紹攝像頭的驅動程序快速開發(fā)方法.傳統(tǒng)的驅動開發(fā)很少能實現(xiàn)所有的接口功能,這嚴重影響到系統(tǒng)開發(fā)周期與維護工作,而且OmniVision公司的ov9650攝像頭在Linux下尚未得到驅動支持.本文選擇S3C2440開發(fā)板作為硬件平臺,在Linux2.6.30.4系統(tǒng)下基于OV9650傳感器芯片實現(xiàn)攝像頭驅動模塊的層次結構以及視頻采集模塊設計的開發(fā)工作,提出基于V4L2接口規(guī)范的驅動開發(fā)方案,從而實現(xiàn)低成本、低功耗、高效率的圖像檢測系統(tǒng)的應用.
V4L 2;驅動;ov 9650;Linux-2.6.30.4
嵌入式系統(tǒng)是一種完全嵌入到受控器件內部,為特定應用而設計的專用計算機系統(tǒng).它的應用領域涵蓋了消費電子、智能家居、醫(yī)療設備、航空航天等[1].隨著物聯(lián)網(wǎng)的不斷發(fā)展,嵌入式產品層出不窮,例如基于嵌入式的圖像視頻監(jiān)控系統(tǒng)的需求在不斷增加,而數(shù)字化視頻系統(tǒng)能夠充分利用嵌入式系統(tǒng)的特點對采集的圖像進行預處理、分析、存儲以及顯示.因此,充分利用linux2.6內核系統(tǒng)的特點,基于ARM920T平臺的視頻處理系統(tǒng)應運而生.
本文以三星公司生產的S3C2440芯片構建基于V4L2規(guī)范實現(xiàn)的圖像采集系統(tǒng),詳細介紹V4L2標準提供的接口函數(shù),以及視頻采集程序模塊的設計與實現(xiàn)[2-3].由于傳統(tǒng)的驅動程序的開發(fā)很少提供完整API接口函數(shù),導致開發(fā)周期長的缺陷.本文提出基于V4L2規(guī)范的驅動程序開發(fā)[4],在保證圖像采集質量的前提下,能夠縮短開發(fā)周期,提高開發(fā)效率[5].
1.1 S3 C2440 A處理器概述
三星公司的ARM920T處理器為嵌入式的產品提供了豐富的片上集成系統(tǒng).比如:16/32位RISC體系結構,16位壓縮指令集Thumb與32位ARM指令集;增強的ARM體系結構MMU;同時支持高速總線模式和異步總線模式.外部接口主要有SDRAM控制器、LED控制器、4通道DMA、3通道UART、IIC總線等[6].本文采用ARM920T的camera功能模塊,如圖1.
1.2 OV9650傳感器芯片
由于CMOS芯片與CDD芯片相比具有低功耗、低成本、速度快、工藝簡單等優(yōu)點,因此本文選用了CMOS攝像頭模塊,型號OV9650.該芯片的像素陣列大小1280*1024,130萬像素,支持SXVGA、VGA、QVGA、CIF等圖像輸出格式.通過S3C2440的IIC總線和串行SCCB總線接口相連,其飽和度、平衡度、曝光時間等參數(shù)均可通過芯片內部寄存器的讀寫來設置.
圖1 S3C2440的camera模塊框圖
圖2 硬件系統(tǒng)平臺框架圖
嵌入式系統(tǒng)上電啟動的過程依次是引導加載程序Bootloader、Linux內核、根文件系統(tǒng)、應用程序.本文在完成移植uboot、linux2.6內核與Yaffs文件系統(tǒng)的基礎上,利用V4L2接口規(guī)范編程,設計并實現(xiàn)OV9650驅動編碼、視頻采集、預處理、壓縮、傳輸?shù)裙δ苣K,以及應用程序的測試工作[7].
2.1 V4 L2 接口規(guī)范
Video For Linux(V4L)提供了各種視頻圖像采集設備的API和數(shù)據(jù)結構,比如TV tuners和usb網(wǎng)絡攝像機等.1999年,V4l接口函數(shù)得到了發(fā)展,成為V4L2,這解決了在V4L中的bugs,而且支持了更加廣泛的設備.
常用的設備結構體在linux2.6內核目錄include/linux/videodev2.h中定義:
2.2 Linux平臺下V4L2驅動的編碼
OV9650的CMOS傳感器在Linux2.6內核中是作為混雜設備來描述,其驅動程序給應用程序提供了一個流控制接口,讓用戶進程借助設備文件與硬件聯(lián)系,對設備文件的操作實質上就是系統(tǒng)調用.所以,系統(tǒng)調用與驅動關聯(lián)起來就要通過file_operations{}這一結構體來實現(xiàn)[8].系統(tǒng)工作流程如圖3所示.
在結構體miscdevice中定義了file_operations*fops,該文件結構體指針對應的操作如下:
這些操作需要在驅動程序中具體實現(xiàn).
file_operations提供了基本的I/O操作接口open,read,write,close,ioctl等函數(shù),實現(xiàn)了對中斷的處理,內存映射功能以及I/O通道的控制功能.在應用程序發(fā)出文件操作的相關命令時,內核根據(jù)這些指針調用相關函數(shù).這樣就完成了驅動和內核之間的通信.
實際上,V4L2是一種兩層驅動系統(tǒng)模型,上層是videodev模塊.當初始化videodev模塊的時候,它被Linux內核注冊為主設備號為81的字符設備,,同時還注冊了一些字符設備的功能函數(shù).而下層就是V4L2驅動程序,它相當于是videodev的客戶端,videodev通過V4L2提供的一套接口函數(shù)訪問這些驅動.每當初始化V4L2驅動的時候,它就會傳遞給videodev模塊的一個數(shù)據(jù)結構或文件節(jié)點.準確地說,通過V4L2方法實現(xiàn)的驅動模型與普通字符設備的不同是前者包含了一些特有的元素.
每當應用程序觸發(fā)一個驅動程序調用時,控制權會首先傳給videodev中的方法,它負責把應用程序傳遞過來的結構指針或文件節(jié)點轉換為對應的V4L2的數(shù)據(jù)結構指針,并調用V4L2驅動程序中的處理函數(shù).
在初始化V4L2驅動程序的時候,videodev將會枚舉它要處理的設備函數(shù),為每個設備填充一個struct v4l2_device結構,同時指向該結構體的指針傳給v4l_register_device()函數(shù).它能夠保證次設備號可用,然后調用struct v4l2_device結構中的相關函數(shù)實現(xiàn)設備的初始化工作.如果初始化成功,那么設備注冊成功.如果要卸載設備驅動,調用v4l_unregister_device()取消注冊.
2.3 視頻驅動模塊設計
本文驅動程序的設計是圍繞著file_operations{}這個數(shù)據(jù)結構體展開,其主要功能是注冊相應的各個函數(shù)的功能,實現(xiàn)對攝像頭設備打開、設置控制項、設備buf映像、采集像素格式初始化、采集圖像、關閉攝像頭等功能.
在初始化函數(shù)s3c2440_ov9650_init(void)中設置GPIO-J引腳為camera的對應模式,通過函數(shù)re?quest_mem_region((unsigned long)S3C2440_PA_CAMIF,S3C2440_SZ_CAMIF,CARD_NAME)為camera申請I/O內存資源,然后使用函數(shù)ioremap_nocache((unsigned long)S3C2440_PA_CAMIF,S3C2440_SZ_CAMIF)進行內存映射.接著,初始化camera時鐘、設置ov9650寄存器等.下一步,使用misc_register(&misc)函數(shù)注冊到videodev層.
圖3 系統(tǒng)工作流程
此外,在驅動程序結構中必須要包含的兩個模塊函數(shù)分別為:模塊加載函數(shù)和模塊卸載函數(shù).在安裝模塊時被系統(tǒng)自動調用的函數(shù),通過module_init宏來指定;而卸載模塊時被系統(tǒng)自動調用的函數(shù),通過module_exit宏來指定.
module_init是驅動程序的入口點,如果被用戶進程加載,它就會自動調用s3c24xx_ov9650_init函數(shù),其實現(xiàn)的工作包括:配置相關寄存器,初始化OV9650攝像頭.
當驅動被用戶進程卸載時,module_exit(s3c24xx_ov9650_exit)會自動調用s3c24xx_ov9650_exit函數(shù),其實現(xiàn)的工作包括:進程地址空間的釋放,中斷請求的關閉.
對于主機端設備驅動程序,接下來的工作就是把驅動程序嵌入到內核,這里采用模塊的形式編寫,因為模塊方式可以動態(tài)加載到Linux內核,而且利于程序調試.
2.4 基于V4L2的圖像采集模塊設計與實現(xiàn)
視頻采集是通過操作系統(tǒng)調用V4L2接口與設備驅動程序來實現(xiàn)的.V4L2接口是內核里提供的一組支持影像設備的API函數(shù),配合視頻采集模塊驅動程序實現(xiàn)圖像采集功能.在Linux中,可以把視頻設備當作普通的設備文件,采集圖像的程序就是通過調用V4L2接口規(guī)范中API函數(shù)對設備文件進行讀操作.整個采集流程圖如圖4所示.
主要用到的函數(shù)模型說明如下:
1)int open(devicename,mode):打開設備文件,采用非阻塞模式調用視頻設備,當沒有可用的視頻數(shù)據(jù)時不會阻塞而立即返回.
2)int ioctl(int__fd,unsigned long int__request,.../*args*/):在打開設備后,使用ioctl函數(shù)可以對設備的I/O通道進行管理,能夠設置該視頻設備的相關屬性以及采集方式,還能夠向驅動申請幀緩存獲取每個幀緩沖的信息后,映射到用戶空間.
3)void*mmap(void*start,size_t length,int prot,int flags,int fd,off_t offset);由于V4L2采集到的圖像數(shù)據(jù)是存放在內核空間,而應用程序無法訪問內核空間中的數(shù)據(jù).我們利用mmap這個函數(shù)將內核地址映射到用戶空間.這樣程序就可以對緩沖區(qū)的數(shù)據(jù)進行操作,從而提高了效率.
4)int close(fd):關閉圖像采集設備.最后還要使用munmap方法來釋放設備申請的內存.
2.5 測試程序
圖4 圖像采集流程
本文中驅動程序的測試采用開源編碼庫—mjpg-streamer,在移植mjpg-streamer之前還需要移植SDL庫.mjpg-streamer使用的是V4L2接口,通過對源碼的相關修改以及移植來實現(xiàn)一個自己需要的視頻服務器,從而可以測試驅動程序開發(fā)與圖像采集模塊程序的編寫工作.
本文給出了在嵌入式系統(tǒng)中基于V4L2實現(xiàn)的驅動程序開發(fā)和圖像采集與傳輸設計方案.在Linux2.6內核中,視頻設備也是文件,可以像訪問普通文件一樣對其進行讀寫,攝像頭設備在/dev/video0目錄下. Video for Linux 2是Linux中有關視頻驅動的內核驅動,它為嵌入式驅動程序開發(fā)提供了統(tǒng)一規(guī)范,從而提高開發(fā)效率.基于S3C2440A硬件平臺,再加上適當?shù)耐鈬骷c應用程序,可應用于圖像傳輸、視頻監(jiān)控等領域.
[1]余輝.嵌入式Linux程序設計案例與實驗教程[M].北京:機械工業(yè)出版社,2009(4):191-195.
[2]S3C2440A User’s manual Revision1[Z].SUMSUNG,2004.Http://www.samsungsemi.com.
[3]OV9650_DS CameraChipTM Implementation Guide[Z].OmniVision Co.,2004(12).http://www.pdf-ic.com/datasheet_0V9650.html.
[4]曹占中,周余,王自強,等.基于s3c2440的Linux攝像頭驅動開發(fā)[J].電子測量技術,2009,32(2):108-111.
[5]周曉光,潘延濤.基于S3C2440A的嵌入式視頻系統(tǒng)設計[J].電子測量技術,2006,29(6):84-86.
[6]楊水清,張建,施云飛.ARM嵌入式Linux系統(tǒng)開發(fā)技術詳解[M].北京:電子工業(yè)出版社,2008:17-20.
[7]宋寶華.設備驅動開發(fā)詳解[M].第二版,北京:人民郵電出版社,2010:85-88.
[8]Jonathan Corbet,Alessandro Rubin,Greg Kroah-Hartman.Linux Device Drivers 3rd Edition[M].America:O'Reilly Media,2005: 108-112.
Design and Application of Embedded Image Detection System
YANG Yong,LIU Yong-jun
(School of Computer Science and Engineering,Changshu Institute of Technology,Changshu 215500,China)
Based on the latest standard Video for Linux 2(V4L2)in Linux kernel 2.6,this paper introduces the rap?id development method of driver programs.Traditional driver development is rarely able to realize all the interface functions,which seriously affects the system development cycle.The ov9650 camera driver of OmniVision Compa?ny has not been supported by Linux kernel.For this reason,under the condition of s3c2440 board hardware plat?form and Linux kernel 2.6.30.4,the authors of this paper achieve development work including camera driver mod?ule hierarchy and video capture module design,put forward the method of driver development based on V4L2 inter?face specification,and realize the application of low-cost,low-power,highly efficient image detection system.
V4L2;driver;ov9650;Linux-2.6.30.4
TP316.81
B
1008-2794(2012)04-0105-05
2012-03-01
江蘇省高校自然科學基金“基于投影分析理論與算法的圖像特征抽取及分類技術研究”(05KJB520152);常熟理工學院科研創(chuàng)新項目基金“基于arm的便攜式人臉識別系統(tǒng)”(KY2012116)
楊勇(1989—),男,江蘇宿遷人,常熟理工學院計算機科學與工程學院學生.
劉永俊(1981—),男,山東青島人,講師,碩士,研究方向:人工智能與智能系統(tǒng),模式識別理論與應用,人臉識別,E-mail:yongjun1981@126.com.