基于S3C2410的的圖像采集系統
系統啟動(dòng)時(shí),首先需要加載各種驅動(dòng)模塊,然后向系統注冊了生產(chǎn)廠(chǎng)商號碼(VendorID)和產(chǎn)品號(Pro-ductID)。當USB設備連接到主機上,系統會(huì )檢測它的VendorID和ProductID,如果與驅動(dòng)模塊的注冊?xún)热萜ヅ?,則將該驅動(dòng)程序與設備掛接起來(lái)[5]。當插入攝像頭時(shí),系統會(huì )調用zc301_probe函數。參數dev指定了設備信息,probe函數驗證所有可選配置的有效性,并調用usbvideo模塊的sbvideo_Regis-terVideodevice()函數向videodev系統注冊。
當系統完成驅動(dòng)注冊后,調用staticintzc301_init(structusb_zc301*zc301)和staticvoidzc301_start(structusb_301*zc301)函數完成對設備的初始化過(guò)程:填寫(xiě)各個(gè)寄存器值、啟動(dòng)攝像頭。系統運行到這一步,基本完成了對攝像頭驅動(dòng)加載及設備初始化。接下來(lái)需要通過(guò)讀取用戶(hù)設定的圖像規格,其中包括:圖像格式、分辨率、顏色深度、對比度和亮度等參數。這些數值的讀取都是通過(guò)以下函數實(shí)現的:
在得到這些參數值后,再調用一套函數,實(shí)現參數的設置。每個(gè)參數設置函數和之前的參數取值函數是一一對應的。具體函數如下:
通過(guò)調用上面的函數,我們基本得到了所需的參數值,這樣我們就可以啟動(dòng)攝像頭了。
當然我們還需要staticvoidzc301_shutdown(structusb_zc301*zc301)來(lái)關(guān)閉攝像頭。
至此,攝像頭驅動(dòng)的驅動(dòng)基本完成。通過(guò)這些函數的設置我們可以把具體的硬件電路抽象化為數據結構中的參數值。接下來(lái)我們可以通過(guò)V4L驅動(dòng)來(lái)調用這些函數,實(shí)現對參數的賦值、打開(kāi)設備、采集圖像和關(guān)閉設備等一系列的過(guò)程。
重新編譯、運行內核時(shí),在串口反饋信息中會(huì )顯示USB攝像頭驅動(dòng)程序成功加載。如圖3所示。
圖3串口反饋信息3Video4Linux下的圖像采集編程:
Video4Linux,簡(jiǎn)稱(chēng)V4L,是Linux中關(guān)于視頻設備的內核驅動(dòng),它為針對視頻設備的應用程序編程提供一系列半標準的接口。V4L利用這個(gè)接口,增加一些額外的功能,同時(shí)向外提供了一個(gè)屬于自己的API。我們可以通過(guò)調用V4L的API來(lái)實(shí)現各種功能。在Linux下,視頻采集設備的正常使用依賴(lài)于對Video4Linux標準的支持。目前的V4L涵蓋了視、音頻流捕捉及處理等內容,USB攝像頭也屬于它支持的范疇。
V4L中定義的主要數據結構:
這些數據結構都是由Video4Linux支持的,它們的用途如下:
(1)video_capability包含攝像頭的基本信息,例如設備名稱(chēng)、支持的最大最小分辨率、信號源信息等,分別對應著(zhù)結構體中成員變量name、maxwidth、maxheight、minwidth、minheight、channels(信號源個(gè)數)、type等;
(2)voide_picture包含設備采集圖像的各種屬性,如brightness(亮度)、hue(色調)、contrast(對比度)、whiteness(色度)、depth(深度)等;
(3)video_mmap用于內存映射;
(4)voido_mbuf利用mmap進(jìn)行映射的幀信息,實(shí)際上是輸入到攝像頭存儲器緩沖中的幀信息,包括size(幀的大?。?、frAMEs(最多支持的幀數)、offsets(每幀相對基址的偏移)。
系統在采集圖像之前,需要初始化這些數據結構中的參數值,系統才能夠按照要求采集圖像數據。
在USB攝像頭被驅動(dòng)后,只需要再編寫(xiě)一個(gè)對視頻流采集的應用程序就可以了。根據嵌入式系統開(kāi)發(fā)特征,先在宿主機上編寫(xiě)應用程序,再使用交叉編譯器進(jìn)行編譯鏈接,生成在目標平臺的可執行文件。宿主機與目標板通信采用打印終端的方式進(jìn)行交叉調試,成功后移植到目標平臺。
V4L圖像采集編程流程:
(1)打開(kāi)視頻設備;
(2)讀取設備信息;
(3)更改設備當前設置;
(4)視頻采集得到圖像信息;
評論