USB 인터페이스 연결 설명자
IAD(USB 인터페이스 연결 설명자)를 사용하면 디바이스가 함수에 속한 인터페이스를 그룹화할 수 있습니다. 이 문서에서는 클라이언트 드라이버가 디바이스에 함수에 대한 IAD가 포함되어 있는지 여부를 확인하는 방법을 설명합니다.
유니버설 직렬 버스 사양( 수정 버전 2.0)은 단일 함수 내에서 복합 디바이스의 인터페이스를 둘 이상 그룹화할 수 없습니다. 그러나 USB DWG(디바이스 작업 그룹)는 여러 인터페이스가 있는 함수를 허용하는 USB 디바이스 클래스를 만들었습니다. USB 구현자 포럼은 인터페이스를 그룹화하기 위한 메커니즘을 정의하는 ECN(엔지니어링 변경 알림)을 발행했습니다.
ECN은 하드웨어 제조업체가 인터페이스 그룹을 정의할 수 있도록 하는 IAD(인터페이스 연결 설명자)라는 USB 설명자를 지정합니다. IAD를 사용할 가능성이 가장 높은 디바이스 클래스는 다음과 같습니다.
- USB 비디오 클래스 사양(클래스 코드 - 0x0E)
- USB 오디오 클래스 사양(클래스 코드 - 0x01)
- USB Bluetooth 클래스 사양(클래스 코드 - 0xE0)
IAD를 사용하는 방법
다음 하위 섹션에서는 IAD를 사용하는 방법에 대한 정보를 설명합니다.
펌웨어에서 IAD의 Windows를 경고하는 복합 디바이스
복합 디바이스 제조업체는 일반적으로 유니버설 직렬 버스 사양에 지정된 대로 디바이스 설명자의 디바이스 클래스(bDeviceClass), 서브클래스(bDeviceSubClass) 및 프로토콜(bDeviceProtocol) 필드에 값 0을 할당합니다. 제조업체는 각 개별 인터페이스를 다른 디바이스 클래스 및 프로토콜과 연결할 수 있습니다.
USB-IF 핵심 팀은 하나 이상의 IAD가 디바이스 펌웨어에 있음을 운영 체제에 알리는 특수 클래스 및 프로토콜 코드 집합을 고안했습니다. 디바이스 설명자에는 다음 표에 표시되는 값이 있어야 합니다. 그렇지 않으면 운영 체제에서 디바이스의 IAD를 검색하거나 디바이스의 인터페이스를 제대로 그룹화하지 않습니다.
디바이스 설명자 필드 | 필수 값 |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
코드 값은 디바이스를 올바르게 열거하는 특수 목적 버스 드라이버를 설치하는 IAD를 지원하지 않는 Windows의 경고 버전입니다. 디바이스 설명자에 이러한 코드가 없으면 시스템이 디바이스를 열거하지 못하거나 디바이스가 제대로 작동하지 않을 수 있습니다.
디바이스에는 둘 이상의 IAD가 있을 수 있습니다. 각 IAD는 IAD에서 설명하는 인터페이스 그룹의 인터페이스 바로 앞에 있어야 합니다.
IAD의 함수 클래스(bFunctionClass), 서브클래스(bFunctionSubclassClass) 및 프로토콜(bFunctionProtocol) 필드에는 함수의 인터페이스를 설명하는 USB 디바이스 클래스에서 지정한 값이 포함되어야 합니다.
IAD의 클래스 및 하위 클래스 필드는 IAD가 설명하는 인터페이스 컬렉션에 있는 인터페이스의 클래스 및 하위 클래스 필드와 일치시킬 필요가 없습니다. 컬렉션의 첫 번째 인터페이스에는 IAD의 클래스 및 하위 클래스 필드와 일치하는 클래스 및 하위 클래스 필드가 있는 것이 좋습니다. 다음 표에서는 일치해야 하는 필드를 나타냅니다.
IAD 필드 | 해당 인터페이스 필드 |
---|---|
bFunctionClass | bInterfaceClass |
bFunctionSubclassClass | bInterfaceSubClass |
IAD의 bFirstInterface 필드는 함수의 첫 번째 인터페이스 수를 나타냅니다. IAD의 bInterfaceCount 필드는 인터페이스 컬렉션에 있는 인터페이스 수를 나타냅니다. IAD 인터페이스 컬렉션의 인터페이스는 연속되어야 하므로(인터페이스 번호 목록에 간격이 없을 수 있음) 첫 번째 인터페이스 번호가 있는 개수만으로 컬렉션의 모든 인터페이스를 지정할 수 있습니다.
IAD의 콘텐츠에 액세스
클라이언트 드라이버는 IAD 설명자에 직접 액세스할 수 없습니다. IAD ECN(엔지니어링 변경 알림)은 구성 설명자(GetDescriptor 구성)에 대한 호스트 소프트웨어로부터 요청을 받을 때 디바이스가 반환하는 구성 정보에 IAD를 포함해야 한다고 지정합니다. 호스트 소프트웨어는 GetDescriptor 요청으로 직접 IAD를 검색할 수 없습니다.
그러나 클라이언트 드라이버는 USB 디바이스의 부모 드라이버에서 디바이스의 하드웨어 식별자(ID)를 쿼리할 수 있으며 디바이스의 하드웨어 ID에는 IAD의 필드에 대한 포함된 정보가 포함되어 있습니다.
USB 인터페이스 연결 설명자 예제
이 섹션에서는 복합 USB 디바이스에 대한 설명자 레이아웃을 보여 줍니다. 예제 디바이스에는 다음 두 가지 함수가 있습니다.
비디오 클래스 함수
IAD(인터페이스 연결 설명자)는 이 함수를 정의합니다. 함수에는 인터페이스 0과 인터페이스 1(1)의 두 인터페이스가 포함됩니다.
이 시스템은 무선 모바일 통신 디바이스 클래스 지원에 설명된 대로 함수에 대한 하드웨어 및 호환 식별자(ID)를 생성합니다. OS가 적절한 INF 파일과 일치하면 시스템은 비디오 클래스 드라이버 스택을 로드합니다.
HID(휴먼 입력 디바이스) 함수
이 함수는 인터페이스 2(2)만 포함합니다.
시스템은 USB 복합 디바이스의 인터페이스 컬렉션 열거에 설명된 대로 함수에 대한 하드웨어 및 호환 ID를 생성합니다. OS가 적절한 INF 파일과 일치하면 시스템에서 HID(휴먼 입력 디바이스) 클래스 드라이버를 로드합니다.
설명자는 다음과 같습니다.
디바이스 설명자
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
구성 설명자
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)
인터페이스 연결 설명자
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
비디오 컨트롤 인터페이스 설명자
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
비디오 컨트롤 클래스별 설명자
. . . .
. . . .
. . . .
비디오 컨트롤 엔드포인트 설명자
. . . .
. . . .
. . . .
비디오 스트리밍 인터페이스 설명자
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
비디오 스트리밍 클래스별 설명자
. . . .
. . . .
. . . .
비디오 스트리밍 엔드포인트 설명자
. . . .
. . . .
. . . .
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
HID 클래스별 설명자
. . . .
. . . .
. . . .
HID 엔드포인트 설명자
. . . .
. . . .
. . . .