[systemd-devel] WebUSB
Lars Knudsen
larsgk at gmail.com
Tue Jan 10 00:01:14 UTC 2017
On Tue, Jan 10, 2017 at 12:47 AM, Lars Knudsen <larsgk at gmail.com> wrote:
> 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.
>
Had to separate the CDC and WebUSB serial control signals completely in the
firmware driver. - now survives
>
> 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/57f45971/attachment-0001.html>
More information about the systemd-devel
mailing list