2012-06-18 6 views
8

Estoy intentando utilizar libusb, pero yo soy obtener el siguiente mensaje de error:mensaje de error 'Interfaz no reclamado' de libusb

usbfs: Proceso 24665 (miprograma) no reclamó interfaz 0 antes de su uso

Realmente no entiendo por qué, porque por lo que yo sé, lo hago de acuerdo con la descripción que se encuentra en la biblioteca. Aquí está mi código:

#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; 
} 

Como puede ver, reclamo la interfaz antes de la transferencia. (He intentado el mismo código con otros dispositivos USB también, por si acaso eso tendría algo que ver con eso.)

Estoy usando libusb-1.0.9, que es la última versión que pude encontrar. Estoy ejecutando esto en Ubuntu12.04_64 (Precise Pangolin).

+0

¿Podría ser un problema de permisos? ¿Has intentado ejecutar tu programa con 'sudo'? – gfour

+0

Sí, probé sudo. Resulta que todo parece funcionar bien, así que supongo que el mensaje es información mal presentada, en lugar de un error o una advertencia. Sin embargo, me encantaría entender por qué recibí el mensaje. – Robert

+0

[Verifique esta solución] (http://stackoverflow.com/questions/22011760/libusb-claim-interface-access-denied-java/39269489#39269489). Puede ayudar. –

Respuesta

1

Debe verificar todos los valores de resultado, luego puede averiguar fácilmente qué es lo que está fallando. Simplemente verifique todos los valores de resultados si devuelven lo que espera.

Verificar:

  • ¿El libusb_open volver LIBUSB_SUCCESS?
  • ¿libusb_kernel_driver_active devuelve 0 o 1, no es un código de error?
  • ¿libusb_detach_kernel_driver devuelve LIBUSB_SUCCESS?
  • ¿libusb_claim_interface devuelve LIBUSB_SUCCESS?
+0

libusb_detach_kernel devuelve LIBUSB_ERROR_OTHER. Mensaje de error no muy útil. – Robert

+1

¿Tienes tus privilegios? ¿Ejecutas tu programa como root o como un usuario normal? En caso de que ejecute sus programas como un usuario normal, asegúrese de tener acceso rw al archivo del dispositivo. – Reinder

3

Pruebe calling libusb_set_debug(context, where_to) para obtener más información sobre la depuración de libusb. El where_to de los mensajes es un entero:

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 

Esto es de la libusb documentation que es bastante bueno.

Ejecuto el código donde los mensajes de error se veían bien, pero internamente informaba que algún otro proceso tenía un reclamo exclusivo sobre él, por lo que no pude usarlo.

3

Acabo de tener el mismo problema con libusb-1.0; I originalmente tenía la siguiente secuencia:

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 
... 

... y para ello, se generó la "interfaz no reivindicada" cuando la primera libusb_bulk_transfer ejecutados (pero no las subsiguientes, que no se muestra más arriba), que me confirmó mediante la intensificación en gdb. (por cierto, que el mensaje de error proviene de /linux/drivers/usb/core/devio.c)

Esta página: USB Hid Issue · Yubico/yubikey-personalization Wiki · GitHub se refiere a una solución para libusb-0.1 que llama la función "detach_driver" correspondiente; así que empecé a mover la parte "detach_driver" todo en mi código también - y, finalmente, esta secuencia parece deshacerse de la "interfaz no reclamado" mensaje:

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 
... 

Al parecer, si el conductor se separa en primer lugar, y luego interfaz es reclamada - entonces no se generan errores.Pero eso es también lo que tiene en OP no - por lo que parece, el truco para OP sería tener detach, entonces set configuration, y después de eso ... claim interface

espero que esto ayude,
Salud!

Cuestiones relacionadas