Сообщение об ошибке "Интерфейс не заявлен" от libusb

Я пытаюсь использовать libusb, но получаю следующее сообщение об ошибке:

usbfs: процесс 24665 (myprogram) не запрашивал интерфейс 0 перед использованием

Я не очень понимаю, почему, потому что, насколько я могу судить, я делаю это в соответствии с описанием, найденным в библиотеке. Вот мой код:

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

Как вы видите, я запрашиваю интерфейс перед передачей. (Я пробовал такой же код и с другими USB-устройствами, на всякий случай, если это как-то связано с этим.)

Я использую libusb-1.0.9, которая является последней версией, которую я смог найти. Я запускаю эту штуку на Ubuntu 12.04_64 (Precise Pangolin).

3 ответа

Просто была такая же проблема с libusb-1.0; У меня изначально была такая последовательность:

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

... и для этого "интерфейс не заявлен" был создан, когда первый libusb_bulk_transfer выполнено (но не последующие, не показаны выше), что я подтвердил, вступив в gdb, (кстати, это сообщение об ошибке приходит от /linux/drivers/usb/core/devio.c)

Эта страница: USB Hid Issue · Вики Yubico / yubikey-personalization · GitHub относится к исправлению libusb-0.1 который вызвал соответствующую функцию detach_driver; поэтому я начал перемещать часть "detach_driver" в своем коде тоже - и, наконец, эта последовательность, кажется, избавляется от сообщения "интерфейс не заявлен":

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

Очевидно, что если сначала драйвер отключен, а затем заявлен интерфейс - ошибки не генерируются. Но это также то, что у вас есть в OP там - так что я думаю, уловка для OP будет иметь detach, затем set configuration, и после этого claim interface...

Надеюсь это поможет,
Ура!

Пытаться calling libusb_set_debug(context, where_to) чтобы получить больше отладочной информации от libusb. Where_to для сообщений является целым числом:

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

Это из документации libusb, которая довольно хороша.

Я запустил код, в котором сообщения об ошибках выглядели просто отлично, но внутренне сообщалось, что какой-то другой процесс имел исключительную претензию, поэтому я не мог его использовать.

Вы должны проверить все значения результатов, тогда вы можете легко узнать, что происходит не так. Просто проверьте все значения результата, если они возвращают то, что вы ожидаете.

Убедитесь, что:

  • Libusb_open возвращает LIBUSB_SUCCESS?
  • Libusb_kernel_driver_active возвращает 0 или 1, а не код ошибки?
  • Libusb_detach_kernel_driver возвращает LIBUSB_SUCCESS?
  • Возвращает ли libusb_claim_interface LIBUSB_SUCCESS?
Другие вопросы по тегам