• USB Descriptors


    Standard Descriptors 

    • A Device Descriptor describes general information about a USB device.
      It includes information that applies globally to the device and
      all of the device's configurations.
      A USB device has only one device descriptor.

    • The Configuration Descriptor gives information about a specific device configuration.
      A USB device has one or more configuration descriptors.
      Each configuration has one or more interfaces and
      each interface has zero or more endpoints. < N interfaces and N endpoints >
      An endpoint is not shared among different interfaces within a single configuration,
      although a single interface can have
      several alternate settings which may use the same endpoint.
      Endpoints may be shared among interfaces that are part
      of different configurations without this restriction.
      Configurations can only be activated by the standard control transfer 
      set_configuration.
      Different configurations can be used to change global device settings, such as power consumption.

    • An Interface Descriptor describes a specific interface within a configuration.
      A configuration provides one or more interfaces, each with zero or more endpoint descriptors
      describing a unique set of endpoints within the configuration.
      An interface may include alternate settings that allow the endpoints and/or their characteristics
      to be varied after the device has been configured.
      The default setting for an interface is always alternate setting zero.
      Alternate settings can be selected exclusively by the standard control transfer set_interface.
      For example a multifunctional device like a video camera with internal microphone
      could have three alternate settings to change the bandwidth allocation on the bus. 

      Camera activated
      Microphone activated
      Camera and microphone activated
    • An Endpoint Descriptor contains information required by the host
      to determine the bandwidth requirements of each endpoint.
      An endpoint represents a logical data source or sink of a USB device.
      The endpoint zero is used for all control transfers
      and there is never a descriptor for this endpoint.
      The USB specification uses the terms pipe and endpoint interchangably.

    • String Descriptors are optional and provide additional information
      in human readable unicode format.
      They can be used for vendor and device names or serial numbers.

    • USB Interface Association Descriptor (IAD) 

      IAD是Interface Association Descriptor,功能是把多个接口定义为一个类设备。
      Windows下,IAD和Composite设备在设备管理器中没有什么区别,甚至使用的驱动也都是Composite驱动
      USB interface association descriptor 
      allows the device
      to group interfaces that belong to a function.
      The Universal Serial Bus Specification, revision 2.0,
      does not support grouping more than one interface of a composite device 
      within a single function.
      However, the USB Device Working Group (DWG) created USB device classes 
      that allow for functions with multiple interfaces, and the USB Implementor's Forum 
      issued an Engineering Change Notification (ECN) 
      that defines a mechanism for grouping interfaces.
      The ECN specifies a USB descriptor, called the Interface Association Descriptor (IAD), 
      that allows hardware manufacturers to define groupings of interfaces.
      The device classes that are most likely to use IADs include:
      USB Video Class Specification (Class Code - 0x0E)
      USB Audio Class Specification (Class Code - 0x01)
      USB Bluetooth Class Specification (Class Code - 0xE0)

      Windows 7, Windows Server 2008, Windows Vista, Microsoft Windows Server 2003 Service Pack 1 (SP1), 
      and Microsoft Windows XP Service Pack 2 (SP2) support IADs.

      Manufacturers of composite devices typically assign a value of zero ( 0x00 )
      in the device descriptor, as specified by the Universal Serial Bus Specification. 

    bDeviceClass      0x00 - defined at Interface level
    bDeviceSubClass    0x00 - Unknown
    bDeviceProtocol    0x00 - Unknown

    This allows the manufacturer to associate 
    each individual interface with a different device class and protocol.

    The USB-IF core team has devised a special class and protocol code set 
    that notifies the operating system that one or more IADs are present in device firmware. 
    A device's device descriptor must have the values that appear in the following table 
    or else the operating system will not detect 
    the device's IADs or group the device's interfaces properly.
    These code values also alert versions of Windows that do not support IADs 
    to install a special-purpose bus driver that correctly enumerates the device. 
    Without these codes in the device descriptor, the system might fail to enumerate the device, 
    or the device might not work properly.

    bDeviceClass      0xEF
    bDeviceSubClass    0x02
    bDeviceProtocol    0x01

    A device can have more than one IAD. Each IAD must be located immediately 
    before the interfaces in the interface group that the IAD describes.

    The function class (bFunctionClass), subclass (bFunctionSubclassClass), 
    and protocol (bFunctionProtocol) fields of the IAD must contain the values 
    that are specified by the USB device class that describes the interfaces in the function.

    The class and subclass fields of the IAD are not required to
    match the class and subclass fields of the interfaces 
    in the interface collection that the IAD describes.

    However, Microsoft recommends that the first interface of the collection 
    have class and subclass fields that match the class and subclass fields of the IAD. 
    The following table indicates which fields should match.

    IAD field           Corresponding interface field
    bFunctionClass         bInterfaceClass
    bFunctionSubclassClass  bInterfaceSubClass

    The bFirstInterface field of the IAD indicates the number of the first interface in the function.
    The bInterfaceCount field of the IAD indicates how many interfaces are in the interface collection.
    Interfaces in an IAD interface collection must be contiguous
    (there can be no gaps in the list of interface numbers),
    and so a count with a first interface number is sufficient
    to specify all of the interfaces in the collection. < First First+1 .. Frist+Count-1 >

    USB Interface Association Descriptor Example

    The following illustrates a descriptor layout for a composite USB device.
    The example device has two functions:

    Function 1: Video Class
    This function is defined by an interface association descriptor (IAD)
    and contains two interfaces: interface zero (0) and interface one (1).
    The system generates hardware and compatible identifiers (IDs) for the function,
    as described in Enumeration of Interface Collections on USB Devices with IADs.
    After matching the appropriate INF file, the system loads the Video Class driver stack.

    Function 2: Human Input Device
    This function contains only one interface: interface two (2).
    The system generates hardware and compatible IDs for the function,
    as described in Enumeration of Interfaces on USB Composite Devices.
    After matching the appropriate INF file, the system loads the Human Input Device (HID) class driver.

    --------------------------------------------------------------------------------
    Device Descriptor:
    --------------------------------------------------------------------------------
    BYTE  bLength             0x12
    BYTE  bDescriptorType     0x01
    WORD  bcdUSB              0x0200
    BYTE  bDeviceClass        0xEF
    BYTE  bDeviceSubClass     0x02
    BYTE  bDeviceProtocol     0x01
    BYTE  bMaxPacketSize0     0x40
    WORD  idVendor            0x045E
    WORD  idProduct           0xFFFF
    WORD  bcdDevice           0x0100
    BYTE  iManufacturer       0x01
    WORD  iProduct            0x02
    WORD  iSerialNumber       0x03
    BYTE  bNumConfigurations  0x01
    
    --------------------------------------------------------------------------------
    Configuration Descriptor:
    --------------------------------------------------------------------------------
    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x02
    WORD  wTotalLength        0x....
    BYTE  bNumInterfaces      0x03    < Interface 0, 1, 2 >
    BYTE  bConfigurationValue 0x01    
    BYTE  iConfiguration      0x01
    BYTE  bmAttributes        0x80 (BUS Powered)
    BYTE  bMaxPower           0xFA (500 mA)
    
    --------------------------------------------------------------------------------
    Interface Association Descriptor:
    --------------------------------------------------------------------------------
    BYTE  bLength             0x08
    BYTE  bDescriptorType     0x0B
    BYTE  bFirstInterface     0x00    < Interface 0 >
    BYTE  bInterfaceCount     0x02    < Interface 1 >
    BYTE  bFunctionClass      0x0E
    BYTE  bFunctionSubClass   0x03
    BYTE  bFunctionProtocol   0x00
    BYTE  iFunction           0x04
    
    --------------------------------------------------------------------------------
    Interface Descriptor (Video Control):
    --------------------------------------------------------------------------------
    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x04
    BYTE  bInterfaceNumber    0x00    < Interface 0 >   
    BYTE  bAlternateSetting   0x00
    BYTE  bNumEndpoints       0x01
    BYTE  bInterfaceClass     0x0E
    BYTE  bInterfaceSubClass  0x01
    BYTE  bInterfaceProtocol  0x00
    BYTE  iInterface          0x05
    
    Class Specific Descriptor(s):
    Endpoint Descriptor(s):
    
    --------------------------------------------------------------------------------
    Interface Descriptor (Video Streaming):
    --------------------------------------------------------------------------------
    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x04
    BYTE  bInterfaceNumber    0x01    < Interface 1 >
    BYTE  bAlternateSetting   0x00
    BYTE  bNumEndpoints       0x01
    BYTE  bInterfaceClass     0x0E
    BYTE  bInterfaceSubClass  0x02
    BYTE  bInterfaceProtocol  0x00
    BYTE  iInterface          0x06
    
    Class Specific Descriptor(s):
    Endpoint Descriptor(s):
    
    --------------------------------------------------------------------------------
    Interface Descriptor (Human Input Devices):
    --------------------------------------------------------------------------------
    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x04
    BYTE  bInterfaceNumber    0x02    < Interface 2 >  
    BYTE  bAlternateSetting   0x00
    BYTE  bNumEndpoints       0x01
    BYTE  bInterfaceClass     0x03
    BYTE  bInterfaceSubClass  0x01
    BYTE  bInterfaceProtocol  0x01
    BYTE  iInterface          0x07
    
    Class Specific Descriptor(s):
    Endpoint Descriptor(s):

      

    http://docs.oracle.com/cd/E19082-01/819-3196/usb-10/index.html

    A descriptor tree for a device with two configurations
    might look like the tree shown in the following figure.

    The dev_cfg array shown in the above figure contains nodes that correspond to configurations.
    Each node contains the following information:

    • A parsed configuration descriptor

    • A pointer to an array of descriptors that correspond to the interfaces of that configuration

    • A pointer to an array of class-specific or vendor-specific raw data, if any exists

    The node that represents the second interface of the second indexed configuration
    is atdev_cfg[1].cfg_if[1] in the diagram.

    That node contains an array of nodes that represent the alternate settings for that interface.
    The hierarchy of USB descriptors propagates through the tree.
    ASCII strings from string descriptor data are attached
    where the USB specification says these strings exist.

    The array of configurations is non-sparse and is indexed by the configuration index.
    The first valid configuration (configuration 1) is dev_cfg[0].
    Interfaces and alternate settings have indices that align with their numbers.
    Endpoints of each alternate setting are indexed consecutively.
    The first endpoint of each alternate setting is at index 0.

    This numbering scheme makes the tree easy to traverse.
    For example, the raw descriptor data of
    endpoint index 0, alternate 0, interface 1, configuration index 1
    is at the node defined by the following path:

    dev_cfg[1].cfg_if[1].if_alt[0].altif_ep[0].ep_descr

    An alternative to using the descriptor tree directly is
    using the usb_lookup_ep_data(9F) function.
    The usb_lookup_ep_data(9F) function takes as arguments
    the interface, alternate, which endpoint, endpoint type, and direction.
    You can use the usb_lookup_ep_data(9F) function
    to traverse the descriptor tree to get a particular endpoint.
    See the usb_get_dev_data(9F) man page for more information.

    http://www.beyondlogic.org/usbnutshell/usb5.shtml

     


  • 相关阅读:
    18-[模块]-shutil
    4-linux基本命令
    代码重构之移除对参数的赋值
    代码重构之分解临时变量
    代码重构之引入解释性变量
    代码重构之以查询取代临时变量
    代码重构之内联临时变量
    代码重构之内联函数
    代码重构之提取方法
    JQuery EasyUI validate 扩展
  • 原文地址:https://www.cnblogs.com/shangdawei/p/3030091.html
Copyright © 2020-2023  润新知