Обзор стека и библиотеки USB

Обзорное руководство по стеку USB и драйверной библиотеке

О чем это руководство
Предположения
Стек USB и драйверная библиотека
Типы USB хост-контроллеров (HCI)
Буферы данных
Энумератор устройств USB
Принципы работы драйвера устройства USB

О чем это руководство

В данном руководстве приводится обзор стека USB в ЗОСРВ «Нейтрино», а также общая информация по разработке драйверов устройств USB с использованием библиотеки usbdi.

Предположения

Предполагается, что разработчик ознакомится со спецификацией шины Universal Serial Bus (USB) в части информации в следующих главах:

Для разработки драйверов устройств USB требуется хорошее понимание изложенных в этих главах концепций.


Note: Актуальная информации о спецификациях шины USB приведена по ссылке www.usb.org.

Стек USB и драйверная библиотека

USB (Universal Serial Bus) – это спецификация оборудования и протокола для взаимодействия различных подключенных к шине устройств с хост-контроллером. В состав ЗОСРВ «Нейтрино» входит стек USB, который реализует протокол USB и позволяет драйверам взаимодействовать с устройствами USB.

Также в состав ЗОСРВ «Нейтрино» входит драйверная (клиентская) библиотека (usbd_*()), которая предназначена для взаимодействия драйверов устройств всо стеком. В этой архитектуре драйвер для стека является клиентом.

Стек USB реализован как отдельный процесс, который регистрирует путь /dev/io-usb/io-usb (имя по умолчанию). Кроме того, стек включает в себя драйверы host-контроллеров USB.

Типы USB хост-контроллеров (HCI)

Стек поддерживает следующие четыре типа промышленных стандарта для USB хост-котроллеров (HCI):

Для каждого типа хост-контроллера запускается отдельный сервер ( devu-ohci.so, devu-uhci.so, devu-ehci.so и devu-xhci.so). При этом с точки зрения устройства USB нет разницы, какой USB хост-контроллер установлен в системе.

Буферы данных

Клиентская библиотека предоставляет функции для выделения буферов данных в общей памяти. Стек управляет этими буферами данных и предоставляет доступ к ним клиентской библиотеке. Эти выделенные буферы должны использоваться во всех передачах данных.

При таком подходе драйвер устройства USB должен работать на том же физическом узле, что и стек USB. В то же время программы, работающие с драйверами устройств, могут быть распределены по сети. Преимущество этого подхода заключается в том, что между моментом получения данных USB стеком и моментом их доставки драйверу (а также наоборот) не происходит дополнительного копирования в память.

Энумератор устройств USB

В ЗОСРВ «Нейтрино» энумератор устройств подключается к стеку USB и ожидает подсоединения устройства к шине. Когда обнаруживается подсоединение, энумератор просматривает базу данных конфигураций, чтобы узнать, какой драйвер необходимо запустить и запускает соответствующий. В момент, когда устройство будет отсоединено от шины, энумератор завершит работу соответствующего драйвера.

Для встраиваемых систем с ограниченными ресурсами, как правило, энумератор не требуется. В этом случае драйверы запускаются индивидуально с необходимыми опциями.

Принципы работы драйвера устройства USB

Драйвер устройства USB обычно выполняет следующие операции:

  1. Подключается к стеку USB с помощью функции ( usbd_connect()) и регистрирует две функции обратного вызова - обработчики для событий подсоединения и отсоединения устройства.

  2. В обработчике подсоединения выполняются следующие действия:
    1. Подключение к устройству USB ( usbd_attach()).
    2. Получение дескрипторов устройства ( usbd_descriptor()).
    3. Выбор конфигурации устройства ( usbd_select_config()) и интерфейса устройства ( usbd_select_interface()).
    4. Настройка каналов связи с соответствующими конечными точками устройства ( usbd_open_pipe()).

  3. В обработчике отсоединения выполняется отключение от устройства USB ( usbd_detach()).

  4. Настройка всех передач данных (чтение и запись данных, отправка и прием управляющей информации, и т.п.) производится через функции семейства usbd_setup_*() ( usbd_setup_bulk(), usbd_setup_interrupt(), и т.п.).

  5. Фактическая передача данных инициируется функцией usbd_io(), которой, если требуется, можно указать функцию - обработчик завершения передачи.


Note: В контексте драйверной библиотеки термин "канал" не имеет отношения к каналу, определенному в стандарте POSIX. В специфичной для USB терминологии "канал" является дескриптором, идентифицирующим соединение с конечной точкой устройства USB.




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