[systemd-devel] WebUSB

Lars Knudsen larsgk at gmail.com
Mon Jan 9 23:47:51 UTC 2017


A small update:  When the modemmanager finishes probing (~16 secs after
connection) data seems to stop flowing in from the WebUSB bulk endpoint
also.  It is, however, possible to reconnect and get data again - so I need
to see if there should be anything in the mbed firmware causing that
behavior or there is some sort of silent reset of interfaces/endpoints
happening on the linux side when probing is done.

On Tue, Jan 10, 2017 at 12:11 AM, Lars Knudsen <larsgk at gmail.com> wrote:

> I finally managed to make a configuration that *seems* to work and I
> realize that I may have had something else blocking the WebUSB interface
> (2) while modemmanager was communicating with the CDC_ACM interface (1).
>
> I made a clean arbitrary VID/PID and get what seems to be a functioning
> WebUSB (now) while modemmanager sends "AT...AT..." to the CDC interface -
> so while I thought the modemmanager grabbed my WebUSB interface part, it
> must have been because of a faulty combination on my side - my apologies.
> WebUSB actually *does* seem to give immediate "bulk" access to a device
> otherwise claimed by modemmanager - a very nice option to have and sorry
> for the confusion I had that modemmanager grabbed more interfaces than it
> should have.
>
> Still, the original request still stands and please tell me if it's a
> viable path:
>
> 1.  If a device has a WebUSB descriptor, it's most probably *not* a modem
> - and should in stead be considered a device that in this rare case needs
> to be whitelisted (as modem), while defaulting to not being it.  This is to
> ease the usage from non-browsers to the same hardware, which can then
> happen immediately and not be required to fail and wait over the
> modemmanager probing period (30 sec?) - related to modemmanager
> 2. If a device has a WebUSB descriptor, at least the interface linked to
> WebUSB should be made accessible in user land by default so no average user
> has to figure out how to do udev rules - related to udev/systemd
>
> my headers that seem to work now for the case above:
>
> Bus 002 Device 089: ID 1209:d010 InterBiometrics
> Device Descriptor:
>   bLength                18
>   bDescriptorType         1
>   bcdUSB               2.10
>   bDeviceClass            0 (Defined at Interface level)
>   bDeviceSubClass         0
>   bDeviceProtocol         0
>   bMaxPacketSize0        64
>   idVendor           0x1209 InterBiometrics
>   idProduct          0xd010
>   bcdDevice            0.01
>   iManufacturer           1 empriKit
>   iProduct                2 empriKit|MOTION
>   iSerial                 3 00.01
>   bNumConfigurations      1
>   Configuration Descriptor:
>     bLength                 9
>     bDescriptorType         2
>     wTotalLength           90
>     bNumInterfaces          3
>     bConfigurationValue     1
>     iConfiguration          0
>     bmAttributes         0xc0
>       Self Powered
>     MaxPower              100mA
>     Interface Descriptor:
>       bLength                 9
>       bDescriptorType         4
>       bInterfaceNumber        0
>       bAlternateSetting       0
>       bNumEndpoints           1
>       bInterfaceClass         2 Communications
>       bInterfaceSubClass      2 Abstract (modem)
>       bInterfaceProtocol      1 AT-commands (v.25ter)
>       iInterface              0
>       CDC Header:
>         bcdCDC               1.10
>       CDC Call Management:
>         bmCapabilities       0x03
>           call management
>           use DataInterface
>         bDataInterface          1
>       CDC ACM:
>         bmCapabilities       0x02
>           line coding and serial state
>       CDC Union:
>         bMasterInterface        0
>         bSlaveInterface         1
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x81  EP 1 IN
>         bmAttributes            3
>           Transfer Type            Interrupt
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0010  1x 16 bytes
>         bInterval              16
>     Interface Descriptor:
>       bLength                 9
>       bDescriptorType         4
>       bInterfaceNumber        1
>       bAlternateSetting       0
>       bNumEndpoints           2
>       bInterfaceClass        10 CDC Data
>       bInterfaceSubClass      0 Unused
>       bInterfaceProtocol      0
>       iInterface              0
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x82  EP 2 IN
>         bmAttributes            2
>           Transfer Type            Bulk
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0040  1x 64 bytes
>         bInterval               0
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x02  EP 2 OUT
>         bmAttributes            2
>           Transfer Type            Bulk
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0040  1x 64 bytes
>         bInterval               0
>     Interface Descriptor:
>       bLength                 9
>       bDescriptorType         4
>       bInterfaceNumber        2
>       bAlternateSetting       0
>       bNumEndpoints           2
>       bInterfaceClass       255 Vendor Specific Class
>       bInterfaceSubClass      0
>       bInterfaceProtocol      0
>       iInterface              0
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x85  EP 5 IN
>         bmAttributes            2
>           Transfer Type            Bulk
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0040  1x 64 bytes
>         bInterval               0
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x05  EP 5 OUT
>         bmAttributes            2
>           Transfer Type            Bulk
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0040  1x 64 bytes
>         bInterval               0
> Binary Object Store Descriptor:
>   bLength                 5
>   bDescriptorType        15
>   wTotalLength           29
>   bNumDeviceCaps          1
>   ** UNRECOGNIZED:  18 10 05 00 38 b6 08 34 a9 09 a0 47 8b fd a0 76 88 15
> b6 65 00 01 57 02
> Device Status:     0x0001
>   Self Powered
>
>
> On Mon, Jan 9, 2017 at 10:32 PM, Reilly Grant <me at reilly.io> wrote:
>
>> On 2017-01-09 9:55 am, Greg KH wrote:
>>
>>> On Mon, Jan 09, 2017 at 06:13:04PM +0100, Bjørn Mork wrote:
>>>
>>>> Greg KH <greg at kroah.com> writes:
>>>> > On Mon, Jan 09, 2017 at 09:40:59AM +0000, Kenneth Rohde Christiansen
>>>> wrote:
>>>> >> Web USB can only grab devices which has special Web USB headers. It
>>>> can not
>>>> >> grab any USB device.
>>>> >>
>>>> >> https://wicg.github.io/webusb/#webusb-descriptors
>>>> >
>>>> > Ah, fun :(
>>>> >
>>>> > So, we can add a quirk into the kernel cdc-acm driver to never bind
>>>> to a
>>>> > device that has the wusb platform capability descriptor,
>>>>
>>>> I fail to see why a quirk should be necessary. New device classes are
>>>> expected to use new class/subclass codes distintly different from
>>>> anything handled by existing class drivers.
>>>>
>>>
>>> One would hope, but it seems like they want to piggy-back on the cdc-acm
>>> spec.  But I could be totally wrong here, does anyone have the actual
>>> descriptor dump of a device anywhere?
>>>
>>
>> We don't want to piggy-back on the CDC-ACM spec. A WebUSB device should
>> always have its interfaces marked vendor-specific. Below is an example of a
>> device which implements both a CDC-ACM interface and a WebUSB interface. As
>> far as I've noticed ModemManager has not interfered with the browser
>> accessing this device but Lars has observed this behavior. What I have had
>> to do, however, is add a udev rule which sets ownership on the devnode so
>> that the browser can access it as an unprivileged user-space application.
>> What would be nice to have from systemd-udevd is a way to write a rule that
>> will detect the presence of WebUSB descriptors (which is a BOS capability
>> descriptor) and set ownership accordingly.
>>
>> Bus 002 Device 040: ID 2341:8037 Arduino SA
>> Device Descriptor:
>>   bLength                18
>>   bDescriptorType         1
>>   bcdUSB               2.10
>>   bDeviceClass            0 (Defined at Interface level)
>>   bDeviceSubClass         0
>>   bDeviceProtocol         0
>>   bMaxPacketSize0        64
>>   idVendor           0x2341 Arduino SA
>>   idProduct          0x8037
>>   bcdDevice            1.00
>>   iManufacturer           1 Arduino LLC
>>   iProduct                2 Arduino Micro
>>   iSerial                 3 WUARTR
>>   bNumConfigurations      1
>>   Configuration Descriptor:
>>     bLength                 9
>>     bDescriptorType         2
>>     wTotalLength           98
>>     bNumInterfaces          3
>>     bConfigurationValue     1
>>     iConfiguration          0
>>     bmAttributes         0xa0
>>       (Bus Powered)
>>       Remote Wakeup
>>     MaxPower              500mA
>>     Interface Association:
>>       bLength                 8
>>       bDescriptorType        11
>>       bFirstInterface         0
>>       bInterfaceCount         2
>>       bFunctionClass          2 Communications
>>       bFunctionSubClass       2 Abstract (modem)
>>       bFunctionProtocol       1 AT-commands (v.25ter)
>>       iFunction               0
>>     Interface Descriptor:
>>       bLength                 9
>>       bDescriptorType         4
>>       bInterfaceNumber        0
>>       bAlternateSetting       0
>>       bNumEndpoints           1
>>       bInterfaceClass         2 Communications
>>       bInterfaceSubClass      2 Abstract (modem)
>>       bInterfaceProtocol      0 None
>>       iInterface              0
>>       CDC Header:
>>         bcdCDC               1.10
>>       CDC Call Management:
>>         bmCapabilities       0x01
>>           call management
>>         bDataInterface          1
>>       CDC ACM:
>>         bmCapabilities       0x06
>>           sends break
>>           line coding and serial state
>>       CDC Union:
>>         bMasterInterface        0
>>         bSlaveInterface         1
>>       Endpoint Descriptor:
>>         bLength                 7
>>         bDescriptorType         5
>>         bEndpointAddress     0x81  EP 1 IN
>>         bmAttributes            3
>>           Transfer Type            Interrupt
>>           Synch Type               None
>>           Usage Type               Data
>>         wMaxPacketSize     0x0010  1x 16 bytes
>>         bInterval              64
>>     Interface Descriptor:
>>       bLength                 9
>>       bDescriptorType         4
>>       bInterfaceNumber        1
>>       bAlternateSetting       0
>>       bNumEndpoints           2
>>       bInterfaceClass        10 CDC Data
>>       bInterfaceSubClass      0 Unused
>>       bInterfaceProtocol      0
>>       iInterface              0
>>       Endpoint Descriptor:
>>         bLength                 7
>>         bDescriptorType         5
>>         bEndpointAddress     0x02  EP 2 OUT
>>         bmAttributes            2
>>           Transfer Type            Bulk
>>           Synch Type               None
>>           Usage Type               Data
>>         wMaxPacketSize     0x0040  1x 64 bytes
>>         bInterval               0
>>       Endpoint Descriptor:
>>         bLength                 7
>>         bDescriptorType         5
>>         bEndpointAddress     0x83  EP 3 IN
>>         bmAttributes            2
>>           Transfer Type            Bulk
>>           Synch Type               None
>>           Usage Type               Data
>>         wMaxPacketSize     0x0040  1x 64 bytes
>>         bInterval               0
>>     Interface Descriptor:
>>       bLength                 9
>>       bDescriptorType         4
>>       bInterfaceNumber        2
>>       bAlternateSetting       0
>>       bNumEndpoints           2
>>       bInterfaceClass       255 Vendor Specific Class
>>       bInterfaceSubClass      0
>>       bInterfaceProtocol      0
>>       iInterface              0
>>       Endpoint Descriptor:
>>         bLength                 7
>>         bDescriptorType         5
>>         bEndpointAddress     0x04  EP 4 OUT
>>         bmAttributes            2
>>           Transfer Type            Bulk
>>           Synch Type               None
>>           Usage Type               Data
>>         wMaxPacketSize     0x0040  1x 64 bytes
>>         bInterval               0
>>       Endpoint Descriptor:
>>         bLength                 7
>>         bDescriptorType         5
>>         bEndpointAddress     0x85  EP 5 IN
>>         bmAttributes            2
>>           Transfer Type            Bulk
>>           Synch Type               None
>>           Usage Type               Data
>>         wMaxPacketSize     0x0040  1x 64 bytes
>>         bInterval               0
>> Binary Object Store Descriptor:
>>   bLength                 5
>>   bDescriptorType        15
>>   wTotalLength           57
>>   bNumDeviceCaps          2
>> FIXME: alloc bigger buffer for device capability descriptors
>> Device Status:     0x0000
>>   (Bus Powered)
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/systemd-devel/attachments/20170110/0c84486e/attachment-0001.html>


More information about the systemd-devel mailing list