如何使用 libusb c++ 从设备获取报告描述符

问题描述

我正在使用 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 (将#修改为@)