祝夏雨,熊九龍,王志虎,王曉明
(國防科技大學 機電工程與自動化學院,長沙 410073)
?
達芬奇平臺的嵌入式Linux圖像采集與顯示
祝夏雨,熊九龍,王志虎,王曉明
(國防科技大學 機電工程與自動化學院,長沙 410073)
在模式識別等領域,需要進行實時快速的圖像處理。本文設計了基于達芬奇系列芯片TMS320DM6446的硬件平臺,介紹了建立Linux開發環境的方法,利用Video4Linux和framebuffer實現了基于嵌入式Linux的USB攝像頭圖像采集與顯示,采集到的圖像可以直接送給DSP內核,進行高速的圖像處理。
達芬奇;Linux;圖像采集;DM6446;Video4Linux;framebuffer;USB攝像頭
嵌入式圖像采集系統具有體積小、成本低、穩定性高等優點,在遠程可視電話、計算機視覺、網絡會議等領域應用廣泛。然而,一些圖像處理領域,如無人駕駛、模式識別,對運算速度、運算量要求較高,傳統的基于ARM芯片的嵌入式圖像采集系統往往無法滿足這一要求。
TI公司的達芬奇技術集成了DSP內核和ARM內核,是典型的基于共享存儲的嵌入式多處理器環境[1]。它既具有ARM對外設強大的管理能力,又擁有DSP對數據信號的高速處理能力,因而可以很好地滿足圖像處理對運算速度和運算量的要求。
Linux操作系統具有內核穩定、功能強大、支持多種硬件平臺、源代碼開放、可裁剪和低成本等眾多優點,使其在嵌入式領域備受青睞。
本文在基于達芬奇技術的嵌入式linux平臺上,利用OV511為控制芯片的網眼2000 USB攝像頭為采集模塊,使用Video4Linux內核API接口函數以及framebuffer編寫相應的程序,實現了圖像的采集與顯示,為DSP內核后續的圖像處理奠定了基礎。
本文使用的系統硬件平臺采用TI公司的TMS320DM6446處理器(簡稱DM6446),它是一款雙核嵌入式處理器,內部集成了ARM926EJS內核和C64x+DSP內核,DSP的數據處理能力達到4752 MIPS。該款芯片的ARM子系統是采用管道流水線的32位RISC處理器,工作頻率高達297 MHz,帶有獨立的16 KB的指令Cache,8 KB的數據Cache,16 KB RAM,16 KB ROM[2]。其片上外設還包括USB接口、10M/100M以太網卡、UART接口、SPI接口。在處理器豐富資源的基礎上,還進行了擴展,配置了128 MB 32位的SDRAM和128 MB的FLASH。另外,還配有分辨率為320×240的256色LCD。系統框圖如圖1所示。

圖1 系統框圖
2.1 主機開發環境的建立
ARM的開發一般需要三個系統,即Windows系統、PC-Linux系統、ARM-Linux系統。其各自的功能如圖2所示。

圖2 三系統功能圖
三系統的搭建有兩種方法:一種是三臺分立的單系統機器組合,一種是一臺雙系統PC機和一臺單系統ARM開發板。本文采用后一種方式,一可以節約硬件資源,二可以使開發流程、開發環境的搭建更加簡單。
本系統PC機采用WindowsXP+VMware虛擬機+Linux的開發環境。其中VMware采用的是6.0版本,Linux采用的是較為成熟的Redhat9,內核版本是2.4.20。
2.2 交叉編譯環境的建立
在進入嵌入式開發之前,還需要建立一個交叉開發環境,這是一套編譯器、連接器和libc庫等組成的開發環境[3]。其開發模型如圖3所示。

圖3 交叉開發模式
圖3中,TARGET是目標板,HOST是開發主機。在開發主機上,可以安裝開發工具,編輯、編譯目標板的Linux引導程序、內核和文件系統,然后在目標板上運行。這種在主機環境下開發,在目標板上運行的開發模式叫做交叉開發。
構建交叉開發環境,首先要安裝交叉編譯工具鏈。Linux使用GUN的工具,社區的開發者已經編譯出了常用體系結構的工具鏈,從因特網上下載ARM體系結構的編譯器,安裝即可。安裝后需要在環境變量PATH中添加路徑,該路徑必須是工具鏈的安裝路徑,這樣就可以直接使用arm-linux-gcc命令了。
2.3 內核定制
嵌入式系統的存儲空間有限,要將Linux用于嵌入式系統就得對Linux操作系統進行定制(或叫裁剪),使整個Linux系統能夠存放到容量較小的開發板FLASH中[4]。
由于本系統采用OV511芯片的USB攝像頭進行圖像采集,所以在定制內核時,一定要使內核支持USB總線和OV511攝像頭。此外,視頻采集設備的正常使用依賴于對 Video4Linux驅動程序的支持,所以在定制內核時也要添加這一項支持。
在定制內核時,應該選中:
[*]Video for Linux
[*]support for usb
[*]USB ov511 Camera Support
Video4Linux(簡稱V4L)是Linux中關于視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供一系列接口函數,這些視頻設備包括TV卡、視頻捕捉卡和USB攝像頭等。在Linux環境下,利用V4L應用程序接口獲取視頻圖像,可以通過調用open()、ioctl()等函數,像操作普通文件一樣,進行視頻硬件初始化、硬件屬性設置和硬件中斷調用等操作。
視頻采集程序的基本流程如圖4所示。

圖4 視頻采集流程
V4L模塊提供的主要API函數有:VIDIOCGCAP函數,以數據結構video_capability返回視頻采集設備的基本信息,包括設備名稱、設備類型、信道數、最大及最小像素高度和寬度等;VIDIOCSPICT函數,使用數據結構video_picture來獲取和設置采集圖像幀的屬性,如亮度、色調、對比度、調色板等[5];VIDIOCGMBUG函數,使用數據結構video_mbuf獲得攝像頭設備圖像存儲的相關信息;VIDIOCMCAPTURE函數用于視頻采集。以上函數都可以在videodev.h文件中查看定義。
首先必須聲明兩個頭文件sys/types.h、linux/videodev.h,接著利用open函數打開視頻設備,其中設備文件為/dev/video0。隨后,調用ioctl(fd, VIDIOCGCAP, &capability)函數的VIDIOCGCAP宏命令,獲取有關視頻設備的基本信息。接著,調用ioctl(fd, VIDIOCGPICT, &picture)函數的VIDIOCGPICT宏命令,獲取所采集圖像的屬性。至此,圖像采集的前期準備工作已經完成。接著就是關鍵的圖像采集部分。
圖像采集有兩種方法:一種是用內存映射方式讀取圖像,一種是直接讀取視頻設備。本文采用前者,獲取圖像的關鍵代碼如下:
struct video_mmap mmap;
/*定義video_mmap型結構變量mmap*/
/*以下為設置圖像緩沖區信息*/
mmap.frame=1;
/*采集幀數為2幀,交替出現,以完成顯示圖像的連續性*/
mmap.height=320; /*圖像高度*/
mmap.width=480; /*圖像寬度*/
mmap.format= picture.palette; /*圖像的調色板格式*/
struct video_mbuf mbuf;
ioctl(fd, VIDIOCGMBUG ,& mbuf);
/*獲取存儲圖像的內存大小*/
unsigned char *map = mmap(0, mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0) /*內存映像*/
ioctl(fd, VIDIOCMCAPTURE, & mmap) /*采集圖像*/
截取圖像后還要調用函數ioctl(fd, VIDIOCSYNC, &frame)進行同步操作,函數返回0表示圖像已經獲取完畢。圖像存儲在以map為起始地址,長度為mbuf.size的存儲空間中。map +mbuf.offsets[frame_current]處。其中frame_current=0,即為第一幀的位置,frame_current=1,為第二幀的位置。由于DSP內核和ARM內核是共享DDR內存的,所以ARM可以直接傳遞該數據地址指針給DSP內核進行圖像處理,無需大塊的數據搬移。
Framebuffer(幀緩沖),它作為基礎圖形設施,是出現在Linux2.2內核當中的一種驅動程序接口,是作為其他高級圖形或者圖形應用程序的基本函數庫。這種接口將顯示設備抽象為幀緩沖區。用戶可以將它看成是顯示內存的一個映像,而不必關心物理顯存的位置、換頁機制等等具體細節,這些都是由Framebuffer設備驅動來完成的。只要將其映射到進程地址空間之后,就可以直接進行讀/寫操作,而寫操作可以立即反應在屏幕上。該設備使用特殊的設備節點,通常位于/dev目錄,如/dev/fb*。用戶若要使用它,需要在編譯內核時選中FrameBuffer[6]。其簡單的使用程序如下:
struct fb_fix_screeninfo finfo;
struct fb_var_screeninfo vinfo;
int fb = open("/dev/fb0", O_RDWR);
ioctl ( fb, FBIOGET_FSCREENINFO, &finfo) ;
/*獲取與Framebuffer有關的固定的信息*/
ioctl( fb, FBIOGET_VSCREENINFO, &vinfo) ;
/*獲取與Framebuffer有關的可變信息*/
從vinfo和finfo中取得顯存起始地址、分辨率、色深等信息,然后根據這些計算出需映射的顯存的大小。
screensize=vinfo.xres*vinfo.yres*vinfo.bits_per_pixel/8;
/*計算顯存所需的字節數,其中xres,yres,bits_per_pixel分別為x、y軸分辨率和色深*/
char * fbp = mmap ( 0 , screensize ,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
/*通過調用mmap()用來實現內存映射IO*/
由此便可以直接操作大小為screensize,起始地址為fbp的內存空間,利用Video4Linux采集的圖像數據映射到Framebuffer的內存區域中,便可以直接顯示到LCD上了。
如前所述,DaVinci是DSP和ARM雙核架構的SOC芯片,ARM核負責芯片與外界的交互,DSP核處理相關算法,它們之間的通信和交互是通過引擎(Engine)和服務器(Server)來完成的[7],其框架如圖5所示。

圖5 Codec框架
Codec Engine是連接ARM和DSP的橋梁,是介于應用層(ARM端的應用程序)和信號處理層(DSP端的算法)之間的軟件模塊。ARM應用程序調用Codec Engine的VISA(Video, Image, Speech, Audio)API,以VIDENC_process(a、 b、 c)為例。首先,Codec Engine的stub(ARM端)會把參數a、b、c以及要調用DSP端process函數這個信息打包;隨后,通過Engine SPI、OSAL和DSP Link傳遞給DSP;接著,Codec Engine的skeleton(DSP端)會解開這個包,把參數a、b、c轉換成DSP端對應的參數x、y、z(比如ARM端傳遞的是虛擬地址,而DSP只能認物理地址);最后,DSP端的Codec server(優先級較低,負責和ARM通信的任務)會根據process這一信息創建一個DSP端的process(x, y, x)任務,最終實現VIDENC_process(a、b、c)的操作。
Linux代碼完全開源,系統具有良好的移植性,可方便地進行各種擴展,利用嵌入式Linux進行的圖像采集和顯示運行穩定,效果良好。本文利用達芬奇平臺實現了圖像采集和顯示,采集到的圖像可以給DSP內核進行高速處理,為后續的工作奠定了基礎,可廣泛應用于對
Embedded Linux Image Acquisition and Display Based on DaVinci
Zhu Xiayu, Xiong Jiulong, Wang Zhihu, Wang Xiaoming
(School of Mechatronics Engineering and Automation, National University of Defense Technology, Changsha 410073,China)
Real time and fast image processing are needed in some field such as Pattern Recognition. This paper first designs the hardware platform based on TMS329DM6446, then introduces a method of building Linux development environment, finally achieves image acquisition and display of the USB camera based on Embedded Linux. The DSP kernel can realize image processing directly with high-speed.
DaVinci SoC; Linux; image acquisition; DM6446; Video4Linux; framebuffer; USB camera
TP391.41
A