《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 業(yè)界動態(tài) > 通用串行總線(USB)設備的驅動

通用串行總線(USB)設備的驅動

2009-02-20
作者:晁建剛 魏安陽 邱淑范

  摘? 要: 從問題的由來,、類驅動程序、通信協議,、描述符,、驅動開發(fā)等對USB的驅動進行分析和討論,提出USB設備使用操作系統(tǒng)嵌入的通用類驅動程序成為趨勢,。

  關鍵詞: USB? 類驅動程序? 人工接口設備(HID)? Windows驅動程序模型(WDM)

?

  最初設計USB(Universal Serial Bus)這種外設總線的目的之一就是為了便于使用,這是計算機發(fā)展的產物。外設總線最重要的就是操作系統(tǒng)對外設的自動識別,、配置,實現熱插拔,即插即用,。本文試圖以人工接口設備(Human interface device,簡稱HID)為主,從問題的由來、類驅動程序,、通信協議,、描述符、驅動開發(fā)等幾個方面來探討一下USB設備的驅動問題,。

1 問題的由來

  一個非常簡單的設備安裝有時得花用戶好幾天時間,原因何在?設備的驅動與其他的驅動程序或軟件不兼容,或隱有bug,。如果操作系統(tǒng)本身就含有用戶需要的驅動程序,設備一插就能使用,這是最好不過的事情。

  現已有上千種不同的設備,許多功能大致一樣,。操作系統(tǒng)不可能為所有的設備提供全部的驅動程序,。仔細考慮一下,許多設備可歸屬為少數幾個具有普遍特性和需求的類,因而為每種類定義一個通用的API接口,寫出通用的驅動程序是可實現的。

通過定義不同的設備類型,USB試圖實現通用驅動程序這一目標,。在USB規(guī)范里,除定義了基本的協議和構造用來配置設備和傳輸數據,還為所有的USB設備定義了機械和電器性能要求,。USB規(guī)范定義了通信、打印,、圖像,、儲存、音頻和人工接口設備等類,。一些設備是單一的類,一些是多種類的綜合體,。具有多種類的設備稱為混合設備,在USB規(guī)范對設備有詳細的劃分。

2 類驅動程序

  由于一些類尚未形成標準,Win2000只包含了部分USB類的驅動程序,。一旦形成標準得到認可,通用的驅動程序也就自然嵌入到操作系統(tǒng)了,。圖1為操作系統(tǒng)中USB驅動接口框圖,。這是一個標準的Windows驅動程序模型(WDM),是一種分層模式,。核心USB Driver Stack模型描述設備如何安裝和啟動,以及如何為用戶請求服務和與硬件打交道,并為上層USB驅動提供接口。上層驅動完成設備功能并為用戶層提供接口,這使得向USB總線發(fā)出請求是通過多層結構,。

?

  HID類是為一些人工的輸入或輸出設備而設計的,最常用的象鍵盤,、鼠標,、游戲控制器。這種類同時也包含了前面板顯示區(qū)和鍵盤區(qū)(象電話或VCR遠程控制),還有觸覺和聽覺反饋設備,。對于HID類的設備,操作系統(tǒng)已經給出了相應的驅動程序,。

連接到計算機的USB設備幾乎都包含HID類,用以信號控制。比如一個USB揚聲器,音量,、音調控制用HID類,但音頻數據傳輸用音頻類,。

  通常情況下,USB設備與主機通信是經過USB端口,類驅動程序無須擔心或考慮ISA總線、PCI總線,、SCSI,、IDE或ATAPI接口、串口,、并口,、鍵盤或鼠標口、游戲接口及相關的一些東西,。類驅動程序甚至不需要了解USB端口,這個物理接口被USB主機驅動程序管理形成抽象層,也正因為這個抽象層及其他相應層,使通用驅動程序成為可能,。每一層有自己的功能,并為上一層提供了API接口,上層沒有必要了解下一層如何工作及內部體系結構,各層為一個封裝體。

  圖2所示為USB各層之間的通信流程,。USB用明確定義了的層協議來減少復雜化且有利于標準化,各層均有連接,但大多為邏輯型的,。最低層的是USB主機控制器和USB設備接口之間的物理連接,包括連接線、連接器,、狀態(tài)機,。其次在計算機方面為USB主機驅動程序,這是操作系統(tǒng)所必須的。在設備方是用于設備管理和請求的固件程序(Firmware),,此層是配置和控制USB接口的邏輯連接,。第三層在主機方是設備驅動程序,通常稱為類驅動程序;在設備方是類屬性的固件程序,通過邏輯連接用于特殊類的控制和請求,。最頂層為用戶層,為用戶所關心和考慮,比如在主機客戶方為飛行模擬仿真,在設備方則為操縱桿,。此時用戶所關心的是操縱桿的輸入,不用考慮這些輸入如何讀、如何打包,、如何傳輸,。

?

3 通信協議

  與USB設備進行通信,主機軟件打開一系列的管道來傳輸數據。不同的管道對應于USB的不同端口(endpoint),。USB有四種傳輸方式,分別為控制,、中斷、同步和批量,每種方式對應各自的管道,。除同步方式外,均有握手信號,保證了數據傳輸的準確性,。

  一般的USB設備通常用控制、中斷或數據管道,如圖3所示,。數據管道是單向的,用于批量或同步傳輸方式時使用,。HID設備通常僅用控制和中斷兩個管道,。控制管道為缺省,也可被USB設備用來接收,、響應特殊的請求或命令,。中斷管道向主機異步發(fā)送數據,其實USB不支持真正的中斷,而是用來傳輸無時序特征的信號變化。比如按下鍵,、鼠標移動,、操縱桿運動,不用特殊的請求就可實時地傳輸數據。

?

  每一種數據傳輸方式中包含了多個事務數據,這些數據被綜合完成一定功能,。一個事務數據由三個部分組成:信令包段(Token Packet phase),、數據包段(Data Packet phase)、握手信號包段(Handshade Packet phase),。信令包定義了事務的類型,設備的地址也包含在其中,。一些信令包單獨存在,后面沒有跟別的包。數據包里包含了與傳輸有關的負載,。在單個的事務數據最大能承載1023個字節(jié),。

  基于相同的管道配置和命令、通用的API接口,USB設備通用驅動程序得以實現,設備之間的差異則使返回的數據結構不同,。

4 描述符

  USB設備用預先定義好的數據結構來表示他們的標識符,、性能、請求和協議,通常稱為描述符,。設備一插入到主機,操作系統(tǒng)就能立刻根據描述符找到與之相對應的類驅動程序,完成USB設備的枚舉及其他功能,。在USB規(guī)范里定義了必要的設備、配置,、接口,、端口、字符串描述,。HID類除此之外又定義了報告描述符,。報告描述符提供了HID類驅動程序能理解和解釋的報告,報告雖然靈活但卻很復雜。描述符可用固件程序來寫,編譯生成二進制格式后儲存到設備中使用,便于類驅動識別和解釋,。

  下面是作者設計的一個利用EZUSB芯片提供的I2C連接多部醫(yī)監(jiān)設備的報告描述符,。圖4為報告描述符所表達的數據結構。

?

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 驅動程序的開發(fā)

  對于USB設備來說,開發(fā)驅動程序是一件比較復雜的事情,。通常驅動程序要實現以下的功能:

  ·設備的初始化;

  ·即插即用創(chuàng)建和刪除設備;

  ·處理Win32打開和關閉文件句柄的請求;

  ·類功能定義IOCTL(I/O Control)、功能實現,;

  ·IRP(I/O Request Packet)的調用處理;

  ·調用其他的驅動程序;

  ·訪問硬件,。

  USB驅動程序設計的核心是端點(Endpoint)及數據傳輸類型的選擇,通過端點建立起管道通信,實現定義的功能。這樣,在應用層和設備之間就建立起了虛擬的通道,所有這些通過多線程的句柄調用實現,。

  每個驅動程序都必須有一個DriverEntry入口函數,用于系統(tǒng)調用,。

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,;

}

  寫驅動程序的軟件較多,目前比較流行的軟件是DriverStudio、WinDriver等,。它們均提供用于生成USB驅動的代碼生成器,用戶按照提示可以定義設備的配置和功能,然后做功能修改即可,。利用軟件提供的例子進行修改也是一個比較好的捷徑。

USB技術的應用,是計算機產業(yè)的一大發(fā)展,。目前以微軟為代表的各大公司積極對其進行開發(fā),使得應用越來越廣泛,。微軟操作系統(tǒng)集成了HID類、音頻類的USB驅動程序,。作者用EZUSB以HID類連接醫(yī)監(jiān)設備,不用寫驅動程序在Win2000上運行良好,。針對開發(fā)USB器件的需要,作者根據HID規(guī)范定義了自己特殊的類并重新寫上層的類驅動程序,測試較為滿意。從長遠的角度來看,操作系統(tǒng)通過集成類驅動程序來支持各種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
本站內容除特別聲明的原創(chuàng)文章之外,,轉載內容只為傳遞更多信息,,并不代表本網站贊同其觀點。轉載的所有的文章,、圖片,、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯系確認版權者,。如涉及作品內容,、版權和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118,;郵箱:aet@chinaaet.com,。