Найти конкретную запись в дереве дескрипторов устройства USB
#include <sys/usbdi.h>usbd_descriptors_t * usbd_parse_descriptors( struct usbd_device *device,struct usbd_desc_node *root,uint8_t type,int index,struct usbd_desc_node **node );
NULL
означает поиск с основания).0
для любого типа дескрипторов.libusbdi
При первом вызове, функция usbd_parse_descriptors() загружает все следующие дескрипторы устройства USB:
Функция использует вызов usbd_descriptor() для получения каждого необработанного дескриптора USB. При последующих запусках данные о дескрипторах упорядочиваются, становятся безопасными для выравнивания и встраиваются в древовидную структуру в памяти для упрощения последующих запросов.
Каждый узел в дереве представляет собой структуру usbd_desc_node
. Параметр root указывает, с какого места в дереве начинать синтаксический анализ (NULL
означает base). Параметр node сообщает, где был найден дескриптор для последующих запросов.
Дерево дескрипторов выглядит следующим образом:
(ROOT)|(DEVICE) - (HUB) - (LANGUAGE TABLE)|(CONFIG) - ..... (CONFIG)|(INTERFACE) - ..... (INTERFACE)|(ENDPOINT) - ..... (ENDPOINT)
Любые дескрипторы поставщика устройства (vendor-specific) или класса устройства (class-specific), встроенные в стандартный вывод дескрипторов, вставляются в дерево в соответствующей точке.
Дескриптор для конечной точки 0
(control) физически отсутствует, но он создается и помещается в дерево для упрощения перечисления в драйвере.
Параметр type используется для указания типа дескрипторов, а параметр index - это номер вхождения дескриптора в дереве. Необходимо иметь в виду, что тип равный 0
соответствует любому типу дескриптора и данное значение можно использовать для получения любого vendor-specific или class-specific дескриптора, в случае, когда их тип неизвестен.
Пример обхода всех конечных точек интерфейса:
for ( eix = 0; (desc = usbd_parse_descriptors( device, ifc, USB_DESC_ENDPOINT, eix, &ept )) != NULL; ++eix ){;}
здесь ifc - это соответствующий узел интерфейса, найденный предыдущим вызовом usbd_parse_descriptors() или usbd_interface_descriptor().
Указатель на дескриптор при успешном завершении или NULL
при возникновении ошибки.
ЗОСРВ «Нейтрино»
usbd_args_lookup(), usbd_configuration_descriptor(), usbd_descriptor(), usbd_device_lookup(), usbd_device_extra(), usbd_device_descriptor(), usbd_endpoint_descriptor(), usbd_hcd_info(), usbd_hub_descriptor(), usbd_interface_descriptor(), usbd_languages_descriptor(), usbd_string(), usbd_urb_status()
Предыдущий раздел: Библиотека разработки драйверов USB-устройств (libusbdi)