t-boot - компактный кроссплатформенный загрузчик для AVR-микроконтроллеров

AVR bootloader

Bootloader

Очень удобной фичей в AVR-микроконтроллерах является возможность использования загрузчика кода. Загрузчик - это такая маленькая програмка, под которую выделяется блок флеш-памяти МК, размер этого блока задается фьюзами и может принимать одно из фиксированных значений: 256, 512, 1024, 2048 байт. Загрузчик помещается в самом конце флеш-памяти. Фьюзами выбирается, что именно будет запущено при сбросе МК - основная программа по адресу 0000 или загрузчик. При запуске загрузчик проверяет некоторое условие (активность интерфейса UART, нажатие некоторых кнопок, установку джамперов и т.д.) и в зависимости от этого либо ожидает приема данных для прошивки МК, либо передает управление основной программе. В итоге, вместо громозкого ISP-интерфейса при разработке и отладке программ можно использовать UART как для обновления прошивки, так и, например, для управлением устройством с компьютера или передачей в компьютер отладочной информации.

Из тех загрузчиков, что мне попадались, хочется выделить два. Первый загрузчик - ATMEL AVR UART Bootloader for AVR-GCC/avr-libc. К его достоинствам относится то, что он совместим с AVRPROG и, следовательно, поддерживается в AVRStudio. Второе достоинство - это загрузчик позволяет читать, проверять и записывать не только flash-память программы, но и eeprom-память. Основным недостаткам загрузчика является его слишком большой размер - 1024 байта в минимальной конфигурации. Я пользовался этим загрузчиком до тех пор, пока однажды свободной памяти в программирумой меге8 перестало хватать и килобайта памяти оказался слишком дорогой ценой для загрузчика.

Второй загрузчик - Small Serial Bootloader отличается минимально возможным размером (256 байт в минимальной конфигурации) но не может работать с eeprom и для управления предлагает только лишь скрипт на питоне, причем, похоже, только под линукс.

На основе этого второго загрузчика был сделан загрузчик t-boot. Из Small Serial Bootloader была выкинута вся лишняя функциональность и внесены некоторые измерения. Вместо питонового скрипта написано управляющее приложение (консольное под Windows и Linux), с синтаксисом аналогичным синтаксису программатора avrdude.

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

К сожалению, в 256 байт загрузочного кода не удается уместить еще и код для программирования памяти eeprom, поэтому, пока операции с eeprom не поддерживаются. Эту функциональность планируется дописать в будущем по мере необходимости следующим образом: размер загрузчика оставить равным 256 байт, не увеличивать его до 512 байт, а код работы с eeprom записывать непосредственно перед началом загрузчика и передавать на него управление, если надо. Таким образом:

  1. загрузчик будет записываться (через программатор) только один раз, в самом начале
  2. возможность работать с eeprom можно будет включить/выключить в любой момент не трогая загрузчик (не используя программатор)
  3. суммарный размер загрузчика составит более 256 но менее 512 байт, он не займет ни одного лишнего байта

 

Командная строка и конфигурация

Синтаксис командной строки:

Usage: tboot [options]
Options:
  -p <partno>         Specify AVR device.
  -b <baudrate>       Override RS-232 baud rate.
  -C <config-file>    Specify location of configuration file.
  -p <partno>         Specify AVR device.
  -b <baudrate>       Override RS-232 baud rate.
  -C <config-file>    Specify location of configuration file.
  -P <port>           Specify connection port.
  -U <flash|eeprom>:r|w|v:<filename.ext>
                      Memory operation specification.
                      Multiple -U options are allowed, each request
                      is performed in the order specified.
  -n                  Do not write anything to the device.
  -V                  Do not verify.
  -v                  Verbose output.
  -q                  Quell progress output.

Например, прошивка памяти:

 

tboot -U flash:w:data.hex

Чтение памяти:

tboot -U flash:r:data.bin

Имя файла должно иметь расширение .hex или .bin, исходя из этого файл будет сохраняться как файл в формате Intel hex, либо соответственно как простой бинарный файл.

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

 

В этом файле указываются настройки программы по умолчанию а также содержится описание всех программируемых МК (я тестировал это пока только на mega8 и mega8535).

 

Компиляиця загрузчика

В файле Makefile изменяем две следующие строки:

MCU=atmega8tboot.hex:  BOOTSTART=0x1F00

В них указываем соответственно имя МК и смещение загрузчика (т.е., размер памяти МК-0xFF)

В файле tboot.S задаем константы FOSC и BAUDRATE. Первая определяет тактовую частоту, вторая - скорость UART. Там же меняем макросы CONTROL_PORT_DDR, CONTROL_PORT_PORT, CONTROL_PORT_PIN и CONTROL_PIN - тут определяется, какой вывод МК будет управлять включением режима заргузки. Если указанный пин замкнут на землю, работать будет загрузчик, иначе - управление перейдет программе по адресу 0000.

После внесения этих изменений надо выполнить команду make (avr-gcc должен быть установлен и прописан в PATH), загрузчик будет скомпилирован в файл tboot.hex.

Загрузчик принимает и передает данные в текстовом виде. Он принимает команды, обрабатывает их и выдаёт результат. Каждая команда - один символ, за которым могут следовать аргументы. Данные передаются в шестнадцатиричном формате. В случае неверной команды загрузчик посылает символ '!'. Когда ожидается команда, загрузчик посылает символ CR (0x0d). Все шестнадцатиричные данные посылаются в нижнем регистре. Пробелы и прочие символы в шестнадцатиричных значения не допускаются. При запуске загрузчик посылает строку 'ok' с последующим CR.

Протокол загрузчика

Команды:

'Z' (0x5A)
Загружает регистр Z, аргумент - шестнадцатиричное слово
'R' (0x52)
Читает память программы. аргумент - шестнадцатиричный байт - размер читаемого блока (если 00, то 256 байт). Чтение начинается с позиции Z-регистра, результат возвращается шестнадцатиричным дампом, регистр Z инкрементируется в процессе чтения
'W' (0x57)
Загрузка буффера страницы. Аргумент - шестнадцатиричный байт - число слов (а не байт, как для 'R') Далее следуют сохраняемые данные, сохранение начинается со смещения в регистре Z, которой инкрементируется. Для завершения операции записи программатор должен передать команду 'P'
'P' (0x50)
Читает словов пару регистров R0:R1, затем, один байт в SPMCR и выполняет инструкцию SPM.
'Q' (0x51)
Получение данных от микроконтроллера. Загрузчик возвращает 4 байта - содержимое регистра Z и адрес загрузчика
'@' (0x40)
Выполняет команду IJUMP, передавая управление по адресу в регистре Z. Используется для перехода на нулевой адрес для запуска программы или запуска расширений

 

По ссылкам ниже можно скачать прошивку загрузчика и его исходники с управляющей программой для Windows или Linux, а также исходники управляющей программы. Для компиляции последних потребуется cmake.

 


 

Скачать: 

Download Загрузчик с исходником и программа прошивки для Windows

Download Загрузчик с исходником и программа прошивки для Linux

Download Исходники программы прошивки

Рейтинг: 
0
Голосов еще нет