AVR4950: USB хост AVR |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Здесь приведен перевод документации Atmel AVR4950: ASF - USB Host Stack [1], посвященной библиотеке для реализации хоста USB с помощью микроконтроллеров AVR. Для этой библиотеки подойдут не все, а строго определенные модели микроконтроллеров AVR и AVR32, которые имеют на борту аппаратный интерфейс USB со встроенной поддержкой функции хоста USB. Список поддерживаемых микроконтроллеров приведен ниже во врезках. [Поддержка только устройства USB] AT90USB1286, AT90USB162, AT90USB646, AT90USB82, ATmega16U2, ATmega16U4, ATmega32U2, ATmega32U4, ATmega8U2, ATxmega128A1U, ATxmega128A3U, ATxmega128A4U, ATxmega128B1, ATxmega128B3, ATxmega128C3, ATxmega16A4U, ATxmega16C4, ATxmega192A3U, ATxmega192C3, ATxmega256A3BU, ATxmega256A3U, ATxmega256C3, ATxmega32A4U, ATxmega32C3, ATxmega32C4, ATxmega384C3, ATxmega64A1U, ATxmega64A3U, ATxmega64A4U, ATxmega64B1, ATxmega64B3, ATxmega64C3. [Поддержка устройства USB и OTG] AT90USB1287, AT90USB647. Для удобного выбора различных моделей микроконтроллеров см. табличный селектор Atmel [3]. [Поддержка только устройства USB] AT32UC3B1128, AT32UC3B1256, AT32UC3B1512, AT32UC3B164, ATUC128D3, ATUC128D4, ATUC128L3U, ATUC128L4U, ATUC256L3U, ATUC256L4U, ATUC64D3, ATUC64D4, ATUC64L3U, ATUC64L4U. [Поддержка устройства USB и OTG] AT32UC3A0128, AT32UC3A0128AU, AT32UC3A0256, AT32UC3A0256AU, AT32UC3A0512, AT32UC3A0512AU, AT32UC3A1128, AT32UC3A1256, AT32UC3A1256AU, AT32UC3A1512, AT32UC3A1512AU, AT32UC3A3128, AT32UC3A3128S, AT32UC3A3256, AT32UC3A3256AU, AT32UC3A3256S, AT32UC3A364, AT32UC3A364S, AT32UC3A4128, AT32UC3A4128S, AT32UC3A4256, AT32UC3A4256S, AT32UC3A464, AT32UC3A464S, AT32UC3B0128, AT32UC3B0128AU, AT32UC3B0256, AT32UC3B0512, AT32UC3B0512AU, AT32UC3B064, AT32UC3C0128C, AT32UC3C0256C, AT32UC3C0512C, AT32UC3C0512CAU, AT32UC3C064C, AT32UC3C1128C, AT32UC3C1256C, AT32UC3C1512C, AT32UC3C164C, AT32UC3C2128C, AT32UC3C2256C, AT32UC3C2512C, AT32UC3C264C. Для удобного выбора различных моделей микроконтроллеров см. табличный селектор Atmel [3]. Основные возможности библиотеки: • Совместимость со стандартом USB 2.0, часть 9. Поддерживаются следующие типы передач: Control (управление), Bulk (пакетное блоками), Isochronous (изохронное, с привязкой по времени) и Interrupt (наподобие прерываний), на скоростях Low Speed (1.5 мегабит/сек), Full Speed (12 мегабит/сек), High Speed (480 мегабит/сек). Пока что альтернатив этой библиотеке практически нет, за исключением LUFA. Стек USB хоста (библиотека), описываемый в этом документе, включен в фреймворк ASF Atmel® (сокращение от AVR Software Framework), и он предназначен для предоставления пользователю самого быстрого и простого пути построения приложения хоста USB на основе микроконтроллеров. Также этот стек хоста USB ориентирован на малый объем кода и низкое потребление энергии. Все непонятные термины и сокращения см. в разделе Словарик, к конце статьи. [Документация по теме приложений хоста USB] Компания Atmel предоставила несколько примеров приложений хоста USB. К каждому примеру имеется несколько апноутов (см. рисунок ниже). Рис. 3-1. Апноуты примеров приложений хоста USB. Для изучения этих апноутов требуются базовые знания по классам хоста USB (классы HID, CDC, MSC, PHDC, AUDIO). Для создания хоста USB для одного из предоставленных в ASF классов, обращайтесь напрямую к апноуту, посвященному соответствующему классу USB. Апноуты стека хоста USB и класса вендора хоста (USB host vendor class) разработаны для опытных разработчиков приложений USB. [Обзор архитектуры библиотек] Стек хоста USB функционально разделен на 3 части: • USB Host Controller (UHC), предоставляющий совместимость со стандартном USB часть 9. Примечание: драйверы хоста USB реализованы в режиме полной поддержки прерываний, так что этот UHD отличная база для создания драйвера USB для стеков USB от сторонних производителей. Это относится либо к пользовательскому интерфейсу, либо к интерфейсу OHCI/EHCI. Рис. 4-1. Архитектура стека хоста USB. В случае двойного режима (устройство/хост) имеется описание стека устройства USB в апноуте "AVR4900: ASF – USB Device stack". Затраты памяти на стек USB зависят от: • Используемого ядра Atmel (megaAVR®, UC3). Различные комбинации этих параметров дают разные затраты на используемую память, но обычно стек хоста USB требует не больше 10 килобайт FLASH и 1 килобайт RAM при использовании самого высокого уровня оптимизации компилятора. Файлы стека хоста USB. Примеры стека доступны в Atmel AVR Studio® 5, если запустить визард создания нового проекта (New Example Project wizard) и выбрать ASF Modules wizard. Можно выбрать примеры хоста из списка или ввести в поле поиска host. Совет: выберите раздел Technology USB чтобы уменьшить список отображаемых примеров в AVR Studio 5. Примечание: имена примеров, включающих "From ASF V1" относятся к предыдущей реализации стека хоста USB из ASF v1.7, которая выходит за рамки этого апноута. Файлы, общие для всех микроконтроллеров, описаны в таблице ниже.
Примечание *: эти файлы используются совместно со стеком устройств USB. Файлы UHD, зависящие от выбранного микроконтроллера: • avr32/drivers/usbb/usbb_host.c/h Примечание *: эти файлы используются совместно со стеком устройств USB. Файл, относящийся к специфике каждого определенного приложения. Для конфигурации стека хоста USB используется файл приложения (см. часть "Конфигурация" и таблицу 5-3) usb_conf_host.h. [API] В этой части описывается все API, кроме UHI API, которому посвящен отдельный документ [4, 5]. Рис. 5-1. Модули USB. Внешнее API от UHC. Внешнее UHC API позволяет приложению обслуживать общее поведение хоста USB и принимать общие события хоста USB. Это управление и обработка событий являются общими для всех приложений USB. Таблица 5-1. Внешнее API UHC – функции ввода.
Таблица 5-2. Внешнее API UHC – функции ввода, относящиеся к подключенным устройствам.
Все UHC callback-и являются опциональными, и для каждого приложения определяются пользователем в файле conf_usb_host.h. Таблица 5-3. Внешнее API UHC – Callback-функции.
Внутреннее API. Следующие определения применяются для квалифицированных пользователей, которые нуждаются в разработке специфического хоста USB, который не предоставлен в ASF. Рис. 5-2. Обзор внутреннего API хоста USB. Примечание: цифры на рисунке относятся к таблицам ниже. Таблица 5-4. Ввод UHI из UHC (1).
Примечание: UHI API сохранено в массиве USB_HOST_UHI, см. таблицу 7-1. Таблица 5-5. Ввод UHC из UHD (3).
Таблица 5-6. Ввод UHD (4).
Таблица 5-7. UHD callback (5).
Таблица 5-8. Ввод UHD, только для совместимости с приложением High Speed (4).
Информация о подключенном устройстве USB. UHC обслуживает устройства через структуру uhc_device_t, которая сохраняет множество данных об устройствах, подключенных к дереву USB. Глобальная переменная g_uhc_device_root содержит информацию о первом подключенном устройстве, и это первый элемент в списке устройств. Приложение пользователя может читать этот список, чтобы получить информацию о текущем состоянии дерева USB. Примечание: здесь нет ограничения на дерево USB, потому что список устройств и выделение памяти на поля дескрипторов USB динамические, и требуют наличия стандартной библиотеки для выделения памяти (например alloc()). Структура uhc_device_t включает: • Указатель на дескриптор устройства USB. Рис. 5-3. Определение uhc_device_t. [Поведение стека хоста USB] В этой части содержатся ответы на вопросы продвинутого использования USB, и здесь описано поведение стека хоста USB. Последующие секции описывают взаимодействие между разными слоями вот этих шагов: • Управление двойной ролью USB. Двойные роли. Когда аппаратура USB может работать в режиме устройства USB и в режиме хоста USB, пользователь может реализовать приложение с двойной ролью. Это приложение будет переключаться задачами между устройства USB и хоста USB в зависимости от уровня на выводе идентификации (USB ID pin, в соответствии со стандартом USB OTG). Стек хоста USB предоставляет 3 возможности управления двойной ролью: ручное, полуавтоматическое и автоматическое. Ручной вариант управления ролью должен использоваться тогда, когда нет вывода идентификации (ID pin). В этом случае процесс пользователя управляет выбором роли. Полуавтоматический и автоматический варианты должны использоваться тогда, когда ID pin обслуживается аппаратурой интерфейса USB. Полуавтоматический вариант управления двойной ролью позволяет отложить запуск режима устройства USB и режима хоста USB, когда меняется состояние ID pin. Эта возможность разрешается, когда имеется определение UHD_START_MODE_MANUAL (см. таблицу 7-2). Рис. 6-1. Ручное управление двойной ролью USB. Рис. 6-2. Полуавтоматическое управление двойной ролью USB. Рис. 6-3. Автоматическое управление двойной ролью USB. Управление VBUS. Рис. 6-4. Управление VBUS. Соединение с устройством USB. Рис. 6-5. Соединение с устройством USB. Примечание: эта последовательность одинакова для устройств, подключенных через хаб USB HUB, но события соединения и сброса управляются через запрос USB HUB setup. Когда энумерация устройства USB терпит неудачу 4 раза, сигнальная линия USB устройства устанавливается в режим приостановки (USB SUSPEND mode). Энумерация устройства. Рис. 6-6. Энумерация устройства USB (одиночная конфигурация USB). Примечание: здесь не определен callback UHC_DEVICE_CONF(), так что по умолчанию выбирается конфигурация 1 устройства. Рис. 6-7. Энумерация устройства USB (с несколькими конфигурациями USB). Ниже приведен пример кода для поддержки известного устройства с несколькими конфигурациями: // Файл conf_usb.h: #define UHC_DEVICE_CONF(dev) user_choose_usb_conf(dev)
// Файл пользователя на языке C:
uint8_t user_choose_usb_conf(uhc_device_t* dev) { if ((dev->dev_desc.idVendor == 0x1234) && (dev->dev_desc.idProduct == 0x5678)) { Assert(dev->dev_desc.bNumConfigurations>=2); return 2; // Выбрана конфигурация 2. } return 0; // Не выбрана ни одна из конфигураций, потому что принято // решение, что устройство не известно (unknown device). } [Конфигурация] Конфигурации приложения определяются в файле conf_usb_host.h. Этот файл должен быть создан для каждого приложения, и это действие требует базовых знаний принципов работы USB. Файл conf_usb_host.h определяет следующие конфигурации: • Конфигурация хоста USB. Конфигурация хоста USB. Следующая конфигурация должна быть включена в файл conf_usb.h приложения, и здесь содержится основная конфигурация поддерживаемого устройства USB. Таблица 7-1. Конфигурация хоста USB.
Примечание 1: опциональная конфигурация. Для того, чтобы запретить это, закомментируйте строку с определением (например: // #define USB_HOST_X). Конфигурация интерфейса хоста USB. Конфигурации UHI описаны в отдельных апноутах классов хоста USB. Конфигурация драйвера хоста USB. Аппаратный интерфейс USB может предоставить отдельные возможности, что управляется файлами conf_usb_host.h, conf_board.h и опциями проекта. Таблица 7-2. Конфигурация драйвера хоста USB в файле conf_usb_host.h.
Таблица 7-3. Конфигурация драйвера хоста USB в файле conf_board.h.
Таблица 7-4. Конфигурация драйвера хоста/устройства USB в проекте.
[Поддержка USB HUB] Стек хоста USB может поддерживать дерево USB через функцию USB HUB. Однако аппаратура интерфейса USB, предоставленная в микроконтроллерах Atmel, может ограничить дерево USB. Таблица 8-1. Ограничение аппаратуры USB HUB.
Примечание (1): чтобы избежать ограничения на количество каналов (pipes), возможно их мультиплексирование. Однако в этом случае планирование передач должно осуществляться программно (драйвером UHD) вместо аппаратуры USB. [Энергопотребление] Режимы энергопотребления, доступные в микроконтроллерах Atmel, поддерживаются аппаратурой USB. Все драйверы USB реализуют эту возможность из службы sleepmgr. Таким образом, должна быть выполнена инициализация этой службы вызовом sleepmgr_init() из приложения перед любым вызовом API стека USB. Ядро AVR32. Для ядра AVR32 такты и генераторы могут быть автоматически выключены в периодах ожидания (idle) при выполнении инструкции sleep процессора CPU. Таблица 9-1. Уровни сна, поддерживаемые драйверами хоста USBB и USBC.
Примечание: режимы сна, перечисленные здесь, не могут быть запущены, если любой другой программный модуль, не относящийся к стеку USB, требует менее глубокого режима сна. [Словарик] ACK Acknowledge, положительное подтверждение по шине USB (подробнее см. [3]). API Application programming interface, интерфейс программирования. ASF AVR Software Framework, библиотека для реализации различных функций от Atmel. CBW Command Block Wrapper, обертка блока команды (термин относится к Mass Storage Class устройств USB). CDC Communication Device Class, класс CDC устройств USB, предназначенных для обмена данными. CSW Command Status Wrapper, обертка статуса команды (термин относится к Mass Storage Class устройств USB). DP или D+ один из сигналов дифференциальной линии данных USB. DM или D- второй сигнал дифференциальной линии данных USB. EHCI Enhanced Host Controller Interface, расширенный интерфейс контроллера хоста. FS USB Full Speed (12 мегабит/сек). HID Human interface device. HS USB High Speed (480 мегабит/сек. LS USB Low Speed (1.5 мегабит/сек). IN ACK подтверждение передачи типа IN (подробнее см. [2]). MSC Mass Storage Class, класс USB для устройств хранения данных (флешки, внешние жесткие диски). OHCI Open Host Controller Interface, открытый интерфейс контроллера хоста. OTG On The Go, переводится "на лету". Термин означает, что система может при подключении выбирать режим работы интерфейса USB - т. е. может работать либо в качестве устройства USB, либо как хост USB. Режим работы определяется уровнем напряжения на специальном выводе идентификации режима (ID pin) на коннекторе USB. OUT ACK подтверждение передачи типа OUT (подробнее см. [2]). PHDC Peripheral Health Device Class. PIPE буфер данных для обслуживания передачи конечной точки в режиме хоста. sleepmgr Sleep management service, служба управления режимом сна из библиотеки ASF. UDC USB Device Controller, контроллер устройства USB. UDD USB Device Descriptor, дескриптор устройства USB. UDI USB Device Interface, интерфейс устройства USB. UHC USB Host Controller, контроллер хоста USB. UHD USB Host Descriptor, дескриптор хоста USB. UHI USB Host Interface, интерфейс хоста USB. USB Universal Serial Bus. USBB версия аппаратного интерфейса USB для платформы 32-битного ядра Atmel. USBC версия аппаратного интерфейса USB на языке C для платформы 32-битного ядра Atmel. SOF Start Of Frame, начало фрейма. STALL токен USB, используемый для остановки транзакции по шине USB. ZLP Zero length packet, пакет нулевой длины. VBUS шина питания +5V интерфейса USB. Примечание: дополнительную информацию по протоколу USB и его терминологии см. в статье [2]. [Ссылки] 1. AVR4950: ASF - USB Host Stack site:atmel.com. |