一.usb載入式流介面驅動要點分析
為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。
(1)usb系統結構分析
wince下usb系統軟體由兩層組成:較高usb裝置驅動程式層和較低的usb函式層。較低的usb函式層本身又由兩部分組成:較高的通用序列匯流排驅動程式(usbd)模組和較低的主控制器驅動程式(hcd)模組。通過hcd模組功能和usbd模組實現高層的usbd介面函式,usb裝置驅動程式就能與外圍裝置進行通訊。
在資料傳輸的過程中,操作流程通常按下列的次序進行:①usb裝置驅動程式進行資料傳輸的初始化,即通過usbd介面函式給usbd模組傳送資料傳輸的請求。②usbd模組將該請求分成一些單獨的事務。③hcd模組排出事務次序。④主控制器硬體執行事務。這裡需要提醒的是,所有的事務都是從主機發出的,外圍裝置完全是被動接受型的。
(2)usb裝置驅動程式入口點函式
從結構分析我們可知,所有的usb裝置驅動程式必須在它們的dll庫設定一定的入口點與usbd模組進行適當的互動。設定入口點函式有兩個作用:一是使得 usbd 模組能與外部裝置互動;二是使得驅動程式能建立和管理任何可能需要的註冊鍵。
下面簡要介紹相關函式的作用:usbdeviceattach是當 usb 裝置連線到主計算機時執行,usbd模組會呼叫這個函式初始化usb裝置,取得usb裝置資訊和配置usb裝置,並且申請必需的資源。 usbinstalldrive是在第一次載入usb裝置驅動程式時首先被呼叫,它使得驅動程式能建立需要的註冊鍵,用於將乙個驅動程式所需的登錄檔資訊寫入到hkey_local_machine/drivers/usb/clientdrivers目錄下,例如裝置名稱等。需要注意的是,usb裝置驅動程式不使用標準的登錄檔函式,而是使用registerclientdriverid()、registerclientsettings()函式來註冊相應的裝置資訊。
usbuninstalldriver是在使用者刪除usb裝置驅動程式時呼叫,負責刪除註冊鍵並釋放其它相關資源。它通過呼叫 unregisterclientsettings()和unregisterclientdriverid()函式來刪除由驅動程式的 usbinstalldriver()函式建立的所有註冊鍵。因此,我們在驅動程式中就需要嚴格按照這三個函式的原型來實現,否則就不能為裝置管理器所識別。
二. usb裝置驅動程式必須輸出的函式有:
①usbdeviecattach()。當usb裝置連線到計算機上時,usbd模組就會呼叫此函式。這個函式主要用於初始化usb裝置,取得usb裝置資訊,配置usb裝置,並且申請必需的資源。
②usbinstalldriver ()。主要用於建立乙個驅動程式載入所需的登錄檔資訊,例如讀/寫超時、裝置名稱等。
③usbuninstalldriver ()。主要用於釋放驅動程式所占用的資源,以及刪除usbinstalldriver ()函式建立的登錄檔等。
上述3個函式介面是所有的usb驅動程式必須提供的,缺一不可。
另外較為重要的是usb裝置驅動程式的登錄檔配置。一般的usb裝置驅動程式的登錄檔配置在[hkey_local_machine\drivers\usb\loadclients\口]下,每個驅動程式的子鍵都有group 1_id\group2_id\group3_id\drivername 格式,裝置的子鍵由**商、裝置類和協議資訊通過下劃線組成。表2列出了允許的組合。
需要注意的是,登錄檔的構成都是以十進位制數值來標識的,也要注意十進位制和十六進製制之間數的轉換。
三 、usb裝置流介面驅動的實現步驟
從wince usb裝置驅動模型及結構分析中,我們可以清晰的看到主機和外設之間的實現方式。在主機端,通過usbd模組和hcd模組使用預設的pipe訪問乙個通用的邏輯裝置,實際上就是說usbd和hcd是一組訪問所有usb裝置的邏輯介面,它們負責管理所有usb裝置的連線、載入、移除、資料傳輸和通用配置。其中hcd是主機控制驅動,是為usbd提供底層的功能訪問服務,usbd是usb匯流排驅動,位於hcd的上層,利用hcd的服務提供較高層次的功能。因此,實現usb載入流驅動程式大致需要完成以下步驟:
(1)選擇代表裝置的檔名字首。字首非常重要,裝置管理器在登錄檔中通過字首來識別裝置。同時,在流介面命名時也將這個字首作為入口點函式的字首,如果裝置字首為***,那麼流介面對應為***_close,***_init等。
(2)設定驅動的各個入口點函式。所謂入口點是指提供給裝置管理器的標準檔案i/o介面。在生成乙個dll後,就用裝置檔名字首替換名字中的***。因此,每個載入式流介面驅動程式必須實現***_init()、***_iocontrol()以及***_powerup()等一組標準的函式,用來完成標準的檔案i/o函式和電源管理等。
(3)建立.def檔案。當裝置管理器初始化usb裝置編譯出來的流介面函式後,還必須建立乙個.def檔案。def檔案定義了dll要匯出的介面集,而且載入式流驅動大多是以dll形式存在的,所以應將dll和def的檔名統一起來。def檔案告訴鏈結程式需要輸出什麼樣的函式,最後將驅動程式編譯到核心中去,這樣這個usb裝置流介面驅動程式就可以被應用程式呼叫。
(4)在登錄檔中為驅動程式建立表項。在登錄檔中建立驅動程式入口點,這樣裝置管理器才能識別和管理這個驅動。此外,登錄檔中還能儲存額外的資訊,這些資訊可以在驅動執行之後被使用到。
USB裝置驅動程式導讀
隨著 usb裝置的不斷增加,我們這些開發人員也就多了對 usb裝置進行驅動程式開發的工作。但是對於很多初學者來說,存在以下三個困難 一是對wince 的驅動程式結構了解得太少,沒辦法得心應手的專注於驅動程式的開發工作 二是對wince 自帶的usb 驅動程式的例子沒有弄懂,看到一大堆資料夾結構和源程...
USB裝置驅動程式(二)
首先我們來看usb裝置描述符的結構 在usb匯流排識別裝置階段就將usb描述符傳送給了usb匯流排驅動程式,裝置的資料傳輸物件是端點,端點0是特殊端點,在usb匯流排驅動程式識別階段,本次通過usb滑鼠點選事件編寫乙個input子系統,從上一章主要實現了如何識別到有個usb裝置的驅動程式,本次,主要...
USB裝置驅動程式導讀 2
接下來,我們就來分析一下ce中的樣例程式,我用的是4.2版本的,所以下面的內容是4.2版本中的程式。這裡的程式是通過資料夾的形式組織在一起的,所以我們還是像以前學習ce的時候那樣,先來了解與此相關的資料夾結構,如下圖。在usb資料夾下,分成了class,clients,common,hcd,inc,...