I am using libusb-1.0 and c++ to try read data from a device. I found in libusb such methods as get device descriptor, config descriptor, interface descriptor and endpoint descriptor, but I didn't find any method to get report descriptor. I would like reading logical and physical limits of device.
I post my code of reading reports of device.
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));
}
Does anybody know how get report descriptor from device in runtime with libusb or another library?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…