USB 裝置描述元
裝置描述項包含 USB 裝置整體的相關信息。 本主題描述 USB_DEVICE_DESCRIPTOR 結構,並包含用戶端驅動程式如何傳送 get-descriptor 要求以取得裝置描述元的資訊。
每個通用序列總線 (USB) 裝置都必須能夠提供包含裝置相關信息的單一裝置描述元。 USB_DEVICE_DESCRIPTOR 結構描述裝置描述項。 Windows 會使用該資訊來衍生各種資訊集。 例如, idVendor 和 idProduct 字段分別指定廠商和產品識別碼。 Windows 會使用這些域值來建構裝置 的硬體標識碼 。 若要檢視特定裝置的硬體標識碼,請開啟 裝置管理員 並檢視裝置屬性。 在 [ 詳細數據] 索引 標籤中, [硬體 標識符] 屬性值會指出 Windows 產生的硬體標識碼 (“USB\XXX”) 。 bcdUSB 欄位指出裝置符合的 USB 規格版本。 例如,0x0200表示裝置是根據USB 2.0規格所設計。 bcdDevice 值表示裝置定義的修訂編號。 USB 驅動程式堆疊會使用 bcdDevice 以及 idVendor 和 idProduct 來產生裝置的硬體和相容標識碼。 您可以在 裝置管理員 中檢視這些識別碼。 裝置描述項也會指出裝置支援的組態總數。
當裝置以高速容量連線到主計算機時,裝置可能會在其裝置描述符中報告不同的資訊,而不是以完整速度容量連線時。 裝置不得在連線存留期間變更裝置描述符中包含的資訊,包括在電源狀態變更期間。
主機會透過控制傳輸取得裝置描述項。 在傳輸中,要求類型為 GET DESCRIPTOR,而收件者是裝置。 用戶端驅動程式可以透過下列兩種方式之一起始傳輸:使用架構 USB 目標裝置物件,或使用要求資訊傳送 URB。
取得裝置描述元
Windows 驅動程式架構 (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 組態描述元。