Сообщение об ошибке «Интерфейс не заявлен» от 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 (Точный панголин).


person Robert    schedule 18.06.2012    source источник
comment
Может ли быть проблема с разрешениями? Вы пытались запустить свою программу с помощью sudo?   -  person gfour    schedule 20.06.2012
comment
Да, я пробовал судо. Как оказалось, все работает нормально, поэтому я предполагаю, что сообщение представляет собой просто плохо представленную информацию, а не ошибку или предупреждение. Я все же очень хотел бы понять, почему я получаю сообщение.   -  person Robert    schedule 23.06.2012
comment
Проверьте это решение. Это может помочь.   -  person Sakib Sami    schedule 01.09.2016


Ответы (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 · Yubico/yubikey-personalization Wiki · 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...

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

person sdaau    schedule 13.11.2012

Попробуйте 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, которая довольно хороша.

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

person user1634809    schedule 30.08.2012

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

Проверять:

  • libusb_open возвращает LIBUSB_SUCCESS?
  • libusb_kernel_driver_active возвращает 0 или 1, а не код ошибки?
  • libusb_detach_kernel_driver возвращает LIBUSB_SUCCESS?
  • libusb_claim_interface возвращает LIBUSB_SUCCESS?
person Reinder    schedule 04.07.2012
comment
libusb_detach_kernel возвращает LIBUSB_ERROR_OTHER. Не очень полезное сообщение об ошибке. - person Robert; 11.07.2012
comment
Ваши привилегии в порядке? Вы запускаете свою программу как root или как обычный пользователь? Если вы запускаете свои программы как обычный пользователь, убедитесь, что у вас есть доступ rw к файлу устройства. - person Reinder; 03.09.2012