libusb_open在Windows 7上返回'LIBUSB_ERROR_NOT_SUPPORTED'

时间:2013-06-27 18:01:57

标签: libusb

我一直在Linux上使用LibUSB开发USB驱动程序,但现在我想为Windows编译我的一个驱动程序(这是我第一次这样做)。

我的环境

我使用MinGW编译器(也使用Dev-cpp IDE)在Windows 7上工作,我正在使用从this link下载的预编译libusb库。

我的设备:这是一款HID触控设备。因此Windows不需要驱动程序。我有一个额外的端点来获取某些调试数据。

我的代码:

我已编译代码列出连接到我的机器的所有设备和USB设备,代码可以正常工作。现在我添加代码来打开设备,以便获得设备句柄并开始通信。但该函数返回-12即 LIBUSB_ERROR_NOT_SUPPORTED

如何解决此问题?

我在互联网上搜索并没有找到解决这个问题的明确方法。虽然它的代码在Linux上运行得很好。

P.S。:我在下面添加了整个代码。 DoList();函数运行正常,但GetTRSDevice();函数在libusb_open(dev, &handle);处失败。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>


libusb_device_handle* deviceHandle = NULL;

int DoList();
libusb_device_handle* GetTRSDevice(void);

int main()
{
    int ret = libusb_init(NULL);
    if (ret < 0) {
        printf("Failed to init libusb");
        return ret;
    }

    DoList();
    deviceHandle = GetTRSDevice();
    if(!deviceHandle) {
        printf("Failed to locate device");
        goto fail_dev_open;
    }

    printf("Device opened");

    libusb_close(deviceHandle);
    fail_dev_open:
        libusb_exit(NULL);

    return(ret);
}

int DoList()
{
    libusb_device **devs;
    ssize_t cnt;


    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0)
        return (int) cnt;

    libusb_device *dev;
    int i = 0;

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            fprintf(stderr, "failed to get device descriptor");
            return(-1);
        }

        printf("%04x:%04x (bus %d, device %d)\n",
               desc.idVendor, desc.idProduct,
               libusb_get_bus_number(dev), libusb_get_device_address(dev));
    }
    libusb_free_device_list(devs, 1);
    return 0;
}

libusb_device_handle* GetTRSDevice(void)
{
    int i = 0;
    ssize_t cnt;
    libusb_device *dev;
    libusb_device **devs;
    libusb_device_handle* handle = NULL;

    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0) {
        printf("Failed libusb_get_device_list");
        return(0);
    }

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int ret = libusb_get_device_descriptor(dev, &desc);
        if (ret < 0) {
            printf("Failed libusb_get_device_descriptor");
            continue;
        }
        if(desc.idVendor == 0X238f && desc.idProduct == 1) {
            int ret = libusb_open(dev, &handle);
            if (ret < 0) {
                printf("Failed libusb_open: %d\n\r",ret);
                break;
            }
            #ifndef WIN32
                libusb_detach_kernel_driver(handle, 0);
            #endif
            ret = libusb_claim_interface(handle,0);
            if (ret < 0) {
                libusb_close(handle);
                handle=NULL;
                break;
            }
            break;
        }
    }
    libusb_free_device_list(devs, 1);
    return(handle);
}

4 个答案:

答案 0 :(得分:10)

您似乎需要安装winusb驱动程序 - libusb可以获取有关没有此驱动程序的设备的信息,但无法打开它们。

http://libusb.6.n5.nabble.com/LIBUSB-ERROR-NOT-SUPPORTED-td5617169.html

  

2012年4月4日星期三下午11:52,QuânPhạmMinh&lt; [隐藏电子邮件]&gt;   写道:

     
    

虽然我从不安装winusb驱动程序,但我使用libusb来获取     我的usb信息(金斯顿usb,已经     通过系统识别)

  
     

是的,这是可能的。但是你无法打开设备并继续做下去   的东西。对于新用户而言,这是一个令人困惑的部分   libusb Windows后端,同样适用于Mac OS X. libusb的   可以获得具有不正确驱动程序的设备的一些基本信息   (例如:USB大容量存储设备),但无法打开   设备没有将驱动程序更改为支持的驱动程序。

     

- 小凡

答案 1 :(得分:7)

您可以通过使用Zadig轻松安装WinUSB驱动程序或libusb支持的其他驱动程序(libusb-win32和libusbK),Zadig是为解决此问题而开发的应用程序。 请参阅https://zadig.akeo.ie

但要记住的一件事是,如果您使用WinUSB替换大容量存储驱动程序或HID驱动程序(Windows自动安装),您将只能通过libusb访问您的设备,并且无法访问在卸载WinUSB驱动程序之前,将设备作为大容量存储或HID访问。

最后,如果您可以控制设备的固件,还可以创建将在Vista或更高版本上自动安装WinUSB驱动程序的设备,以便用户无需安装手动驱动程序(这可能需要连接到Windows 7或更早版本的Windows Update,但即使没有Windows 8或更高版本的Internet连接也应该可以正常工作。请参阅https://github.com/pbatard/libwdi/wiki/WCID-Devices

[免责声明]我是Zadig / libwi的作者,WCID维基页面以及libusb Windows后端的贡献者。

答案 2 :(得分:0)

我遇到了同样的问题,并通过Zadig安装WinUSB驱动程序没有解决。

一直以来,我发现libusb_open()在且仅当将Logitech Unifying Receiver插入另一个USB端口时才返回LIBUSB_ERROR_NOT_SUPPORTED。这会导致pyusb libusb1后端引发类似“ NotImplementedError:此平台不支持或未实现操作”的异常。

我已经卸下了Logitech接收器(因此我正在使用有线键盘),问题已为我解决。我很想知道Logitech接收器为何或如何在另一个USB端口上导致此错误,但是我没有。

答案 3 :(得分:0)

我遇到了同样的问题,但 Zadig 无法正常工作。我修复了我将设备直接连接到笔记本电脑的问题,而不是通过 USB-C 集线器