2017-08-05 3 views
8

J'essaie d'utiliser Google Chrome webUSB api pour accéder à un lecteur de carte connecté à mon ordinateur via USB.Erreur Google Chrome WebUSB API en essayant de revendiquer l'interface

En suivant les instructions here, tout va bien jusqu'à ce que j'essaie de réclamer l'interface qui me donne une erreur:

« Impossible de demander l'interface 0: Périphérique ou ressource occupé »

Il semble que mon OS (linux mint) a accédé à ce périphérique et ne permet pas à l'opérateur d'y avoir accès.

Des suggestions pour surmonter cela?

EDIT:

Quand je délie le pilote, je reçois l'erreur suivante:

« Impossible de demander l'interface 0: Aucun fichier ou répertoire »

est également ici la sortie de lsusb -v pour cet appareil:

Bus 001 Device 012: ID 0ca6:a050 Castles Technology Co., Ltd 
Device Descriptor: 
    bLength    18 
    bDescriptorType   1 
    bcdUSB    2.00 
    bDeviceClass   2 Communications 
    bDeviceSubClass   0 
    bDeviceProtocol   0 
    bMaxPacketSize0  64 
    idVendor   0x0ca6 Castles Technology Co., Ltd 
    idProduct   0xa050 
    bcdDevice   0.00 
    iManufacturer   1 Linux 2.6.32.9 with dwc_otg_pcd 
    iProduct    2 EFT-POS Terminal 
    iSerial     0 
    bNumConfigurations  1 
    Configuration Descriptor: 
    bLength     9 
    bDescriptorType   2 
    wTotalLength   67 
    bNumInterfaces   2 
    bConfigurationValue  2 
    iConfiguration   3 EFT-POS Terminal 
    bmAttributes   0xc0 
     Self Powered 
    MaxPower    2mA 
    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    4 CDC Abstract Control Model (ACM) 
     CDC Header: 
     bcdCDC    1.10 
     CDC Call Management: 
     bmCapabilities  0x00 
     bDataInterface   1 
     CDC ACM: 
     bmCapabilities  0x02 
      line coding and serial state 
     CDC Union: 
     bMasterInterface  0 
     bSlaveInterface   1 
     Endpoint Descriptor: 
     bLength     7 
     bDescriptorType   5 
     bEndpointAddress  0x82 EP 2 IN 
     bmAttributes   3 
      Transfer Type   Interrupt 
      Synch Type    None 
      Usage Type    Data 
     wMaxPacketSize  0x000a 1x 10 bytes 
     bInterval    32 
    Interface Descriptor: 
     bLength     9 
     bDescriptorType   4 
     bInterfaceNumber  1 
     bAlternateSetting  0 
     bNumEndpoints   2 
     bInterfaceClass  10 CDC Data 
     bInterfaceSubClass  0 Unused 
     bInterfaceProtocol  0 
     iInterface    5 CDC ACM Data 
     Endpoint Descriptor: 
     bLength     7 
     bDescriptorType   5 
     bEndpointAddress  0x81 EP 1 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  0x01 EP 1 OUT 
     bmAttributes   2 
      Transfer Type   Bulk 
      Synch Type    None 
      Usage Type    Data 
     wMaxPacketSize  0x0040 1x 64 bytes 
     bInterval    0 
Device Qualifier (for other device speed): 
    bLength    10 
    bDescriptorType   6 
    bcdUSB    2.00 
    bDeviceClass   2 Communications 
    bDeviceSubClass   0 
    bDeviceProtocol   0 
    bMaxPacketSize0  64 
    bNumConfigurations  1 
Device Status:  0x0001 
    Self Powered 
+0

La première erreur est attendue car un pilote de noyau est lié. Pour la seconde, j'ai besoin d'en savoir un peu plus sur l'appareil. Pouvez-vous poster les descripteurs complets de 'lsusb -v'? –

+0

@ReillyGrant C'était long, j'ai mis dans la partie edit de ma question. – JDrake

Répondre

2

« Aucun fichier ou répertoire » (code d'erreur ENOENT) indique généralement que le numéro d'interface fournie n'existe toutefois pas de les descripteurs ce n'est clairement pas le cas et Chrome rejetterait la promesse retournée par claimInterface avec "Le numéro d'interface fourni n'est pas supporté par l'appareil dans sa configuration actuelle." s'il pensait que le numéro d'interface était invalide avant de soumettre la requête au noyau. Je remarque, cependant, que la configuration unique prise en charge par cet appareil est bConfigurationValue de 2. Il est possible que lorsque le pilote n'a pas été lié, le système ait déconfiguré l'appareil et que la connaissance de Chrome de la configuration actuelle de l'appareil soit désynchronisé avec le système. Si vous trouvez l'appareil dans /sys/bus/usb/devices et d'imprimer le fichier bConfigurationValue il vous dira la véritable configuration actuelle de l'appareil, que je devine sera 0.

Il n'y a malheureusement actuellement aucun moyen de corriger ce décalage via l'API WebUSB Cependant, redémarrer Chrome après avoir déconnecté le pilote du noyau lui permettra de lire ce fichier au bon moment et de ne pas être désynchronisé.

Si cela fonctionne pour vous s'il vous plaît déposer un bug au crbug.com/new et nous pouvons trouver le meilleur moyen d'éviter ce problème à l'avenir.

+0

Le paramètre 'bConfigurationValue' est toujours 2 sous'/sys/bus/usb/devices'. Je redémarre Chrome et l'essaye à nouveau, tout autre chose que la configuration 2 me donne l'erreur hors de la configuration. Mais cette fois, l'erreur est retournée à: 'Impossible de revendiquer l'interface 0: Device or resource busy' bien que le périphérique soit déjà non lié. – JDrake