加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

libusb_open在Windows 7上返回’LIBUSB_ERROR_NOT_SUPPORTED’

发布时间:2020-12-13 20:25:56 所属栏目:Windows 来源:网络整理
导读:我一直在Linux上使用LibUSB开发USB驱动程序,但现在我想为Windows编译我的一个驱动程序(这是我第一次这样做). 我的环境 我正在使用MinGW编译器(也使用Dev-cpp IDE)在Windows 7上工作,我正在使用从this link下载的预编译的libusb库. 我的设备:这是一款HID触控
我一直在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: %dnr",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);
}
您似乎需要安装winusb驱动程序 – libusb可以获取有关没有此驱动程序的设备的信息,但它无法打开它们.

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

On Wed,Apr 4,2012 at 11:52 PM,Quan Ph?m Minh <[hidden email]>
wrote:

although I never install winusb driver but I use libusb to get
information of my usb (kingston usb,and already
recognize by system)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读