AVR4023: протокол FLIP USB DFU Печать
Добавил(а) microsin   

В этой статье приведен перевод даташита Atmel AVR4023, посвященного внутреннему устройству протокола DFU FLIP.

[Особенности протокола FLIP]

• Делает возможным программирование микроконтроллеров, уже установленных в систему, через интерфейс USB.
• Возможности протокола:
   - Чтение информации о программируемом микроконтроллере.
   - Чтение/запись конфигурации микроконтроллера.
   - Чтение/запись внутренней памяти микроконтроллера (FLASH, EEPROM).
   - Чтение/запись внешней памяти микроконтроллера.
   - Управление защитой памяти.
   - Запуск приложения (программы firmware, записанной в память микроконтроллера).
• Atmel® USB DFU:
   - Совместимость со стандартом USB часть 9.
   - Нужна одна конечная точка управления USB (USB control endpoint).  

Для чего нужен и используется протокол FLIP? Все очень просто - это удобное средство программировать микроконтроллеры AVR с интерфейсом USB. Так что можно сделать свое устройство USB, не покупая при этом программатор. Достаточно иметь под рукой компьютер с установленным программным обеспечением FLIP и подключение через интерфейс USB. Кроме того, это удобный инструмент для обновления программного обеспечения (firmware) - чтобы обновить программу, можно даже не разбирать готовое устройство.

AVR4023-FLIP-AVR-USB162

[1 Введение]

Для выполнения обновления firmware компания Atmel разработала гибкую систему программирования микроконтроллеров, уже встроенных в систему (FLexible In-system Programmer, FLIP). Это программное обеспечение позволяет программировать память микроконтроллера по командам от USB хоста (компьютера). При этом нет необходимости разбирать готовое изделие, извлекать оттуда микроконтроллер, и не нужно применять никакую дополнительную внешнюю аппаратуру для программирования (не нужен программатор).
   
Atmel предоставляет бутлоадеры USB для микроконтроллеров AVR® (включая серии AVR XMEGA® и UC3), которые имеют в составе чипа аппаратный интерфейс USB. Эти бутлоадеры используют проприетарный протокол USB DFU, который описывается в этом апноуте. Бутлоадер FLIP поставляется конечному потребителю уже загруженным в память чипа на заводе Atmel. При этом тратится некоторая часть памяти программ (около 2 килобайт в старших адресах FLASH). Бутлоадеры Atmel поставляются в двоичном виде, без исходного кода. Однако благодаря тому, что спецификация протокола FLIP открыта, существуют открытые альтернативные версии бутлоадеров FLIP (с открытым исходным кодом), например в библиотеке LUFA [1].

Для активации бутлоадера в устройстве применяется специальная процедура, описанная в документации на бутлоадер. Обычно это замыкание определенной ножки микроконтроллера на землю при включении питания (например, для микроконтроллера AT90USB162 это ножка 13, порт PD7) или сбросе.

По традиции DFU называют протоколом FLIP (что создает некоторую путаницу), однако к DFU относятся все функции программирования от хоста, включая FLIP, BatchISP или все дальнейшие интеграции протоколов в AVR Studio.
   
[2 Термины и аббревиатуры]

DFU Device Firmware Upgrade - обновление программного обеспечения устройства на микроконтроллере.
FLIP FLexible In-system Programmer - гибкое программирование микроконтроллера "прямо в системе", т. е. в готовом изделии.
Firmware выполняемое программное обеспечение микроконтроллера, которое сохранено в перезаписываемой, энергонезависимой памяти микроконтроллера (в нашем случае это AVR, работающий как устройство USB).
FS USB Full Speed - полная скорость по стандарту USB (около 12 мегабит/сек).
Upgrade перезапись кода firmware в микроконтроллере (в нашем случае это AVR, работающий как устройство USB). Новое firmware может быть предназначено для замены старого, которое имеется в устройстве.
Download выгрузка, передача информации от хоста к устройству.
Upload выгрузка, передача информации от устройства к хосту.
IN передача пакета USB от устройства к хосту.
OUT передача пакета USB от хоста к устройству.
ZLP USB Zero Length Packet - пакет нулевой длины, специальный пакет, используемый для квитирования в протоколе USB.
ISP программирование микроконтроллера "прямо в системе", т. е. в готовом изделии.

[3 Область применения FLIP]

Этот документ относится к микроконтроллерам AVR, имеющим в составе чипа аппаратный интерфейс USB, а также к микроконтроллерам AVR XMEGA и серии AVR UC3.

Atmel megaAVR Series2, Series3, Series4.
 Это микроконтроллеры AT90USB82, AT90USB162, AT90USB646, AT90USB647, AT90USB1286,  AT90USB1287, ATmega8U2, ATmega16U2, ATmega32U2, ATmega16U4, ATmega32U4.
• Atmel AVR XMEGA
  Это микроконтроллеры ATxmega64A1U, ATxmega128A1U, ATxmega64A3U, ATxmega128A3U, ATxmega192A3U, ATxmega256A3U, ATxmega256A3BU, ATxmega16A4U, ATxmega32A4U, ATxmega64A4U, ATxmega128A4U, ATxmega64B1, ATxmega128B1, ATxmega64B3, ATxmega128B3, ATxmega64C3, ATxmega128C3, ATxmega192C3, ATxmega256C3, ATxmega384C3, ATxmega16C4, ATxmega32C4.
Atmel AVR UC3 Device series.
  Это микроконтроллеры ATUC64L3U, ATUC128L3U, ATUC256L3U, ATUC64L4U, ATUC128L4U, ATUC256L4U. 
• Atmel 8051 USB.
  Это микроконтроллеры AT83C5134, AT83C5135, AT83C5136, AT89C5130A-M, AT89C5131A-L, AT89C5131A-M, AT89C5132. 

С помощью протокола FLIP могут программироваться и некоторые другие микроконтроллеры, через другие интерфейсы, не USB - через CAN и USART. Процедура программирования подробна описана в даташите на соответствующий бутлоадер, применяемый для конкретного микроконтроллера.

[4 Литература и связанные ресурсы]

Atmel FLIP.
Atmel AVR Software Framework.
AVR32784: AVR UC3 USB DFU Bootloader.
Atmel AVR1916: USB DFU Boot Loader for XMEGA.

[5 Общий обзор окружения протокола FLIP]

Специальное ПО хоста (это могут быть FLIP, BatchISP, или будущие расширения Atmel AVR Studio) получает команды пользователя для выполнения операций с памятью, и переводит эти команды в соответствующие запросы протокола USB, основанного на DFU. На запросы отвечает бутлоадер USB, записанный в память FLASH микроконтроллера. Бутлоадер обрабатывает протокол USB и выполняет нужные операции чтения/записи с памятью микроконтроллера (FLASH, EEPROM, а также иногда это может быть и внешняя память).

Рис. 5-1. Системное рабочее окружение, в котором работает FLIP DFU.

AVR4023-FLIP-system-environment-fig5-1

Для программирования микроконтроллеров имеется специальная бесплатная утилита Atmel Flip, написанная на JAVA.

AVR4023-FLIP-utility-chip-selection

В этой статье подробно рассматривается именно протокол USB FLIP. Статья разделена на 2 секции:

• Atmel USB DFU Class (секция 6).
• Atmel FLIP Protocol (секция 7).

[6 Atmel USB DFU Class]

6.1 Что такое Atmel USB DFU Class

Device Firmware Upgrade (DFU) является классом USB, который позволяет обновлять firmware, встроенное в микроконтроллер устройства USB. Atmel USB DFU является реализацией класса вендора (vendor class implementation), основанное на части официального стандарта USB DFU, однако она не полностью реализует стандартный USB DFU class.

Для обмена данными с хостом USB DFU FLIP использует только одну конечную точку управления (control endpoint, конечная точка с номером 0), и только запрос настройки (setup request). Далее будут показаны использующиеся дескрипторы USB и управляющие запросы USB (control requests).

6.2 Набор используемых дескрипторов USB

Устройство USB DFU FLIP предоставляет хосту набор дескрипторов, которые содержат:

• Дескриптор устройства (device descriptor).
• Один дескриптор конфигурации (configuration descriptor).
• Один дескриптор интерфейса (interface descriptor).

Таблица 6-1. USB Device Descriptor.

Смещение Имя поля Размер Значение Описание поля
0 bLength 1 12h Размер этого дескриптора в байтах.
1 bDescriptorType 1 01h Тип функционального дескриптора DFU.
2 bcdUSB 2 0100h Номер спецификации USB в формате BCD.
4 bDeviceClass 1 00h См. описание интерфейса.
5 bDeviceSubClass 1 00h См. описание интерфейса.
6 bDeviceProtocol 1 00h См. описание интерфейса.
7 bMaxPacketSize0 1 64 Максимальный размер пакета для конечной точки 0 (ограничено до 32 из-за драйвера на стороне хоста).
8 idVendor 2 03EBh Atmel Vendor ID
10 idProduct 2 2FXXh Product ID
12 bcdDevice 2 0x0000 Номер релиза устройства в формате BCD.
14 iManufacturer 1 0 Индекс строкового дескриптора.
15 iProduct 1 0 Индекс строкового дескриптора.
16 iSerialNumber 1 0 Индекс строкового дескриптора.
17 bNumConfigurations 1 01h Имеется только одна конфигурация DFU.

USB configuration descriptor идентичен стандартному дескриптору конфигурации, описанному в спецификации USB версии 1.0 с тем исключением, что поле bNumInterfaces должно содержать значение 01h.

Таблица 6-2. USB Interface Descriptor.

Смещение Имя поля Размер Значение Описание поля
0 bLength 1 09h Размер этого дескриптора в байтах.
1 bDescriptorType 1 04h Тип - дескриптор интерфейса.
2 bInterfaceNumber 1 00h Номер этого интерфейса.
3 bAlternateSetting 1 00h Альтернативная установка.
4 bNumEndpoints 1 00h Используется только канал управления (control pipe).
5 bInterfaceClass 1 FFh Информация, специфичная для вендора.
6 bInterfaceSubClass 1 00h Нет определения подкласса.
7 bInterfaceProtocol 1 00h Нет определения протокола.
8 iInterface 1 00h Индекс строкового дескриптора для этого интерфейса.

6.3 Специальные запросы настройки (specific setup requests)

В дополнение к стандартным запросам USB, для поддержки операций обновления обрабатываются 4 специальных запроса, относящиеся к классу (class-specific requests):

Таблица 6-3. Class-specific requests.

bmRequestType bRequest wValue wIndex wLength Фаза данных
0010 0001b DFU_DNLOAD wBlock 0 длина Протокол FLIP
1010 0001b DFU_UPLOAD wBlock 0 длина Протокол FLIP
1010 0001b DFU_GETSTATUS 0 0 6 Статус
0010 0001b DFU_CLRSTATUS 0 0 0 нет

6.3.1 Device status (состояние устройства USB)

Информация о статусе используется для упрощения синхронизации между ПО хоста и устройством USB. Статус предоставляет информацию о выполнении предыдущего запроса. Устройство USB DFU FLIP отвечает на запрос DFU_GETSTATUS с полезной нагрузкой пакета, описанной в таблице 6-4.

Таблица 6-4. Пакет статуса устройства.

Смещение Имя поля Размер Значение Описание поля
0 bStatus 1 Число Показывает статус результата выполнения самого последнего подходящего запроса.
1 bwPollTimeOut 3 Число Не используется, здесь всегда 0.
4 bState 1 Число Показывает состояние, в которое устройство немедленно переходит вслед за передачей этого ответа.
5 iString 1 Индекс Не используется, здесь всегда 0.

Возможные значения полей пакета bStatus и bState описаны в таблице 6-5.

Таблица 6-5. Значения статуса и состояния.

Символьное имя Статус Состояние Описание
STATUS_OK 00h 00h Команда выполнена успешно, и устройство находится в режиме ожидания (IDLE mode).
STATUS_STALL 0Fh 0Ah Неизвестный специфичный запрос Setup.
STATUS_MEM_UNKNOW 03h 0Ah Невозможен доступ к памяти на чтение или запись.
STATUS_MEM_PROTECTED 03h 00h Доступ к памяти запрещен защитой.
STATUS_OUTOFRANGE 08h 0Ah Адрес вышел из допустимого диапазона, или неизвестный ID памяти.
STATUS_BLANK_FAIL 05h 00h Тест на чистоту закончился неудачей (память не чистая).
STATUS_ERASE_ONGOING 09h 04h Идет процесс очистки памяти.

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

6.3.2 Command request (командный запрос)

Запросы setup request DFU_DNLOAD и DFU_UPLOAD используют 4 типа команд:

• Одиночная команда FLIP.
• Пустая команда (используется только для того, чтобы проверить команду запуска приложения пользователя, firmware).
• Команда FLIP для загрузки полезных данных (data payload to download).
• Команда FLIP для выгрузки полезных данных (data payload to upload).

Рис. 6-1. Одиночная команда FLIP.

AVR4023-single-FLIP-command-fig6-1

Рис. 6-2. Empty command (пустая команда).

AVR4023-empty-command-fig6-2

Рис. 6-3. Команда FLIP для загрузки данных FLIP (download).

AVR4023-FLIP-command-with-data-to-download-fig6-3

Рис. 6-4. Команда FLIP для выгрузки данных FLIP (upload).

AVR4023-FLIP-command-with-data-to-upload-fig6-4

[7 Протокол FLIP]

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

7.1 Общий обзор протокола FLIP

В команде имеется код группы, идентификатор команды, и также 4 байта, используемые для добавления аргумента в команду, см. таблицу 7-1.

Таблица 7-1. Структура команды FLIP.

Смещение (в байтах) Поле Размер (в байтах)
0 Идентификатор группы команды 1
1 Идентификатор команды 1
2 Аргументы 4

Имеются 4 группы (таблица 7-2), описанные в последующих секциях. Для каждой команды описана структура команды FLIP, после отправки команды возможно наличие дополнительных данных для загрузки (download), или выгрузки (upload), или статуса.

Таблица 7-2. Группы команды FLIP.

Значение (байт) Группа Описание
01h CMD_GROUP_DOWNLOAD Группа команд для загрузки (программирования памяти микроконтроллера).
03h CMD_GROUP_UPLOAD Группа команд для чтения и проверки памяти микроконтроллера.
04h CMD_GROUP_EXEC Группа команд для стирания памяти микроконтроллера и для запуска приложения пользователя (кода firmware).
06h CMD_GROUP_SELECT Группа команд для выбора типа памяти и для выбора области памяти.

7.2 Группа выбора

Перед любой операцией чтения или программирования памяти, необходимо выбрать целевую память, а также смещение страницы внутри этой памяти. Это достигается отправкой команд SELECT_MEMORY_UNIT и SELECT_MEMORY_PAGE.

7.2.1 Selecting memory unit (выбор типа памяти).

Таблица 7-3. Select memory unit command.

Поле Значение Описание
Идентификатор группы 06h Выбор группы.
Идентификатор команды 03h Выбор команды памяти.
Аргумент 1 00h Выбор юнита памяти.
Аргумент 2 Юнит памяти Идентификатор памяти для выбора.
Аргумент 3 00h Зарезервировано.
Аргумент 4 00h Зарезервировано.
Полезная нагрузка (данные) нет нет

Таблица 7-4. Memory unit available (доступные типы памяти).

Значение Описание
00h FLASH
01h EEPROM
02h SECURITY
03h CONFIGURATION
04h BOOTLOADER
05h SIGNATURE
06h USER
07h INT_RAM
08h EXT_MEM_CS0
09h EXT_MEM_CS1
0Ah EXT_MEM_CS2
0Bh EXT_MEM_CS3
0Ch EXT_MEM_CS4
0Dh EXT_MEM_CS5
0Eh EXT_MEM_CS6
0Fh EXT_MEM_CS7
10h EXT_MEM_DF

Таблица 7-5. Select memory unit status (выбор статуса юнита памяти).

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_OUTOFRANGE Неизвестный ID памяти.

7.2.2 Selecting memory page (выбор страницы памяти)

Таблица 7-6. Команда выбора страницы памяти.

Поле Значение Описание
Идентификатор группы 06h Выбор группы.
Идентификатор команды 03h Выбор команды памяти.
Аргумент 1 01h Выбор страницы памяти.
Аргумент 2 Страница, MSB (старший байт) Номер страницы памяти 64 килобайта
Аргумент 3 Страница, LSB (младший байт)
Аргумент 4 00h Зарезервировано.
Полезная нагрузка (данные) нет нет

Таблица 7-7. Select memory page status (выбор статуса страницы памяти).

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_OUTOFRANGE Адрес за пределами допустимого диапазона.

7.3 Download group (группа загрузки)

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

7.3.1 Program start (запуск программирования)

BatchISP и FLIP имеют внутренние буферы ISP (один буфер на память устройства). Запись в память всегда осуществляется из содержимого буфера. Содержимое буфера обычно не имеет значения для пользователя протокола FLIP. Команда Program Start передает буфер ISP из FLIP в выбранную память.

Таблица 7-8. Команда Program Start.

Поле Значение Описание
Идентификатор группы 01h Группа загрузки (download).
Идентификатор команды 00h Команда Program Start.
Аргумент 1 Страница, MSB (старший байт) Начальный адрес памяти.
Аргумент 2 Страница, LSB (младший байт)
Аргумент 3 Страница, MSB (старший байт) Конечный адрес памяти.
Аргумент 4 Страница, LSB (младший байт)
Полезная нагрузка (данные для загрузки) буфер FLIP В буфер FLIP добавляется префикс(1).

Примечание: (1) Data Payload Prefix (префикс данных полезной нагрузки, т. е. передаваемых данных для программирования).

Чтобы соответствовать записываемой единице памяти (размеру страницы), могут быть добавлены X ничего не значащих байт перед первым байтом для программирования. Число X вычисляется для выравнивания начала firmware с записываемой памятью.

Внимание: в настоящий момент приложение FLIP делит внутренний буфер так, чтобы размер полезной нагрузки (включая префикс) не превышал 2 килобайта.

Таблица 7-9. Статус Program Start.

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_MEM_UNKNOW Память недоступна для записи.
STATUS_MEM_PROTECTED Память имеет установленную защиту от записи.
STATUS_OUTOFRANGE Адрес за пределами допустимого диапазона.

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

7.4 Upload group (группа выгрузки)

Эта группа команд позволяет прочитать содержимое выбранной памяти, а также проверить её на чистоту (blank state).

7.4.1 Read memory (чтение памяти)

BatchISP и FLIP имеют внутренние буферы ISP (один буфер на память устройства). Чтение памяти обновляет содержимое буфера данными, прочитанными из памяти. Во время операции проверки (verify) целевая память читается и её содержимое сравнивается с содержимым буфера.

Таблица 7-10. Команда чтения памяти.

Поле Значение Описание
Идентификатор группы 03h Группа выгрузки (upload).
Идентификатор команды 00h Команда чтения памяти.
Аргумент 1 Страница, MSB (старший байт) Начальный адрес памяти.
Аргумент 2 Страница, LSB (младший байт)
Аргумент 3 Страница, MSB (старший байт) Конечный адрес памяти.
Аргумент 4 Страница, LSB (младший байт)
Полезная нагрузка (данные для выгрузки) Содержимое памяти
Содержимое памяти, соответствующее выбранной памяти и адресу памяти.

Внимание: в настоящий момент приложение FLIP делит команду Read Memory так, чтобы размер полезной нагрузки не превышал 1 килобайт.

Таблица 7-11. Статус команды Read Memory.

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_MEM_UNKNOW Память недоступна для чтения.
STATUS_MEM_PROTECTED Доступ к памяти защищен.
STATUS_OUTOFRANGE Адрес за пределами допустимого диапазона.

Внимание: если произойдут ошибки STATUS_MEM_UNKNOW или STATUS_OUTOFRANGE, то должен быть остановлен (stall) ZLP запроса DOWNLOAD. Если произойдет ошибка STATUS_MEM_PROTECTED, то следующий запрос UPLOAD должен быть остановлен (stall) на уровне протокола USB.

7.4.2 Blank check memory (проверка, что память очищена)

Во время проверки памяти на чистоту её содержимое сравнивается с FFh.

Таблица 7-12. Команда Blank check memory.

Поле Значение Описание
Идентификатор группы 03h Группа выгрузки (upload).
Идентификатор команды 01h Команда проверки памяти на чистоту.
Аргумент 1 Страница, MSB (старший байт) Начальный адрес памяти.
Аргумент 2 Страница, LSB (младший байт)
Аргумент 3 Страница, MSB (старший байт) Конечный адрес памяти.
Аргумент 4 Страница, LSB (младший байт)
Полезная нагрузка нет
нет

Таблица 7-13. Статус команды Blank check.

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_MEM_UNKNOW Память недоступна для чтения.
STATUS_MEM_PROTECTED Доступ к памяти защищен.
STATUS_OUTOFRANGE Адрес за пределами допустимого диапазона.

Внимание: если произойдут ошибки STATUS_MEM_UNKNOW или STATUS_OUTOFRANGE, то должен быть остановлен (stall) ZLP запроса DOWNLOAD.

7.5 Excec group (группа выполнения)

Эта группа команд позволяет полностью очистить память firmware микроконтроллера (FLASH), либо запустить на выполнение код приложения пользователя - firmware.

7.5.1 Chip erase (очистка памяти микроконтроллера)

Команда Chip erase полностью очищает всю память FLASH (за исключением секции бутлоадера FLIP).

Таблица 7-14. Команда Chip erase.

Поле Значение Описание
Идентификатор группы 04h Группа Exec.
Идентификатор команды 00h Команда очистки памяти.
Аргумент 1 FFh Очистка чипа.
Аргумент 2 00h Зарезервировано.
Аргумент 3 00h Зарезервировано.
Аргумент 4 00h Зарезервировано.
Полезная нагрузка нет
нет

Таблица 7-15. Статус команды Chip erase.

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).
STATUS_ERASE_ONGOING Происходит процесс очистки памяти чипа. Команда очистки чипа должна быть отправлена повторно для завершения очистки чипа.

7.5.2 Запуск приложения пользователя (firmware)

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

Таблица 7-16. Команда Start Application.

Поле Значение Описание
Идентификатор группы 04h Группа Exec.
Идентификатор команды 03h Команда Start Application.
Аргумент 1 00h Аппаратный сброс.
Аргумент 2 00h Зарезервировано.
Аргумент 3 00h Зарезервировано.
Аргумент 4 00h Зарезервировано.
Полезная нагрузка нет
нет

Таблица 7-17. Статус команды Start Application.

Символьное имя
Описание
STATUS_OK Команда выполнена успешно и устройство находится в режиме ожидания (IDLE mode).

Внимание: для завершения команды Start Application должна быть отправлена пустая команда (empty FLIP command), см. рисунок 6-2.

[Ссылки]

1. LUFA - бесплатная библиотека USB для микроконтроллеров Atmel AVR.