다음을 통해 공유


USB 디바이스 설명자

디바이스 설명자에는 USB 디바이스에 대한 전체 정보가 포함되어 있습니다. 이 문서에서는 USB_DEVICE_DESCRIPTOR 구조에 대해 설명하고 클라이언트 드라이버가 디바이스 설명자를 가져오기 위해 get-descriptor 요청을 보내는 방법에 대한 정보를 포함합니다.

모든 USB(유니버설 직렬 버스) 디바이스는 디바이스에 대한 관련 정보를 포함하는 단일 디바이스 설명자를 제공할 수 있어야 합니다. USB_DEVICE_DESCRIPTOR 구조는 디바이스 설명자를 설명합니다. Windows는 이 정보를 사용하여 다양한 정보 집합을 파생합니다. 예를 들어 idVendoridProduct 필드는 각각 공급업체 및 제품 식별자를 지정합니다. Windows는 이러한 필드 값을 사용하여 디바이스에 대한 하드웨어 ID 를 생성합니다. 특정 디바이스의 하드웨어 ID를 보려면 다음을 수행합니다.

  1. 장치 관리자 엽니다.
  2. USB 디바이스를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  3. 속성 대화 상자에서 세부 정보 탭을 선택합니다.
  4. 속성 목록을 드롭다운합니다.
  5. 하드웨어 ID 속성 선택

값은 Windows에서 생성하는 하드웨어 ID("USB\XXX")를 나타냅니다.

USB_DEVICE_DESCRIPTOR 구조의 bcdUSB 필드는 디바이스가 준수하는 USB 사양의 버전을 나타냅니다. 예를 들어 0x0200 디바이스가 USB 2.0 사양에 따라 설계되었음을 나타냅니다. bcdDevice 값은 디바이스 정의 수정 번호를 나타냅니다.

USB 드라이버 스택은 idVendor 및 idProduct함께 bcdDevice를 사용하여 디바이스에 대한 하드웨어 및 호환 ID를 생성합니다. 장치 관리자 해당 식별자를 볼 수 있습니다. 또한 디바이스 설명자는 디바이스에서 지원하는 총 구성 수를 나타냅니다.

디바이스가 최고 속도 용량으로 연결할 때와는 다른 빠른 용량으로 호스트 컴퓨터에 연결할 때 디바이스 설명자에 다른 정보를 보고할 수 있습니다. 전원 상태 변경 중을 포함하여 연결 수명 동안 디바이스 설명자에 포함된 정보를 디바이스에서 변경해서는 안 됩니다.

호스트는 제어 전송을 통해 디바이스 설명자를 가져옵니다. 전송에서 요청 유형은 GET DESCRIPTOR이고 받는 사람은 디바이스입니다. 클라이언트 드라이버는 프레임워크 USB 대상 디바이스 개체를 사용하거나 요청 정보와 함께 URB를 전송하는 두 가지 방법 중 하나로 전송을 시작할 수 있습니다.

디바이스 설명자 가져오기

WDF(Windows 드라이버 프레임워크) 클라이언트 드라이버는 프레임워크 USB 대상 디바이스 개체를 만든 후에만 디바이스 설명자를 가져올 수 있습니다.

KMDF(커널 모드 드라이버 프레임워크) 드라이버는 WdfUsbTargetDeviceCreate를 호출하여 USB 대상 디바이스 개체에 대한 WDFUSBDEVICE 핸들을 가져와야 합니다. 일반적으로 클라이언트 드라이버는 드라이버의 EvtDevicePrepareHardware 콜백 구현에서 WdfUsbTargetDeviceCreate를 호출합니다. 그런 다음 클라이언트 드라이버는 WdfUsbTargetDeviceGetDeviceDescriptor 메서드를 호출해야 합니다. 호출이 완료되면 호출자가 할당 한 USB_DEVICE_DESCRIPTOR 구조에서 디바이스 설명자를 받습니다.

UMDF(사용자 모드 드라이버 프레임워크) 드라이버는 IWDFUsbTargetDevice 포인터에 대한 프레임워크 디바이스 개체를 쿼리한 다음 IWDFUsbTargetDevice::RetrieveDescriptor 메서드를 호출하고 설명자 형식으로 USB_DEVICE_DESCRIPTOR_TYPE 지정해야 합니다.

호스트는 URB를 전송하여 디바이스 설명자를 가져올 수도 있습니다. 이 메서드는 커널 모드 드라이버에만 적용됩니다. 그러나 드라이버가 WDM(Windows 드라이버 모델)을 기반으로 하지 않는 한 클라이언트 드라이버는 이러한 유형의 요청에 대해 URB를 보낼 필요가 없습니다. 이러한 드라이버는 URB 구조를 할당한 다음, UsbBuildGetDescriptorRequest 매크로를 호출하여 요청에 대한 URB 형식을 지정해야 합니다. 그런 다음 드라이버는 URB를 USB 드라이버 스택에 제출하여 요청을 보낼 수 있습니다. 자세한 내용은 URB를 제출하는 방법을 참조하세요.

이 코드 예제에서는 적절한 URB를 사용하여 pURB가 가리키는 버퍼의 형식을 지정하는 UsbBuildGetDescriptorRequest 호출을 보여 줍니다.

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
);

샘플 디바이스 설명자

이 예제에서는 USBView 애플리케이션을 사용하여 가져온 USB 웹캠 디바이스의 디바이스 설명자(USB 디바이스 레이아웃 참조)를 보여줍니다.

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, bDeviceSubClassbDeviceProtocol 값을 확인합니다. 이러한 값은 디바이스에 함수당 여러 인터페이스를 그룹화하는 데 사용할 수 있는 하나 이상의 USB 인터페이스 연결 설명자가 포함되어 있음을 나타냅니다. 자세한 내용은 USB 인터페이스 연결 설명자를 참조 하세요.

다음으로, bMaxPacketSize0 값을 참조하세요. 이 값은 기본 엔드포인트의 최대 패킷 크기를 나타냅니다. 이 샘플 디바이스는 기본 엔드포인트를 통해 최대 64바이트의 데이터를 전송할 수 있습니다.

일반적으로 디바이스를 구성하기 위해 클라이언트 드라이버는 디바이스 설명자를 받은 후 디바이스에서 지원되는 구성에 대한 정보를 가져옵니다. 디바이스에서 지원하는 구성 수를 확인하려면 반환된 구조체의 bNumConfigurations 멤버를 검사합니다. 이 디바이스는 하나의 구성을 지원합니다. USB 구성에 대한 정보를 얻으려면 드라이버에서 USB 구성 설명자를 가져와야 합니다.