USB裝置驅動程式導讀

2021-06-11 22:01:32 字數 3177 閱讀 7555

隨著

usb裝置的不斷增加,我們這些開發人員也就多了對

usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難:

一是對wince

的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作;

二是對wince

自帶的usb

驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程式思維混亂;

三是幾乎沒有什麼中文的參考資料,不知如何下手。

第三條是很多開發人員都遇到的,我也一樣,很多朋友問我有沒有什麼資料,我也只能說抱歉,因為我也同樣有這個問題,一切都靠自己的黑暗中摸索,因此本文不談第三條。

第一條是可以找到資料的,如《

windows ce.net

系統分析及實驗教程》,因此本文也不打算在此花費大量筆墨。

windows ce

下對usb

裝置的驅動模型及樣例程式中的實現過程,以樣例**為基礎理順

usb裝置驅動程式的開發思路。同樣,本文的讀者物件預期是入門者和準備著手

usb驅動開發的人員,驅動開發高手自然就當一笑吧。同時寫本文的目的也是履行我半年前答應很多朋友的諾言,並向我的慵懶致歉。

好了,在看樣例程式之前,我們還有些東西需要了解,我們就先來看下圖:

在此圖中,我們可以非常清晰的看到主機和物理外設之間的結構方式,在主機端,通過

usbd

模組和hcd

模組使用預設的

pipe

訪問乙個通用的邏輯裝置,實際上就是說

usbd

和hcd

是一組抽象出來的訪問所有

usb裝置的邏輯介面,它們負責管理所有

usb裝置的連線、載入、移除、資料傳輸和通用的配置。其中

hcd是主機控制驅動,是為

usbd

提供底層的功能訪問服務,

usbd

是usb

匯流排驅動,位於

hcd的上層,利用

hcd的服務提供較高層次抽象的功能。

由於hcd

和usbd

都是面向的一致的邏輯裝置介面,那麼對於各種各樣的物理裝置,就需要有唯一對應的裝置驅動程式,這就是上圖中最上層的特殊的

pipe

所連線的物理裝置和

usb裝置驅動程式。

有了對這個結構的認識,我們可以明確的是我們要寫的就是最上端的

usb裝置驅動程式,在

wince

的樣例程式中也稱為

usb clientdriver

,它是工作於

usbd

之上,所以實際上我們的工作就變成了利用

usbd

提供的介面針對特定的物理裝置來完成

usb裝置驅動程式,而暫時與其他的部分無關。

好了,先到這,接下來就準備看一些具體的東西吧!

接下來,我們就來分析一下

ce中的樣例程式,我用的是

4.2版本的,所以下面的內容是

4.2版本中的程式。這裡的程式是通過資料夾的形式組織在一起的,所以我們還是像以前學習

ce的時候那樣,先來了解與此相關的資料夾結構,如下圖。

在usb

資料夾下,分成了

class,clients,common,hcd,inc,usbd

幾個資料夾,其中

inc和

common

裡面有乙個

lock.c

的程式,這個程式很明顯是將要被其他

usb有關的驅動程式所使用的乙個鎖,**很簡單,只是乙個類似臨界區的封裝體,可以保護多執行緒對同一記憶體區域的讀寫訪問,可以先不去管它。

clients

資料夾可能最初微軟的開發人員是用來放置裝置驅動程式的,但是後來沒有放,而發布的時候也沒有刪除,所以遺留了下來,裡面是個空的資料夾,所以沒用實際用處。

usbd

和hcd

是前述的底層驅動,裡面含有很多子資料夾和程式,由於我們只針對

usb裝置驅動,因此對這兩部分不做分析,不興趣的朋友可以自己去了解。

重點就在

class

資料夾了,展開來看,裡面又包含了

common

、hid

、printer

、storage

幾個資料夾,同樣,

common

裡面存放的源程式是為

hid、

printer

、storage

所共有的。

hid是

usb輸入裝置如鍵盤

/滑鼠的樣例驅動程式,

printer

是usb

印表機的樣例驅動程式,

storage

是usb

儲存裝置如

u盤的樣例程式。

我們此次以

usb儲存裝置為例,所以再來展開

storage

資料夾,其中的

inc資料夾裡面是標頭檔案,

class

是usb

儲存裝置的驅動程式,

disk

是磁碟驅動程式。這裡為什麼有兩個驅動程式呢,我來簡要解釋一下。

驅動程式工作在硬體與作業系統之間,它有兩個功能,乙個是

將作業系統**來的操作以符合指定硬體裝置的形式控制硬體裝置,另乙個是向作業系統提供這個訪問介面。比如說

u盤,一方面驅動程式要把作業系統對

u盤的識別、讀、寫等操作轉換成

u盤的動作,另一方面又告訴作業系統這是個

u盤,可以當成乙個資料夾或檔案系統來用,能夠接受標準的檔案操作命令。所以此處存在兩個驅動。

另外還有乙個資料夾,

wince420/public/common/ddk/inc

,這裡面是與裝置驅動有關的標頭檔案,對於

usb裝置,相關的檔案有

usb100.h, usbtypes.h, usbdi.h

,這裡面前兩個裡面關於

usb的定義是完全符合

usb規範的,不是隨便定義出來的,而

usbdi.h

檔案裡的內容就是

usbd

匯流排驅動程式向

usb裝置驅動程式提供的介面描述,在開發

usb裝置驅動時必須要包含此標頭檔案,這樣才可以得到

usbd

介面的原型。

說了這麼多,還沒接觸到程式,不過不要著急,這些可是大的框架哦,我得休息一下,

「廣告過後,馬上回來!

USB裝置驅動程式導讀 2

接下來,我們就來分析一下ce中的樣例程式,我用的是4.2版本的,所以下面的內容是4.2版本中的程式。這裡的程式是通過資料夾的形式組織在一起的,所以我們還是像以前學習ce的時候那樣,先來了解與此相關的資料夾結構,如下圖。在usb資料夾下,分成了class,clients,common,hcd,inc,...

USB裝置驅動程式導讀 8

帶著上次留下的疑問,我們繼續來學習作業系統如何通過usbdisk讀寫usb裝置的。我們先看usb class storage disk scsi2 usbdisk6.def檔案。在這個檔案中可以看到,該dll一共匯出了14個函式,其中兩個是上次內容當中被裝置驅動程式呼叫的usbdiskattach和...

USB裝置驅動程式導讀 1

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