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

通用串行總線(USB)設(shè)備的驅(qū)動

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

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

  關(guān)鍵詞: USB? 類驅(qū)動程序? 人工接口設(shè)備(HID)? Windows驅(qū)動程序模型(WDM)

?

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

1 問題的由來

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

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

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

2 類驅(qū)動程序

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

?

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

連接到計算機(jī)的USB設(shè)備幾乎都包含HID類,用以信號控制。比如一個USB揚(yáng)聲器,音量、音調(diào)控制用HID類,但音頻數(shù)據(jù)傳輸用音頻類。

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

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

?

3 通信協(xié)議

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

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

?

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

  基于相同的管道配置和命令、通用的API接口,USB設(shè)備通用驅(qū)動程序得以實現(xiàn),設(shè)備之間的差異則使返回的數(shù)據(jù)結(jié)構(gòu)不同。

4 描述符

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

  下面是作者設(shè)計的一個利用EZUSB芯片提供的I2C連接多部醫(yī)監(jiān)設(shè)備的報告描述符。圖4為報告描述符所表達(dá)的數(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設(shè)備來說,開發(fā)驅(qū)動程序是一件比較復(fù)雜的事情。通常驅(qū)動程序要實現(xiàn)以下的功能:

  ·設(shè)備的初始化;

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

  ·處理Win32打開和關(guān)閉文件句柄的請求;

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

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

  ·調(diào)用其他的驅(qū)動程序;

  ·訪問硬件。

  USB驅(qū)動程序設(shè)計的核心是端點(diǎn)(Endpoint)及數(shù)據(jù)傳輸類型的選擇,通過端點(diǎn)建立起管道通信,實現(xiàn)定義的功能。這樣,在應(yīng)用層和設(shè)備之間就建立起了虛擬的通道,所有這些通過多線程的句柄調(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ū)動的代碼生成器,用戶按照提示可以定義設(shè)備的配置和功能,然后做功能修改即可。利用軟件提供的例子進(jìn)行修改也是一個比較好的捷徑。

USB技術(shù)的應(yīng)用,是計算機(jī)產(chǎn)業(yè)的一大發(fā)展。目前以微軟為代表的各大公司積極對其進(jìn)行開發(fā),使得應(yīng)用越來越廣泛。微軟操作系統(tǒng)集成了HID類、音頻類的USB驅(qū)動程序。作者用EZUSB以HID類連接醫(yī)監(jiān)設(shè)備,不用寫驅(qū)動程序在Win2000上運(yùn)行良好。針對開發(fā)USB器件的需要,作者根據(jù)HID規(guī)范定義了自己特殊的類并重新寫上層的類驅(qū)動程序,測試較為滿意。從長遠(yuǎn)的角度來看,操作系統(tǒng)通過集成類驅(qū)動程序來支持各種USB設(shè)備勢在必行。

?

參考文獻(xiàn)

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
本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。