usb驅動程式開發技術總結

2021-04-13 01:46:55 字數 4850 閱讀 7007

一.

usb基礎知識

usb是英文universal serial bus

的縮寫,中文含義是「通用序列匯流排」。

1994

年,intel

、compaq

、digital

、ibm

、microsoft

、nec

、northern telecom

等七家世界著名的計算機和通訊公司成立了

usb論壇,花了近兩年的時間形成了統一的意見,於

2023年11

月正式制定了

usb0.9

通用序列匯流排(

universal serial bus

)規範,

1997

年開始有真正符合

usb技術標準的外設出現。

usb1.1

是目前推出的在支援

usb的計算機與外設上普遍採用的標準。

1999

年初在intel

的開發者論壇大會上,與會者介紹了

usb2.0

規範,該規範的支持者除了原有的

compaq

、intel

、microsoft

和nec

四個成員外,還有惠普、朗訊和飛利浦三個新成員。

usb2.0

向下相容

usb1.1

,資料的傳輸率將達到

120mbps

~240mbps

,還支援寬頻寬數字攝像裝置及下一代掃瞄器、印表機及儲存裝置。

目前普遍採用的

usb1.1

主要應用在中低速外部裝置上,它提供的傳輸速度有低速

1 .5mbps

和全速12mbps

兩種,低速的

usb頻寬(1.

5mbps

)支援低速裝置,例如顯示器、

數據機、鍵盤、滑鼠、掃瞄器、印表機、光碟機、磁帶機、軟碟機等。全速的

usb頻寬(

12mbps

)將支援大範圍的多**裝置。

usb之所以能得到廣泛支援和快速普及,是因為它具備下列的很多特點:

1.終端使用者的易用性 ●

為接纜和連線頭提供了單一模型

●電氣特性與使用者無關

●自檢外設,自動的進行裝置驅動和設定

●外設可以動態連線,動態重置

2.廣泛的適用性

●適應不同裝置,傳輸速率從幾kb/s到十幾mb/s

●在同一線上支援同步、非同步兩種傳輸模式

●支援對多個裝置的同時操作

●可同時操作127個物理裝置

●在主機和裝置之間可以傳輸多個資料和資訊流

●支援多功能的裝置

●利用底層協議,提高了匯流排利用率

3.同步傳輸頻寬

●確定的頻寬和低延遲適合**系統和音訊的應用

●同步工作可以利用整個匯流排頻寬

4.靈活性

●直接傳送一系列指定大小的資料報,允許對裝置緩衝器大小進行選擇

●通過指定資料緩衝區的大小和執行時間,支援各種資料傳輸率

●通過協議對資料流進行緩衝處理

5.健壯性

●在協議中使用差錯處理/差錯恢復機制

●完全實時熱插拔

●可以對有缺陷的裝置進行鑑別

6.與pc產業的一致性

●協議的易實現性和完整性

●與pc機的即插即用體系結構一致

●與現存作業系統有良好銜接的介面

7.價效比

●以低廉的**提供傳輸速率為1.5mb/s的子通道

●將外設和主機硬體進行了最優化的整合

●促進了低**外設的發展

●廉價的電纜和連線頭

●運用商業技術降低成本

8.可公升級性

●體系結構的可公升級性支援在乙個系統中同時存在多個usb主機控制器

二.usb

介面驅動程式的開發

1.裝置和驅動程式的層次結構

wdm模型使用了如圖所示的層次結構。圖中右邊是乙個裝置物件堆疊。裝置物件是系統為幫助軟體管理硬體而建立的資料結構。乙個物理硬體可以有多個這樣的資料結構。

在wdm

中引入了功能裝置物件(

fdo)和物理裝置物件(

pdo)來描述硬體。乙個

pdo對應乙個真實硬體,乙個硬體只允許有乙個

pdo,卻可以有多個

fdo。在驅動程式中直接操作的不是硬體裝置,而是相應的

pdo和

fdo。

pdo和

fdo都處於堆疊的最低層。在

fdo的上面和下面還會有一些過濾器裝置物件

(filter device object)

。位於fdo

上面的過濾器裝置物件稱為上層過濾器,位於

fdo下面

(但仍在

pdo之上

)的過濾器裝置物件稱為下層過濾器。在使用者態和核心態通訊方面,系統為每乙個使用者請求打包形成乙個

irp結構,將其傳送至驅動程式,並通過識別

irp中的

pdo來區分是傳送給哪乙個裝置的。

2.編寫驅動程式的基本步驟

(1)

首先編寫乙個

driverentry

例程。在這個例程中必須設定一系列的**例程來處理

irp. driverentry

是核心模式驅動程式主入口點常用的名字。該例程的主要工作是把各種函式指標填入驅動程式物件。這些指標為作業系統指明了驅動程式容器中各種子例程的位置。(2

)編寫乙個

adddevice

例程,它的基本功能是建立乙個裝置物件並把它連線到堆疊底部為

pdoiocreatedevice

建立裝置物件,並建立乙個私有的裝置擴充套件物件;寄存乙個或多個裝置介面,以便應用程式能知道裝置的存在,另外,還可以給出裝置名並建立符號連線;初始化裝置擴充套件和裝置物件的

flag

成員;呼叫

ioattachdevicetodevicestack

函式把新裝置物件放到堆疊上。(3

)編譯連線驅動程式。(4

)測試驅動程式。

三.客戶端程式的編寫 1

裝置介面

驅動程式的

adddevice

**呼叫

iocreatedevice

建立裝置物件。有兩種方法提供對

win32

程式可用的名稱,老的方法是提供乙個明確的符號鏈結名,新的方法是使用裝置介面標識支援定義的

api的裝置。

iocreatedevice

呼叫有乙個

devicename

引數,可以用於為裝置指定乙個名字。這個名字向核心標識裝置,而不是向

win32

標識裝置。所以需要建立乙個符號鏈結來使核心裝置名對

win32

可用。

老的方法呼叫

iocreatesymboliclink

,使用引數傳遞合適的符號鏈結名和裝置鏈結名。新方法的主要思想是為裝置物件定義乙個可用的應用程式程式設計介面,全域性唯一識別符號(

guid

)用於標識這個介面。

guid

必須使用

guidgen

工具生成,在

guid.h

中正式宣告自己定義的裝置介面。在

adddevice

例程中呼叫

ioregisterdeviceinte***ce

函式註冊它的介面,然後呼叫

iosetdeviceinte***cestate

啟用這個裝置介面。

2.使用者態程式呼叫驅動程式

ez-usb

系列的ezusb.sys

是乙個不用修改就可以直接使用的驅動程式,在自行開發外部裝置的時候,如果沒有非常特殊的要求,完全可以採用這個驅動程式作為裝置的

usb介面驅動,當然前提是裝置必須採用

ez-usb

的usb

控制晶元。 在

ezusb.sys

中使用iocreatesymboliclink

建立符號鏈結,提供對使用者態程式可用的裝置名。故使用者態程式首先通過呼叫乙個

win32

函式createfile()

來獲得裝置驅動程式的控制代碼;然後用

deviceiocontrol()

函式通過

createfile()

函式返回的控制代碼,來提交

i/o控制**和相關的輸入輸出緩衝區到驅動程式,完成在

windows

環境下usb

資料傳輸的任務。 3.

韌體**、驅動程式和客戶端程式的關係

韌體**是非常重要的,他主要實現裝置的初始化和配置。驅動程式主要負責對各種

irp的處理,客戶端發出

irp實現具體的功能。 以向

ez-usb

的2131

晶元實現簡單的讀寫為例,資料從

ep2out

輸出到晶元,從

ep2in

讀回到主機。而

2131

晶元的2

端點輸出緩衝區的位址為

7dc0,

輸入緩衝區的位址為

7e00

,這就要求韌體程式將

2端點輸入緩衝區的資料全部複製到輸出緩衝區。客戶端程式在發出讀寫命令後,通過

createfile()

函式獲得裝置控制代碼,然後呼叫

deviceiocontrol()

函式提交

i/o控制**和相關的輸入輸出緩衝區到驅動程式。驅動程式負責處理有關

irp,實現資料的通訊。

USB裝置驅動程式

一.usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...

USB驅動程式分析

1.對於每個pc來說,都有乙個或者多個稱為主機 host 控制器的裝置,該主機控制器和乙個根集線器 hub 作為乙個整體。2.每個host控制器其實就是乙個pci裝置,掛載在pci匯流排上。驅動開發人員應該給host控制器提供驅動程式,用usb hcd結構體表示。3.usb host控制器都會自帶乙...

USB裝置驅動程式導讀

隨著 usb裝置的不斷增加,我們這些開發人員也就多了對 usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難 一是對wince 的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作 二是對wince 自帶的usb 驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程...