libusb_open returns LIBUSB_ERROR_NOT_SUPPORTED 在 windows 10
libusb_open returns LIBUSB_ERROR_NOT_SUPPORTED on windows 10
OS: Windows 10 64 位
编译器:MSVC 19 std:c++20
静态链接
我有下面的代码,它只是初始化并打印了一些关于设备的信息
#include "libusb.h"
#include <iostream>
int main()
{
libusb_context* cntx{ nullptr };
int status{ libusb_init(&cntx) };
if (status != LIBUSB_SUCCESS)
{
std::cerr << libusb_strerror(status);
return -1;
}
libusb_device** devices;
ssize_t numberOfDevices{ libusb_get_device_list(cntx, &devices) };
if (numberOfDevices <= 0)
{
std::cerr << "Device does NOT found\n";
return -1;
}
std::cout << "Found " << numberOfDevices << " Devices\n";
int index{ 0 };
std::cout << std::hex;
std::cout << "Device Address: " << +libusb_get_device_address(devices[index]) << '\n'
<< "Port Number: " << +libusb_get_port_number(devices[index]) << '\n'
<< "Bus Number: " << +libusb_get_bus_number(devices[index]) << '\n'
<< "Device Speed: ";
switch (libusb_get_device_speed(devices[index])
{
case LIBUSB_SPEED_SUPER: std::cout << "5Gb\n"; break;
case LIBUSB_SPEED_SUPER_PLUS: std::cout << "10Gb\n"; break;
case LIBUSB_SPEED_FULL: std::cout << "12Mb\n"; break;
case LIBUSB_SPEED_LOW: std::cout << "1.5Mb\n"; break;
case LIBUSB_SPEED_HIGH: std::cout << "480Mb\n"; break;
default: std::cout << "UNKNOWN\n"; break;
}
到目前为止一切顺利,但是当我想打开(例如)设备[0]时,LIBUSB_ERROR_NOT_SUPPORTED
将 return:
constexpr std::uint16_t VID{ 0x8086 };
constexpr std::uint16_t PID{ 0x1D26 };
libusb_device_handle* device{ nullptr };
status = libusb_open(devices[index], &device);
if (status)
{
std::cerr << "Can NOT open the device: " << libusb_strerror(status) << '\n';
device = libusb_open_device_with_vid_pid(cntx, VID, PID);
if (!device)
{
std::cerr << "Can NOT open the device with VID & PID\n";
return -1;
}
}
std::cout << "Device opened\n";
return 0;
}
都不行。
顺便说一句,这个设备是由一个微型程序员编程的,所以我不知道他是怎么编程的,我的工作只是从设备中获取数据。
libusb可以枚举所有USB设备。但它只能打开安装了 WinUSB 驱动程序(或 libusbK 或 libusb0)的设备。 WinUSB 是直接与 USB 设备及其端点一起工作的通用驱动程序,无需实施和提供您自己的设备驱动程序。
如果设备未实现任何标准 USB 协议(大容量存储、相机、音频、串行端口等),Windows 提供并加载标准驱动程序,并且如果设备没有自带驱动,需要先安装。
在 Linux 和 macOS 上,这是 non-issue 因为没有专用驱动程序的 USB 设备可供应用程序使用,没有任何驱动程序麻烦。
为了安装WinUSB,可以使用Zadig。确保您 select 使用正确的设备,如果出现问题可以将其拔掉。如果更换 USB 主机控制器、键盘等关键设备的驱动程序,PC 可能无法再启动。
要自动安装 WinUSB,设备可以执行额外的 USB 控制请求。有两种选择:
OS: Windows 10 64 位
编译器:MSVC 19 std:c++20
静态链接
我有下面的代码,它只是初始化并打印了一些关于设备的信息
#include "libusb.h"
#include <iostream>
int main()
{
libusb_context* cntx{ nullptr };
int status{ libusb_init(&cntx) };
if (status != LIBUSB_SUCCESS)
{
std::cerr << libusb_strerror(status);
return -1;
}
libusb_device** devices;
ssize_t numberOfDevices{ libusb_get_device_list(cntx, &devices) };
if (numberOfDevices <= 0)
{
std::cerr << "Device does NOT found\n";
return -1;
}
std::cout << "Found " << numberOfDevices << " Devices\n";
int index{ 0 };
std::cout << std::hex;
std::cout << "Device Address: " << +libusb_get_device_address(devices[index]) << '\n'
<< "Port Number: " << +libusb_get_port_number(devices[index]) << '\n'
<< "Bus Number: " << +libusb_get_bus_number(devices[index]) << '\n'
<< "Device Speed: ";
switch (libusb_get_device_speed(devices[index])
{
case LIBUSB_SPEED_SUPER: std::cout << "5Gb\n"; break;
case LIBUSB_SPEED_SUPER_PLUS: std::cout << "10Gb\n"; break;
case LIBUSB_SPEED_FULL: std::cout << "12Mb\n"; break;
case LIBUSB_SPEED_LOW: std::cout << "1.5Mb\n"; break;
case LIBUSB_SPEED_HIGH: std::cout << "480Mb\n"; break;
default: std::cout << "UNKNOWN\n"; break;
}
到目前为止一切顺利,但是当我想打开(例如)设备[0]时,LIBUSB_ERROR_NOT_SUPPORTED
将 return:
constexpr std::uint16_t VID{ 0x8086 };
constexpr std::uint16_t PID{ 0x1D26 };
libusb_device_handle* device{ nullptr };
status = libusb_open(devices[index], &device);
if (status)
{
std::cerr << "Can NOT open the device: " << libusb_strerror(status) << '\n';
device = libusb_open_device_with_vid_pid(cntx, VID, PID);
if (!device)
{
std::cerr << "Can NOT open the device with VID & PID\n";
return -1;
}
}
std::cout << "Device opened\n";
return 0;
}
都不行。 顺便说一句,这个设备是由一个微型程序员编程的,所以我不知道他是怎么编程的,我的工作只是从设备中获取数据。
libusb可以枚举所有USB设备。但它只能打开安装了 WinUSB 驱动程序(或 libusbK 或 libusb0)的设备。 WinUSB 是直接与 USB 设备及其端点一起工作的通用驱动程序,无需实施和提供您自己的设备驱动程序。
如果设备未实现任何标准 USB 协议(大容量存储、相机、音频、串行端口等),Windows 提供并加载标准驱动程序,并且如果设备没有自带驱动,需要先安装。
在 Linux 和 macOS 上,这是 non-issue 因为没有专用驱动程序的 USB 设备可供应用程序使用,没有任何驱动程序麻烦。
为了安装WinUSB,可以使用Zadig。确保您 select 使用正确的设备,如果出现问题可以将其拔掉。如果更换 USB 主机控制器、键盘等关键设备的驱动程序,PC 可能无法再启动。
要自动安装 WinUSB,设备可以执行额外的 USB 控制请求。有两种选择: