Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
651 views
in Technique[技术] by (71.8m points)

hid - How get report descriptor from device with libusb c++

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?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...