usb描述符打印实现
- 通过libusb实现系统lsusb -v的功能
- 使用场景:在一些平台没有lsusb -v的功能,通过自己实现的lsusb -v可以在这些平台查询device的描述符信息
废话不多说,直接上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <libusb-1.0/libusb.h>
#include <errno.h>
libusb_context *ctx = NULL;
static int dump_altsetting(libusb_device_handle *dev, const struct libusb_interface_descriptor *interface)
{
#if 1
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);
#endif
return 0;
}
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 list_devices(libusb_context *ctx)
{
libusb_device **list;
struct libusb_device_descriptor desc;
struct libusb_config_descriptor* conf;
libusb_device_handle *handle = NULL;
int config= 0;
int ret;
int status;
ssize_t num_devs, i, j, k;
status = 1;
num_devs = libusb_get_device_list(ctx, &list);
if (num_devs < 0)
goto error;
for (i = 0; i < num_devs; ++i) {
libusb_device *dev = list[i];
libusb_open(dev,&handle);
uint8_t bnum = libusb_get_bus_number(dev);
uint8_t dnum = libusb_get_device_address(dev);
libusb_get_device_descriptor(dev, &desc);
status = 0;
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 {
for (k = 0 ; k < conf->bNumInterfaces ; k++)
dump_interface(handle, &conf->interface[k]);
libusb_free_config_descriptor(conf);
}
}
}
libusb_free_device_list(list, 0);
error:
return status;
}
int main()
{
int err = 0;
if (err = list_devices(ctx) < 0) {
printf("list_devices fail...\n");
return -1;
}
return 0;
}