commit 4073b32a5da5fb17317fa3769d0688d901c90a02 Author: Alexander Zhirov Date: Wed Jul 13 09:15:44 2022 +0300 Базовая реализация получения информации о USB устройствах diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4f75b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/Debug +/.settings +.project +.cproject diff --git a/README.md b/README.md new file mode 100644 index 0000000..f609870 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# libusb + +Получение информации о USB устройствах с использованием библиотеки `lubusb`. diff --git a/main.c b/main.c new file mode 100644 index 0000000..6ab59bb --- /dev/null +++ b/main.c @@ -0,0 +1,86 @@ +#include +#include +#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); +} diff --git a/usb.c b/usb.c new file mode 100644 index 0000000..b36c21f --- /dev/null +++ b/usb.c @@ -0,0 +1,40 @@ +/* + * usb.c + * + * Created on: 12 июл. 2022 г. + * Author: alexander + */ + +#include +#include + +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); +} diff --git a/usb.h b/usb.h new file mode 100644 index 0000000..be13b43 --- /dev/null +++ b/usb.h @@ -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_ */