표준 USB 설명자
USB 디바이스는 USB 설명자라는 데이터 구조에서 자체에 대한 정보를 제공합니다. 이 섹션에서는 디바이스, 구성, 인터페이스 및 엔드포인트 설명자에 대한 정보와 USB 디바이스에서 검색하는 방법을 제공합니다.
디바이스 레이아웃에 매핑된 USB 설명자
호스트 소프트웨어는 다양한 표준 제어 요청을 기본 엔드포인트로 전송하여 연결된 디바이스에서 설명자를 가져옵니다(설명자 요청 가져오기, USB 사양 섹션 9.4.3 참조). 이러한 요청은 검색할 설명자의 유형을 지정합니다. 이러한 요청에 대한 응답으로 디바이스는 디바이스, 해당 구성, 인터페이스 및 관련 엔드포인트에 대한 정보를 포함하는 설명자를 보냅니다. 디바이스 설명자에 는 전체 디바이스에 대한 정보가 포함되어 있습니다. 구성 설명자에 는 각 디바이스 구성에 대한 정보가 포함됩니다. 문자열 설명자에 는 유니코드 텍스트 문자열이 포함됩니다.
모든 USB 디바이스는 디바이스의 클래스 정보, 공급업체 및 제품 식별자 및 구성 수를 나타내는 디바이스 설명자를 노출합니다. 각 구성은 인터페이스 수와 전원 특성을 나타내는 구성 설명자를 노출합니다. 각 인터페이스는 클래스 및 엔드포인트 수에 대한 정보를 포함하는 각 대체 설정에 대한 인터페이스 설명자를 노출합니다. 각 인터페이스 내의 각 엔드포인트는 엔드포인트 유형 및 최대 패킷 크기를 나타내는 엔드포인트 설명자를 노출합니다.
예를 들어 OSR FX2 보드 디바이스 레이아웃을 살펴보겠습니다(USB 디바이스 레이아웃 참조). 디바이스 수준에서 디바이스는 기본 엔드포인트에 대한 디바이스 설명자 및 엔드포인트 설명자를 노출합니다. 구성 수준에서 디바이스는 구성 0에 대한 구성 설명자를 노출합니다. 인터페이스 수준에서 대체 설정 0에 대한 하나의 인터페이스 설명자를 노출합니다. 엔드포인트 수준에서는 세 개의 엔드포인트 설명자를 노출합니다.
USB 디바이스 설명자
모든 USB(유니버설 직렬 버스) 디바이스는 디바이스에 대한 관련 정보를 포함하는 단일 디바이스 설명자를 제공할 수 있어야 합니다. Windows는 해당 정보를 사용하여 다양한 정보 집합을 파생합니다. 예를 들어 idVendor 및 idProduct 필드는 각각 공급업체 및 제품 식별자를 지정합니다. Windows는 이러한 필드 값을 사용하여 디바이스에 대한 하드웨어 ID를 생성합니다. 특정 디바이스의 하드웨어 ID를 보려면 장치 관리자 열고 디바이스 속성을 봅니다. 세부 정보 탭에서 하드웨어 ID 속성 값은 Windows에서 생성된 하드웨어 ID("USB\XXX")를 나타냅니다. bcdUSB 필드는 디바이스가 준수하는 USB 사양의 버전을 나타냅니다. 예를 들어 0x0200 디바이스가 USB 2.0 사양에 따라 설계되었음을 나타냅니다. bcdDevice 값은 디바이스 정의 수정 번호를 나타냅니다. USB 드라이버 스택은 idVendor 및 idProduct와 함께 bcdDevice를 사용하여 디바이스에 대한 하드웨어 및 호환 ID를 생성합니다. 장치 관리자 해당 식별자를 볼 수 있습니다. 또한 디바이스 설명자는 디바이스가 지원하는 총 구성 수를 나타냅니다.
호스트는 제어 전송을 통해 디바이스 설명자를 가져옵니다. 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(500mA) |
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 필드를 확인합니다. 이 값은 인터페이스 설명자에 두 개의 문자열 설명자가 추가되었음을 나타냅니다. 문자열 설명자에는 디바이스 열거 중에 기능을 식별하는 데 사용되는 유니코드 설명이 포함되어 있습니다.
를 작성하는 경우... | 호출... |
---|---|
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 특성은 엔드포인트 형식이 등시형임을 나타냅니다. wMaxPacketSizefield는 엔드포인트가 단일 트랜잭션에서 보내거나 받을 수 있는 최대 바이트 수를 나타냅니다. 비트 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 디바이스에 대한 구성을 선택하는 방법을 참조하세요. |