正如所料,接下來我們就進入到drivers/usb/class/storage/class資料夾下,接觸usb裝置驅動程式。
我們先來了解兩個標頭檔案,分別是storage/inc/usbmsc.h和storage/class/usbmscp.h,其中前者是usb儲存裝置公用的標頭檔案,後者是需要按照自己的裝置更改的標頭檔案。我們先來看前者。
在usbmsc.h這個標頭檔案中,前邊定義了很多常量,包括子類和協議的常量,這是從**來的呢?前文我們已經提到過,這些量值是依據usb裝置規範得來的,在規範上都作了定義,所以此處的值必須與usb規範中的相一致。再向下的命令塊結構體和資料塊結構體是用來與usb裝置通訊用的,可以通過這兩個結構體的例項與usb裝置傳輸資料。 下面的函式原型就不說了,前文提到過,在這裡只記得有這幾個函式就行了。
再來看usbmscp.h這個標頭檔案,這個標頭檔案是要按照自己的需要和usb裝置來進行修改的,比如driver_name_sz是驅動程式的名字,reset_timeout 是乙個超時的預設值。還有很重要的乙個就是usbmsc_driver_settings的設定,這個設定是與usbdi.h中的usb_driver_settings結構體一一對應的,為了符合我自己的裝置,通常要把dwvendorid和dwproductid等設定成裝置的對應值,比如我的u盤的vendorid是0x058f,productid是0x9321,那我就會把這兩個值對應的寫在相應的位置上。同時在系統登錄檔中也會利用這兩個值修改登錄檔的鍵以便裝置管理器可以順利的找到我的裝置驅動。
下面還有乙個_usbmsc_device結構體,它是用來描述你自己的usb儲存裝置的,是封裝了usbd函式表指標、磁碟裝置指標、管道和配置項的最重要的資料結構,在驅動程式實現上此資料結構就是重點的引數,鑑於樣例程式對每乙個結構體元素都作了明確的注釋,此處我就不一一描述了,它就像c++中的類一樣,是最後把一些小類組合起來的可以最終使用的結構。
好了,對這兩個標頭檔案有所了解以後,我們就進入最關鍵的部分,源程式。我們接下來來看usbmsc.c這個檔案。為什麼要先看這個檔案而不是同一資料夾下的其他幾個檔案呢?我來解釋一下。在這個資料夾中有乙個usbmsc.def的檔案,大家都知道它是定義了匯出函式的,通常與它同名的程式檔案都會含有dllentry的入口,既然入口在這,那我們自然就先來看這個檔案了。如果用到了其他的檔案,再看不遲。
這可是乙個有1000多行的源程式,但不要害怕,我們只看最主要的,別的函式的實現你可以自己去研究。首先看到檔案的dllentry入口之前有5個函式原型的定義,從函式名上就可以知道這個函式的功能了,很顯然這幾個函式是程式實現過程中被呼叫的,所以目前知道功能就行了,不用了解實現方法。忘了說一句,這個程式中包含了bot.h和cbit.h兩個標頭檔案,可見程式中是要用到它們的功能的,不過先不管它,繼續往下看。
dllentry入口函式的下面,就是usbinstalldriver()這個函式了,它的作用是進行與usb裝置相關的登錄檔操作,主要的語句是:
brc = registerclientdriverid( wsusbdeviceid );
brc = registerclientsettings( szdriverlibfile, wsusbdeviceid, null, &usbdriversettings );
即先註冊裝置類別,然後是裝置細節。 同樣,usbuninstalldriver()函式是以相反的順序解除註冊資訊的。 這幾個與註冊有關的函式在前面我們提到過,是由usbd介面提供的,這裡我們可以看到usbd對裝置驅動程式的重要性。
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和...