1 系統平臺的硬件結構 本文使用的系統平臺硬件功能框圖如圖1所示,該平臺采用Samsung公司的處理器S3C2410。該處理器內部集成了ARM公司ARM920T處理器核的32b微控制器,資源豐富,帶獨立的16kB的指令Cache和16kB數據Cache,LCD控制器、RAM控制器,NAND閃存控制器,3路UART、4路DMA、4路帶PWM的Timer、并行I/O口、8路10位ADC、Touch Screen接口,I2C接口,I2S接口、2個USB接口控制器、2路SPI,主頻最高可達203MHz。在處理器豐富資源的基礎上,還進行了相關的配置和擴展,平臺配置了16MB 16b的FLASH和64MB 32位的SDRAM,通過以太網控制器芯片AX88796擴展了一個網口,另外引出了一個HOST USB接口。在USB接口上外接一個帶USB口的攝像頭。另外,還配有分辨率為320×240,256色的LCD。 2 嵌入式Linux簡介 Linux操作系統具有相當多的優點,他的內核穩定、功能強大、支持多種硬件平臺、源代碼完全開放,可裁減和低成本的特性非常適合于嵌入式應用,并且Linux本身直接提供完整的TCP/IP協議,可非常方便地進行網絡應用。但Linux內核本身不具備強實時性,且內核體積較大,而且嵌入式系統的硬件資源有限,因此把Linux用于嵌入式系統,必須對Linux進行實時化和嵌入式化,即通過配置內核,裁減shell和嵌入式C庫對系統定制,使整個系統能夠存放到容量較小的FLASH中,Linux的動態模塊加載,使Linux的裁減極為方便,高度模塊化的部件使添加非常容易。 整個系統軟件是在嵌入式Linux的基礎上構建的。S3C2410平臺使用的Linux內核是在Linux-2.4.18內核打上patch-2.4.18-S3C2410這個補丁后編譯而成。S3C2410平臺使用的文件系統是yaffs,文件系統包括應用程序、模塊、配置文件和庫等,圖像的采集和顯示是建立在嵌入式Linux內核之上的,整個軟件系統如圖2所示。 通常宿主機和目標板上的處理器不同,宿主機通常為Intel處理器,而目標板如圖1所示為SAMSUNG S3C2410,所以程序需要使用針對處理器特點的編譯器才能生成在相應平臺上可運行的代碼,GNU編譯器提供這樣的功能,在編譯時,可以選擇開發所需的宿主機和目標機,從而建立開發環境。在進行嵌入式開發前的第一步工作就是把一臺PC機作為宿主機開發機,并在其上安裝指定操作系統。對于嵌入式Linux,宿主機PC上應安裝Linux系統。之后,在宿主機上建立交叉編譯調試的開發環境,開發環境的具體建立這里不細談。本文采用移植性很強的C語言在宿主機上編寫視頻采集程序,再利用交叉編譯調試工具編譯鏈接生成可執行代碼,最后向目標平臺移植。 3 基于Video4Linux的圖像采集 Video4Linux是Linux中關于視頻設備的內核驅動,他為針對視頻設備的應用程序編程提供一系列接口函數,在Linux下,視頻采集設備的正常使用依賴于對Video4 Linux標準的支持。如果使用Video4Linux,在編譯內核時,一定要選中Multimedia Devices下的Video for Linux選項,本文針對的設備文件是 / dev / video,使用的器件是基于OV511的USB攝像頭。在運行程序前,一定要先加載USB及OV511設備驅動模塊,同時加載Video4Linux模塊,分別使用命令:modprobe usbcore,modprobe usbohci,modprobe videodev和modprobe ov511,以確保生成設備文件/dev/video,若使用的Linux操作系統不支持modprobe命令,也可使用insmod命令。一般來講,基于Video4Linux的圖像采集的程序流程如圖3所示。 以下簡單介紹程序的編寫,在這里只給出關鍵部分的實現代碼。 首先,必須聲明包含2個頭文件: 在獲取圖像信息后,還可根據需要改變這些信息,例如對比度、亮度、調色板等,具體做法是先給video_picture中相應變量賦新值,再利用VIDIOCSPICT ioct1函數。 第2部分,使用mmap方式的單幀圖象采集: 然后調用ioct1(grab_fd,VIDIOCSYNC,&fRAMe)函數,該函數成功返回則表示采集完畢,采集到的圖像數據放到以data為起始地址,長度為240×320×3的內存區域中,讀取該內存中的數據便可得到圖像數據。 在此基礎上同樣可實現連續幀的采集,即一次采集連續多幀圖像的數據,Video4Linux最多支持一次采集32幀,此時首先要設置grab_buf.frame為要采集的幀數,而每一幀的數據在內存中的位置為data+grab_vm.offsets[frame],其中grab_vm為video_mbuf結構體變量的一個聲明,利用ioct1(fd,VIDIOCGMBUF,&grab_vm)便可獲得grab_vm的信息。 4 基于FrameBuffer的圖象顯示 當Video4Linux使用mmap方式采集圖像時,他總是盡最大努力將圖像直接顯示在屏幕上,但并不一定能夠完成,因此一個完整的設備應該具有圖像顯示的功能,一般來講,嵌入式Linux下顯示一幅圖像總共有以下幾種方法: (1)在利用Video4Linux采集圖像時,將采集到的圖象數據直接放到FrameBuffer的內存映射區中,而Video4Linux也支持這種功能,利用VIDIOCSFBUF和VIDIOCGFBUF這兩個ioct1函數,可設置和獲得struct video_buffer。但該方法并不是每個圖像采集設備都支持。 (2)進圖像數據存成各種格式(例如bmp),在各種GUI軟件中,均會直接顯示不同格式的圖像的函數,如MiniGui中的FillBoxWithBitmap函數。 (3)直接將圖像數據寫入FrameBuffer中。 在這里主要介紹第3種。 FrameBuffer設備是運行在Linux控制臺上的一個優秀的圖形接口,他幾乎支持所有的硬件,提供了統一的API接口,很好地實現了硬件無關性,他可以直接操作顯存,而且還留有提供圖形加速功能的接口,運行時不需要root權限;FrameBuffer的設備節點是/dev/fb*,用戶若要使用他,需要在編譯內核時選中FrameBuffer,其簡單的使用程序如下: 從vinfo和finfo中取得顯存起始地址、分辨率、色深等信息,然后根據這些計算出需映射顯存的大小。 由此便可直接操作大小為screensize,起始地址為fbp的內存區域,在LCD上直接顯示圖像、圖形、文字等,例如執行memset(fbp,0,screensize)將進行清屏操作。 需要注意的是,對于色深為8位或8位以下的設備,在進行繪圖操作前還需要設置合適的調色板,操作調色板要用到fb_camp結構,執行ioctl(fd,FBIOGETCMAP,&old_cmap)將保存調色板信息,執行ioctl(fd,FBIO-PU TCMAP,&new_cmap)將設置新的調色板。以下介紹如何顯示一個象素,這里假設LCD為24位色的。 由此便可逐一顯示每個象素,進而顯示整幅圖像。 5 結語 由于Linux的驅動模型支持模塊堆疊技術,內核開發者已提供了一些通用模塊,因此,雖然文中是以USB攝像頭為例,但只要針對自己的圖像采集設備編寫基于Video4 Linux的驅動程序,針對自己的LCD編寫基于FRAMeBuffer的驅動程序,以上的程序便可成為通用的圖像采集與顯示程序。應用本文所述方法完成圖像采集與顯示工作,再加上相關的處理并接入網絡,就構成了一個智能終端設備,可用于工廠、銀行等場合全天候的智能監控,圖像的網絡通信等,具有廣闊的是市場和應用前景。 |