USB 裝置描述元
裝置描述項包含整體 USB 裝置的相關信息。 本文說明 USB_DEVICE_DESCRIPTOR 結構,並包含客戶端驅動程式如何傳送 get-descriptor 要求以取得裝置描述元的資訊。
每個通用序列總線 (USB) 裝置都必須能夠提供包含裝置相關信息的單一裝置描述元。 USB_DEVICE_DESCRIPTOR結構描述裝置描述項。 Windows 會使用該資訊來衍生各種資訊集。 例如, idVendor 和 idProduct 字段分別指定廠商和產品識別碼。 Windows 會使用這些域值來建構 裝置的硬體標識碼 。 若要檢視特定裝置的硬體識別碼:
- 開啟 裝置管理員。
- 以滑鼠右鍵按兩下 USB 裝置,然後選取 [ 屬性]。
- 選取 [屬性] 對話框中的 [詳細數據] 索引標籤。
- 下拉 [ 屬性 ] 清單。
- 選取 [硬體識別符] 屬性
這些值表示 Windows 產生的硬體識別碼 (“USB\XXX”。
USB_DEVICE_DESCRIPTOR 結構的 bcdUSB 字段表示裝置符合的 USB 規格版本。 例如,0x0200表示裝置是根據USB 2.0規格所設計。 bcdDevice 值表示裝置定義的修訂編號。
USB 驅動程式堆疊會使用 bcdDevice 以及 idVendor 和 idProduct,為裝置產生硬體和相容的標識碼。 您可以在 裝置管理員 中檢視這些識別碼。 裝置描述元也表示裝置支援的組態總數。
當裝置以高速容量連線到主計算機時,裝置可能會報告其裝置描述元中的不同資訊,而不是以完整速度容量連接時。 裝置不得在連線存留期間變更裝置描述元中包含的資訊,包括在電源狀態變更期間。
主機會透過控制項傳輸取得裝置描述項。 在傳輸中,要求類型為 GET DESCRIPTOR,而收件者是裝置。 用戶端驅動程式可以透過下列兩種方式之一起始該傳輸:使用架構 USB 目標裝置物件,或使用要求資訊傳送 URB。
取得裝置描述元
Windows Driver Frameworks (WDF) 客戶端驅動程式只能在建立架構 USB 目標裝置物件之後取得裝置描述元。
核心模式驅動程序架構 (KMDF) 驅動程式必須呼叫 WdfUsbTargetDeviceCreate,以取得 USB 目標裝置物件的 WDFUSBDEVICE 句柄。 用戶端驅動程式通常會在驅動程式的 EvtDevicePrepareHardware 回呼實作中呼叫 WdfUsbTargetDeviceCreate。 之後,客戶端驅動程序必須呼叫 WdfUsbTargetDeviceGetDeviceDescriptor 方法。 呼叫完成之後,會在呼叫端配置的 USB_DEVICE_DESCRIPTOR 結構中收到裝置描述元。
使用者模式驅動程序架構 (UMDF) 驅動程式必須查詢 IWDFUsbTargetDevice 指標的架構裝置物件,然後呼叫 IWDFUsbTargetDevice::RetrieveDescriptor 方法,並將USB_DEVICE_DESCRIPTOR_TYPE指定為描述元類型。
主機也可以藉由傳送 URB 來取得裝置描述元。 這個方法只適用於內核模式驅動程式。 不過,除非驅動程式是以 Windows 驅動程式模型 (WDM) 為基礎,否則客戶端驅動程式不應該傳送此類型要求的 URB。 這類驅動程式必須配置 URB 結構,然後呼叫 UsbBuildGetDescriptorRequest 巨集,以指定要求的 URB 格式。 然後,驅動程式可以將 URB 提交至 USB 驅動程式堆疊,以傳送要求。 如需詳細資訊,請參閱 如何提交 URB。
此程式代碼範例顯示UsbBuildGetDescriptorRequest呼叫,其會將 pURB 所指向的緩衝區格式化為適當的 URB:
UsbBuildGetDescriptorRequest(
pURB, // Points to the URB to be formatted
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0, // Not used for device descriptors
0, // Not used for device descriptors
pDescriptor, // Points to a USB_DEVICE_DESCRIPTOR structure
NULL,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL
);
範例裝置描述元
此範例顯示 USB 網路攝影機裝置的裝置描述元(請參閱 USB 裝置配置),使用 USBView 應用程式取得:
Device Descriptor:
bcdUSB: 0x0200
bDeviceClass: 0xEF
bDeviceSubClass: 0x02
bDeviceProtocol: 0x01
bMaxPacketSize0: 0x40 (64)
idVendor: 0x045E (Microsoft Corporation)
idProduct: 0x0728
bcdDevice: 0x0100
iManufacturer: 0x01
0x0409: "Microsoft"
iProduct: 0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber: 0x00
bNumConfigurations: 0x01
在上述範例中,裝置已根據USB規格2.0版進行開發。 請注意 bDeviceClass、bDeviceSubClass 和 bDeviceProtocol 值。 這些值表示裝置包含一或多個USB介面關聯描述元,可用來將每個函式的多個介面分組。 如需詳細資訊,請參閱 USB介面關聯描述元。
接下來,請參閱 bMaxPacketSize0 的值。 此值表示預設端點的封包大小上限。 此範例裝置可以透過預設端點傳輸最多64個字節的數據。
一般而言,若要設定裝置,用戶端驅動程式會在取得裝置描述元之後,取得裝置中支援設定的相關信息。 若要判斷裝置支援的組態數目,請檢查 傳回結構的 bNumConfigurations 成員。 此裝置支援一個設定。 若要取得 USB 設定的相關信息,驅動程式必須取得 USB 設定描述元。