USB載入式流介面驅動要點分析和實現步驟

2021-05-12 11:17:26 字數 2243 閱讀 9966

為了支援不同型別的外圍裝置,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裝置流介面驅動的實現步驟

從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驅動開發過程中,錯走許多冤枉路使我叫苦連天。我感受最深的是由於wince提供了通用序列匯流排驅動程式(usbd)模組、usbd介面函式全集、樣本主機控制器驅動程式(hcd)模組。所以,我們只需要根據usb裝置硬體特性,利用usbd提供的不同函式,實現流介面函式與外圍裝置的互動。在沒有特別的情況下,我最大的收穫經驗是把這些公用的源程式照搬過來,能極大的縮短開發周期,從而能更快速地進行嵌入式開發

usb介面驅動載入流程分析

usb介面驅動載入流程分析 struct usb device driver usb generic driver struct bus type usb bus type 系統初始化時usb core會呼叫 retval usb register device driver usb generic...

USB裝置驅動載入過程

本文摘自 使用者插入usb裝置 usb匯流排 或者是pci匯流排,這個不太清楚,反正就是匯流排來著 識別到插入了usb裝置。匯流排和usb裝置進行通訊,獲取usb的硬體id 產品id,以及bcdversion。根據這些資訊組成裝置硬體id號 vid x pid x rev x。匯流排根據usb裝置的...

USB驅動程式的載入 二

應用程式 usb client driver 層一 usbd.dll 層二 ohci.dll 層三 wince的usb驅動分為三層,如上圖所示.從上到下,姑且將其稱為層一,層二,層三。層一通過gc usbfuncs來呼叫層二所提供的功能,而層二通過gc hcdfuncs來呼叫層三實現的功能,而應用程...