Сеньков Андрей SWD Software Ltd. Санкт-Петербург Особенности разработки драйверов для USB устройств в ОС QNX
В чем секрет успеха USB? "Горячее" подключение и отключение Пропускная способность – 12Mbps Подключение до 127 устройств Встроенная помехозащищенность Контроллер USB занимает одно прерывание Связь CPU686E Fastwel через USB кабель – хорошая замена RS232
Топология шины USB Хост-контроллер Корневой Hub Hub Device Hub Device Hub Device Физическая топология шины USB - многоярусная звезда Единственный хост-контроллер
Хост-контроллеры USB UHCI Universal Host Controller Interface ( спецификация USB 1.x ) OHCI Open Host Controller Interface ( спецификация USB 1.x ) EHCI Enhanced Host Controller Interface ( спецификация USB 2.0 ) devu-uhci devu-ohci
Классы USB устройств Низкоскоростные (скорость до 1.5 Mbps) Высокоскоростные (скорость до 12 Mbps) Изохронные (естественные типы данных)
Модель передачи данных Конечная точка – логический источник/приемник данных в устройстве Интерфейс – набор конечных точек Канал (pipe) – модель передачи данных между хостом и конечной точкой USB Host USB device EP0 EP1 EPn управление передачи каналы (pipes) host device
Типы передачи данных Тип передачНаправление Запуск в определенный момент Гарантия доставки Управляющие ( Control transfers ) Двунаправленные Не гарантируется Есть ИзохронныеОднонаправленныеКаждые 1 мс Нет - отсутствует управление потоком Прерывания ( Interrupts ) Только ввод Определяется частотой опроса Есть Массивов данных ( Bulk data transfers ) Двунаправленные Не гарантируется Есть
Использование USB SDK QNX Neutrino 6 QNX Neutrino или старше GNU GCC USB OHCI или UHCI контроллер, спецификация 1.1 QNX 4 QNX 4.25, patch D или старше Watcom 10.6, patch B или старше USB OHCI или UHCI контроллер, спецификация 1.1 Системные требования Набор утилит ДокументацияUSBD – интерфейс драйвера USB USB DDK (QNX6.2) Примеры
USB утилиты devu-uhci - менеджер UHCI контроллера devu-ohci - менеджер OHCI контроллера usb - вывод конфигурации USB устройств devu-mouse - драйвер класса USB мышей ( Logitech, Microsoft ) devu-prn - драйвер класса USB принтеров ( Canon, Epson, HP ) devu-kbd - драйвер класса USB клавиатур ( Belkin, Micro Innovations )
Структура стека USB devu-uchi или devu-ochi это наша разработка Драйвер контроллера Драйвер управления Драйверы устройств Хост- контроллер Концентратор Устройство USB стек USBаппаратный уровень
Структура драйвера USB устройства Менеджер ресурсов - devu-mouse, devu-prn, devu-kbd devu-uhci & devu-mouse & Динамическая библиотека – devn-rtl8150.so (QNX6) devu-uhci & io-net –p qnet & mount –T io-net devn-rtl8150.so Сетевой драйвер – Net.upl (QNX4) devu-ohci & Net & Net.upl –l2 –a0001 &
Общий алгоритм работы драйвера Соединение со стеком usbd_connect() Соединение со стеком usbd_connect() Присоединение устройства usbd_attach() Чтение конфигурации устройства Выделение ресурсов, настройка устройства Основной цикл драйвера Отсоединение устройства usbd_detach() Освобождение связанных с устройством ресурсов INSERTIONREMOVAL Отсоединение от стека usbd_disconnect() Отсоединение от стека usbd_disconnect()
Соединение драйвера со стеком usbd_connect( ) – соединение с USB стеком Основные параметры: Тип устройства (VID, DID, Class, Subclass, Protocol) Имена функций обработчиков событий insertion/removal Имя стека, по умолчанию /dev/usb Время ожидания стека usbd_disconnect( ) – отсоединение от USB стека
Обработка события insertion Основные функции: usbd_attach( ) – присоединить устройство usbd_*_descriptor( ) – получить конфигурацию устройства usbd_open_pipe( ) – открыть канал для конечной точки usbd_alloc_urb( ) – разместить USB Request Block (URB) usbd_alloc( ) – разместить буфер для обмена данными Захват устройства Чтение конфигурации Выделение ресурсов Настройка устройства insertion callback
Обработка события removal Основные функции: usbd_close_pipe( ) – закрыть канал для конечной точки usbd_detach( ) – отсоединить устройство usbd_free_urb( ) – освободить память URB usbd_free( ) – освободить память буфера обмена Отсоединение устройства Закрытие каналов Освобождение ресурсов removal callback
Конфигурация устройства дескрипторы устройства версии контроллера и USB SDK дескрипторы конфигурации дескрипторы интерфейса вывод утилиты usb -vvv дескрипторы конечных точек
Ввод/вывод данных Установка URB usbd_setup*( ) Запрос менеджеру usbd_io( ) Менеджер USB devu-uhci, devu-ohci Менеджер USB devu-uhci, devu-ohci USB устройство драйвер пакеты заданной длины пакеты фиксированной длины Типы запросов: usbd_setup_bulk( ) usbd_setup_vendor( ) usbd_setup_interrupt( ) usbd_setup_isochronous( ) usbd_setup_control( ) Направление передачи: URB_DIR_IN – от устройства URB_DIR_OUT – к устройству
Примеры приема и передачи данных usbd_setup_bulk( urb, URB_DIR_OUT, out_buf, length ); usbd_io( urb, out_pipe, out_bulk_cbf, data, USBD_TIME_INFINITY ); блок URB, выделен usbd_alloc_urb() буфер, выделен usbd_alloc() Размер данных блок URB, выделен usbd_alloc_urb() функция callback, вызывается при завершении обмена тайм-аут обмена передача: прием: usbd_setup_bulk( urb, URB_DIR_IN, in_buf, IN_SIZE ); usbd_io( urb, in_pipe, in_bulk_cbf, data, USBD_TIME_INFINITY ); прерывание: usbd_setup_interrupt( urb, URB_DIR_IN, intr_buf, INTR_SIZE ); usbd_io( urb, intr_pipe, intr_cbf, data, USBD_TIME_INFINITY );
Оптимизация: цепочки URB USB-Ethernet конвертер // организация цепочек urb urb_out_end = usbd_alloc_urb( NULL ); urb_out = usbd_alloc_urb( urb_out_end ); usbd_setup_bulk( urb_out_end, URB_DIR_OUT, NULL, 0 ); usbd_setup_bulk( urb_out, URB_DIR_OUT, out_buf, length ); usbd_io( urb_out, out_pipe, out_bulk_cbf, data, USBD_TIME_INFINITY ); пример: драйвер устройство usbd_io( ) разделитель пакет данных URB2URB1URB0 NULL
Оптимизация: кольцевой опрос запрос 4 запрос 3 запрос 2 запрос 1 устройство данные драйвер // кольцевой прием данных for ( i=0; i < IN_URB_NUMBER; i++ ) { in_urb[ i ] = usbd_alloc_urb( NULL ); in_buf[ i ] = usbd_alloc( IN_BUF_SIZE ); usbd_setup_bulk( in_urb[ i ], URB_DIR_IN, in_buf[ i ], IN_BUF_SIZE ); usbd_io(in_urb[ i ], in_pipe, in_bulk_cbf, data, USBD_TIME_INFINITY ); } пример: Запросы обрабатываются менеджером в порядке поступления Ускорение приема данных 10 – 20 %
Обзор спецификации USB 2.0 Скорость передачи до 480 Мбит/с Обратная совместимость с устройствами USB 1.x Основа спецификации – технология EHCI Наличие неоптимальных и неработоспособных конфигураций EHCI хост-контроллер USB 2.0 Корневой hub USB 2.0 Hub USB 2.0Hub USB 1.1 Устройство USB 2.0 Устройство USB 2.0 Устройство USB 2.0 Устройство USB 1.1 Hub USB 2.0 Устройство USB 1.1 неоптимальное подключение Возможно неработоспособное подключение
SWD Software Ltd. Официальный дистрибьютор QNX , Санкт-Петербург, пр. Юрия Гагарина 23 тел.: (812) тел.: (812) факс: (812) web: Спасибо!