레이블이 IF-USB-Descriptor인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IF-USB-Descriptor인 게시물을 표시합니다. 모든 게시물 표시

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

              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