摘? 要: 從問題的由來,、類驅(qū)動程序,、通信協(xié)議,、描述符,、驅(qū)動開發(fā)等對USB的驅(qū)動進行分析和討論,提出USB設備使用操作系統(tǒng)嵌入的通用類驅(qū)動程序成為趨勢。
關(guān)鍵詞: USB? 類驅(qū)動程序? 人工接口設備(HID)? Windows驅(qū)動程序模型(WDM)
?
最初設計USB(Universal Serial Bus)這種外設總線的目的之一就是為了便于使用,這是計算機發(fā)展的產(chǎn)物,。外設總線最重要的就是操作系統(tǒng)對外設的自動識別,、配置,實現(xiàn)熱插拔,即插即用。本文試圖以人工接口設備(Human interface device,簡稱HID)為主,從問題的由來,、類驅(qū)動程序,、通信協(xié)議、描述符,、驅(qū)動開發(fā)等幾個方面來探討一下USB設備的驅(qū)動問題,。
1 問題的由來
一個非常簡單的設備安裝有時得花用戶好幾天時間,原因何在?設備的驅(qū)動與其他的驅(qū)動程序或軟件不兼容,或隱有bug。如果操作系統(tǒng)本身就含有用戶需要的驅(qū)動程序,設備一插就能使用,這是最好不過的事情,。
現(xiàn)已有上千種不同的設備,許多功能大致一樣,。操作系統(tǒng)不可能為所有的設備提供全部的驅(qū)動程序。仔細考慮一下,許多設備可歸屬為少數(shù)幾個具有普遍特性和需求的類,因而為每種類定義一個通用的API接口,寫出通用的驅(qū)動程序是可實現(xiàn)的。
通過定義不同的設備類型,USB試圖實現(xiàn)通用驅(qū)動程序這一目標,。在USB規(guī)范里,除定義了基本的協(xié)議和構(gòu)造用來配置設備和傳輸數(shù)據(jù),還為所有的USB設備定義了機械和電器性能要求,。USB規(guī)范定義了通信,、打印,、圖像、儲存,、音頻和人工接口設備等類,。一些設備是單一的類,一些是多種類的綜合體。具有多種類的設備稱為混合設備,在USB規(guī)范對設備有詳細的劃分,。
2 類驅(qū)動程序
由于一些類尚未形成標準,Win2000只包含了部分USB類的驅(qū)動程序,。一旦形成標準得到認可,通用的驅(qū)動程序也就自然嵌入到操作系統(tǒng)了。圖1為操作系統(tǒng)中USB驅(qū)動接口框圖,。這是一個標準的Windows驅(qū)動程序模型(WDM),是一種分層模式,。核心USB Driver Stack模型描述設備如何安裝和啟動,以及如何為用戶請求服務和與硬件打交道,并為上層USB驅(qū)動提供接口。上層驅(qū)動完成設備功能并為用戶層提供接口,這使得向USB總線發(fā)出請求是通過多層結(jié)構(gòu),。
?
HID類是為一些人工的輸入或輸出設備而設計的,最常用的象鍵盤,、鼠標、游戲控制器,。這種類同時也包含了前面板顯示區(qū)和鍵盤區(qū)(象電話或VCR遠程控制),還有觸覺和聽覺反饋設備,。對于HID類的設備,操作系統(tǒng)已經(jīng)給出了相應的驅(qū)動程序。
連接到計算機的USB設備幾乎都包含HID類,用以信號控制,。比如一個USB揚聲器,音量,、音調(diào)控制用HID類,但音頻數(shù)據(jù)傳輸用音頻類。
通常情況下,USB設備與主機通信是經(jīng)過USB端口,類驅(qū)動程序無須擔心或考慮ISA總線,、PCI總線,、SCSI、IDE或ATAPI接口,、串口,、并口、鍵盤或鼠標口,、游戲接口及相關(guān)的一些東西,。類驅(qū)動程序甚至不需要了解USB端口,這個物理接口被USB主機驅(qū)動程序管理形成抽象層,也正因為這個抽象層及其他相應層,使通用驅(qū)動程序成為可能。每一層有自己的功能,并為上一層提供了API接口,上層沒有必要了解下一層如何工作及內(nèi)部體系結(jié)構(gòu),各層為一個封裝體,。
圖2所示為USB各層之間的通信流程,。USB用明確定義了的層協(xié)議來減少復雜化且有利于標準化,各層均有連接,但大多為邏輯型的。最低層的是USB主機控制器和USB設備接口之間的物理連接,包括連接線,、連接器,、狀態(tài)機。其次在計算機方面為USB主機驅(qū)動程序,這是操作系統(tǒng)所必須的。在設備方是用于設備管理和請求的固件程序(Firmware),,此層是配置和控制USB接口的邏輯連接,。第三層在主機方是設備驅(qū)動程序,通常稱為類驅(qū)動程序;在設備方是類屬性的固件程序,通過邏輯連接用于特殊類的控制和請求,。最頂層為用戶層,為用戶所關(guān)心和考慮,比如在主機客戶方為飛行模擬仿真,在設備方則為操縱桿,。此時用戶所關(guān)心的是操縱桿的輸入,不用考慮這些輸入如何讀、如何打包,、如何傳輸,。
?
3 通信協(xié)議
與USB設備進行通信,主機軟件打開一系列的管道來傳輸數(shù)據(jù)。不同的管道對應于USB的不同端口(endpoint),。USB有四種傳輸方式,分別為控制,、中斷、同步和批量,每種方式對應各自的管道,。除同步方式外,均有握手信號,保證了數(shù)據(jù)傳輸?shù)臏蚀_性,。
一般的USB設備通常用控制、中斷或數(shù)據(jù)管道,如圖3所示,。數(shù)據(jù)管道是單向的,用于批量或同步傳輸方式時使用,。HID設備通常僅用控制和中斷兩個管道??刂乒艿罏槿笔?也可被USB設備用來接收,、響應特殊的請求或命令。中斷管道向主機異步發(fā)送數(shù)據(jù),其實USB不支持真正的中斷,而是用來傳輸無時序特征的信號變化,。比如按下鍵,、鼠標移動、操縱桿運動,不用特殊的請求就可實時地傳輸數(shù)據(jù),。
?
每一種數(shù)據(jù)傳輸方式中包含了多個事務數(shù)據(jù),這些數(shù)據(jù)被綜合完成一定功能,。一個事務數(shù)據(jù)由三個部分組成:信令包段(Token Packet phase)、數(shù)據(jù)包段(Data Packet phase),、握手信號包段(Handshade Packet phase),。信令包定義了事務的類型,設備的地址也包含在其中。一些信令包單獨存在,后面沒有跟別的包,。數(shù)據(jù)包里包含了與傳輸有關(guān)的負載,。在單個的事務數(shù)據(jù)最大能承載1023個字節(jié)。
基于相同的管道配置和命令,、通用的API接口,USB設備通用驅(qū)動程序得以實現(xiàn),設備之間的差異則使返回的數(shù)據(jù)結(jié)構(gòu)不同,。
4 描述符
USB設備用預先定義好的數(shù)據(jù)結(jié)構(gòu)來表示他們的標識符、性能,、請求和協(xié)議,通常稱為描述符,。設備一插入到主機,操作系統(tǒng)就能立刻根據(jù)描述符找到與之相對應的類驅(qū)動程序,完成USB設備的枚舉及其他功能,。在USB規(guī)范里定義了必要的設備、配置,、接口,、端口、字符串描述,。HID類除此之外又定義了報告描述符,。報告描述符提供了HID類驅(qū)動程序能理解和解釋的報告,報告雖然靈活但卻很復雜。描述符可用固件程序來寫,編譯生成二進制格式后儲存到設備中使用,便于類驅(qū)動識別和解釋,。
下面是作者設計的一個利用EZUSB芯片提供的I2C連接多部醫(yī)監(jiān)設備的報告描述符,。圖4為報告描述符所表達的數(shù)據(jù)結(jié)構(gòu)。
?
ReportDescriptor??? :???,; Generated with HID Tool, copied to here
DB?? 6,,0,,0FFH??????; Usage_Page (Vendor Defined)?
DB?? 9,,1????????????,; Usage (I/O Device)?
DB?? 0A1H,1???????? ,; Collection (Application)
DB?? 19H,,1????????? ; Usage_Minimum?
DB?? 29H,,2????????? ,; Usage_Maximum?
DB?? 15H,0????????? ,; Logical_Minimum (0)?
DB?? 26H,,255,0???? ,; Logical_Maximum (255)
DB?? 75H,,8????????? ; Report_Size (8)
DB?? 95H,,1????????? ,; Report_Count (1) = Read Address
DB?? 81H,2????????? ,; Input (Data,,Var,Abs)
DB?? 19H,,1????????? ,; Usage_Minimum?
DB?? 29H,2????????? ; Usage_Maximum?
DB?? 95H,,2????????? ,;?Report_Count (2)=Write Address+Data
DB?? 91H, 2???????? ,; Output (Data,,Var,Abs)
DB?? 0C0H????????????,; End_Collection
ReportLength? EQU $-ReportDescriptor
5 驅(qū)動程序的開發(fā)
對于USB設備來說,開發(fā)驅(qū)動程序是一件比較復雜的事情,。通常驅(qū)動程序要實現(xiàn)以下的功能:
·設備的初始化;
·即插即用創(chuàng)建和刪除設備;
·處理Win32打開和關(guān)閉文件句柄的請求;
·類功能定義IOCTL(I/O Control)、功能實現(xiàn),;
·IRP(I/O Request Packet)的調(diào)用處理;
·調(diào)用其他的驅(qū)動程序;
·訪問硬件,。
USB驅(qū)動程序設計的核心是端點(Endpoint)及數(shù)據(jù)傳輸類型的選擇,通過端點建立起管道通信,實現(xiàn)定義的功能。這樣,在應用層和設備之間就建立起了虛擬的通道,所有這些通過多線程的句柄調(diào)用實現(xiàn),。
每個驅(qū)動程序都必須有一個DriverEntry入口函數(shù),用于系統(tǒng)調(diào)用,。
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
???????????????????? IN PUNICODE_STRING RegistryPath)
{
NTSTATUS status = STATUS_SUCCESS,;
// Export other driver entry points...
DriverObject->DriverUnload = USBUnload,;
DriverObject->MajorFunction[IRP_MJ_CREATE]=USBCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE]=USBClose,;
DriverObject->MajorFunction[IRP_MJ_READ]=USBRead,;
DriverObject->MajorFunction[IRP_MJ_WRITE] =USBWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBDeviceControl,;
RegisterForPnpNotification(DriverObject),;
return status;
}
寫驅(qū)動程序的軟件較多,目前比較流行的軟件是DriverStudio,、WinDriver等,。它們均提供用于生成USB驅(qū)動的代碼生成器,用戶按照提示可以定義設備的配置和功能,然后做功能修改即可。利用軟件提供的例子進行修改也是一個比較好的捷徑,。
USB技術(shù)的應用,是計算機產(chǎn)業(yè)的一大發(fā)展,。目前以微軟為代表的各大公司積極對其進行開發(fā),使得應用越來越廣泛。微軟操作系統(tǒng)集成了HID類,、音頻類的USB驅(qū)動程序,。作者用EZUSB以HID類連接醫(yī)監(jiān)設備,不用寫驅(qū)動程序在Win2000上運行良好。針對開發(fā)USB器件的需要,作者根據(jù)HID規(guī)范定義了自己特殊的類并重新寫上層的類驅(qū)動程序,測試較為滿意,。從長遠的角度來看,操作系統(tǒng)通過集成類驅(qū)動程序來支持各種USB設備勢在必行,。
?
參考文獻
1 Compaq,Intel,Microsoft,NEC.Universal Serial Bus Specification.Revision2.0 May 18,2000
2 Chris Cant.Writing Windows WDM Device Drivers
3 EZ-USB Technical Reference Manual Version1.6.Anchor Chips Incorporated. Copyright1999
4 Jim Lyle.USB Primer Classer and Drivers
5 Device Class Definition for Human Interface Devices (HID). Firmware Specification 4/7/99. Version 1.1.
July 4, 1999
6 Peter G.Viscarola &W.Anthony Mason.Windows NT Device Driver Development
7 Mike Zerkus,,John Lusher,Jonathan Ward.USB Primer
?
? Practical Design Guide