時(shí)間:2021年10月18日 分類:推薦論文 次數(shù):
基于Linux平臺(tái)高清攝像頭USB驅(qū)動(dòng)的研究
胡雄暉
摘要:本文通過(guò)在嵌入式系統(tǒng)中對(duì)USB攝像頭驅(qū)動(dòng)的改進(jìn),并對(duì)基于Relay技術(shù)的高清攝像頭設(shè)備驅(qū)動(dòng)作了分析和說(shuō)明,有效提升攝像頭整體性能。
關(guān)鍵詞:Linux;USB驅(qū)動(dòng);Relay
1 Linux內(nèi)核USB驅(qū)動(dòng)框架
每一類設(shè)備都提供了通用接口,以便在需要時(shí)為內(nèi)核提供服務(wù)。這種通用接口使得內(nèi)核可以以相同的方式來(lái)對(duì)待不同的設(shè)備及驅(qū)動(dòng)程序[1]。在應(yīng)用程序看來(lái),硬件設(shè)備只是一個(gè)設(shè)備文件,應(yīng)用程序可以像操作普通文件一樣對(duì)硬件設(shè)備進(jìn)行操作。
Linux內(nèi)核提供了完整的USB驅(qū)動(dòng)程序框架。USB總線采用樹形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。Linux內(nèi)核從主機(jī)和設(shè)備兩個(gè)角度觀察USB總線結(jié)構(gòu)。在linux系統(tǒng)中,USB主機(jī)驅(qū)動(dòng)程序由3部分組成:USB主機(jī)控制器驅(qū)動(dòng)(HCD)、USB核心驅(qū)動(dòng)(USBD)和不同種類的USB設(shè)備驅(qū)動(dòng)。
2 USB驅(qū)動(dòng)程序主要數(shù)據(jù)結(jié)構(gòu)
1) 主機(jī)控制器用于管理主機(jī)硬件與USB設(shè)備的數(shù)據(jù)傳輸【2】。在Linux系統(tǒng)下定義了如下用于開放主機(jī)控制器的數(shù)據(jù)結(jié)構(gòu)。
Struct usb_operation sohci_device_operations={
sohci_alloc_dev,
sohci_free_dev,
sohci_get_current_frame_number,
sohci_submit_urb,
sohci_unlink_urb
};
其中:
sohci_alloc_dev用來(lái)分配USB設(shè)備資源。
sohci_free_dev用來(lái)收回USB設(shè)備資源。
sohci_get_current_frame_number用來(lái)獲得當(dāng)前幀號(hào)。
sohci_submit_urb用來(lái)提交URB請(qǐng)求快。
sohci_unlink_urb用來(lái)撤銷URB請(qǐng)求塊。
2) Linux系統(tǒng)中,USBD通過(guò)定義一組宏、數(shù)據(jù)結(jié)構(gòu)和函數(shù)來(lái)抽象出所有硬件或者設(shè)備具有依賴關(guān)系的部分。USBD中主要有四個(gè)數(shù)據(jù)結(jié)構(gòu),分別是:
usb_device保存一個(gè)USB設(shè)備的信息。
usb_bus保存一個(gè)USB總線系統(tǒng)的信息。
usb_driver保存客戶驅(qū)動(dòng)信息,包括驅(qū)動(dòng)名稱,以及驅(qū)動(dòng)提供給USB內(nèi)核使用的函數(shù)指針等。
urb是進(jìn)行USB通信的數(shù)據(jù)結(jié)構(gòu),USBD通過(guò)URB在USB設(shè)備類驅(qū)動(dòng)和USBD、USBD和HCD間進(jìn)行數(shù)據(jù)傳輸。
3) USB攝像頭驅(qū)動(dòng)程序需要做的第一件事情就是在USB子系統(tǒng)里注冊(cè),包括該驅(qū)動(dòng)程序支持哪些設(shè)備,當(dāng)被支持的設(shè)備從總線插入或拔出時(shí),會(huì)有哪些動(dòng)作等,所有這些信息通過(guò)usb_driver的形式傳送到USBD中,具體實(shí)現(xiàn)如下:
static struct usb_driver cam_driver={
.name="cam_video",
.probe=cam_probe,
.disconnect:cam_disconnect,
.id_table:cam_ids,
};
cam_video是客戶端驅(qū)動(dòng)程序的字符串名稱;cam_probe則指向USB驅(qū)動(dòng)程序的探測(cè)函數(shù)指針;cam_ids列表包含了一系列該驅(qū)動(dòng)程序可以支持的所有不同類型的USB設(shè)備,如沒有設(shè)置該列表,則該驅(qū)動(dòng)程序中的探測(cè)回調(diào)函數(shù)不會(huì)被調(diào)用[3]。
3 基于relay的Linux系統(tǒng)USB視頻驅(qū)動(dòng)
3.1 relay技術(shù)基本原理
Relay是一種從Linux內(nèi)核到用戶空間的高效數(shù)據(jù)傳輸技術(shù)。通過(guò)用戶定義的relay通道,內(nèi)核空間的程序能夠高效、可靠、便捷地將數(shù)據(jù)傳輸?shù)接脩艨臻g。Relay特別適用于內(nèi)核空間有大量數(shù)據(jù)需要傳輸?shù)接脩艨臻g的情形,它提供一種機(jī)制使得內(nèi)核空間的程序能夠通過(guò)用戶定義的relay通道將大量數(shù)據(jù)高效的傳輸?shù)接脩艨臻g。
一個(gè)relay通道由一組和CPU一一對(duì)應(yīng)的內(nèi)核緩沖區(qū)組成。這些緩沖區(qū)又被稱為relay緩沖區(qū),其中的每一個(gè)在用戶空間都用一個(gè)常規(guī)文件來(lái)表示,這被叫做relay文件。Relay并不關(guān)心數(shù)據(jù)的格式和內(nèi)容,這些完全依賴于使用relay的用戶程序。Relay的目的是提供一個(gè)足夠簡(jiǎn)單的接口,從而使得基本操作盡可能的高效[4]。
Relay將數(shù)據(jù)的讀和寫分離,使得突發(fā)性大量數(shù)據(jù)寫入的時(shí)候,不需要受限于用戶空間相對(duì)較慢的讀取速度,從而大大提高了效率。Relay作為寫入和讀取的橋梁,也就是將內(nèi)核用戶寫入的數(shù)據(jù)緩存并轉(zhuǎn)發(fā)給用戶空間的程序。Relay提供了兩大類主要API包括面向用戶空間和面向內(nèi)核空間,面向用戶空間的API:
open()允許用戶打開一個(gè)已經(jīng)存在的通道緩沖區(qū)。
mmap()使通道緩沖區(qū)被映射到位于用戶空間的調(diào)用者的地址空間。
read()讀取通道緩沖區(qū)的內(nèi)容。
endfile()將數(shù)據(jù)從通道緩沖區(qū)傳輸?shù)揭粋(gè)輸出文件描述符。
poll()支持 POLLIN/POLLRDNORM/POLLERR信號(hào)。
close()將通道緩沖區(qū)的引用數(shù)減1。
面向內(nèi)核空間的API為:
relay_open()創(chuàng)建一個(gè)relay通道,包括創(chuàng)建每個(gè)CPU對(duì)應(yīng)的relay緩沖區(qū)。
relay_close()關(guān)閉一個(gè)relay通道,包括釋放所有的relay緩沖區(qū),在此之前會(huì)調(diào)用relay_switch()來(lái)處理這些relay緩沖區(qū)以保證已讀取但是未滿的數(shù)據(jù)不會(huì)丟失。
relay_write()將數(shù)據(jù)寫入到當(dāng)前CPU對(duì)應(yīng)的relay緩沖區(qū)內(nèi)。
relay_reserve()在relay通道中保留一塊連續(xù)的區(qū)域來(lái)留給未來(lái)的寫入操作。
3.2 Relay技術(shù)可靠性分析
整個(gè)攝像頭圖像采集系統(tǒng)由前端高清視頻采集和后臺(tái)處理過(guò)程組成。前端高清視頻采集的可靠性主要由攝像頭設(shè)備中的圖像處理器性能決定的,目前市場(chǎng)絕大多數(shù)高清攝像頭都可以滿足系統(tǒng)要求。我們通過(guò)創(chuàng)建數(shù)據(jù)緩存多通道和增加緩存大小的方法來(lái)提高系統(tǒng)的可靠性,從而減少丟幀現(xiàn)象,從一定程度上提成了高清攝像頭的工作的可靠性。
4 總結(jié)
本文在ARM體系結(jié)構(gòu)平臺(tái)下對(duì)USB攝像頭設(shè)備驅(qū)動(dòng)的基本原理進(jìn)行了說(shuō)明,并介紹了一種新型的驅(qū)動(dòng)改進(jìn)方法,通過(guò)提高內(nèi)核空間和用戶空間的數(shù)據(jù)傳輸速度,從而提高整個(gè)攝像頭設(shè)備的數(shù)據(jù)采集速度,使得改進(jìn)方案可行高效。
參考文獻(xiàn)
【1】 馮偉,王博編著【M】.北京:中國(guó)電力出版社,2008.
【2】 商斌.Linux設(shè)備驅(qū)動(dòng)開發(fā)入門與編程實(shí)踐【M】.北京:電子工業(yè)出版社,2009.
【3】 暢衛(wèi)功.嵌入式Linux中USB攝像頭驅(qū)動(dòng)的研究【J】.嵌入式軟件應(yīng)用,2008.
【4】 季春志,褚偉.Linux平臺(tái)下高分辨率攝像頭設(shè)備USB驅(qū)動(dòng)的研究與改進(jìn)【J】.合肥工業(yè)大學(xué)學(xué)報(bào),2009.