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