Device/Interface Descriptor는 Driver의 Loading과 밀접한 관계있으며,상위 두 Descriptors들은 아래 값에 따라 Class가 구분이 되어 Driver와 연관되어 동작된다.
경우에따라 본인이 Class를 제외하고 직접 정의를 하여서 구현을 해도 좋다.
- Class
- SubClass
- Protocol
- USB Class Code 표 (반드시 확인)
- USB Device Class Documents
1.1 특별한 Class
Class와 Subclass는 각 Driver를 연결할때 중요하지만 아래와 같은 경우 특별하다.
- Base Class FEh (Application Specific)
- Base Class FFh (Vendor Specific)
이는 Vendor ID와 Product ID가 중요하며, 이에 따라 각 Driver가 연결이 된다.
각 Class는 어떻게 정의할 지는 본인이 정하자.
2. Class 와 Driver
상위 USB Device Class에 정의가 되어있다고, 각 OS가 모든 Driver를 제공을 해주는 것은 아니다.
그러므로, 각각의 Class 별로 확인을 해야한다. 물론 가장 많이 사용되는 Driver들은 OS가 거의 모두 지원을 해준다.
하지만, 다양해지다 보니, 지원과 Vendor의 Driver 역시 존재한다.
2.1 HID (Human Interface Device) Class
Input Device들을 지원한다.
이를 이용하여, 다른 Input Device로도 설계가 가능하며 본인의 용도에 맞게 Descriptor를 만들면 될 것이다.
Class | SubClass | Protocol |
---|---|---|
03h - HID | 00h - None 01h - Boot Interface | 00h - None 01h - Keyboard 02h - Mouse |
- 관련예제
2.2 Hub Class
이에 관련된 부분을 Descriptors로 구성한다.
Class | SubClass | Protocol |
---|---|---|
09h - Hub | 00h | 00h - Full-speed Hub 01h - Hi-speed Hub with single TT 02h - Hi-speed Hub with multiple TTs |
http://www.usblyzer.com/usb-hub-class-decoder.htm
2.3 Mass Storage Class
대중적으로 많이 사용하기 때문에 일반적으로 거의 동일하게 사용이 되며, Linux에서 처음사용한다면, fdisk로 partition 을 먼저 나눈다음에, fat로 포맷을 한 후 사용하는 것이 맞다.
USB Host에서는 일반적으로 udev를 이용하여 Auto mount 되는 shell script가 제공한다.
Class | SubClass | Protocol |
---|---|---|
08h - MSC | 0x01 - Reduced Block Commands (RBC) 0x02 - MMC (ATAPI) 0x05 - SFF-8070i 0x06 - SCSI transparent command set | 0x50 - Bulk-Only (BOT) Transport |
http://www.usblyzer.com/usb-mass-storage-class-msc-decoder.htm
2.4 CDC(Communication Device Class)
현재 USB를 이용하여 Network 및 다양하게 통신 중심으로 나누어지는 Class이기 때문에 반드시 알아둬야할 것이다.
아래의 usb분석기도 모든 CDC 정보를 가지고 있지 않아 분석이 가능하지 않다.
Class | SubClass |
---|---|
02h - CDC | 01h - Direct Line Control Model 02h - Abstract Control Model 03h - Telephone Control Model 04h - Multi-Channel Control Model 05h - CAPI Control Model 06h - Ethernet Networking Control Model 07h - ATM Networking Control Model 08h - Wireless Handset Control Model 09h - Device Management 0Ah - Mobile Direct Line Model 0Bh - OBEX |
http://www.usblyzer.com/usb-communication-device-class-cdc-decoder.htm
http://elixir.free-electrons.com/linux/v4.3.3/source/include/uapi/linux/usb/cdc.h#L17
- Linux 에서 많이 사용되어지는 CDC Class
- ACM(Abstract Control Model : 주로 RS-232로 사용)
- ECM (Ethernet Device Model)
- NCM (Network Control Model)
- RNDIS(Remote NDIS RNDIS) : Ethernet Device이며, Host가 Window에서 많이 이용.
- MBIM(Mobile Broadband Interface Model)
- Driver Source를 확인
- drivers/net/usb/Kconfig
- drivers/usb/net/Kconfig
- driver/usb/serial/Kconfig
https://github.com/torvalds/linux/blob/master/drivers/net/usb/Kconfig
- CDC-ACM (USB 위에 RS-232 Emulate한 예제)
GPS Module로도 이용이 가능
http://www.atmel.com/images/doc4322.pdf
https://www.keil.com/pack/doc/mw/USB/html/group__usbh__cdcacm_functions.html
- CDC- RNDIS의 예제
**아래정보는 Vault Micro 제품의 CDC 관련 Driver 지원여부이며, 아래 사이트참조.
- CDC- 기타기능
https://en.wikipedia.org/wiki/Ethernet_over_USB
- USB LTE
퀄컴은 QMI/Rmnet 이라는 Interface를 이용하여 wwan을 만들어 사용한다고한다.
LG or GCT의 경우는 제조사별로 별도의 Interface driver가 존재한다고 한다.
Vault Micro 제품
http://vaultmicro.blogspot.kr/2013/04/usb-network-protocol.html
WAN Inteface (Protocol)
https://lede-project.org/docs/user-guide/wan_interface_protocols
https://en.wikipedia.org/wiki/Wireless_WAN
USB 3G Dongle
Device Driver->USB support->USB Serial Converter support
* USB Serial Converter support (CONFIG_USB_SERIAL=y)
* USB driver for GSM and CDMA modems (CONFIG_USB_SERIAL_OPTION=y)
drivers/usb/serial/usb-serial.c
drivers/usb/serial/option.c
https://wiki.openwrt.org/doc/recipes/3gdongle
Network Configuration
https://wiki.debian.org/NetworkConfiguration
2.5 UVC or USB Video Class
Host에서 이에 관련된 Class device driver가 필요하다.
그리고, 주로 Webcam 같은 Video Stream을 전송하는 Device에서 사용이 되어지고 있다.
이것역시 개별 Version이 있어 각 Version에 따라 성능과 지원기능이 다르므로, 각 Spec을 자세히 참고하자.
https://docs.microsoft.com/ko-kr/windows-hardware/drivers/stream/usb-video-class-driver-overview
https://en.wikipedia.org/wiki/USB_video_device_class
https://en.wikipedia.org/wiki/List_of_USB_video_class_devices
- Linux UVC Driver
http://www.ideasonboard.org/uvc/
https://git.linuxtv.org/pinchartl/uvcvideo.git/
https://git.linuxtv.org/pinchartl/uvcvideo.git/tree/drivers/usb/gadget?h=uvcvideo-gadget
https://git.linuxtv.org/
- USB Video Class 1.5
https://drive.google.com/open?id=0B_ehveuLi8MVSWh2dnRwQlp0dVk