AVR271
Демонстрация USB клавиатуры
Свойства:
- поддержка любой операционными системами фирмы Microsoft начиная с Windows® 98SE, Linux и MAC OS;
- отсутствие необходимости установки драйвера;
- отображение простого текстового сообщения;
- отсутствие поддержки управления светодиодами на клавиатуре.
Введение
Интерфейс PS/2 исчезает из ПК нового поколения, его замещает интерфейс USB, который стал стандартным интерфейсом между ПК и периферийными устройствами. Это изменение должно быть учтено разработчиками клавиатур, которые должны встраивать USB-интерфейс для подключения клавиатуры к ПК.
Цель этого документа - описание начала реализации и разработки USB клавиатуры на МК AT90USB с использованием отладочного набора STK525 и внутрисистемного программирования с помощью Flip.
Предполагается, что пользователь знаком с программной библиотекой USB для микроконтроллеров AT90USBxxx (Application Note AVR276 Программная библиотека USB для AT90USBxxx) и спецификацией HID-класса (http://www.usb.org/developers/hidpage).
Рис. 1-1. Интерфейс между клавиатурой и ПК
2. Требования к аппаратному обеспечению
Для реализации HID-приложения требуется следующее аппаратное обеспечение:
- AVR USB демонстрационная плата (STK525, AT90USBKey, STK526...или ваша собственная плата);
- AVR USB-микроконтроллер
- USB-кабель (стандартный A в мини B);
- ПК с операционной системой Windows (98SE, ME, 2000, XP, Vista), Linux® или MAC® OS с USB хостом 1.1 или 2.0.
3. Внутрисистемное программирование и обновление программного обеспечения устройства
Для программирования устройства вы можете использовать несколько методов:
- JTAG-интерфейс с использованием JTAGICE MKII
- SPI - интерфейс с использованием AVRISP MKII
- USB-интерфейс благодаря фабричному DFU загрузчику (bootloader) и программному обеспечению Flip;
- Параллельное программирование с помощью STK500 или STK600.
Пожалуйста, обратитесь к руководству пользователя используемой вами платы (если вы используете стартовые наборы Atmel) для понимания как программировать устройства этими разными методами.
Пожалуйста, обратитесь к разделу помощи Flip, чтобы понять как устанавливать USB-драйвер и программировать устройство через USB-интерфейс.
Замечание. Flip - это программное обеспечение, поставляемое фирмой Atmel, для предоставления пользователям возможности программирования USB AVR-устройств через USB-интерфейс (для этого не требуется внешнего аппаратного обеспечения) благодаря заводскому DFU-загрузчику.
4. Быстрый старт
Когда ваше устройство запрограммировано файлом usb_keyboard.a90, вы можете начать демонстрацию клавиатуры. Проверьте, что ваше устройство нумеруется в качестве клавиатуры (см. рис. 4-1), после чего вы можете использовать отладочный набор для посылки символов в ПК.
Рис. 4-1. Нумерация клавиатуры
Нижеприведенный рисунок показывает использование STK525 в качестве демонстрации клавиатуры (вы можете использовать другой отладочный набор: AT90USBKey, STK526 - в зависимости от того, с каким USB AVR микроконтроллером вы работаете).
Рис. 4-2. Демонстрационная плата STK525
Назначение демонстрации клавиатуры - послать строку символов в ПК. Для запуска демонстрации следуйте нижеприведенным инструкциям:
- Откройте Notepad или другой текстовый редактор.
- Установите раскладку клавиатуры QWERTY (иначе в текстовом редакторе вы увидите неправильные символы).
- Подсоедините STK525.
- Нажмите на джойстик.
Рис. 4-3. Демонстрация клавиатуры
5. Обзор приложения
Приложение "USB-клавиатура" обеспечивает простой обмен данными между ПК и клавиатурой.
ПК "спрашивает" клавиатуру каждый интервал времени P (интервал опроса), есть ли новые данные, если они есть, то клавиатура посылает их в ПК, иначе клавиатура посылает NAK (отказ от транзакции), чтобы "сказать" ПК, что нет новых доступных данных.
Обмен данными между ПК и клавиатурой осуществляется с помощью репортов. Репорт, который содержит информацию о нажатых кнопках, является IN-репортом (посылается от клавиатуры к ПК). Репорт, в котором содержится информация о статусе светодиодов (NUM LOCK, CAPS LOCK, SCROLL LOCK...) является OUT-репортом (посылается от ПК к клавиатуре). Нижеприведенный рисунок иллюстрирует структуры этих репортов:
Рис. 5-1. Структура USB-репортов
Рис. 5-2. Обзор приложения
6. Программное обеспечение
Как объяснено в документе "Программная библиотека USB для AT90USBxxx" (Application Note AVR276) все программное обеспечение для USB имеет одинаковую архитектуру (для более подробной информацией обратитесь, пожалуйста, к этому документу).
Рис. 6-1 Архитектура программного обеспечения USB-клавиатуры
Этот раздел посвящен только модулю клавиатуры. Изменение файлов, описанных ниже, позволяет пользователю разработать его собственную клавиатуру.
6.1 keyboard_task.c
Этот файл содержит функции, которые инициализируют аппаратные средства, используемые в качестве клавиатуры, а также функции, которые получают данные репорта и отправляют их в FIFO конечной точки для подготовки их к отправке в ПК.
Рис. 6-2. Алгоритм работы клавиатуры
6.1.1 keyboard_task_init
Эта функция осуществляет инициализацию параметров клавиатуры и аппаратных ресурсов (джойстик….).
6.1.2 kbd_test_hit
Эта функция проверяет, есть ли нажатые кнопки, и устанавливает в 1 переменную key_hit.
6.1.3 keyboard_task
Эта функция проверяет, нажата ли какая-нибудь из кнопок (key_hit == true). Если это условие выполняется, то формируется IN-репорт с соответствующими данными и сохраняется в FIFO конечной точки, чтобы быть отправленным в хост.
6.2 stk_52x.c
Этот файл содержит все процедуры для управления ресурсами отладочной платы STK52x (джойстик, потенциометр, датчик температуры, светодиоды…). Пользователь не должен изменять этот файл при использовании STK52x. Иначе ему придется разработать собственный файл для управления аппаратными ресурсами.
6.3 Как управлять светодиодами CAPS, NUMLOCK...
Управление светодиодами на клавиатуре (CAPS, NUMLOCK... ) осуществляется хостом при нажатии соответствующих кнопок. При получении кода кнопок CAPS или NUMLOCK... хост посылает запрос Set_Report (OUT-репорт) для включения/выключения светодиодов на клавиатуре.
Запрос посылается через нулевую конечную точку (управляющая передача) и должен быть обработан как запрос Set_Configuration, как показано ниже:
Сначала хост посылает set_report, как показано ниже:
bmRequestType 00100001
bRequest SET_REPORT (0x09)
wValue Report Type (0x02) and Report ID 0x00)
wIndex Interface (0x00)
wLength Report Length (0x0004)
Data Report (1 byte) |
Этот запрос является специфическим для HID-класса, поэтому он не обрабатывается функциями в файле usb_standard_request.c, но обрабатывается функциями, содержащимися в файле usb_specific_request.c. В этом файле запрос декодируется с помощью функции usb_user_read_request() в соответствии со значениями полей bmRequest и bRequest. Тип репорта (0x02) соответствует OUT-репорту. Для обработки этого запроса usb_user_read_request() вызовет функцию hid_set_report(). Эта функция подтвердит setup-запрос и затем позволит пользователю получить доступ к посланным данным (вы можете проверить размер с помощью параметра wLength), чтобы узнать, какой светодиод нужно включить/выключить. (обратитесь к спецификации HID-класса для более подробной информации относительно использования значения LEDs).
void hid_set_report (void)
{ U16 wLength;
U8 CAPS_LED = 0;
U8 REPORT_ID;
LSB(wInterface)=Usb_read_byte();
MSB(wInterface)=Usb_read_byte();
LSB(wLength) = Usb_read_byte(); //!< read wLength
MSB(wLength) = Usb_read_byte();
Usb_ack_receive_setup();
while(!Is_usb_receive_out());
REPORT_ID = Usb_read_byte();
CAPS_LED = Usb_read_byte();// get the value of the CAPS LED status sent
by the host
Usb_ack_receive_out();
Usb_send_control_in();
while(!Is_usb_in_ready());
//Send a report to clear the CAPS request
Usb_select_endpoint(EP_KBD_IN);
Usb_write_byte(0); // Byte0: Modifier
Usb_write_byte(0); // Byte1: Reserved
Usb_write_byte(0); // Byte2: Keycode 0
Usb_write_byte(0); // Byte2: Keycode 1
Usb_write_byte(0); // Byte2: Keycode 2
Usb_write_byte(0); // Byte2: Keycode 3
Usb_write_byte(0); // Byte2: Keycode 4
Usb_write_byte(0); // Byte2: Keycode 5
11
7602B–USB–07/08
AVR271
Usb_ack_in_ready();
//Turn ON/OFF the LED0 following the host reuqest
if(CAPS_LED == 0)
Led3_off();
else
Led3_on();
}
|
6.4 Как изменить мое не загрузочное (non-bootable) устройство на загрузочное (bootable) устройство
Пожалуйста, заметьте: HID устройство может быть загрузочным и нет. Изначально демонстрации HID устройсв, поставляемые Atmel, не загрузочные. Если необходимо, чтобы ваше приложение было загрузочным, вы должны изменить параметр sub-class (usb_descriptors.h):
// USB Interface descriptor Keyboard
#define INTERFACE_NB_KEYBOARD 0
#define ALTERNATE_KEYBOARD 0
#define NB_ENDPOINT_KEYBOARD 1
#define INTERFACE_CLASS_KEYBOARD 0x03 // HID Class
#define INTERFACE_SUB_CLASS_KEYBOARD 0x00 // Non-bootable
#define INTERFACE_PROTOCOL_KEYBOARD 0x01 //Keyboard
#define INTERFACE_INDEX_KEYBOARD 0
|
Установите INTERFACE_SUB_CLASS_KEYBOARD в 1 для преобразования клавиатуры в загрузочное устройство.
7. Программное обеспечение для ПК
Приложение "USB-клавиатура" не требует никакого программного обеспечения на компьютере.
Ограничения. Демонстрация не поддерживает OUT-репорты. Вам нужно добавить соответствующий код для обработки этих репортов (для получения более подробной информации обратитесь к разделу 6.3)
Документация
|