9

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

我的环境

我正在使用MinGW编译器(也使用 Dev-cpp IDE)在 Windows 7 上工作,并且我正在使用从这个链接下载的预编译 libusb 库。

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

我的代码:

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

我该如何解决这个问题?

我通过互联网搜索并没有找到针对此问题的明确解决方案。虽然它的代码在 Linux 上运行良好。

PS:我在下面添加了整个代码。该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

4 回答 4

12

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

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

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

[免责声明] 我是 Zadig/libwi、WCID wiki 页面的作者,也是 libusb Windows 后端的贡献者。

于 2014-07-19T15:14:14.087 回答
11

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

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

2012 年 4 月 4 日星期三晚上 11:52,Quân Phạm Minh <[hidden email]> 写道:

虽然我从不安装winusb驱动,但我使用libusb来获取我的usb的信息(金士顿usb,并且已经被系统识别)

是的,这是可能的。但是您不能打开设备并做进一步的事情。对于 libusb Windows 后端的新用户来说,这是令人困惑的部分,对于 Mac OS X 也是如此。libusb 可以获取带有不正确驱动程序的设备的一些基本信息(例如:USB 大容量存储设备),但如果不将驱动程序更改为支持的驱动程序,将无法打开该设备。

——小凡

于 2013-06-27T18:23:42.063 回答
0

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

我始终发现,当且仅当我将Logitech Unifying Receiver插入另一个 USB 端口时,libusb_open() 才会返回 LIBUSB_ERROR_NOT_SUPPORTED 。这会导致 pyusb libusb1 后端引发异常,例如“NotImplementedError: Operation not supported or unimplemented on this platform”。

我已经移除了罗技接收器(所以我使用的是有线键盘),问题就解决了。我很想知道罗技接收器为何或如何在另一个 USB 端口上导致此错误,但我不知道。

于 2020-02-11T09:18:33.387 回答
0

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

于 2021-01-05T11:58:16.440 回答