usbd_attach()

Подключить устройство USB

Прототип:

#include <sys/usbdi.h>
int usbd_attach( struct usbd_connection *connection,
usbd_device_instance_t *instance,
size_t extra,
struct usbd_device **device );

Аргументы:

connection
Дескриптор для идентификации USB стека, возвращаемый функцией usbd_connect().
instance
Параметр, описывающий подключаемое устройство.
extra
Размер дополнительной памяти, которую необходимо выделить вместе с подключением устройства. Позднее для получения указателя на эту память необходимо использовать функцию usbd_device_extra(). Как правило, драйвер хранит в этой памяти различные данные о статусе и конфигурации устройства.
device
Дескриптор для идентификации устройства при последующих вызовах.

Библиотека:

libusbdi

Описание:

Функция usbd_attach() используется для подключения устройства. Как правило, эта функция вызывается из функции - обработчике подсоединения (insertion callback), вызываемого при физическом подключении устройства, соответствующего заданному фильтру. Обработчик подсоединения возвращает параметр instance (сведения об экземпляре подключенного устройства).

Прототип обработчика подсоединения:

void (*insertion)( struct usbd_connection *, usbd_device_instance_t *instance );

Подключение в цикле

Другим способом подключения является подключение в цикле ко всем устрйотсвом (при этом экземпляр устройства создается самостоятельно). Пример:

for ( busno = 0; busno < 10; ++busno )
{
for ( devno = 0; devno < 64; ++devno )
{
memset( &instance, USBD_CONNECT_WILDCARD, sizeof( usbd_device_instance_t ) );
instance.path = busno;
instance.devno = devno;
if ( usbd_attach( connection, &instance, 0, &device ) == EOK )
{
...
}
}
}

Степень “подключенности” зависит от типа подсоединения:

Возвращаемое значение:

EOK
Успешное завершение.
ENODEV
Указанного устройства не существует. Если подключение выполняется в цикле, то devno будет пустым. Если подключение выполняется в обработчике подсоединения, то это может означать, что устройство было физически отсоединено.
EBUSY
Возник конфликт общего и эксклюзивного доступа.
ENOMEM
Не хватает памяти для внутренней структуры устройства.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
да
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

usbd_device_instance_t, usbd_connect(), usbd_detach(), usbd_device_extra(), usbd_disconnect()




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