来自 libusb 的错误消息“未声明接口”

Posted

技术标签:

【中文标题】来自 libusb 的错误消息“未声明接口”【英文标题】:Error message 'Interface not claimed' from libusb 【发布时间】:2012-06-20 18:25:32 【问题描述】:

我正在尝试使用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,这是我能找到的最新版本。我在Ubuntu12.04_64(Precise Pangolin)上运行这个东西。

【问题讨论】:

会不会是权限问题?你试过用sudo运行你的程序吗? 是的,我试过 sudo。事实证明,一切似乎都正常,所以我假设该消息只是呈现错误的信息,而不是错误或警告。不过,我仍然非常想了解我收到此消息的原因。 Check out this solution。它可能会有所帮助。 【参考方案1】:

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

希望这会有所帮助, 干杯!

【讨论】:

【参考方案2】:

尝试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 documentation,非常好。

我运行代码时错误消息看起来还不错,但在内部它报告某个其他进程对其拥有独占声明,因此我无法使用它。

【讨论】:

【参考方案3】:

您应该检查所有结果值,然后您可以轻松找出问题所在。只需检查所有结果值是否返回您所期望的值。

验证:

libusb_open 是否返回 LIBUSB_SUCCESS? libusb_kernel_driver_active 是否返回 0 或 1,而不是错误代码? libusb_detach_kernel_driver 是否返回 LIBUSB_SUCCESS? libusb_claim_interface 是否返回 LIBUSB_SUCCESS?

【讨论】:

libusb_detach_kernel 返回 LIBUSB_ERROR_OTHER。不是很有帮助的错误消息。 您的权限正常吗?您是以 root 用户身份运行程序还是以普通用户身份运行程序?如果您以普通用户身份运行程序,请确保您对设备文件具有 rw 访问权限。

以上是关于来自 libusb 的错误消息“未声明接口”的主要内容,如果未能解决你的问题,请参考以下文章

运行 GRC 文件后出现错误消息

使用 libusb 的 Windows 应用程序:由于互斥锁导致的运行时错误

将 PC 用作带有 libusb 的 USB 主机的 Android ADK,批量传输错误

libusb系列-003-Linux下libusb源码编译

Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误

No package ‘libusb‘ found