AVR328
 

Реализация устройства класса HID

Свойства:

  • поддержка любой операционной системой фирмы Microsoft начиная с Windows® 98SE;
  • простой интерфейс с ПК с функциями записи, чтения;
  • возможность обмена со скоростью до 64Кбайт/с в режиме полного дуплекса;
  • Выполняется на любом USB-контроллере AVR.

1. Введение

Целью этого документа является описание начала реализации и разработки приложения USB основанного на HID-классе, осуществляющего передачу данных между ПК и оборудованием пользователя.

2. Описание

Интерфейс USB становится очень сложным, если данные пользователя не соответствуют стандартным классам USB-устройств (Mass Storage, Аудио, Видео…). Для таких устройств должны быть разработаны специальные драйвера, а это отнимает много времени у разработчика.

Atmel разработала решение для уменьшения временных затрат на разработку. Это решение основано на классе HID. Это решение обеспечивает обмен данными между ПК и устройством в режиме полного дуплекса (со скоростью до 64Кбайт/с). Кроме обмена данными это приложение позволяет пользователю обновить программное обеспечение без установки какого-либо аппаратного обеспечения.

HID-класс поддерживается всеми операционными системами Microsoft начиная с Windows 98SE. Он также поддерживается большинством ОС других фирм (на момент публикации 02/08).

Предполагается, что пользователь знаком с программной библиотекой USB для микроконтроллеров AT90USBxxx (Application Note AVR276 Программная библиотека USB для AT90USBxxx) и спецификацией HID-класса.

3. Требования к аппаратному обеспечению

Для реализации HID-приложения требуется следующее аппаратное обеспечение:

  • AVR USB демонстрационная плата (STK525, AT90USBKey, STK526... или ваша собственная плата);
  • AVR USB-микроконтроллер
  • USB-кабель (стандартный A в мини B);
  • ПК с операционной системой Windows (98SE, ME, 2000, XP) с USB хостом 1.1 или 2.0

4. Внутрисистемное программирование и обновление программного обеспечения устройства

Для программирования устройства вы можете использовать несколько методов:

  • JTAG-интерфейс с использованием JTAGICE MKII
  • SPI - интерфейс с использованием AVRISP MKII
  • USB-интерфейс благодаря фабричному DFU загрузчику (bootloader) и программному обеспечению Flip;
  • Параллельное программирование с помощью STK500 или STK600.

Пожалуйста, обратитесь к руководству пользователя используемой вами платы (если вы используете стартовые наборы Atmel) для понимания как программировать устройства этими разными методами.

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

Замечание. Flip - это программное обеспечение, поставляемое фирмой Atmel, для предоставления пользователям возможности программирования USB AVR-устройств через USB-интерфейс (для этого не требуется внешнего аппаратного обеспечения) благодаря заводскому DFU-загрузчику.

5. Быстрый старт

Когда ваше устройство запрограммировано HID hex файлом, вы можете запустить демонстрационную версию HID-устройства. Проверьте, что ваше устройство нумеруется в качестве HID устройства, (см. рис. 5.1), затем запустите приложение на ПК (см. рис. 5.2) и начните обмен данными между ПК и устройством.

Нумерация HID
Рисунок 5.1. Нумерация HID

Цель этой демонстрации показать как осуществить полнодуплексный обмен между USB устройством и USB хостом.

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

Рисунок 5.2 показывает графический интерфейс, используемый приложением на ПК.

Графический интерфейс для HID-устройства
Рисунок 5.2. Графический интерфейс для HID-устройства

Пожалуйста для дополнительной информации о приложении для ПК, обратитесь к рекомендациям "Драйверы для устройств USB HID-класса"

6. Обзор приложения

Приложение HID-класса обеспечивает простой обмен данными между ПК и устройством.

Обмен данными по USB для этого приложения происходит через две конечные точки прерываний (одна для IN- и одна для OUT-передач).

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

Пакет данных, посылаемый из устройства в хост, называется IN-репортом. Чтобы послать данные в устройство ПК каждый интервал времени P (интервал опроса) проверяет, есть ли новые доступные данные для приложения. Этот пакет данных называется OUT-репортом.

Эти репорты содержат набор байт, которые могут быть использованы приложением пользователя для обмена данными - в зависимости от условий.

Это демонстрационное приложение использует IN-и OUT-репорты нижеприведенной структуры:

Структура IN-репорта
Рис. 6.1. Структура IN-репорта

Значение LEDs: Этот байт содержит текущее состояние (вкл/выкл) светодиодов.

Значение джойстика (Joystick): этот байт содержит состояние джойстика (активный/неактивный) и направление указателя.

Значение потенциометра: этот байт содержит значение потенциометра.

Значение температуры: этот байт содержит показание датчика температуры.

Структура OUT-репорта
Рис. 6.2. Структура OUT-репорта

Значение LEDs: Этот байт содержит новое состояние (вкл/выкл) светодиодов.

Замечание: В этом приложении мы используем IN- и OUT-репорты длиной 8 байт. Этот размер может быть изменен пользователем. Нет верхнего предела для длины репорта, но единовременно должно посылаться не более 64 байт. (см. раздел "Программное обеспечение").

Устройства HID-класса позволяют пользователю посылать данные через нулевую конечную точку с помощью функции "set_feature". Эта функция посылает feature-репорт длиной 4 байта (длина может быть изменена пользователем, см. раздел 7.3).

Feature-репорт
Рис 6.3. Feature-репорт

Пример применения
Рисунок 6.4. Пример применения

7. Программное обеспечение

Как объяснено в документе "Программная библиотека USB для AT90USBxxx" (Application Note AVR276, включенной в CD-диск, посвященный USB) все программное обеспечение для USB имеет одинаковую архитектуру (для более подробной информацией обратитесь, пожалуйста, к этому документу).

Архитектура программного обеспечения для реализации устройства HID-класса
Рисунок 7.1. Архитектура программного обеспечения для реализации устройства HID-класса

Этот раздел посвящен только модулю HID.

Изменение файлов, описанных ниже, позволяет пользователю разработать его собственное HID-приложение:

  • hid_task.c
  • usb_descriptor.h

7.1 hid_task.c

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

HID-приложение
Рисунок 7.2. HID-приложение

7.1.1 hid_task_init

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

7.1.2 (*start_bootloader)

Эта функция-указатель позволяет запускать загрузчик.

7.1.3 hid_task

Эта функция обеспечивает обмен данными, запуск загрузчика, при посылке команды DFU от ПК.

7.2 stk_52x.c.

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

7.3. Изменение длины репорта

Как уже упоминалось в пункте "обзор приложения", пользователь может изменять длину IN- и OUT-репортов.

Длины IN- и OUT-репортов определяются в файле usb_descriptor.h:

#define LENGTH_OF_REPORT_IN 8
#define LENGTH_OF_REPORT_OUT 8

Пожалуйста заметьте, что длина репорта должна быть равна или меньше размера конечной точки. Если размер репорта больше размера конечной точки, то вы должны посылать репорт за несколько временных интервалов.

Для изменения размера репорта (максимально 64 байта, т.к. HID-класс использует передачу по прерываниям), вы должны изменить следующие параметры в файле usb_descriptors.c:

#define EP_IN_LENGTH 8
#define EP_OUT_LENGTH 8

И параметр SIZE_n в файле usb_specific_request.c, а конкретнее в функции usb_user_endpoint_init():

usb_configure_endpoint(EP_HID_IN, \
                         TYPE_INTERRUPT, \
                         DIRECTION_IN, \
                         SIZE_8, \
                         ONE_BANK, \
                         NYET_ENABLED);
usb_configure_endpoint(EP_HID_OUT, \
                         TYPE_INTERRUPT, \
                         DIRECTION_OUT, \
                         SIZE_8, \
                         ONE_BANK, \
                         NYET_ENABLED);

SIZE_n может принимать следующие значения:

SIZE_8: 8 bytes
SIZE_16: 16 bytes
SIZE_32: 32
SIZE_64: 64 bytes
SIZE_128: 128 bytes
SIZE_256: 256 bytes
SIZE_512: 512 bytes
SIZE_1024: 1024 bytes

Для изменения feature-репорта, вы должны изменить следующий параметр в файле usb_descriptor.h:

#define LENGTH_OF_REPORT_FEATURE 4

Как и для IN- и OUT- репортов, для этого репорта нет ограничения на длину. Если его длина равна или меньше размера нулевой конечной точки, то он будет послан за один временной интервал, иначе он должен быть послан за несколько временных интервалов. Вам может понадобиться изменить размер нулевой конечной точки для посылки более длинного репорта, для этого вы должны изменить следующий параметр в файле usb_descriptors.h:

#define EP_CONTROL_LENGTH 8

Максимальный размер, который может быть установлен для нулевой конечной точки, составляет 64 байта (согласно спецификации USB).

7.4. Как обрабатывать запросы setFeature

Функция setFeature() содержится в DLL для того, чтобы позволить пользователю посылать устройству управляющие команды. Эти команды посылаются через нулевую конечную точку и должны обрабатываться как запросы set_report (для более подробной информации обратитесь к спецификации HID).

Запрос set_report должен обрабатываться программным обеспечением как управляющая передача. Сначала хост пошлет set_report как показано ниже:

bmRequestType               00100001
bRequest                    SET_REPORT (0x09)
wValue                      Report Type (0x03) and Report ID 0x00)
wIndex                      Interface (0x00)
wLength                     Report Length (0x0004)
Data                        Report (4 bytes)

Этот запрос является специфическим для HID-класса, поэтому он не обрабатывается функциями в файле usb_standard_request.c, но обрабатывается функциями, содержащимися в файле usb_specific_request.c. В этом файле запрос декодируется с помощью функции usb_user_read_request() в соответствии со значениями полей bmRequest и bRequest. Тип репорта (0x03) соответствует Set_Feature_Report. Для обработки этого запроса usb_user_read_request() вызовет функцию usb_set_feature(). Эта функция подтвердит setup-запрос и затем позволит вам получить доступ к посланным данным (вы можете проверить размер с помощью параметра wLength).

void usb_set_feature(void)
{U16 wInterface;
  U16 wLength;
  U8 tab[];
  LSB(wInterface)=Usb_read_byte();
   MSB(wInterface)=Usb_read_byte();
  LSB(wlength)=Usb_read_byte();
   MSB(wLength)=Usb_read_byte();
  Usb_ack_receive_setup(); //Clear the setup flag
  while(!Is_usb_receive_out()); //Wait data stage
for(i=0;i<wLength;i++)
   tab[i] = Usb_read_byte() //Read data sent by the host using setFeaure
Usb_ack_receive_out();
Usb_send_control_in(); //send a ZLP zero length packet to ack the setup
while(!Is_usb_in_ready());
}

Запрос Set_Feature посылается ПК устройству для того, чтобы устройство перешло к выполнению загрузчика.

7.5. Как изменить интервал опроса для каждой конечной точки

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

Для изменения этого параметра в соответствии с требованиями вашего приложения, вы должны изменить следующие значения в файле usb_descriptors.c:

// USB Endpoint 1 descriptor FS
#define ENDPOINT_NB_1      (EP_HID_IN | 0x80)
#define EP_ATTRIBUTES_1     0x03      // BULK = 0x02, INTERUPT = 0x03
#define EP_IN_LENGTH        8
#define EP_SIZE_1           EP_IN_LENGTH
#define EP_INTERVAL_1       20 //interrupt pooling from host
// USB Endpoint 1 descriptor FS
#define ENDPOINT_NB_2       (EP_HID_OUT)
#define EP_ATTRIBUTES_2      0x03 // BULK = 0x02, INTERUPT = 0x03
#define EP_OUT_LENGTH        8
#define EP_SIZE_2            EP_OUT_LENGTH
#define EP_INTERVAL_2        20 //interrupt pooling from host

Разрешенные значения находятся в интервале от 1 до 255 и измеряются в мс.

8. Программное обеспечение для ПК

Как показано на рисунке 6-4, приложения HID-класса требуют пакета программ. В этот пакет входит DLL (динамически подключаемая библиотека) и приложение пользователя. DLL позволяет пользователю "общаться" с драйверами USB-хоста и предотвратить сложную разработку.

Эта DLL содержит 5 функций, как описано ниже:


Рис. 8.1. HID DLL

8.0.1 findHidDevice

Эта функция возвращает "1" и создает дескриптор, если найдено правильное устройство (правильные VID и PID). Иначе она возвращает "0".

Параметры: VID: идентификатор производителя устройства

PID: идентификатор изделия.

8.0.2 read Data

Эта функция обеспечивает чтение данных, посланных устройством, и сохраняет их в буфере.

Параметры: *buffer: указатель буфера, в котором сохраняются данные.

8.0.3 writeData

Эта функция обеспечивает посылку данных от ПК к устройству. Она также обеспечивает посылку DFU-команд.

Параметры: *buffer: указатель буфера данных.

8.0.4 setFeature

Эта функция позволяет пользователю посылать управляющие посылки устройству через нулевую конечную точку.

Параметры: *buffer: указатель буфера данных.

8.0.5 closeHandles

Эта функция закрывает все обработчики и потоки. Она должна вызываться, когда вы закрываете приложение.

Параметры: нет.

Для получения более подробной информации о USB HID DLL обратитесь, пожалуйста, к документу "USB-драйвера основанные на USB HID-классе"

Связанные документы

Интерфейсы
HID (659.9 Кб), 02.07.2009
USB Human Interface Device
Телекоммуникации
AVR328 (304.5 Кб), 30.11.2009
Реализация устройства класса HID
AVR276 (223.7 Кб), 30.11.2009
Программная библиотека USB для микроконтроллеров
Интерфейсы
AVR276 (80.7 Кб), 30.11.2009
Программная библиотека USB для микроконтроллеров
 
Автор документа: Мария Дата публикации: 30.08.2009
Дата редактирования: 30.11.2009
Кол-во просмотров 3969
 
 Все новости одной лентой