網(wǎng)站怎樣做鏈接微信怎么推廣
下面介紹主機(jī)驅(qū)動(dòng)程序開發(fā)的高級(jí)概念和任務(wù)。 如果你正在編寫與 Microsoft 提供的 USB 主機(jī)控制器擴(kuò)展驅(qū)動(dòng)程序 (Ucx01000.sys) 通信的新主機(jī)控制器驅(qū)動(dòng)程序,則這部分內(nèi)容適用于你。
下面是 Windows 中 USB 主機(jī)端驅(qū)動(dòng)程序中顯示的圖表的修改版本。 此版本隱藏 USB 客戶端驅(qū)動(dòng)程序?qū)拥脑敿?xì)信息,這些詳細(xì)信息與主控制器驅(qū)動(dòng)程序開發(fā)無(wú)關(guān):
在上圖中,
USB 集線器驅(qū)動(dòng)程序 (Usbhub3.sys) 是 KMDF 驅(qū)動(dòng)程序。 集線器驅(qū)動(dòng)程序負(fù)責(zé)管理 USB 集線器及其端口、枚舉和創(chuàng)建物理設(shè)備對(duì)象, (PDO) USB 設(shè)備和可能連接到其下游端口的其他集線器。
USB 主機(jī)控制器擴(kuò)展 (Ucx01000.sys) 是堆棧中上述集線器驅(qū)動(dòng)程序的抽象層,提供一種通用機(jī)制,用于將請(qǐng)求排隊(duì)到基礎(chǔ)主機(jī)控制器驅(qū)動(dòng)程序。
USB 主機(jī)控制器驅(qū)動(dòng)程序 管理硬件。 Usbxhci.sys 是 Microsoft 提供的一個(gè)此類驅(qū)動(dòng)程序,它尤其面向符合 xHCI 規(guī)范的 USB 控制器硬件。 獨(dú)立硬件開發(fā)人員可能需要編寫自己的主機(jī)控制器驅(qū)動(dòng)程序,而不是使用收件箱 Usbxhci.sys。 例如,對(duì)于 XHCI 硬件,該硬件不完全符合規(guī)范,因此無(wú)法使用 Usbxhci.sys 或非 XHCI 硬件,例如 USB over TCP 連接。
UCX 和主機(jī)控制器驅(qū)動(dòng)程序之間的雙向通信通過(guò)使用 USB 主機(jī)控制器擴(kuò)展 (UCX) 編程接口進(jìn)行。 編譯驅(qū)動(dòng)程序時(shí),每個(gè)驅(qū)動(dòng)程序靜態(tài)鏈接到 Microsoft 提供的存根庫(kù)中的入口點(diǎn) (Ucx01000.lib) 。
下面是為主機(jī)控制器驅(qū)動(dòng)程序加載的設(shè)備堆棧:
UCX 對(duì)象和句柄?
UCX 擴(kuò)展了 WDF 對(duì)象功能,以定義其自己的特定于 USB 的 UCX 對(duì)象。 UCX 使用這些對(duì)象將請(qǐng)求排隊(duì)到任何基礎(chǔ)主機(jī)控制器驅(qū)動(dòng)程序。
重要的 API
UcxControllerCreate
UcxRootHubCreate
UcxUsbDeviceCreate
UCXCONTROLLER:主機(jī)控制器對(duì)象
表示由主機(jī)控制器驅(qū)動(dòng)程序創(chuàng)建的主機(jī)控制器。 驅(qū)動(dòng)程序必須為每個(gè)主機(jī)控制器實(shí)例僅創(chuàng)建一個(gè)主機(jī)控制器對(duì)象。 通常通過(guò)調(diào)用 UcxControllerCreate 方法在 EvtDriverDeviceAdd 回調(diào)中創(chuàng)建。
當(dāng)主機(jī)控制器驅(qū)動(dòng)程序創(chuàng)建對(duì)象時(shí),驅(qū)動(dòng)程序?qū)⒆?cè)由 UCX 調(diào)用的回調(diào)函數(shù)的實(shí)現(xiàn)。 驅(qū)動(dòng)程序還應(yīng)識(shí)別主機(jī)控制器連接的總線類型,例如 ACPI 或 PCI。 驅(qū)動(dòng)程序還通過(guò)使用傳遞給 UcxControllerCreate 調(diào)用的 UCX_CONTROLLER_CONFIG 結(jié)構(gòu)來(lái)提供主機(jī)控制器設(shè)備信息。
若要處理 I/O 請(qǐng)求,主機(jī)控制器驅(qū)動(dòng)程序必須注冊(cè) GUID_DEVINTERFACE_USB_HOST_CONTROLLER 設(shè)備接口。 此驅(qū)動(dòng)程序不需要實(shí)現(xiàn)此接口中定義的 IOCTL。 相反,UCX 客戶端通過(guò)調(diào)用 UcxIoDeviceControl 將在此接口上收到的 IOCTL 請(qǐng)求傳遞給 UCX。
下面是與主機(jī)控制器對(duì)象關(guān)聯(lián)的回調(diào)函數(shù),這些函數(shù)由 UCX 調(diào)用。 這些函數(shù)必須由主機(jī)控制器驅(qū)動(dòng)程序?qū)崿F(xiàn)。
*EVT_UCX_CONTROLLER_USBDEVICE_ADD
當(dāng)集線器驅(qū)動(dòng)程序通過(guò)與根集線器和/或外部集線器的交互確定總線上有新設(shè)備時(shí)調(diào)用。
*EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY UCX
調(diào)用以收集有關(guān) USB 主機(jī)控制器支持的各種功能的信息。
*EVT_UCX_CONTROLLER_RESET
由 UCX 調(diào)用以重置控制器硬件,以響應(yīng)檢測(cè)到的錯(cuò)誤。
*EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER
用于從主機(jī)控制器中檢索當(dāng)前幀編號(hào),中心驅(qū)動(dòng)程序使用它來(lái)計(jì)劃時(shí)序傳輸。
UCXROOTHUB:根集線器對(duì)象
獲取和控制主機(jī)控制器的根端口的狀態(tài)。 主機(jī)控制器驅(qū)動(dòng)程序通常在創(chuàng)建主機(jī)控制器對(duì)象后調(diào)用 UcxRootHubCreate 方法,在 EvtDriverDeviceAdd 回調(diào)中創(chuàng)建。 每個(gè)主機(jī)控制器實(shí)例只能有一個(gè)根集線器對(duì)象。 在 UcxRootHubCreate 調(diào)用中,驅(qū)動(dòng)程序注冊(cè)其回調(diào)實(shí)現(xiàn)。
EVT_UCX_ROOTHUB_GET_INFO
返回根集線器的 USB 2.0 和 USB 3.0 端口的數(shù)目。
EVT_UCX_ROOTHUB_GET_20PORT_INFO
返回有關(guān)根中心的 USB 2.0 或 USB 3.0 端口 (*EVT_UCX_ROOTHUB_GET_30PORT_INFO) 的信息。
創(chuàng)建并初始化根集線器對(duì)象后,集線器驅(qū)動(dòng)程序通過(guò)發(fā)送中斷和控制傳輸與根集線器端口交互。 UCX 通過(guò)調(diào)用主機(jī)控制器驅(qū)動(dòng)程序?qū)崿F(xiàn)的這些回調(diào)函數(shù)來(lái)幫助實(shí)現(xiàn)這些傳輸。
EVT_UCX_ROOTHUB_CONTROL_URB
處理 USB 集線器的功能控制請(qǐng)求。。
EVT_UCX_ROOTHUB_INTERRUPT_TX
處理有關(guān)已更改端口的信息的請(qǐng)求。
UCXUSBDEVICE:USB 設(shè)備對(duì)象
表示連接到總線的物理 USB 設(shè)備。 主機(jī)控制器驅(qū)動(dòng)程序通常通過(guò)調(diào)用 UcxUsbDeviceCreate 方法在 EVT_UCX_CONTROLLER_USBDEVICE_ADD 回調(diào)中創(chuàng)建。
創(chuàng)建對(duì)象時(shí),主機(jī)控制器驅(qū)動(dòng)程序使用 UcxUsbDeviceCreate 調(diào)用注冊(cè)其回調(diào)函數(shù)的實(shí)現(xiàn)。
這些回調(diào)函數(shù)旨在使控制器和驅(qū)動(dòng)程序了解 USB 設(shè)備的當(dāng)前狀態(tài)。
EVT_UCX_USBDEVICE_ENABLE
準(zhǔn)備控制器以執(zhí)行到設(shè)備的默認(rèn)端點(diǎn)的傳輸。
EVT_UCX_USBDEVICE_DISABLE
釋放與設(shè)備及其默認(rèn)端點(diǎn)關(guān)聯(lián)的控制器資源。
EVT_UCX_USBDEVICE_ADDRESS
將地址編程到控制器中,并將 SET_ADDRESS 傳輸發(fā)送到設(shè)備,使其進(jìn)入尋址狀態(tài)。
EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE
將非默認(rèn)端點(diǎn)編程到控制器中,并/或釋放其他非默認(rèn)端點(diǎn)。
EVT_UCX_USBDEVICE_RESET
設(shè)備已重置的控制器通知,在這種情況下,驅(qū)動(dòng)程序采取任何必要措施將控制器與 USB 設(shè)備同步。
EVT_UCX_USBDEVICE_UPDATE
通知控制器與設(shè)備相關(guān)的各種信息。
EVT_UCX_USBDEVICE_HUB_INFO
如果 UCXUSBDEVICE 句柄用于集線器設(shè)備,則通知集線器屬性。
EVT_UCX_USBDEVICE_ENDPOINT_ADD
通知驅(qū)動(dòng)程序?yàn)樵O(shè)備創(chuàng)建端點(diǎn)。 默認(rèn)端點(diǎn)的 EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD。
當(dāng)掛起的 USB 3.0 設(shè)備上的接口發(fā)出喚醒信號(hào)時(shí),驅(qū)動(dòng)程序應(yīng)調(diào)用 UcxUsbDeviceRemoteWakeNotification 來(lái)通知 UCX。
創(chuàng)建對(duì)象后,對(duì)象的生存期由 UCX 管理,驅(qū)動(dòng)程序不得刪除該對(duì)象。
UCXENDPOINT:端點(diǎn)對(duì)象
表示 USB 設(shè)備對(duì)象上的端點(diǎn)。 端點(diǎn)對(duì)象由主機(jī)控制器在 EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD 或 EVT_UCX_USBDEVICE_ENDPOINT_ADD 回調(diào)期間創(chuàng)建。 創(chuàng)建端點(diǎn)對(duì)象時(shí),驅(qū)動(dòng)程序會(huì)注冊(cè)其回調(diào)函數(shù)。
驅(qū)動(dòng)程序還會(huì)為每個(gè)端點(diǎn)創(chuàng)建一個(gè)框架隊(duì)列對(duì)象,并通過(guò)調(diào)用 UcxEndpointSetWdfIoQueue 將該隊(duì)列的 WDFQUEUE 傳遞給 UCX。 創(chuàng)建端點(diǎn)后,對(duì)象及其關(guān)聯(lián)的隊(duì)列的生存期由 UCX 管理,驅(qū)動(dòng)程序不得刪除這些對(duì)象本身。
端點(diǎn)對(duì)象實(shí)現(xiàn)多個(gè)回調(diào)函數(shù),使驅(qū)動(dòng)程序能夠協(xié)助 UCX 執(zhí)行與端點(diǎn)相關(guān)的操作。
EVT_UCX_ENDPOINT_ABORT
中止與端點(diǎn)關(guān)聯(lián)的隊(duì)列。
EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS
通知控制器驅(qū)動(dòng)程序,它可以在端點(diǎn)上完成取消的傳輸。
EVT_UCX_ENDPOINT_PURGE
完成端點(diǎn)上所有未完成的 I/O 請(qǐng)求。
EVT_UCX_ENDPOINT_START
開始與端點(diǎn)關(guān)聯(lián)的隊(duì)列。
EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD
創(chuàng)建靜態(tài)流。
EVT_UCX_ENDPOINT_RESET
通知驅(qū)動(dòng)程序重置控制器的端點(diǎn)編程。
當(dāng)主機(jī)控制器驅(qū)動(dòng)程序在端點(diǎn)上收到 USB 3.0 無(wú) Ping 響應(yīng)錯(cuò)誤時(shí),驅(qū)動(dòng)程序必須調(diào)用 UcxEndpointNoPingResponseError。 該調(diào)用會(huì)導(dǎo)致 USB 設(shè)備對(duì)象接收 EVT_UCX_USBDEVICE_UPDATE。 有關(guān)詳細(xì)信息,請(qǐng)參閱 在主機(jī)控制器驅(qū)動(dòng)程序中配置 USB 端點(diǎn)。
UCXSTREAMS:流對(duì)象
代表通過(guò)單個(gè)端點(diǎn)連接設(shè)備的管道數(shù)量。 主機(jī)控制器驅(qū)動(dòng)程序通過(guò)調(diào)用 UcxStaticStreamsCreate 在 EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD 回調(diào)中創(chuàng)建流對(duì)象。
在 UcxStaticStreamsCreate 調(diào)用期間,主機(jī)控制器驅(qū)動(dòng)程序注冊(cè)其回調(diào)函數(shù)。 對(duì)于特定的端點(diǎn)對(duì)象,驅(qū)動(dòng)程序可以確定它是否已創(chuàng)建流對(duì)象,并通過(guò)調(diào)用 UcxEndpointGetStaticStreamsReferenced 返回 UCXSTREAMS 句柄。
創(chuàng)建對(duì)象后,驅(qū)動(dòng)程序會(huì)為每個(gè)流創(chuàng)建一個(gè)框架隊(duì)列對(duì)象,并通過(guò)調(diào)用 UcxStaticStreamsSetStreamInfo 將 WDFQUEUE 句柄發(fā)送到 UCX。
流對(duì)象為主機(jī)控制器提供了多個(gè)回調(diào)函數(shù),以幫助 UCX 管理靜態(tài)流。
EVT_UCX_ENDPOINT_STATIC_STREAMS_DISABLE
為端點(diǎn)的所有流發(fā)布控制器資源。
EVT_UCX_ENDPOINT_STATIC_STREAMS_ENABLE
為此端點(diǎn)啟用所有流的控制器硬件。
對(duì)象的生存期和關(guān)聯(lián)的隊(duì)列由 UCX 管理,驅(qū)動(dòng)程序不得刪除這些對(duì)象。