2012-06-18 6 views
8

Sto cercando di usare libusb, ma io sono il seguente messaggio di errore:Messaggio di errore 'interfaccia non reclamati' dal libusb

usbfs: processo di 24665 (myprogram) non rivendicare l'interfaccia 0 prima dell'uso

Non capisco davvero perché, perché per quanto posso dire, lo sto facendo secondo la descrizione trovata nella libreria. Ecco il mio codice:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 

#include <libusb.h> 

int main(void) 
{ 
    int result; 
    struct libusb_device_descriptor desc; 
    libusb_device **list; 
    libusb_device *my_device = NULL; 

    result = libusb_init(NULL); 
    libusb_set_debug(NULL, 3); 

    ssize_t count = libusb_get_device_list(NULL, &list); 
    for (int i = 0; i < count; i++) { 
     libusb_device *device = list[i]; 
     result = libusb_get_device_descriptor(device, &desc); 
     if((desc.idVendor == 0x03f0) && (desc.idProduct == 0x241d)) { 
      my_device = device; 
      break; 
     } 
    } 

    if(my_device != NULL) { 
     libusb_device_handle *handle; 
     result = libusb_open(my_device, &handle); 
     int kernelActive = libusb_kernel_driver_active(handle, 0); 
     if(kernelActive == 1) { 
      result = libusb_detach_kernel_driver(handle, 0); 
     } 
     result = libusb_claim_interface (handle, 0); 
     result = libusb_control_transfer(handle,0x21,34,0x0003,0,NULL,0,0); 
     result = libusb_release_interface (handle, 0); 

     if(kernelActive == 1) { 
      result = libusb_attach_kernel_driver(handle, 0); 
     } 
     libusb_close(handle); 
    } 
    libusb_free_device_list(list, 1); 
    libusb_exit(NULL); 
    return EXIT_SUCCESS; 
} 

Come si può vedere, rivendico l'interfaccia prima del trasferimento. (Ho provato lo stesso codice con altri dispositivi USB, nel caso avessi qualcosa a che fare con esso.)

Sto usando libusb-1.0.9, che è l'ultima versione che ho trovato. Sto facendo funzionare questa cosa su Ubuntu12.04_64 (Precise Pangolin).

+0

Potrebbe essere un problema di autorizzazioni? Hai provato a eseguire il tuo programma con 'sudo'? – gfour

+0

Sì, ho provato sudo. A quanto pare, tutto sembra funzionare bene, quindi presumo che il messaggio sia solo un'informazione mal presentata, piuttosto che un errore o un avvertimento. Mi piacerebbe ancora molto capire perché ho ricevuto il messaggio, però. – Robert

+0

[Dai un'occhiata a questa soluzione] (http://stackoverflow.com/questions/22011760/libusb-claim-interface-access-denied-java/39269489#39269489). Potrebbe essere d'aiuto –

risposta

1

È necessario controllare tutti i valori dei risultati, quindi è possibile scoprire facilmente cosa non funziona. Basta controllare tutti i valori dei risultati se restituiscono ciò che ti aspetti.

Verificare:

  • Does libusb_open tornare LIBUSB_SUCCESS?
  • libusb_kernel_driver_active restituisce 0 o 1, non un codice di errore?
  • libusb_detach_kernel_driver restituisce LIBUSB_SUCCESS?
  • Fa libusb_claim_interface restituisce LIBUSB_SUCCESS?
+0

libusb_detach_kernel restituisce LIBUSB_ERROR_OTHER. Messaggio di errore non molto utile. – Robert

+1

I tuoi privilegi sono favorevoli? Esegui il tuo programma come utente root o come utente normale? Se esegui i tuoi programmi come utente normale, assicurati di avere accesso rw al file del dispositivo. – Reinder

3

Provare calling libusb_set_debug(context, where_to) per ottenere ulteriori informazioni di debug da libusb. Il Where_to per i messaggi è un numero intero:

Level 0: no messages ever printed by the library (default) 
Level 1: error messages are printed to stderr 
Level 2: warning and error messages are printed to stderr 
Level 3: informational messages are printed to stdout, warning and error messages are printed to stderr 

Questo è dal libusb documentation che è abbastanza buono.

Ho eseguito il codice in cui i messaggi di errore sembravano soddisfacenti, ma internamente ha riportato che alcuni altri processi avevano un reclamo esclusivo su di esso, quindi non potevo usarlo.

3

Appena avuto lo stesso problema con libusb-1.0; Inizialmente avevo questa sequenza:

libusb_init 
libusb_open_device_with_vid_pid 
libusb_reset_device 
libusb_get_device 
libusb_reset_device 
libusb_set_configuration 
libusb_claim_interface 
libusb_set_interface_alt_setting 
libusb_get_device_descriptor 
libusb_get_bus_number 
libusb_get_device_address 
libusb_get_string_descriptor_ascii 
if(libusb_kernel_driver_active..) 
    if(libusb_detach_kernel_driver..) 
libusb_bulk_transfer 
... 

... e per esso, il "interfaccia non rivendicato" è stata generata quando il primo libusb_bulk_transfer eseguito (ma non quelli successivi, non mostrato sopra), che ho confermato intervenendo gdb. (btw, il messaggio di errore viene da /linux/drivers/usb/core/devio.c)

Questa pagina: USB Hid Issue · Yubico/yubikey-personalization Wiki · GitHub si riferisce ad una correzione per libusb-0.1 che chiama la funzione corrispondente "detach_driver"; così ho iniziato a spostare la parte "detach_driver" intorno nel mio codice troppo - e, infine, questa sequenza sembra liberarsi della "interfaccia non sostenuto" un messaggio:

libusb_init 
libusb_open_device_with_vid_pid 
if(libusb_kernel_driver_active..) 
    if(libusb_detach_kernel_driver..) 
libusb_reset_device 
libusb_get_device 
libusb_set_configuration 
libusb_claim_interface 
libusb_set_interface_alt_setting 
libusb_get_device_descriptor 
libusb_get_bus_number 
libusb_get_device_address 
libusb_get_string_descriptor_ascii 
libusb_bulk_transfer 
... 

A quanto pare, se il conducente viene prima staccata, e poi l'interfaccia è richiesta, quindi non vengono generati errori.Ma questo è anche quello che hai in OP là - così mi pare, il trucco per OP sarebbe avere detach, poi set configuration, e dopo che claim interface ...

Spero che questo aiuti,
Cheers!