libusb 解析描述符


static void dump_altsetting(libusb_device_handle *dev, const struct libusb_interface_descriptor *interface)
{
//	char cls[128], subcls[128], proto[128];
//	char *ifstr;
 
//	get_class_string(cls, sizeof(cls), interface->bInterfaceClass);
//	get_subclass_string(subcls, sizeof(subcls), interface->bInterfaceClass, interface->bInterfaceSubClass);
//	get_protocol_string(proto, sizeof(proto), interface->bInterfaceClass, interface->bInterfaceSubClass, interface->bInterfaceProtocol);
//	ifstr = get_dev_string(dev, interface->iInterface);
 
	printf("    Interface Descriptor:\n"
	       "      bLength             %5u\n"
	       "      bDescriptorType     %5u\n"
	       "      bInterfaceNumber    %5u\n"
	       "      bAlternateSetting   %5u\n"
	       "      bNumEndpoints       %5u\n"
	       "      bInterfaceClass     %5u\n"
	       "      bInterfaceSubClass  %5u\n"
	       "      bInterfaceProtocol  %5u\n",
	       interface->bLength, interface->bDescriptorType, interface->bInterfaceNumber,
	       interface->bAlternateSetting, interface->bNumEndpoints, interface->bInterfaceClass,
	       interface->bInterfaceSubClass,interface->bInterfaceProtocol);
 
//	free(ifstr);
}
 
static void dump_interface(libusb_device_handle *dev, const struct libusb_interface *interface)
{
	int i;
 
	for (i = 0; i < interface->num_altsetting; i++)
		dump_altsetting(dev, &interface->altsetting[i]);
}

static int parserDescriptor(libusb_device *dev)
{
	struct libusb_device_descriptor desc;
	struct libusb_config_descriptor* conf;
    libusb_device_handle* handle;
 
	int config = 0;
	int ret;
 
	int status;
	ssize_t num_devs, i, j, k;

		libusb_open(dev,&handle);
 
		libusb_get_configuration(handle,&config);
 
 		uint8_t bnum = libusb_get_bus_number(dev);
		uint8_t dnum = libusb_get_device_address(dev);
 
		libusb_get_device_descriptor(dev, &desc);
		status = 0;
		printf("device:%04x:%04x\n",desc.idVendor,desc.idProduct);
		printf("bDeviceSubClass = %5u\n",desc.bDeviceSubClass);
		printf("bDeviceClass    = %5u\n",desc.bDeviceClass);
		printf("bDeviceProtocol    = %5u\n",desc.bDeviceProtocol);
		printf("bNumConfigurations    = %5u\n",desc.bNumConfigurations);
		for( j = 0; j < desc.bNumConfigurations; ++j) {
                        ret = libusb_get_config_descriptor(dev, j, &conf);
                        if (ret) {
                                fprintf(stderr, "    Couldn't get configuration "
                                                "descriptor %lu, some information will "
                                                "be missing\n", j);
                        } else {
				printf("    bNumberInterfaces = %5u\n",conf->bNumInterfaces);
				printf("    bConfigurationValue = %5u\n",conf->bConfigurationValue);
				
				for (k = 0 ; k < conf->bNumInterfaces ; k++)
					dump_interface(handle, &conf->interface[k]);
                                libusb_free_config_descriptor(conf);
                        }
                }
		
    libusb_close(handle);
}

init()
{
    bool res = false;
    int ret = 0;
    int count = 0;

    libusb_device** devs = NULL;

retry:
    if (NULL != devs)
    {
        libusb_free_device_list(devs, 1);
        devs = NULL;
    }

    libusbExit();
    libusbInit();

//    if (count++ >= INIT_RETRY_COUNT_MAX)
//    {
//        LOGD("------accessory exit");
//        return false;
//    }

    int size = libusb_get_device_list(mContext, &devs);
    //printf("usb device list size = %d\n", size);

    if (size < 0)
    {
        devs = NULL;
        goto retry;
    }

    for (int i = 0; i < size; i++)
    {
        libusb_device_descriptor desc;
        ret = libusb_get_device_descriptor(devs[i], &desc);


        if (LIBUSB_SUCCESS == ret)
        {
                parserDescriptor(devs[i]);
        }
        else
        {
            LOGW("Failed to libusb_get_device_descriptor %d", ret);

            sleep(1);

            goto retry;
        }
    }

    if (NULL != devs)
    {
        libusb_free_device_list(devs, 1);
        devs = NULL;
    }

    if (!res)
    {
        sleep(1);
        goto retry;
    }

    return res;
}


int libusbInit()
{
    int ret = 0;
    if (NULL == mContext)
    {
        ret = libusb_init(&mContext);
        if (ret != LIBUSB_SUCCESS)
        {
            LOGE("Failed to initialize libusb\n");
        }

        //libusb_set_debug(mContext, LIBUSB_LOG_LEVEL_DEBUG); // Verbose USB debug output
    }

    return ret;
}

void libusbExit()
{
    if (NULL != mContext)
    {
        libusb_exit(mContext);
        mContext = NULL;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值