- PVSM.RU - https://www.pvsm.ru -
Представляю вашему вниманию новый компактный Bootloader для AVR Tiny 45/85 [1]. Данный автозагрузчик распространяется под лицензией GNU GPL, как того требует лицензия V-USB. Основой для данного автозагрузчика послужил ATtiny85 USB Boot Loader от Embedded Creations и его потомок micronucleus-t85, используемый платами Digispark.
Также как и вышеупомянутые, TinyHID Loader основан на библиотеке V-USB.
Экономика должна быть экономной, господа. А с AVR Tiny x5 вы экономите дважды да ещё и в двух вопросах. Первый — это вопрос цены: «тиньки» дешевле «мег». Но персонально у Tiny x5 есть PLL генератор, позволяющий также отказаться от кварцевого резонатора. Так что экономим на нём да и на двух конденсаторах. Кроме того есть ещё и вопрос места на плате. В QNF корпусе таракан размером 2,5 на 2,5 мм. И снова нам не нужен резонатор. Всю схему можно легко уместить на смехотворных 12x5 мм. Как резюме — использование AVR Tiny 85 уместно всегда, и особенно для USB девайсов пока не появится необходимость в функционале, которого данный таракан не поддерживает (например когда нужно много IO портов)
Автозагрузчиков для AVR Mega пруд пруди, но с Tiny 85 всё не так просто. Для понимания этих сложностей, излагаю алгоритм работы классики:
Более подробно о особенностях работы автозагрузчика на AVR Tiny 85 можно почитать на сайте Embedded Creations [2] на английском
Использование классических MEGA-вских автозагрузчиков на AVR tiny не возможно по причинам, описанным в предыдущей главе. Но даже без них есть 2 реализации автозагрузчика: ATtiny85 USB Boot Loader и micronucleus-t85, и обе они эмулируют некогда популярный программатор USBasp. А вышеупомянутый программатор работает на хосте через библиотеку libusb. Это замечательная и многофункциональная библиотека, и её использование под Mac OS или Linux элементарно как 2x2. И если вы свои творения собираетесь использовать сами, то TinyHID Loader вам может приглянуться разве что более компактными размерами. Но вот под Windows 8.1 x64 установка libusb драйвера уже не является тривиальной задачей. Глубоко-глубоко в настройках есть пункт, позволяющий разово перезагрузить компьютер с отключенной проверкой электронной подписи драйверов. И горе тому, кто будет объяснять типичному юзеру этот способ. Поэтому основной идеей было создание автозагрузчика, способного работать через HID Feature Report-ы. Для всех HID устройств используются стандартные драйвера ОС, и дополнительные ставить не надо. Также оказалось, что отказ от поддержки avrdude приносит возможность сократить вес загрузчика. При отключении всех опций кроме записи/очистки FLASH и программного выхода в прикладную прошивку, автозагрузчик весит 2кб, что меньше чем у конкурентов.
Для начала нужно сконфигурировать прошивку. Для этого нужно скорректировать файл firmware/usbloader/usbloader.h под вашу схему и ваши нужды:
// Нога ATTiny, к которой подключен USB D-
#define USB_CFG_DMINUS_BIT 2
// Нога ATTiny, к которой подключен USB D+
#define USB_CFG_DPLUS_BIT 1
// Нога ATTiny, к которой подключен светодиод
// (можно раскоментить, но объём увеличится)
// #define LED_PIN 4
// Нога ATTiny, заземление которой приводит к старту загрузчика (экстренное включение загрузчика)
// (можно закоментить для сохранения места)
#define START_JUMPER_PIN 0
// Установить в 1, если требуется возможность очистки EEPROM (что заметно увеличит объём загрузчика)
#define CAN_ERASE_EEPROM 0
// Установить в 1, если требуется возможность чтения FLASH (что заметно увеличит объём загрузчика)
#define CAN_READ_FLASH 0
// Установить в 0, если не нужен программный переход в прикладную прошивку (что уменьшит объём загрузчика)
#define CAN_LEAVE_LOADER 1
При этом не нужно заботиться, чтобы USB_CFG_DPLUS_BIT попал на ногу INT0, так как автозагрузчиком используется прерывание PCINT0, которое можно сконфигурировать на любую ногу.
В приведённом выше варианте загрузчик укладывается в 2кб, хотя и впритык. Включение любых дополнительных опций выведет его за эти пределы, и придётся заодно менять его расположение в памяти. Делается это по разному в зависимости от того, используете ли вы AtmelStudio, или Makefile
Удостоверьтесь, что выбрана конфигурация Release.
Откройте свойства проекта, перейдите на вкладку Toolchain, и в пункте «AVR/GNU Linker/Memory Settings» уменьшите значение ".text=0xc00". Уменьшать можно только порциями по 32 слова. То есть 0xbe0, 0xbc0, 0xba0, 0xb80. 0xb80 хватит для работы всех доступных опций, дальше уменьшать не надо. Помимо этого, нужно также уменьшить значение константы BOOTLOADER_WADDRESS. Это можно сделать на странице «AVR/GNU C Compiler/Symbols». Значение должно равняться значению ".text=".
После конфигурирования нужно скомпилировать проект (F7) и можно его заливать на контроллер внешним программатором.
Откройте файл Makefile, и уменьшите константу BOOTLOADER_ADDRESS до требуемого значения. Уменьшать можено только порциями по 64 байта (AtmelStudio использует слова, а Makefile — байты). То есть 17c0, 1780, 1740, 1700. 1700 хватит для работы всех доступных опций, дальше уменьшать не надо.
После конфигурирования нужно скомпилировать проект, набрав в коммандной строке make и можно его заливать на контроллер внешним программатором.
Готово, внешний программатор вашей схеме более не нужен, переходим к софту на компьютере.
Утилита, заливающая прошивку на контроллер написана на C#, проект разработан в VisualStudio 2012, но его можно открыть и в Xamarin для дальнейшей работой с MONO. Для общения с HID используется кроссплатформенная библиотека HidSharp, что сделает ваш MONO проект по настоящему кроссплатформенным.
Утилита загрузки крайне проста в использовании:
TinyLoaderCmd.exe firmware.hex
И через 3 секунды таракан прошит и готов к работе. Если прошивка была создана с конфигом по-умолчанию, то запуск утилиты не только прошьёт контроллер, но и по готовности запустит записанную прошивку.
Кроме того, можно использовать API TinyHID Loader из вашего проекта на C#:
void UploadNewFirmware(string file)
{
HexFile file = new HexFile(args[0]);
Loader ldr = Loader.TryGetLoader(40);
byte[] programm = new byte[Loader.LOADERSTART];
for (int i = 0; i < programm.Length; i++) programm[i] = 0xff;
file.Fill(programm);
ldr.WriteFlash(programm, 0);
ldr.LeaveBootloader();
}
А если в вашей прошивке добавить функцию загрузки автозагрузчика:
void runBootloader()
{
cli();
TCCR1 = 0;
TCNT1 = 0xff;
asm volatile ("rjmp __vectors");
}
То перепрошивка превратиться для пользователя в нажатие одной кнопки. А ваш проект в то время:
Поставили полный набор опций и новая прошивка теперь не влезает? Или жалеете, что не добавили возможность чтения памяти? Ну или вам вообще не подходит TinyHID Loader, и без avrdude жизнь не мила? А ведь микроконтроллер уже не только прошит, но и запаян. И выпаивать его совсем не хочется. Не вопрос — TinyHID Loader умеет перерошивать сам себя!
Алгоритм самоперепрошивки такой:
Гарантиями безопасности reloader-а являются проверка CRC и логика процесса, который запустится снова в случае непредвиденного завершения. Но некорректная новая прошивка превратит таракана в кирпич, и воскресить его сможет только программатор. Поэтому будьте аккуратны — проверяйте корректность настроек.
Также при помощи reloader-а можно прошить TinyHID Loader на девайс с другим программатором. То есть заменить вообще любой автозагрузчик AVR Tiny 85 на любой другой.
Автор: makarenya
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/avr/47580
Ссылки в тексте:
[1] Bootloader для AVR Tiny 45/85: https://bitbucket.org/makaranya/tinyhid-loader/
[2] Embedded Creations: http://embedded-creations.com/projects/attiny85-usb-bootloader-overview/details/
[3] V-USB: http://www.obdev.at/vusb/
[4] ATtiny85 USB Boot Loader: http://embedded-creations.com/projects/attiny85-usb-bootloader-overview/
[5] micronucleus-t85: https://github.com/Bluebie/micronucleus-t85
[6] BootloaderHID: http://www.obdev.at/products/vusb/bootloadhid.html
[7] FunkUsb: http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/FunkUsb/
[8] Источник: http://habrahabr.ru/post/200896/
Нажмите здесь для печати.