btashton opened a new issue #3644:
URL: https://github.com/apache/incubator-nuttx/issues/3644


   USB host driver cannot handle multiple interface descriptors.  I ran into 
this when trying to use Logitech Unifying Receiver,  which has three interface 
descriptors: `Keyboard`, `Mouse`, `None`.  NuttX only supports the first one. 
   
   ```
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        0
         bAlternateSetting       0
         bNumEndpoints           1
         bInterfaceClass         3 Human Interface Device
         bInterfaceSubClass      1 Boot Interface Subclass
         bInterfaceProtocol      1 Keyboard
         iInterface              0 
           HID Device Descriptor:
             bLength                 9
             bDescriptorType        33
             bcdHID               1.11
             bCountryCode            0 Not supported
             bNumDescriptors         1
             bDescriptorType        34 Report
             wDescriptorLength      59
            Report Descriptors: 
              ** UNAVAILABLE **
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x81  EP 1 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0008  1x 8 bytes
           bInterval               8
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        1
         bAlternateSetting       0
         bNumEndpoints           1
         bInterfaceClass         3 Human Interface Device
         bInterfaceSubClass      1 Boot Interface Subclass
         bInterfaceProtocol      2 Mouse
         iInterface              0 
           HID Device Descriptor:
             bLength                 9
             bDescriptorType        33
             bcdHID               1.11
             bCountryCode            0 Not supported
             bNumDescriptors         1
             bDescriptorType        34 Report
             wDescriptorLength     148
            Report Descriptors: 
              ** UNAVAILABLE **
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x82  EP 2 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0008  1x 8 bytes
           bInterval               2
       Interface Descriptor:
         bLength                 9
         bDescriptorType         4
         bInterfaceNumber        2
         bAlternateSetting       0
         bNumEndpoints           1
         bInterfaceClass         3 Human Interface Device
         bInterfaceSubClass      0 
         bInterfaceProtocol      0 
         iInterface              0 
           HID Device Descriptor:
             bLength                 9
             bDescriptorType        33
             bcdHID               1.11
             bCountryCode            0 Not supported
             bNumDescriptors         1
             bDescriptorType        34 Report
             wDescriptorLength      98
            Report Descriptors: 
              ** UNAVAILABLE **
         Endpoint Descriptor:
           bLength                 7
           bDescriptorType         5
           bEndpointAddress     0x83  EP 3 IN
           bmAttributes            3
             Transfer Type            Interrupt
             Synch Type               None
             Usage Type               Data
           wMaxPacketSize     0x0020  1x 32 bytes
           bInterval               2
   ```
   
   Here is where we see the code handling this, with the limitation.
   ```
     if (id.base == USB_CLASS_PER_INTERFACE)
       {
         /* Get the class identification information for this device from the
          * interface descriptor(s).  Hmmm.. More logic is need to handle the
          * case of multiple interface descriptors.
          */
   
         ret = usbhost_configdesc(buffer, cfglen, &id);
         if (ret < 0)
           {
             uerr("ERROR: usbhost_configdesc failed: %d\n", ret);
             goto errout;
           }
       }
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to