共用方式為


USB 裝置描述元

裝置描述項包含整體 USB 裝置的相關信息。 本文說明 USB_DEVICE_DESCRIPTOR 結構,並包含客戶端驅動程式如何傳送 get-descriptor 要求以取得裝置描述元的資訊。

每個通用序列總線 (USB) 裝置都必須能夠提供包含裝置相關信息的單一裝置描述元。 USB_DEVICE_DESCRIPTOR結構描述裝置描述項。 Windows 會使用該資訊來衍生各種資訊集。 例如, idVendoridProduct 字段分別指定廠商和產品識別碼。 Windows 會使用這些域值來建構 裝置的硬體標識碼 。 若要檢視特定裝置的硬體識別碼:

  1. 開啟 裝置管理員
  2. 以滑鼠右鍵按兩下 USB 裝置,然後選取 [ 屬性]。
  3. 選取 [屬性] 對話框中的 [詳細數據] 索引標籤。
  4. 下拉 [ 屬性 ] 清單。
  5. 選取 [硬體識別符] 屬性

這些值表示 Windows 產生的硬體識別碼 (“USB\XXX”。

USB_DEVICE_DESCRIPTOR 結構的 bcdUSB 字段表示裝置符合的 USB 規格版本。 例如,0x0200表示裝置是根據USB 2.0規格所設計。 bcdDevice 值表示裝置定義的修訂編號。

USB 驅動程式堆疊會使用 bcdDevice 以及 idVendoridProduct,為裝置產生硬體和相容的標識碼。 您可以在 裝置管理員檢視這些識別碼。 裝置描述元也表示裝置支援的組態總數。

當裝置以高速容量連線到主計算機時,裝置可能會報告其裝置描述元中的不同資訊,而不是以完整速度容量連接時。 裝置不得在連線存留期間變更裝置描述元中包含的資訊,包括在電源狀態變更期間。

主機會透過控制項傳輸取得裝置描述項。 在傳輸中,要求類型為 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版進行開發。 請注意 bDeviceClassbDeviceSubClassbDeviceProtocol 值。 這些值表示裝置包含一或多個USB介面關聯描述元,可用來將每個函式的多個介面分組。 如需詳細資訊,請參閱 USB介面關聯描述元

接下來,請參閱 bMaxPacketSize0 的值。 此值表示預設端點的封包大小上限。 此範例裝置可以透過預設端點傳輸最多64個字節的數據。

一般而言,若要設定裝置,用戶端驅動程式會在取得裝置描述元之後,取得裝置中支援設定的相關信息。 若要判斷裝置支援的組態數目,請檢查 傳回結構的 bNumConfigurations 成員。 此裝置支援一個設定。 若要取得 USB 設定的相關信息,驅動程式必須取得 USB 設定描述元