《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于ARM920T處理器核的圖像采集系統(tǒng)設計
基于ARM920T處理器核的圖像采集系統(tǒng)設計
摘要:  本文設計了一種嵌入式視頻采集系統(tǒng),該系統(tǒng)小巧,,并且在保證當前信息完整的情況下,,盡可能少的占用存儲容量,實現了該系統(tǒng)的圖像采集,、存儲和重現功能,。在硬件規(guī)劃上,采用實用簡單的USB接口通信,。且系統(tǒng)中預留了豐富的外設接口,,便于今后的擴展升級。
關鍵詞: ARM ARM920T S3C2410
Abstract:
Key words :

  引言

  隨著微電子技術和軟件技術的發(fā)展,,嵌入式技術也有了長足的進步,。因此,基于嵌入式技術的圖像數據采集與存儲監(jiān)控系統(tǒng)以其直觀,、方便,、信息內容豐富的特點,,廣泛應用于許多場合。

  處理器性能的提高,,接口傳輸數據能力的增強,,特別是未來高容量存儲器的出現,圖像監(jiān)控系統(tǒng)的小型化,、多功能化是易于實現的,,嵌入式技術引入圖像監(jiān)控系統(tǒng)后,兩個問題需要解決,,一是靈活的圖像監(jiān)控系統(tǒng)結構調整,,二是適合監(jiān)控規(guī)范、集圖像和信號檢測與控制一體的交互式軟件的設計,。 

  1 系統(tǒng)平臺的搭建

  1.1 硬件平臺的搭建

  ARM(AdvancedRISCMachines),,既可以認為是一個公司的名字,也可以認為是對一類微處理器的統(tǒng)稱,,還可以認為是一種技術的名字,。

  S3C2410處理器是Samsung公司基于ARM公司的ARM920T處理器核,采用0.18um制造工藝的32位微控制器,。該處理器擁有:獨立的16KB指令Cache和16KB數據Cache,,MMU,支持TFT的LCD控制器,,NAND閃存控制器,,3路UART,4路DMA,,4路帶PWM的Timer,,I/O口,RTC,,8路10位ADC,,TouchScreen接口,IIC-BUS接口,,IIS-BUS接口,,2個USB主機,1個USB設備,,SD主機和MMC接口,,2路SPI。S3C2410處理器最高可運行在203MHz,。

  由S3C2410為核心的圖像采集系統(tǒng)的硬件結構如圖1所示,。因為S3C2410內部只有很小的存儲空間,所以我必須外擴系統(tǒng)的存儲器,作為32位的微處理器,,S3C2410支持8位,,16位和32位尋址方式,有16M×32位的尋址能力,,可方便地構建較大地存儲空間,,系統(tǒng)的存儲器由FLASH和SDRAM構成。數碼攝像頭通過USB接口與S3C2410芯片連接,,通過S3C2410芯片來控制數碼攝像頭對圖像進行采集,,并存儲在存儲器中?! ?/p>

  1.2 軟件平臺的搭建

  嵌入式Linux(EmbeddedLinux)是指對Linux經過裁剪小型化后,,可固化在存儲器或單片機中,應用于特定嵌入式場合的專用Linux操作系統(tǒng),。具體的搭建流程如圖2所示,。  

  2 USB攝像頭設備驅動的開發(fā)

  在Linuxkernel源碼目錄中driver/usb/usb_skeleton.c提供了一個最基礎的USB驅動程序,,我們稱為USB骨架,。通過他僅需要修改極少的部分,就可以完成一個USB設備的驅動,。我們的USB驅動開發(fā)也是從它開始的,。USB驅動程序結構如下:  

  該結構指明了USB設備驅動所要做的工作,具體內容如下:

  (1)在驅動模塊加載的時候,,向USB核心子系統(tǒng)注冊,,并告訴子系統(tǒng)需要支持的設備。

  (2)在卸載USB設備驅動程序向USB核心子系統(tǒng)注銷,。

  (3)當獲支持的設備插入或者拔出的時候,,調用哪些功能。

  在初始化函數中,,USB設備驅動調用usb_register函數進行注冊,。  

  以上介紹了簡單USB設備驅動程序的框架,。但是我們要進行的攝像頭驅動開發(fā)比上述驅動稍微復雜些,。除了之前講到的USB驅動還包括圖像采集部分的設備驅動。

  首先,,我們需要定義一個數據結構,其中一個包括圖片信息,、采集模式,、解碼方式。具體定義如下?! ?/p>

  LinuxUSB驅動程序需要做的第一件事情就是在LinuxUSB子系統(tǒng)里注冊,,并提供一些相關信息,例如這個驅動程序支持哪種設備,,當被支持的設備從系統(tǒng)插入或拔出時,,會有哪些動作。所有這些信息都將傳送到USB子系統(tǒng)中,。以下代碼完成USB攝像頭的注冊功能:  

  以上定義的數據含義如下ZC301是客戶端驅動程序的名稱,,用于避免驅動程序的重復安裝和卸載。

  zc301_probe則指向USB驅動程序的探測函數指針,,提供給USB內核的函數,,用于判斷驅動程序是否能對設備的某個接口進行驅動。

  zc301_disconnect指向USB驅動程序中的斷開函數的指針,,當從系統(tǒng)中被移除或者驅動程序正在從USB核心中卸載時,,USB核心將調用該函數。

  zc301_table列表包含了一系列該驅動程序可以支持的所有不同類型的USB設備,,如沒有設置該列表,,則該驅動程序中的探測回調函數不會被調用。

  系統(tǒng)啟動時,,首先需要加載各種驅動模塊,,然后向系統(tǒng)注冊了生產廠商號碼(VendorID)和產品號(Pro-ductID)。當USB設備連接到主機上,,系統(tǒng)會檢測它的VendorID和ProductID,,如果與驅動模塊的注冊內容匹配,則將該驅動程序與設備掛接起來[5],。當插入攝像頭時,,系統(tǒng)會調用zc301_probe函數。參數dev指定了設備信息,,probe函數驗證所有可選配置的有效性,,并調用usbvideo模塊的sbvideo_Regis-terVideoDevice()函數向videodev系統(tǒng)注冊。

  當系統(tǒng)完成驅動注冊后,,調用staticintzc301_init(structusb_zc301*zc301)和staticvoidzc301_start(structusb_301*zc301)函數完成對設備的初始化過程:填寫各個寄存器值,、啟動攝像頭。系統(tǒng)運行到這一步,,基本完成了對攝像頭驅動加載及設備初始化,。接下來需要通過讀取用戶設定的圖像規(guī)格,其中包括:圖像格式,、分辨率,、顏色深度,、對比度和亮度等參數。這些數值的讀取都是通過以下函數實現的:  

  在得到這些參數值后,,再調用一套函數,,實現參數的設置。每個參數設置函數和之前的參數取值函數是一一對應的,。具體函數如下:  

  通過調用上面的函數,,我們基本得到了所需的參數值,這樣我們就可以啟動攝像頭了,。

  當然我們還需要staticvoidzc301_shutdown(structusb_zc301*zc301)來關閉攝像頭,。

 

  至此,攝像頭驅動的驅動基本完成,。通過這些函數的設置我們可以把具體的硬件電路抽象化為數據結構中的參數值,。接下來我們可以通過V4L驅動來調用這些函數,實現對參數的賦值,、打開設備,、采集圖像和關閉設備等一系列的過程。

  重新編譯,、運行內核時,,在串口反饋信息中會顯示USB攝像頭驅動程序成功加載。如圖3所示,?! ?/p>

  圖3串口反饋信息3Video4Linux下的圖像采集編程:

  Video4Linux,簡稱V4L,是Linux中關于視頻設備的內核驅動,它為針對視頻設備的應用程序編程提供一系列半標準的接口,。V4L利用這個接口,,增加一些額外的功能,同時向外提供了一個屬于自己的API,。我們可以通過調用V4L的API來實現各種功能,。在Linux下,視頻采集設備的正常使用依賴于對Video4Linux標準的支持,。目前的V4L涵蓋了視,、音頻流捕捉及處理等內容,USB攝像頭也屬于它支持的范疇,。

  V4L中定義的主要數據結構:  

  這些數據結構都是由Video4Linux支持的,,它們的用途如下:

  (1)video_capability包含攝像頭的基本信息,例如設備名稱,、支持的最大最小分辨率,、信號源信息等,分別對應著結構體中成員變量name,、maxwidth,、maxheight,、minwidth、minheight,、channels(信號源個數)、type等;

  (2)voide_picture包含設備采集圖像的各種屬性,,如brightness(亮度),、hue(色調)、contrast(對比度),、whiteness(色度),、depth(深度)等;

  (3)video_mmap用于內存映射;

  (4)voido_mbuf利用mmap進行映射的幀信息,實際上是輸入到攝像頭存儲器緩沖中的幀信息,,包括size(幀的大小),、frames(最多支持的幀數)、offsets(每幀相對基址的偏移),。

  系統(tǒng)在采集圖像之前,,需要初始化這些數據結構中的參數值,系統(tǒng)才能夠按照要求采集圖像數據,。

  在USB攝像頭被驅動后,,只需要再編寫一個對視頻流采集的應用程序就可以了。根據嵌入式系統(tǒng)開發(fā)特征,,先在宿主機上編寫應用程序,,再使用交叉編譯器進行編譯鏈接,生成在目標平臺的可執(zhí)行文件,。宿主機與目標板通信采用打印終端的方式進行交叉調試,,成功后移植到目標平臺。

  V4L圖像采集編程流程:

  (1)打開視頻設備;

  (2)讀取設備信息;

  (3)更改設備當前設置;

  (4)視頻采集得到圖像信息;

  (5)對采集到的圖像進行處理;

  (6)關閉視頻設備,。

  本文編寫采集程序是在安裝Linux操作系統(tǒng)的宿主機PC機上進行的,,之后再移植到開發(fā)板上。下面是具體論述,。

  之前我們講到了在V4L中定義的主要數據結構及其功能,。對應著這些內容,我們需要對這些數據結構進行定義,,以抽象化一個視頻設備,。以下是具體的定義內容:  

  攝像頭、采集圖像和關閉攝像頭的操作,。采集程序中定義了如下的函數,,以實現前面講到的功能。

  intinit_videoIn(structvdIn*vd,char*device,intwidth,intheight,intgrabmethod);初始化攝像頭設備,。*vd包含了之前定義的數據結構中的基本信息,。另外還要對攝像頭采集圖像的大小,、采集模式等參數進行賦值。

  intv4lGrab(structvdIn*vd,char*filename);采集圖像主程序,。*filename為圖像的文件名,,我們可以通過對文件名的設置來確定圖像保存的位置。

  intclose_v4l(structvdIn*vd);關閉攝像頭intget_jpegsize(unsignedchar*buf,intinsize);采集圖像的大小,。

  因為我們是通過調用采集主函數intv4lGrab(structvdIn*vd,char*filename)來實現圖像的采集和保存的,,所以需要詳細的講解一下該函數的構成。以下是該函數的具體內容:  

  首先,,我們需要定義幾個參數,,如下:

  FILE*fp;定義一個文件類型指針,指向我們采集到的圖像文件intlen;

  定義一個整型變量,,記錄從內存中讀取的數據量intsize;

  定義一個整型變量,,指明一幀圖像的數據量interreur=0;定義一個整型變量,指明運行時的錯誤返回值intjpegsize;定義一個整型變量,,指明我們需要的圖像大小,。

  接著我們調用read(vd->fd,vd->pFramebuffer,size)函數,把存放于圖像緩沖區(qū)的數據讀入到指定的臨時文件中,。之后根據我們對圖像的大小,、亮度、對比度等要求轉化之前采集到的圖像數據,,最后我們打開一個文件,,把圖像數據寫入到該文件中并保存。

  4 結論

  本文設計了一種嵌入式視頻采集系統(tǒng),,該系統(tǒng)小巧,,并且在保證當前信息完整的情況下,盡可能少的占用存儲容量,,實現了該系統(tǒng)的圖像采集,、存儲和重現功能。在硬件規(guī)劃上,,采用實用簡單的USB接口通信,。且系統(tǒng)中預留了豐富的外設接口,便于今后的擴展升級,。



 

此內容為AET網站原創(chuàng),,未經授權禁止轉載。