问题描述
我正在使用 libusb-1.0 和 C++ 尝试从设备读取数据。我在libusb中找到了获取设备描述符、配置描述符、接口描述符和端点描述符等方法,但我没有找到任何获取报告描述符的方法。我想阅读设备的逻辑和物理限制。 我发布了阅读设备报告的代码。
std::vector<Usb::Dev> Usb::getUsbDevList()
{
Log log;
int r = libusb_init(NULL);
if (r < 0)
{
return std::vector<Usb::Dev>();
}
libusb_device **devs;
ssize_t cnt = libusb_get_device_list(NULL,&devs);
if (cnt < 0)
{
return std::vector<Usb::Dev>();
}
std::vector<Usb::Dev> result;
// Цикл по всем устройствам
for (uint8_t i = 0; devs[i]; i++)
{
libusb_device *dev = devs[i];
libusb_device_descriptor desc;
int ret = libusb_get_device_descriptor(dev,&desc);
if (ret < 0)
{
break;
}
Dev usbDevice;
// Фиксируем idV и idP
usbDevice.idvendor = desc.idvendor;
usbDevice.idProduct = desc.idProduct;
libusb_device_handle *handle = nullptr;
libusb_open(dev,&handle);
if (handle)
{
if (desc.iProduct)
{
unsigned char string[256];
ret = libusb_get_string_descriptor_ascii(handle,desc.iProduct,string,sizeof(string));
if (ret > 0)
{
// Фиксируем имя устройства
usbDevice.product = std::string(reinterpret_cast<char*>(string));
}
}
}
for (uint8_t k = 0; k < desc.bNumConfigurations; k++)
{
libusb_config_descriptor *config;
ret = libusb_get_config_descriptor(dev,k,&config);
if (LIBUSB_SUCCESS != ret)
{
continue;
}
if (!config->bNumInterfaces)
{
continue;
}
const libusb_interface *interface = &config->interface[0];
if (!interface->altsetting)
{
continue;
}
const libusb_interface_descriptor *interface_desc = &interface->altsetting[0];
for (uint8_t j = 0; j < interface_desc->bNumEndpoints; j++)
{
const libusb_endpoint_descriptor *endpoint = &interface_desc->endpoint[j];
uint8_t endPointAddr = endpoint->bEndpointAddress;
if (endPointAddr & LIBUSB_ENDPOINT_IN)
{
usbDevice.endPointAddrIn = endPointAddr;
}
else
{
usbDevice.endPointAddrOut = endPointAddr;
}
}
libusb_free_config_descriptor(config);
break;
}
if (handle)
libusb_close(handle);
if (usbDevice.isValid())
{
result.emplace_back(std::move(usbDevice));
}
}
libusb_free_device_list(devs,1);
libusb_exit(NULL);
return std::vector<Dev>(std::move(result));
}
有人知道如何在运行时使用 libusb 或其他库从设备获取报告描述符吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)