在上次了解了所有usbd介面函式以後,我們已經有了很多基礎知識了,回顧usb樣例的資料夾結構,我們還能記得usb\class\common這個資料夾下是存放所公共部分的源程式,它是微軟專門抽象出來的能為大多數usb裝置驅動程式服務的一些結構體以及函式的封裝,我們這次再來概略的了解一下這裡面的源程式。
這裡面包含了三個程式,分別是:
remlock usbclient utils
下面我們分別來了解一下這三個程式的功能和介面,很顯然,usb裝置驅動程式肯定是會用到這其中的一部分函式的,因此我們不一定需要讀懂這其中的每一行,但至少要對這些函式有個印象,不至於在讀驅動程式時不知道函式的**。
remlock程式是乙個移除裝置的鎖,利用這個結構體
typedef struct _remove_lock
remove_lock, *premove_lock
來實現在裝置移除時進行的同步控制。其中removed成員是對裝置是否已經移除的標識,iocount成員是對裝置進行訪問的數量,這也是驅動程式中常用的行為,就像此前我們看到的那個lock程式一樣,removeevent是乙個核心事件,熟悉win32程式設計的應該都很清楚,它是核心通知應用程式的一種方式,也是執行緒這間併發控制的一種手段,如果不熟悉,還是像我在以前文章中提到的那樣,一定要找windows高階程式設計之類的書把它學明白,否則就很難控制驅動程式了。
利用它實現的那幾個函式就不說了,與臨界區的用法是一樣的。另外提一句,在此程式中有類似interlockedincrement這樣的函式,這種函式是win32 api函式,專門用來提供多執行緒對同一變數的同步訪問的,可以通過msdn查到詳細用法。
usbclient程式是對usbd進行包裝以供usb裝置驅動程式使用的函式介面,通過usbclient.h我們可以發現裡面是關於資料傳輸、屬性設定、狀態描述和復位的一組函式原形的定義,我們再看usbclient.c檔案,這些函式大部分都擁有乙個lpcusb_funcs型別的引數,回顧上次我們對usbd的了解可知,正是通過這一引數才能訪問usbd提供的服務功能,瀏覽一下函式的實現發現,確實每個函式都是通過這個引數呼叫了usbd的函式,然後處理呼叫後的結果,所以這裡只是多了一層封裝,使得驅動程式的編寫更加清晰易於維護。
另外,這裡我們要留意一下issuebulktransfer()、issueinterrupttransfer()、issuevendortransfer() 這三個函式,它們實現了通用的bulk傳輸、中斷傳輸和自定義的傳輸方式,在驅動程式中要用得到。
utils程式很簡單,是對登錄檔操作的封裝,利用_reg_value_descr這個結構體和getsetkeyvalues()函式可以方便的訪問登錄檔,在驅動程式的安裝中會用得較多。
又說了這麼多東西,雖然沒有看多少程式,但我們又離驅動程式近了一層,至少知道了很多函式是要在驅動程式中用到的,如果有興趣,可以具體閱讀每乙個函式的實現方法,但我覺得這並不影響對驅動程式的開發。如果是我寫驅動,在沒有特別的情況下,我會把這些公用的源程式照搬過來,這可是能極大的縮短開發周期的事哦!
USB裝置驅動程式導讀
隨著 usb裝置的不斷增加,我們這些開發人員也就多了對 usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難 一是對wince 的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作 二是對wince 自帶的usb 驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程...
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和...