USB 裝置會在稱為 USB 描述元的數據結構中提供本身的相關信息。 本節提供裝置、組態、介面和端點描述項的相關信息,以及從USB裝置擷取它們的方式。
對應至裝置配置的 USB 描述符
主機軟體會將各種標準控制要求傳送至預設端點,從連接的裝置取得描述元(取得描述元要求,請參閱 USB 規格第 9.4.3 節)。 這些要求會指定要擷取的描述元類型。 為了回應此類請求,裝置會傳送描述符,其中包含有關裝置、其配置、介面和相關端點的資訊。 裝置描述符 包含整個裝置的相關資訊。 配置描述符 包含每個裝置配置的相關資訊。 字串描述子 包含 Unicode 文字字串。
每個 USB 裝置都會公開裝置描述元,指出裝置的類別資訊、廠商和產品識別碼,以及設定數目。 每個配置都會公開其配置描述符,該描述符指示介面數量和電源特性。 每個介面都會公開其每個替代設定的介面描述元,其中包含類別和端點數目的相關資訊。 每個介面內的每個端點都會公開端點描述元,以指出端點類型和封包大小上限。
例如,讓我們考慮 OSR FX2 板設備佈局(請參閱 USB 設備佈局)。 在裝置層級,裝置會公開預設端點的裝置描述元和端點描述元。 在組態層級,裝置會公開組態 0 的組態描述元。 在介面層級,它會公開替代設定 0 的一個介面描述元。 在端點層級,它會公開三個端點描述元。
USB 裝置描述元
每個通用序列總線 (USB) 裝置都必須能夠提供包含裝置相關信息的單一裝置描述元。 Windows 會使用該資訊來衍生各種資訊集。 例如, idVendor 和 idProduct 欄位分別指定廠商和產品識別碼。 Windows 會使用這些欄位值來建構裝置的硬體識別碼。 若要檢視特定裝置的硬體 ID,請開啟裝置管理員並檢視裝置屬性。 在 [詳細資料] 索引標籤中, [硬體識別碼 ] 屬性值指出 Windows 所產生的硬體識別碼 (“USB\XXX”) 。 bcdUSB 欄位指出裝置符合的 USB 規格版本。 例如,0x0200表示裝置是根據USB 2.0規格所設計。 bcdDevice 值指出裝置定義的修訂號碼。 USB 驅動程式堆疊會使用 bcdDevice 以及 idVendor 和 idProduct 來產生裝置的硬體和相容標識碼。 您可以在裝置管理員中檢視這些識別碼。 裝置描述元也表示裝置支援的組態總數。
主機會透過控制項傳輸取得裝置描述項。 Microsoft 提供程式設計介面來取得描述元。
| 如果你正在寫一個... | 呼叫... |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 應用程式 | UsbDevice.DeviceDescriptor |
| 使用 WinUSB 函式的 Win32 桌面應用程式 | WinUsb_GetDescriptor |
| UMDF 型用戶端驅動程式 | IWDFUsbTargetDevice::RetrieveDescriptor |
| KMDF 型用戶端驅動程式 | WdfUsbTargetDeviceGetDeviceDescriptor |
| WDM 型用戶端驅動程式 |
UsbBuildGetDescriptorRequest _URB_CONTROL_DESCRIPTOR_REQUEST |
USB 組態描述元
USB 配置包含一系列介面。 每個介面都包含一或多個替代設定,而每個替代設定都由一組端點所組成 (請參閱 USB 裝置配置)。 配置描述符描述整個配置,包括其介面、替代設定及其端點。 每個實體也會以其描述元格式說明。 配置描述子也可以包含裝置製造商所定義的自訂描述子。
因此,只有配置描述子的起始部分是固定的,即 9 個位元組。 其餘部分是可變的,具體取決於介面數量及其替代設定,以及裝置支援的端點。 在此文檔集中,初始9個位元組稱為配置描述符。 描述元的前兩個位元組表示總長度。
下表顯示 USB 網路攝影機裝置的組態描述元:
| 領域 | 價值觀 |
|---|---|
| wTotalLength (總長度) | 0x02CA |
| bNumInterfaces | 0x02 |
| bConfigurationValue | 0x01 |
| iConfiguration | 0x00 |
| bmAttributes | 0x80(總線供電) |
| MaxPower | 0xFA (500 mA) |
bConfigurationValue 欄位指出裝置韌體中定義的組態編號。 USB 配置也表示某些電源特性。 bmAttributes 包含位元遮罩,指出設定是否支援遠端喚醒功能,以及裝置是匯流排供電還是自行供電。 MaxPower 欄位會指定裝置使用匯流排供電時,裝置可以從主機取用的最大功率 (以毫安單位為單位)。 配置描述符也指出裝置支援的介面總數 (bNumInterfaces)。
| 如果你正在寫一個... | 呼叫... |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 應用程式 |
UsbDevice.ConfigurationDescriptor 來取得固定長度部分。 UsbConfiguration.Descriptors 以取得整個組態集。 |
| 使用 WinUSB 函式的 Win32 桌面應用程式 | WinUsb_GetDescriptor |
| UMDF 型用戶端驅動程式 | IWDFUsbTargetDevice::RetrieveDescriptor |
| KMDF 型用戶端驅動程式 | WdfUsbTargetDeviceRetrieveConfigDescriptor |
| WDM 型用戶端驅動程式 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST |
USB 介面描述元
介面描述元包含 USB 介面替代設定的相關資訊。
下表顯示網路攝影機裝置介面0的替代設定0的介面描述元:
| 領域 | 價值觀 |
|---|---|
| bInterfaceNumber | 0x00 |
| bAlternateSetting (备用设定) | 0x00 |
| bNumEndpoints | 0x01 |
| bInterfaceClass | 0x0E |
| bInterfaceSubClass | 0x02 |
| bInterfaceProtocol (接口協議) | 0x00 |
| iInterface | 0x02 |
| 0x0409 | “Microsoft LifeCam VX-5000” |
| 0x0409 | “Microsoft LifeCam VX-5000” |
在上述範例中,請注意 bInterfaceNumber 和 bAlternateSetting 欄位值。 這些欄位包含主機用來啟動介面的索引值及其替代設定之一。 針對啟用,應用程式或驅動程式會在函式呼叫中指定索引值。 根據該資訊,USB 驅動程式堆疊接著建置標準控制要求 (SET INTERFACE) ,並將它傳送至裝置。 請注意 bInterfaceClass 欄位。 介面描述元或其任何替代設定的描述元會指定類別碼、子類別及通訊協定。 0x0E 的值表示介面適用於視訊裝置類別。 另外,請注意 iInterface 欄位。 該值表示有兩個字串描述元附加至介面描述元。 字串描述元包含裝置列舉期間用來識別功能的 Unicode 描述。
| 如果你正在寫一個... | 呼叫... |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 應用程式 |
UsbInterfaceSetting.Descriptors 來取得特定替代設定的特定描述元。 UsbInterface.Descriptors 來取得介面所有設定的描述元。 |
| 使用 WinUSB 函式的 Win32 桌面應用程式 | WinUsb_GetDescriptor |
| UMDF 型用戶端驅動程式 | IWDFUsbInterface::GetInterfaceDescriptor |
| KMDF 型用戶端驅動程式 | WdfUsbInterfaceGetDescriptor |
| WDM 型用戶端驅動程式 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST ,然後剖析每一個介面描述元。 如需詳細資訊,請參閱 如何選取USB裝置的設定。 |
USB 端點描述元
介面中的每個端點都會描述裝置的單一輸入或輸出資料流程。 支援不同類型功能串流的裝置有多個介面。 支援多個與功能相關的資料流的裝置可以在單一介面上支援多個端點。
所有類型的端點 (預設端點除外) 都必須提供端點描述元,以便主機可以取得端點的相關資訊。 端點描述符包含資訊,例如其位址、類型、方向,以及端點可以處理的資料量。 到端點的資料傳輸是基於該資訊。
下表顯示網路攝影機裝置的端點描述元:
| 領域 | 價值觀 |
|---|---|
| bEndpointAddress | 0x82 IN |
| bmAttributes | 0x01 |
| wMaxPacketSize | 0x0080 (128) |
| bInterval | 0x01 |
bEndpointAddress 欄位會指定包含端點號碼 (位元 3..0) 和端點方向 (位元 7) 的唯一端點位址。 藉由讀取上述範例中的這些值,我們可以判斷描述元描述端點號碼為 2 的 IN 端點。 bmAttributes 屬性指出端點類型是同步的。 wMaxPacketSize欄位指出端點可以在單一交易中傳送或接收的位元組數目上限。 位元 12..11 表示每個微幀可以傳送的交易總數。 bInterval 表示端點可以傳送或接收資料的頻率。
| 如果你正在寫一個... | 呼叫... |
|---|---|
| 使用 Windows.Devices.Usb 的 UWP 應用程式 | UsbEndpointDescriptor |
| 使用 WinUSB 函式的 Win32 桌面應用程式 | WinUsb_GetDescriptor |
| UMDF 型用戶端驅動程式 | WDFUsbTargetPipe::GetInformation |
| KMDF 型用戶端驅動程式 | WdfUsbTargetPipeGetInformation |
| WDM 型用戶端驅動程式 |
UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST ,然後解析每個端點描述元。 如需詳細資訊,請參閱 如何選取USB裝置的設定。 |