Базовая реализация получения информации о USB устройствах
This commit is contained in:
commit
4073b32a5d
|
@ -0,0 +1,4 @@
|
|||
/Debug
|
||||
/.settings
|
||||
.project
|
||||
.cproject
|
|
@ -0,0 +1,3 @@
|
|||
# libusb
|
||||
|
||||
Получение информации о USB устройствах с использованием библиотеки `lubusb`.
|
|
@ -0,0 +1,86 @@
|
|||
#include <libusb-1.0/libusb.h>
|
||||
#include <stdio.h>
|
||||
#include "usb.h"
|
||||
|
||||
void printdev(libusb_device *dev);
|
||||
int main()
|
||||
{
|
||||
libusb_device **devs; // указатель на указатель на устройство, используется для получения списка устройств
|
||||
libusb_context *ctx = NULL; // контекст сессии libusb
|
||||
int r; // для возвращаемых значений
|
||||
ssize_t cnt; // число найденных USB-устройств
|
||||
ssize_t i; // индексная переменная цикла перебора всех устройств
|
||||
r = libusb_init(&ctx); // инициализировать библиотеку libusb, открыть сессию работы с libusb
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Ошибка: инициализация не выполнена, код: %d.\n", r);
|
||||
return 1;
|
||||
}
|
||||
|
||||
libusb_set_option(ctx, 3); // задать уровень подробности отладочных сообщений
|
||||
cnt = libusb_get_device_list(ctx, &devs); // получить список всех найденных USB- устройств
|
||||
if (cnt < 0)
|
||||
{
|
||||
fprintf(stderr, "Ошибка: список USB устройств не получен.\n");
|
||||
return 1;
|
||||
}
|
||||
printf("найдено устройств: %li\n", cnt);
|
||||
printf("===========================================================\n");
|
||||
printf("* количество возможных конфигураций\n");
|
||||
printf("| * класс устройства\n");
|
||||
printf("| | * идентификатор производителя\n");
|
||||
printf("| | | * идентификатор устройства\n");
|
||||
printf("| | | | * количество интерфейсов\n");
|
||||
printf("| | | | | * количество альтернативных настроек\n");
|
||||
printf("| | | | | | * класс устройства\n");
|
||||
printf("| | | | | | | * номер интерфейса\n");
|
||||
printf("| | | | | | | | * USB-IF код класса интерфейса\n");
|
||||
printf("| | | | | | | | | * количество конечных точек\n");
|
||||
printf("| | | | | | | | | | * тип дескриптора\n");
|
||||
printf("| | | | | | | | | | | * адрес конечной точки\n");
|
||||
printf("+--+---+-----+-----+---+--+---+--+---+--+--+-------------------\n");
|
||||
for (i = 0; i < cnt; i++) // цикл перебора всех устройств
|
||||
{
|
||||
printUSB(devs[i]); // печать параметров устройства
|
||||
printdev(devs[i]); // печать только устройства MASS STORAGE
|
||||
}
|
||||
printf("===========================================================\n");
|
||||
|
||||
libusb_free_device_list(devs, 1); // освободить память, выделенную функцией получения списка устройств
|
||||
libusb_exit(ctx); // завершить работу с библиотекой libusb, закрыть сессию работы с libusb
|
||||
return 0;
|
||||
}
|
||||
void printdev(libusb_device *dev)
|
||||
{
|
||||
struct libusb_device_descriptor desc; // дескриптор устройства
|
||||
struct libusb_config_descriptor *config; // дескриптор конфигурации объекта
|
||||
const struct libusb_interface *inter;
|
||||
const struct libusb_interface_descriptor *interdesc;
|
||||
const struct libusb_endpoint_descriptor *epdesc;
|
||||
int r = libusb_get_device_descriptor(dev, &desc);
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Ошибка: дескриптор устройства не получен, код: %d.\n", r);
|
||||
return;
|
||||
}
|
||||
|
||||
libusb_get_config_descriptor(dev, 0, &config); // получить конфигурацию устройства
|
||||
printf("%.2d %.3d %.5d %.5d %.3d | | | | | | |\n", (int) desc.bNumConfigurations, (int) desc.bDeviceClass, desc.idVendor, desc.idProduct,
|
||||
(int) config->bNumInterfaces);
|
||||
for (int i = 0; i < (int) config->bNumInterfaces; i++)
|
||||
{
|
||||
inter = &config->interface[i];
|
||||
printf("| | | | | %.2d %.3d | | | | |\n", inter->num_altsetting, (int) desc.bDeviceClass);
|
||||
for (int j = 0; j < inter->num_altsetting; j++)
|
||||
{
|
||||
interdesc = &inter->altsetting[j];
|
||||
printf("| | | | | | | %.2d %.3d %.2d | |\n", (int) interdesc->bInterfaceNumber, (int) interdesc->bInterfaceClass, (int) interdesc->bNumEndpoints);
|
||||
for (int k = 0; k < (int) interdesc->bNumEndpoints; k++)
|
||||
{
|
||||
epdesc = &interdesc->endpoint[k];
|
||||
printf("| | | | | | | | | | %.2d %.9d\n", (int) epdesc->bDescriptorType, (int) (int) epdesc->bEndpointAddress);
|
||||
}
|
||||
}
|
||||
}
|
||||
libusb_free_config_descriptor(config);
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* usb.c
|
||||
*
|
||||
* Created on: 12 июл. 2022 г.
|
||||
* Author: alexander
|
||||
*/
|
||||
|
||||
#include <libusb-1.0/libusb.h>
|
||||
#include <stdio.h>
|
||||
|
||||
void printUSB(libusb_device *dev)
|
||||
{
|
||||
struct libusb_device_descriptor desc;
|
||||
struct libusb_config_descriptor *config;
|
||||
const struct libusb_interface *inter;
|
||||
const struct libusb_interface_descriptor *interdesc;
|
||||
const struct libusb_endpoint_descriptor *epdesc;
|
||||
int r = libusb_get_device_descriptor(dev, &desc);
|
||||
|
||||
if (r < 0)
|
||||
{
|
||||
fprintf(stderr, "Ошибка: дескриптор устройства не получен, код: %d.\n", r);
|
||||
return;
|
||||
}
|
||||
|
||||
libusb_get_config_descriptor(dev, 0, &config);
|
||||
for (int i = 0; i < (int) config->bNumInterfaces; i++)
|
||||
{
|
||||
inter = &config->interface[i];
|
||||
for (int j = 0; j < inter->num_altsetting; j++)
|
||||
{
|
||||
interdesc = &inter->altsetting[j];
|
||||
if (interdesc->bInterfaceClass == LIBUSB_CLASS_MASS_STORAGE)
|
||||
{
|
||||
fprintf(stdout, "0x%04X:0x%04X\n", desc.idVendor, desc.idProduct);
|
||||
}
|
||||
}
|
||||
}
|
||||
libusb_free_config_descriptor(config);
|
||||
}
|
Loading…
Reference in New Issue