Udostępnij przez


Deskryptor połączenia interfejsu USB

Deskryptor skojarzenia interfejsu USB (IAD) umożliwia urządzeniu grupowanie interfejsów należących do funkcji. W tym artykule opisano, jak sterownik klienta może określić, czy urządzenie zawiera identyfikator IAD dla funkcji.

Specyfikacja uniwersalnej magistrali szeregowej, wersja 2.0, nie obsługuje grupowania więcej niż jednego interfejsu urządzenia złożonego w ramach jednej funkcji. Jednak grupa robocza urządzenia USB (DWG) utworzyła klasy urządzeń USB, które umożliwiają korzystanie z funkcji z wieloma interfejsami. Forum implementatora USB wydało powiadomienie o zmianie inżynieryjnej (ECN), które definiuje mechanizm grupowania interfejsów.

EcN określa deskryptor USB, nazywany deskryptorem skojarzenia interfejsu (IAD), który umożliwia producentom sprzętu definiowanie grup interfejsów. Klasy urządzeń, które najprawdopodobniej używają identyfikatorów IAD, obejmują:

  • Specyfikacja klasy wideo USB (kod klasy — 0x0E)
  • Specyfikacja klasy audio USB (kod klasy — 0x01)
  • Specyfikacja klasy Bluetooth USB (kod klasy — 0xE0)

Jak używać identyfikatorów IAD

W poniższych podsekcjach opisano informacje dotyczące używania IAD.

Urządzenia złożone ostrzegające system Windows o IAD-ach w oprogramowaniu układowym

Producenci urządzeń złożonych zazwyczaj przypisują wartość zero do klasy urządzenia (bDeviceClass), podklasy (bDeviceSubClass) i pól protokołu (bDeviceProtocol) w deskryptorze urządzenia, zgodnie ze specyfikacją uniwersalnej magistrali szeregowej. Producent może skojarzyć poszczególne interfejsy z inną klasą i protokołem urządzenia.

Podstawowy zespół USB-IF opracował specjalny zestaw kodu klasy i protokołu, który powiadamia system operacyjny, że jeden lub więcej identyfikatorów znajduje się w oprogramowaniu układowym urządzenia. Deskryptor urządzenia musi mieć wartości wyświetlane w poniższej tabeli lub system operacyjny nie wykrywa identyfikatorów urządzeń ani prawidłowo grupuje interfejsy urządzenia.

Pole deskryptora urządzenia Wymagana wartość
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Wartości kodu alertują wersje systemu Windows, które nie obsługują IAD, aby zainstalować sterownik magistrali o specjalnym przeznaczeniu, który poprawnie identyfikuje urządzenie. Bez tych kodów w deskryptorze urządzenia system może nie wyliczyć urządzenia lub urządzenie może nie działać prawidłowo.

Urządzenie może mieć więcej niż jeden identyfikator IAD. Każde urządzenie IAD musi znajdować się bezpośrednio przed interfejsami w grupie interfejsów, które opisuje urządzenie IAD.

Klasa funkcji (bFunctionClass), podklasa (bFunctionSubclassClass) i pola protokołu (bFunctionProtocol) IAD muszą zawierać wartości określone przez klasę urządzeń USB opisujących interfejsy w funkcji.

Pola klasy i podklasy IAD nie muszą odpowiadać polom klasy i podklasy interfejsów w kolekcji interfejsów, które opisuje IAD. Firma Microsoft zaleca, aby pierwszy interfejs kolekcji zawierał pola klasy i podklasy zgodne z polami klasy i podklasy IAD. Poniższa tabela wskazuje, które pola powinny być zgodne.

Pole IAD Odpowiednie pole interfejsu
bFunctionClass Klasa interfejsu (bInterfaceClass)
bFunctionSubclassClass bInterfaceSubClass

Pole bFirstInterface IAD wskazuje liczbę pierwszego interfejsu w funkcji. Pole bInterfaceCount usługi IAD wskazuje, ile interfejsów należy do kolekcji interfejsów. Interfejsy w kolekcji interfejsów IAD muszą być ciągłe (nie może być żadnych przerw na liście numerów interfejsów), dlatego liczba z pierwszym numerem interfejsu wystarczy, aby określić wszystkie interfejsy w kolekcji.

Uzyskiwanie dostępu do zawartości IAD

Sterowniki klienta nie mogą bezpośrednio uzyskać dostępu do deskryptorów IAD. Powiadomienie o zmianie inżynierii dla IAD (ECN) określa, że deskryptory powiązania interfejsu (IAD) muszą być uwzględnione w informacjach konfiguracyjnych zwracanych przez urządzenia po otrzymaniu żądania od oprogramowania hosta dotyczącego deskryptora konfiguracji (konfiguracja GetDescriptor). Oprogramowanie hosta nie może bezpośrednio pobrać IAD za pomocą żądania GetDescriptor.

Jednak sterowniki klienta mogą wysyłać zapytania do sterownika nadrzędnego urządzenia USB o identyfikatory sprzętowe urządzenia, a identyfikatory sprzętowe urządzenia zawierają informacje o polach IAD.

Przykład deskryptora połączenia interfejsu USB

W tej sekcji przedstawiono układ deskryptora dla złożonego urządzenia USB. Przykładowe urządzenie ma dwie funkcje:

Funkcja klasy wideo

Deskryptor skojarzenia interfejsu (IAD) definiuje tę funkcję. Funkcja zawiera dwa interfejsy: interfejs zero (0) i interfejs jeden (1).

System generuje identyfikatory sprzętowe i zgodne dla funkcji, zgodnie z opisem w temacie Obsługa klasy urządzeń bezprzewodowej komunikacji mobilnej. Po dopasowaniu systemu operacyjnego do odpowiedniego pliku INF system ładuje stos sterowników klasy wideo.

Funkcja HID (Human Input Device)

Ta funkcja zawiera tylko dwa interfejsy (2).

System generuje identyfikatory sprzętowe oraz zgodności dla funkcji, jak opisano w Wyliczanie kolekcji interfejsów na urządzeniach złożonych USB. Po dopasowaniu systemu operacyjnego do odpowiedniego pliku INF system ładuje sterownik klasy HID (human input device).

Deskryptor jest następujący:

Deskryptor urządzenia

    BYTE  bLength            0x12
    BYTE  bDescriptorType    0x01
    WORD  bcdUSB             0x0200
    BYTE  bDeviceClass       0xEF
    BYTE  bDeviceSubClass    0x02
    BYTE  bDeviceProtocol    0x01
    BYTE  bMaxPacketSize0    0x40
    WORD  idVendor           0x045E
    WORD  idProduct          0xFFFF
    WORD  bcdDevice          0x0100
    BYTE  iManufacturer      0x01
    WORD  iProduct           0x02
    WORD  iSerialNumber      0x02
    BYTE  bNumConfigurations 0x01

Deskryptor konfiguracji

    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x02
    WORD  wTotalLength        0x...
    BYTE  bNumInterfaces      0x03
    BYTE  bConfigurationValue 0x01
    BYTE  iConfiguration      0x01
    BYTE  bmAttributes        0x80    // (BUS Powered)
    BYTE  bMaxPower           0x19    // (50 mA)

Deskryptor asocjacji interfejsu

    BYTE  bLength           0x08
    BYTE  bDescriptorType   0x0B
    BYTE  bFirstInterface   0x00
    BYTE  bInterfaceCount   0x02
    BYTE  bFunctionClass    0x0E
    BYTE  bFunctionSubClass 0x03
    BYTE  bFunctionProtocol 0x00
    BYTE  iFunction         0x04

Deskryptor interfejsu sterowania wideo

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x00
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x0E
    BYTE  bInterfaceSubClass 0x01
    BYTE  bInterfaceProtocol 0x00
    BYTE  iInterface         0x05

Deskryptor specyficzny dla klasy kontroli wideo

    . . . .
    . . . .
    . . . .

Deskryptor punktu końcowego sterowania wideo

    . . . .
    . . . .
    . . . .

Deskryptor interfejsu przesyłania strumieniowego wideo

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x01
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x0E
    BYTE  bInterfaceSubClass 0x02
    BYTE  bInterfaceProtocol 0x00
    BYTE  iInterface         0x06

Deskryptor właściwy dla klasy transmisji strumieniowej wideo

    . . . .
    . . . .
    . . . .

Deskryptor punktu końcowego przesyłania strumieniowego wideo

    . . . .
    . . . .
    . . . .

Deskryptor interfejsu urządzeń wejściowych HID

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x02
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x03
    BYTE  bInterfaceSubClass 0x01
    BYTE  bInterfaceProtocol 0x01
    BYTE  iInterface         0x07

Deskryptor specyficzny dla klasy HID

    . . . .
    . . . .
    . . . .

Deskryptor punktu końcowego HID

    . . . .
    . . . .
    . . . .