10/19/2014

USB Device Descriptor 기본구조

1. USB의 Descriptor 의 역할 

Descriptor의 역할은 Host와 Device 사이에 DATA를 어떻게 주고 받을 것인지, Interface를
어떻게 설정할지 데이타의 흐름을 어떻게 설정하지 등 구체적인 설정하는 것이다.

이 정보는 USB Device가 가지고 있어야 하며, USB Host는 이에 맞게 Driver를 연결해야한다.
  1. Device Descriptor  (Host에서는 이를 Device로 인식)
  2. Configuration Descriptor (Device의 상태 및 설정)
  3. Interface Descriptor  ( 실제 연결되는 Interface Driver 연결, HID,CDC, Mass Storage)
  4. Endpoint Descriptor ( 전송방식과 전송방향 ,데이타구조 정의)

  • 일반적인 USB Device ( Class Device )
대표적인 USB Host에는 기본적으로 많이 사용이 되는 Class Device Driver 들이 존재하며 Device가 연결될때 이 Class Device Driver 연결한다.
USB 범용으로 사용되는 Class Device Driver는 윈도우에서도 동일하게 지원을 하고 있다.

  • 개별정의 USB Device 
만약 별도의 USB Device가 본인이 직접 설정하여 Descriptor 구성을 한다면 USB Host에서 별도의 Device Driver는 만들어 구성했지만,
이전에는 직접 이렇게 했는데, 요즘 거의 이렇게까지 할일이 거의 없으며, 표준 Class Device Driver 에 연결하여 사용한다.


  http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/wd_usb_arch.html

2. USB의 Device Descriptors의 구조 

Device -> Coifnguration-> Interface -> Endpoint Tree 형태로 구성이 되어있으며, 각각의 Descriptor 에 하단의 Descritor의 갯수를 정의하여, 각 구성이 가능하다.





Configuration Descriptor 는 각각의 Interface Descriptor 가지고 있으며, 이는Host에서  Device Driver 에서 Device/Interface의 Class 정보를 가지고 
각 Class Device Driver를 구동을 하여 실행이 가능하다. 







3. USB Descriptor 의 Table 구성 

실제 USB Device의 Descriptor의 구성을 살펴보자.

  • Device Descriptor 
USB Device 의 최상위에 있는 Descriptor로 Vendor 정보와 Class 정보를 가지고 있다.

0bLength1NumberSize of the Descriptor in Bytes (18 bytes)
1bDescriptorType1ConstantDevice Descriptor (0x01)
2bcdUSB2BCDUSB Specification Number which device complies too.
4bDeviceClass1ClassClass Code (Assigned by USB Org)
If equal to Zero, each interface specifies it’s own class code
If equal to 0xFF, the class code is vendor specified.
Otherwise field is valid Class Code.
5bDeviceSubClass1SubClassSubclass Code (Assigned by USB Org)
6bDeviceProtocol1ProtocolProtocol Code (Assigned by USB Org)
7bMaxPacketSize1NumberMaximum Packet Size for Zero Endpoint. Valid Sizes are 8, 16, 32, 64
8idVendor2IDVendor ID (Assigned by USB Org)
10idProduct2IDProduct ID (Assigned by Manufacturer)
12bcdDevice2BCDDevice Release Number
14iManufacturer1IndexIndex of Manufacturer String Descriptor
15iProduct1IndexIndex of Product String Descriptor
16iSerialNumber1IndexIndex of Serial Number String Descriptor
17bNumConfigurations1IntegerNumber of Possible Configurations

중요하게 봐야 할 부분

  1. ID / Vendor ID: 정해진 값으로 Device 제조사에 의해 결정  
  2. ID / Product: 정해진 값으로 Device 제조사에 의해 결정 
  3. Class/Sub Class/Protocol : 

VendorID 신청 


  • Configuration Descriptor 

0bLength1NumberSize of Descriptor in Bytes
1bDescriptorType1ConstantConfiguration Descriptor (0x02)
2wTotalLength2NumberTotal length in bytes of data returned
4bNumInterfaces1NumberNumber of Interfaces
5bConfigurationValue1NumberValue to use as an argument to select this configuration
6iConfiguration1IndexIndex of String Descriptor describing this configuration
7bmAttributes1BitmapD7 Reserved, set to 1. (USB 1.0 Bus Powered)
D6 Self Powered
D5 Remote Wakeup
D4..0 Reserved, set to 0.
8bMaxPower1mAMaximum Power Consumption in 2mA units

  • Interface Descriptor 
가장 중요한 Interface Descriptor 이며, 이는 곳 Driver와 관계가 되니 잘봐야한다.

0bLength1NumberSize of Descriptor in Bytes (9 Bytes)
1bDescriptorType1ConstantInterface Descriptor (0x04)
2bInterfaceNumber1NumberNumber of Interface
3bAlternateSetting1NumberValue used to select alternative setting
4bNumEndpoints1NumberNumber of Endpoints used for this interface
5bInterfaceClass1ClassClass Code (Assigned by USB Org)
6bInterfaceSubClass1SubClassSubclass Code (Assigned by USB Org)
7bInterfaceProtocol1ProtocolProtocol Code (Assigned by USB Org)
8iInterface1IndexIndex of String Descriptor Describing this interface



USB의 Class 정보
  https://www.usb.org/defined-class-codes

Interface Decirptor
  https://www.beyondlogic.org/usbnutshell/usb5.shtml#InterfaceDescriptors

  • Endpoint Descriptor 

0bLength1NumberSize of Descriptor in Bytes (7 bytes)
1bDescriptorType1ConstantEndpoint Descriptor (0x05)
2bEndpointAddress1EndpointEndpoint Address
Bits 0..3b Endpoint Number.
Bits 4..6b Reserved. Set to Zero
Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints)
3bmAttributes1BitmapBits 0..1 Transfer Type
    00 = Control
    01 = Isochronous
    10 = Bulk
    11 = Interrupt
Bits 2..7 are reserved. If Isochronous endpoint,
Bits 3..2 = Synchronisation Type (Iso Mode)

    00 = No Synchonisation
    01 = Asynchronous
    10 = Adaptive
    11 = Synchronous
Bits 5..4 = Usage Type (Iso Mode)
    00 = Data Endpoint
    01 = Feedback Endpoint
    10 = Explicit Feedback Data Endpoint
    11 = Reserved
4wMaxPacketSize2NumberMaximum Packet Size this endpoint is capable of sending or receiving
6bInterval1NumberInterval for polling endpoint data transfers. Value in frame counts. Ignored for Bulk & Control Endpoints. Isochronous must equal 1 and field may range from 1 to 255 for interrupt endpoints.

각 Endpoint 마다 Transer Type을 정의하고 Endpoint를 2 (In/Out)개 혹은 그 이상으로 정의하여 각각의 Stream Pipe 구성한다.


  • USB Transfer Type은 총 4가지 종류
  1. Control Transfers: Control 하기위해 사용되며 Host에서 Device에게 명령전달
  2. Interrupt Transfers: 작은용량의 Data를 비동기적으로 받을경우 사용 
  3. Isochronous Transfers: 시간에 제한되어지는 Device 사용되며, 대표적으로 telephony
  4. Bulk Transfers: 많은용량으로 사용할 경우 사용하며, 대표적으로 Mass Storage 


Endpoint의 통신방식
  http://www.beyondlogic.org/usbnutshell/usb4.shtml
  http://www.jungo.com/st/support/documentation/windriver/10.2.1/wdusb_manual.mhtml/USB_data_transfer_types.html

  • String Descriptor 

0bLength1NumberSize of Descriptor in Bytes
1bDescriptorType1ConstantString Descriptor (0x03)
2wLANGID[0]2numberSupported Language Code Zero
(e.g. 0x0409 English - United States)
4wLANGID[1]2numberSupported Language Code One
(e.g. 0x0c09 English - Australian)
nwLANGID[x]2numberSupported Language Code x
(e.g. 0x0407 German - Standard)


0bLength1NumberSize of Descriptor in Bytes
1bDescriptorType1ConstantString Descriptor (0x03)
2bStringnUnicodeUnicode Encoded String


  • 더 자세한 내용은 아래사이트 (상위내용은 아래에서 참고)
USB Descriptor의 구조
  http://www.beyondlogic.org/usbnutshell/usb5.shtml

USB의 SETUP Packet
  http://www.beyondlogic.org/usbnutshell/usb6.shtml