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的內存區域中,讀取該內存中的數據便可得到圖像數據。
&
nbsp; 在此基礎上同樣可實現連續幀的采集,即一次采集連續多幀圖像的數據,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-PUTCMAP,&new_cmap)將設置新的調色板。以下介紹如何顯示一個象素,這裡假設LCD為24位色的。
由此便可逐一顯示每個象素,進而顯示整幅圖像。5 結語
由於Linux的驅動模型支持模塊堆疊技術,內核開發者已提供了一些通用模塊,因此,雖然文中是以USB攝像頭為例,但只要針對自己的圖像采集設備編寫基於Video4 Linux的驅動程序, 針對自己的LCD編寫基於FrameBuffer的驅動程序,以上的程序便可成為通用的圖像采集與顯示程序。應用本文所述方法完成圖像采集與顯示工作,再 加上相關的處理並接入網絡,就構成了一個智能終端設備,可用於工廠、銀行等場合全天候的智能監控,圖像的網絡通信等,具有廣闊的是市場和應用前景。
from:
http://article.ednchina.com/Embeded/2006-10/200610101046022.htm