Базовая реализация получения информации о USB устройствах

This commit is contained in:
Alexander Zhirov 2022-07-13 09:15:44 +03:00
commit 4073b32a5d
5 changed files with 146 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/Debug
/.settings
.project
.cproject

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# libusb
Получение информации о USB устройствах с использованием библиотеки `lubusb`.

86
main.c Normal file
View File

@ -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);
}

40
usb.c Normal file
View File

@ -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);
}

13
usb.h Normal file
View File

@ -0,0 +1,13 @@
/*
* usb.h
*
* Created on: 12 июл. 2022 г.
* Author: alexander
*/
#ifndef USB_H_
#define USB_H_
void printUSB(libusb_device *dev);
#endif /* USB_H_ */