From 4073b32a5da5fb17317fa3769d0688d901c90a02 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Wed, 13 Jul 2022 09:15:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=B7=D0=BE=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=20USB=20=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2?= =?UTF-8?q?=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++ README.md | 3 ++ main.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ usb.c | 40 +++++++++++++++++++++++++ usb.h | 13 +++++++++ 5 files changed, 146 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.c create mode 100644 usb.c create mode 100644 usb.h 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_ */