Descriptor의 역할은 Host와 Device 사이에 DATA를 어떻게 주고 받을 것인지, Interface를
어떻게 설정할지 데이타의 흐름을 어떻게 설정하지 등 구체적인 설정하는 것이다.
이 정보는 USB Device가 가지고 있어야 하며, USB Host는 이에 맞게 Driver를 연결해야한다.
- Device Descriptor (Host에서는 이를 Device로 인식)
- Configuration Descriptor (Device의 상태 및 설정)
- Interface Descriptor ( 실제 연결되는 Interface Driver 연결, HID,CDC, Mass Storage)
- Endpoint Descriptor ( 전송방식과 전송방향 ,데이타구조 정의)
- 일반적인 USB Device ( Class Device )
USB 범용으로 사용되는 Class Device Driver는 윈도우에서도 동일하게 지원을 하고 있다.
- 개별정의 USB Device
이전에는 직접 이렇게 했는데, 요즘 거의 이렇게까지 할일이 거의 없으며, 표준 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
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of the Descriptor in Bytes (18 bytes) |
1 | bDescriptorType | 1 | Constant | Device Descriptor (0x01) |
2 | bcdUSB | 2 | BCD | USB Specification Number which device complies too. |
4 | bDeviceClass | 1 | Class | Class 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. |
5 | bDeviceSubClass | 1 | SubClass | Subclass Code (Assigned by USB Org) |
6 | bDeviceProtocol | 1 | Protocol | Protocol Code (Assigned by USB Org) |
7 | bMaxPacketSize | 1 | Number | Maximum Packet Size for Zero Endpoint. Valid Sizes are 8, 16, 32, 64 |
8 | idVendor | 2 | ID | Vendor ID (Assigned by USB Org) |
10 | idProduct | 2 | ID | Product ID (Assigned by Manufacturer) |
12 | bcdDevice | 2 | BCD | Device Release Number |
14 | iManufacturer | 1 | Index | Index of Manufacturer String Descriptor |
15 | iProduct | 1 | Index | Index of Product String Descriptor |
16 | iSerialNumber | 1 | Index | Index of Serial Number String Descriptor |
17 | bNumConfigurations | 1 | Integer | Number of Possible Configurations |
중요하게 봐야 할 부분
- ID / Vendor ID: 정해진 값으로 Device 제조사에 의해 결정
- ID / Product: 정해진 값으로 Device 제조사에 의해 결정
- Class/Sub Class/Protocol :
VendorID 신청
- Configuration Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | Configuration Descriptor (0x02) |
2 | wTotalLength | 2 | Number | Total length in bytes of data returned |
4 | bNumInterfaces | 1 | Number | Number of Interfaces |
5 | bConfigurationValue | 1 | Number | Value to use as an argument to select this configuration |
6 | iConfiguration | 1 | Index | Index of String Descriptor describing this configuration |
7 | bmAttributes | 1 | Bitmap | D7 Reserved, set to 1. (USB 1.0 Bus Powered) D6 Self Powered D5 Remote Wakeup D4..0 Reserved, set to 0. |
8 | bMaxPower | 1 | mA | Maximum Power Consumption in 2mA units |
- Interface Descriptor
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes (9 Bytes) |
1 | bDescriptorType | 1 | Constant | Interface Descriptor (0x04) |
2 | bInterfaceNumber | 1 | Number | Number of Interface |
3 | bAlternateSetting | 1 | Number | Value used to select alternative setting |
4 | bNumEndpoints | 1 | Number | Number of Endpoints used for this interface |
5 | bInterfaceClass | 1 | Class | Class Code (Assigned by USB Org) |
6 | bInterfaceSubClass | 1 | SubClass | Subclass Code (Assigned by USB Org) |
7 | bInterfaceProtocol | 1 | Protocol | Protocol Code (Assigned by USB Org) |
8 | iInterface | 1 | Index | Index 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
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes (7 bytes) |
1 | bDescriptorType | 1 | Constant | Endpoint Descriptor (0x05) |
2 | bEndpointAddress | 1 | Endpoint | Endpoint Address Bits 0..3b Endpoint Number. Bits 4..6b Reserved. Set to Zero Bits 7 Direction 0 = Out, 1 = In (Ignored for Control Endpoints) |
3 | bmAttributes | 1 | Bitmap | Bits 0..1 Transfer Type
01 = Isochronous 10 = Bulk 11 = Interrupt Bits 3..2 = Synchronisation Type (Iso Mode)
01 = Asynchronous 10 = Adaptive 11 = Synchronous
01 = Feedback Endpoint 10 = Explicit Feedback Data Endpoint 11 = Reserved |
4 | wMaxPacketSize | 2 | Number | Maximum Packet Size this endpoint is capable of sending or receiving |
6 | bInterval | 1 | Number | Interval 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가지 종류
- Control Transfers: Control 하기위해 사용되며 Host에서 Device에게 명령전달
- Interrupt Transfers: 작은용량의 Data를 비동기적으로 받을경우 사용
- Isochronous Transfers: 시간에 제한되어지는 Device 사용되며, 대표적으로 telephony
- 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
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | String Descriptor (0x03) |
2 | wLANGID[0] | 2 | number | Supported Language Code Zero (e.g. 0x0409 English - United States) |
4 | wLANGID[1] | 2 | number | Supported Language Code One (e.g. 0x0c09 English - Australian) |
n | wLANGID[x] | 2 | number | Supported Language Code x (e.g. 0x0407 German - Standard) |
Offset | Field | Size | Value | Description |
0 | bLength | 1 | Number | Size of Descriptor in Bytes |
1 | bDescriptorType | 1 | Constant | String Descriptor (0x03) |
2 | bString | n | Unicode | Unicode Encoded String |
- 더 자세한 내용은 아래사이트 (상위내용은 아래에서 참고)
http://www.beyondlogic.org/usbnutshell/usb5.shtml
USB의 SETUP Packet
http://www.beyondlogic.org/usbnutshell/usb6.shtml