11/02/2014

Device/Interface Descriptor 의 Class 와 Device Driver

1. Device/Interface Descriptor의 Class 

Device/Interface Descriptor는 Driver의 Loading과 밀접한 관계있으며,상위 두 Descriptors들은 아래 값에 따라 Class가 구분이 되어 Driver와 연관되어 동작된다.
경우에따라 본인이 Class를 제외하고 직접 정의를 하여서 구현을 해도 좋다.
  1. Class 
  2. SubClass 
  3. Protocol

  • USB Class Code 표 (반드시 확인) 
  http://www.usb.org/developers/defined_class

  • USB Device Class Documents
  http://www.usb.org/developers/docs/devclass_docs/


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
    Keyboard, Mouse 및 기타 일반적인 Input Device 이며 대중적으로 많이 사용이 되어지는
    Input Device들을 지원한다.
    이를 이용하여, 다른 Input Device로도 설계가 가능하며 본인의 용도에 맞게 Descriptor를 만들면 될 것이다.

    ClassSubClassProtocol
    03h - HID00h - None
    01h - Boot Interface
    00h - None
    01h - Keyboard
    02h - Mouse
    • 관련예제 
      http://www.usblyzer.com/usb-human-interface-device-hid-class-decoder.htm


    2.2 Hub Class 
      USB Host에서 연결되는 USB Hub를 말하며, USB의 Bridge 역할을 하는 Hub를 사용하기 위한 Class이며,
      이에 관련된 부분을 Descriptors로 구성한다.

      ClassSubClassProtocol
      09h - Hub00h00h - 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
        일반적으로 많이 사용이 되는 USB Storage를 말하며 Window에서는 FAT로 포맷해서 사용한다.
        대중적으로 많이 사용하기 때문에 일반적으로 거의 동일하게 사용이 되며, Linux에서 처음사용한다면, fdisk로 partition 을 먼저 나눈다음에, fat로 포맷을 한 후 사용하는 것이 맞다.
        USB Host에서는 일반적으로 udev를 이용하여 Auto mount 되는 shell script가 제공한다.

        ClassSubClassProtocol
        08h - MSC0x01 - 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에서 통신을 하는 일반적인 방법을 말하며, Subclass에 종류가 많으며, 이에 따라서 통신방식도 달라진다.
          현재 USB를 이용하여 Network 및 다양하게 통신 중심으로 나누어지는 Class이기 때문에 반드시 알아둬야할 것이다.
          아래의 usb분석기도 모든 CDC 정보를 가지고 있지 않아 분석이 가능하지 않다.

          ClassSubClass
          02h - CDC01h - 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 
            1. ACM(Abstract Control Model : 주로 RS-232로 사용)
            2. ECM (Ethernet Device Model)
            3. NCM (Network Control Model)
            4. RNDIS(Remote NDIS RNDIS) :  Ethernet Device이며, Host가 Window에서 많이 이용.
            5. MBIM(Mobile Broadband Interface Model) 


            • Driver Source를 확인
            1. drivers/net/usb/Kconfig  
            2. drivers/usb/net/Kconfig 
            3. driver/usb/serial/Kconfig  

              https://github.com/torvalds/linux/blob/master/drivers/net/usb/Kconfig

            • CDC-ACM (USB 위에 RS-232 Emulate한 예제)
            CDC-ACM은 RS-232으로도 통신이 가능하며, 다른 기능이 존재하는 것 같은데, 현재 주로 RS-232로 사용이 많이 되어진다.
            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의 예제
              http://blog.naver.com/PostView.nhn?blogId=inftee&logNo=60175694218

            **아래정보는 Vault Micro 제품의 CDC 관련 Driver 지원여부이며, 아래 사이트참조.

            • CDC- 기타기능 
            CDC ECM (Ethernet Devices), CDC EEM (Ethernet Emulation Devices) 부터 대용량 데이터 처리를 할 수 있도록 패킷 처리 방식을 개선한 CDC NCM (Network Control Model)까지 기능 별 사양을 정의하고 있다.

              https://en.wikipedia.org/wiki/Ethernet_over_USB



            • USB LTE 
            USB LTE는 Serial Interface (AT Command)와 PPP Interface (Data)로 구분이되어지며, Kernel에서 이를 지원을 해줘야한다.
            퀄컴은 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