usbd_parse_descriptors()

Найти конкретную запись в дереве дескрипторов устройства 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 );

Аргументы:

device
Дескриптор устройства USB, в котором проводится поиск
root
Параметр, определяющий начало поиска в дереве дескрипторов (NULL означает поиск с основания).
type
Тип дескриптора для поиска: значение (USB_DESC_*) или 0 для любого типа дескрипторов.
index
Индекс вхождения дескриптора, который необходимо найти.
node
Указатель на местоположение, в котором функция сохранит указатель найденного дескриптора. Этот параметр в дальнейшем можно использовать в качестве корня для будущих запросов.

Библиотека:

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()




Предыдущий раздел: Библиотека libusbdi