AVR270: демонстрационный проект мыши на AVR с аппаратным USB Печать
Добавил(а) microsin   

Перевод апноута AVR270: USB Mouse Demonstration on megaAVR with USB [1], рассказывающий про демонстрационный код устройства USB HID - компьютерная мышь. Исходный код и документацию можно скачать по ссылке [2].

Особенности демо-проекта мыши:

• Работает на микроконтроллерах серии AT90USB, на частоте 8 МГц (или 16 МГц)
• Реализовано устройство USB с низким потреблением от шины USB (менее 100 мА)
• Мышь стандартная, т. е. она работает на любом компьютере PC, на котором установлена любая операционная система (Windows® 98SE или более свежая, Linux® или Mac OS®).
• Требуется менее 3 килобайта пространства памяти программ (FLASH)
• Реализованы перемещение курсора по осям X, Y, левая кнопка мыши.

Исходный код можно скачать по ссылке [2] (см. папку USB mouse).

Прим. переводчика: в библиотеке LUFA также есть готовый проект мыши с исходным кодом, который также можно скомпилировать на любой микроконтроллер AVR с аппаратным интерфейсом USB (см. [2], папки LUFA-130901\Demos\Device\ClassDriver\Mouse и LowLevel\Mouse архива). Проекты из LUFA удобнее тем, что их можно скомпилировать практически под любую макетную плату, имеющуюся на рынке. Все примеры кода из архива [2] можно с успехом запустить на макетных платах AVR-USB162, AVR-USB162MU, userial, AVR-USB32U4.

[1. Введение]

Традиционно клавиатура подключалась к компьютеру через интерфейс PS/2. Но интерфейс PS/2 уже устарел, и постепенно исчезает с новых моделей PC и ноутбуков. Его место с успехом заменяет интерфейс USB. Такое изменение на рынке касается разработчиков устройств ввода/вывода, потому что необходимо иметь возможность реализовать интерфейс USB, чтобы обеспечить простое подключение разрабатываемых устройств к новым компьютерам.

AVR270-USB-mouse

Этот апноут описывает простой проект мыши. Он позволяет быстро протестировать аппаратуру USB чипов серий AT90USBxxx, при этом не нужно устанавливать никакие драйвера на компьютер. Подразумевается, что читатель знаком с библиотекой USB Software Library for AT90USBxxx Microcontrollers [3] (поставляется бесплатно на CD-ROM, и её также можно скачать с сайта Atmel), и знаком со стандартом USB HID [4].

Прим. переводчика: за разъяснением специфических терминов стандарта USB (конечная точка endpoint, polling, request, report, хост USB, устройство USB и т. д.) лучше обратиться к документу USB in a Nutshell [7].

[2. Требования к аппаратуре]

Приложение firmware для мыши USB требует следующую аппаратуру:

• Отладочную плату с микроконтроллером AVR USB (STK525, AT90USBKey, STK526, или это может быть Ваша собственная плата).
• Стандартный кабель USB, если он нужен для подключения к Вашей плате (например, на одной стороне должен быть стандартный коннектор типа A, а на другой коннектор типа Mini B).
• Компьютер, на котором установлена операционная система Windows (98SE, ME, 2000, XP и т. д.), Linux или MAC OS, поддерживающие хост USB стандартов USB 1.1 или USB 2.0.

Firmware мыши Вы также с успехом можете запустить на макетных платах AVR-USB162, AVR-USB162MU, userial, AVR-USB32U4 [6].

at90usb162-04IMG 8330 AVR-USB162MU IMG_1139 AVR-USB32U4-top-IMG 2310

[3. Как можно запрограммировать Ваш чип AVR USB]

Для того, чтобы прошить память микроконтроллера, Вы можете использовать следующие методы:

• Интерфейс JTAG, для этого нужен аппаратный отладчик JTAGICE mkII(2).
• Интерфейс ISP (SPI), для этого можно использовать программаторы AVRISP mkII, AVR Dragon (прим. переводчика: и множество других программаторов [5]) и отладчик JTAGICE mkII(2).
• Интерфейс USB, благодаря прошитому в память микроконтроллера (это уже сделано на заводе Atmel) DFU bootloader и программному обеспечению FLIP(1). Этот способ наиболее практичен и удобен.
• Параллельное программирование, для этого нужны программаторы STK®500 или STK600.

Примечания: 

(1) Программа-утилита FLIP предоставляется компанией Atmel, чтобы позволить пользователю прошить устройства AVR USB (и другие) через подключение USB, что не требует никакой дополнительной аппаратуры типа отладчиков и программаторов. Прием данных через USB и перепрошивку памяти программ берет на себя бутлоадер DFU, заранее прошитый в память чипа на заводе Atmel.
(2) При использовании JTAGICE MKII будьте осторожны с галочкой "erase before programming" (очистить перед программированием) в утилите программатора AVR Studio®. Если эта галочка установлена, то это приведет к стиранию как программы пользователя, так и к стиранию бутлоадера DFU. Прим. переводчика: при необходимости бутлоадер всегда можно восстановить с помощью ISP-программатора, бинарник бутлоадера можно скачать с сайта Atmel.

Пожалуйста обратитесь к содержимому справки FLIP для того, чтобы узнать, как установить драйвер USB и как запрограммировать микроконтроллер ATmega32U4 через интерфейс USB.

Прим. переводчика: простые указания на русском языке по установке драйвера USB и перепрошивке микроконтроллера через FLIP можно получить из статьи "Макетная плата AVR-USB32U4" [6].

[4 Быстрый старт]

Как только прошили Ваш микроконтроллер (например ATmega32U4) файлом usb_mouse.a90 проекта USB mouse [2], Вы можете запустить демонстрацию работы мыши. Проверьте, что Ваше устройство USB успешно прошло энумерацию как мышь (см. скриншот окна Диспетчера Устройств), и теперь Вы может использовать Вашу плату как мышь.

AVR270-USB-mouse-enumeration

На рисунке ниже показано на примере отладочной платы STK525, какие кнопки нужны для управления работой этого демо.

AVR270-demo-board

Для перемещения курсора мыши по рабочему столу окна Windows используйте джойстик. Кнопка HWB работает как будто левая кнопка мыши. Кнопка и джойстик просто подключены к портам ввода вывода AVR как замыкатели на землю. Уже упоминалось, что могут быть использованы и другие стартер-киты и отладочные платы, в этом случае см. по исходному коду проекта, какие порты микроконтроллера нужно замкнуть на GND, чтобы получить эффект перемещения курсора или нажатия левой кнопки мыши.

[5. Обзор приложения firmware мыши USB HID]

Программа микроконтроллера (firmware), которая ведет себя как мышь USB, использует простейший обмен данными с компьютером PC. Компьютер постоянно опрашивает мышь с интервалом P (поллинг или опрос, polling interval time) на предмет наличия новый данных, и мышь будет отправлять эти данные, если они имеются. Если данных нет, то мышь будет посылать в ответ NAK (No Acknowledge, нет подтверждения).

Данные, которые посылаются в компьютер, называются репортом (report). Этот репорт имеет следующую структуру:

AVR270-USB-mouse-report-structure

Рис. 5-1. Структура USB репорта мыши.

AVR270-Application-Overview

Рис. 5-2. Как работает приложение мыши.

[6. Организация кода firmware]

Код firmware мыши базируется на USB Software Library for AT90USBxxx Microcontrollers [3], и поэтому имеет ту же самую архитектуру.

AVR270-USB-Mouse-Firmware-Architecture

Рис. 6-1. Архитектура программного обеспечения USB Mouse

Эта секция посвящена только работе модуля мыши (как опрашивается джойстик и кнопка). После этого будет описана настройка файлов, чтобы дать пользователю возможность построить собственное приложение мыши на основе проекта [2].

6.1 mouse_task.c

Этот файл содержит функции для инициализации мыши, сбора данных для репорта, и копирования данных репорта в буфер FIFO конечной точки устройства USB, чтобы данные были готовы для отправки в компьютер.

AVR270-Mouse-Application

Рис. 6-2. Приложение мыши.

6.1.1 mouse_task_init

Эта функция выполняет инициализацию параметров мыши и аппаратных ресурсов (в данном примере настройка портов джойстика и кнопки).

6.1.2 Is_usb_mouse_event

Если произойдет какое-либо событие, связанное с мышью, то эта функция обновит USB-репорт мыши и вернет true. Иначе вернет false.

6.1.3 mouse_task

Эта задача проверяет результат Is_usb_mouse_event, и если true, то загружает репорт в USB endpoint FIFO, чтобы данные были отправлены хосту (компьютеру PC).

6.2 stk_52x.c

Этот файл содержит все подпрограммы, касающиеся управления ресурсами платы STK52x (джойстик, потенциометр, термодатчик, светодиоды...). Пользователю не нужно модифицировать этот файл, если он использует плату STK52x. Иначе на основе файла stk_52x.c. нужно сделать свой собственный файл для управления аппаратными ресурсами Вашей платы.

6.3 Как организовать поддержку Remote Wake Up (возможность пробуждения компьютера)

Функция Remote Wake Up является опциональной (необязательной) возможностью, указанной в стандарте USB. Она позволяет устройству USB вывести хост из режима пониженного энергопотребления (stand by mode). За подробностями, как это работает, обратитесь к спецификации USB, например [4]. Запрос на Remote Wake Up может инициировать устройство USB, но только хост может разрешить эту возможность. Хост отправляет запрос Set Feature request, чтобы разрешить фичу Remote Wake Up перед тем, как отправить запрос приостановки работы устройства (suspend request). Если хост не отправил Set Feature (RemoteWakeUpEnable), то устройству не разрешено использовать фичу Remote Wake Up.

Устройство USB device сообщает о своей способности поддержать remote wakeup в своем дескрипторе конфигурации (configuration descriptor, см. описание далее, как это делается совместно с библиотекой USB Atmel [3]). Если устройство поддерживает remote wakeup, оно должно также поддержать разрешение и запрет своей работы с использованием стандартных запросов USB.

Дескриптор конфигурации (configuration descriptor) определен в файле usb_descriptors.h следующим образом:

// HID Mouse CONFIGURATION (конфигурация HID-мыши)
#define NB_INTERFACE 1
#define CONF_NB 1
#define CONF_INDEX 0
#define CONF_ATTRIBUTES USB_CONFIG_BUSPOWERED
#define MAX_POWER 50 // 100 mA

Чтобы настроить поддержку фичи Remote Wake Up, Вам нужно модифицировать CONF_ATTRIBUTES:

#define CONF_ATTRIBUTES (USB_CONFIG_BUSPOWERED|USB_CONFIG_REMOTEWAKEUP)

Если устройство поддерживает фичу Remote Wake Up, пользователь имеет поддержку запроса Set_Feature(DEVICE_REMOTE_WAKEUP) через использование подпрограммы void usb_set_feature(void).

Как только Set_Feature(DEVICE_REMOTE_WAKEUP) успешно обработано, то Вы можете использовать любую кнопку (она должна работать в режиме внешнего прерывания по изменению состояния вывода, external interrupt/pin change mode) чтобы вывести хост из режима сна. Чтобы это нормально работало, уделите внимание следующему:

• Во-первых, контроллер USB должен определить состояние приостанова (suspend state) линии: remote wake-up может быть отправлен только тогда, когда установлен флаг SUSPI.
• Программа firmware может установить RMWKUP, чтобы отправить поток "upstream resume". Это автоматически произойдет с помощью контроллера после 5 миллисекунд неактивности шины USB.
• Когда контроллер запустит отправку "upstream resume", сработает прерывание UPRSMI (если оно разрешено). SUSPI очищается аппаратно.
• RMWKUP очищается аппаратно по окончанию "upstream resume".
• Если контроллер детектировал хороший сигнал "End Of Resume" (окончание пробуждения) от хоста, то сработает прерывание EORSMI (если оно было разрешено).

6.4 Как переделать устройство USB из "незагрузочного" (non-bootable device) в "загрузочное" (bootable device)

Пожалуйста имейте в виду, что устройства USB HID могут быть bootable или non-bootable. По умолчанию демонстрационные примеры от Atmel поставляются как non-bootable устройства. Если Ваше приложение требует поддержки bootable, то нужно модифицировать параметр подкласса (sub-class parameter) в файле usb_descriptors.h:

// USB Interface descriptor mouse (дескриптор интерфейса USB мыши)
#define INTERFACE_NB_MOUSE 0
#define ALTERNATE_MOUSE 0
#define NB_ENDPOINT_MOUSE 1
#define INTERFACE_CLASS_MOUSE 0x03 // HID Class
#define INTERFACE_SUB_CLASS_MOUSE 0x00 // Non-bootable
#define INTERFACE_PROTOCOL_MOUSE 0x01 // мышь
#define INTERFACE_INDEX_MOUSE 0

Установите INTERFACE_SUB_CLASS_MOUSE в значение 1, чтобы мышь стала bootable device.

[7. Программное обеспечение для компьютера (PC Software)]

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

В этом демо-приложении USB HID мыши не реализована поддержка средней и правой кнопок мыши.

[Ссылки]

1. AVR270: USB Mouse Demonstration on megaAVR with USB site:atmel.com.
2. 131122AVR270_AVR271_AVR272_AVR273.zip - документация, исходный код.
3. AVR276: USB Software Library for AT90USBxxx Microcontrollers.
4. HID Related Specifications site:usb.org.
5. Программаторы для AVR.
6. Макетная плата AVR-USB32U4.
7. USB in a NutShell - путеводитель по стандарту USB.