Бутлоадер

UART-Бутлоадер для AVR размером 512байт — DRIVE2

Бутлоадер

Иногда приходится делать схемки на МК, которые ведут обмен с компьютером посредством универсального последовательного порта (UART).

Но кроме передачи разных настроечных параметров, было бы полезно этот самый порт использовать для обновления прошивки.

Во-первых не нужен будет ни разъём ISP, ни программатор для внесения мелких исправлений, во-вторых сам процесс значительно упрощается, можно даже доверить пользователю загружать новые прошивки.

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

Я уже делал экзотические бутлоадеры для обновления прошивки по радио-каналу, через nRF24L01, или через wi-fi, но схемы подключающиеся по простому UART встречаются довольно часто, да ещё пару таких схем нарисовались в голове в планах на разработку.

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

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

В его коде учитываются особенности разных МК, например, ATmega8 и ATmega88, у которых разительно отличается расположение регистров: например, регистры USART у ATmega8 находятся в нижней части пространства регистров, и доступ к ним осуществляется через in/out, в то время как у 88 и ему подобных эти регистры доступны только через их отображение в адресном пространстве, через lds/sts.

Итак, представляю результат моей разработки: ассемблерный код бутлоадера, который компилируется в не более чем 512 байт, работает почти на всех МК из семейства ATmega от 8 до 32кб (у МК с менее 8кб нет бутлоадера, а более 32кб — бутлоадер минимум 1кб). Главное, что работает с моим любимым семейством: ATmega88PA, 168PA, 328P

Принцип работы.

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

Таких условий три:1) если управление на программу бутлоадера было передано из основной программы;2) если загрузка прошивки не была завершена должным образом;

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

Чтобы узнать, откуда было передано управление, бутлоадер смотрит на содержимое регистра MCUCSR (или MCUSR в некоторых МК). В этом регистре хранится информация о том, что привело микроконтроллер к перезагрузке: низкое напряжение, сторожевой таймер, сброс через ножку RESET, включение питания, или JTAG.

Если содержимое этого регистра равно нулю, значит переход был осуществлён из основной программы, т.е. программа либо сознательно вызвала бутлоадер, либо она поломана и адрес исполнения сам докатился до бутлоадера.

В любом случае, нулевое значение — это сигнал, чтобы не переходить к основной программе, а включить режим загрузки и ожидать новой прошивки по UART.

Если же оказалось, что содержимое этого регистра было не нулевым, то его содержимое обнуляется. На случай, если основной программе зачем-то нужно будет изначальное значение этого регистра, оно сохраняется в регистре GPIOR0, а на МК где этого регистра нет — в первой ячейке SRAM памяти (как правило, это ячейка с адресом 0x0100)

Одна из ячеек (обычно — самая последняя) энергонезависимой памяти (EEPROM) отводится для хранения маркера об успешном окончании процесса прошивки. Когда начинается процесс прошивки, значение этой ячейки сбрасывается — в неё записывается 0xFF. Когда процесс прошивки завершён, то в неё записывается определённое значение.

В зависимости от настроек, это делает либо сам бутлоадер, либо основная программа самостоятельно. При старте бутлоадер считывает значение этой ячейки, и если оно не равно заданному значению, то включается программа загрузки прошивки. Этот контроль можно отключить.

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

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

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

Этот контроль может быть отключен, либо работать в одном из четырёх режимов:1) низкий уровень на входе с включением подтягивающего резистора. На указанном входе включается подтягивающий резистор, и проверяется, что логический уровень остаётся низким в течение некоторого времени.

Эта опция для типичного подключения кнопки.2) высокий уровень — аналогично, но проверяется высокий уровень и подтягивающий резистор не включается. Должен существовать внешний стягивающий резистор.3) Перемычка между двумя входами.

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

Эта опция полезна, если особенности подключения входов изначально не удаётся определить.

4) Низкий уровень на двух входах. Аналогично режиму 1, на обоих входах включаются подтягивающие резисторы, низкий уровень должен определятся на обоих входах в течение нескольких замеров подряд.

На деле, все эти проверки проходят практически мгновенно и не задерживают переход к основной прошивке.

Кроме того, есть возможность включить индикацию работы миганиями светодиодов.

Протокол работы.

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

Команд всего три:
BLST — вход в режим программирования, эта команда может быть выполнена в любой момент и начинает процесс загрузки сначала.
BLPG — запись страницы. Эта команда не может быть выполнена, если не выполнялась BLST.
BLXT — завершение процесса прошивки (если он был начат) и переход к основному ПО.

Запрос: 0x42 0x4C 0x53 0x54 (BLST)
Ответ: 0x62 0x6C 0x73 0x74 (blst)
После 4х символов blst в ответе следуют 16 байт, первый из которых указывает размер страницы в словах (т.е.

парах байт), второй — количество страниц, доступных для прошивки (т.е.

размер флеш-памяти в страницах, не считая самого загрузчика), а последующие 14 байт — это произвольная строка, идентифицирующая схему, которая может использоваться для предотвращения попыток загрузить неподходящую прошивку.

Запрос: 0x42 0x4C 0x50 0x47 (BLPG)
Ответ: 0x62 0x6C 0x70 0x77 (blpg) — если страница успешно загружена;либо: 0x62 0x6C 0x65 0x72 (bler) — если не была вызвана BLST, неправильный номер страницы, или не совпал контроль.Команде загрузки страницы должен предшествовать вызов BLST — номера страниц должны идти по порядку и начинаться с нуля — данные страницы.

Количество данных точно равно размеру страницы в байтах (ответ blst возвращает её в словах, т.е. нужно умножить на 2)

— это CRC с полиномом x8 +x7 +x6 +x3 +x2 +x +1 (полином выбран из списка users.ece.cmu.edu/~koopman/crc/crc8.html) по всем байтам в поле data, от старших битов к младшим. Инициализируется значением 0xFF (способ расчёта контрольной суммы изменён 24.09.

2016):

cc = 0xFF;for (i = 0; i < sizeof(data); i++) {cc = data[i];for (b = 0; b < 8; b++) {cc = ((cc & 0x80) ? 0xCF : 0) (cc

Источник: https://www.drive2.ru/b/2878717/

Что такое загрузчик (bootloader) на Xiaomi и какие плюшки он даёт

Бутлоадер

Если говорить простым языком, то загрузчик (bootloader) на Xiaomi – это так называемая программа, которая запускается при включении смартфона. Именно с неё и начинается загрузка самой операционной системы или перевод телефона в режим восстановления.

То есть загрузчик запускается сразу после нажатия по кнопке включения, ещё до загрузки самой операционной системы. После этого начинают происходить сложные процессы, в результате которых загрузчик (bootloader) понимает, какую операцию необходимо выполнить.

Например, загрузить систему или перейти в меню восстановления.

Большинство производителей блокируют доступ к загрузчику, запрещая пользователям устанавливать сторонние системы и прошивки. Но его практически всегда можно разблокировать, отправив запрос через настройки телефона. Процедура разблокировки занимает немного времени, от 360 до 720 часов.О том, как это сделать читайте в статье Как разблокировать загрузчик на любом Xiaomi в 2020 году

А кому нужен этот загрузчик? Что он дает? Я расскажу о минимум 3 причинах разблокировки бутлоадера. Советую внимательно изучить каждый пункт, чтобы после не возникло дополнительных вопросов.

Китайская версия телефона

При покупке телефонов на таких сайтах как AliExpress или Gearbest можно найти очень выгодные цены, которые могут отличаться от местных на 50-100 долларов.

Именно поэтому многие пользователи покупают телефоны с низкой ценой. Продавцы в свою очередь могут продать китайскую версию под видом глобальной.

Китайская версия смартфона Xiaomi всегда дешевле и на ней может быть установлена MIUI China, или MIUI Global.

  • MIUI China: на телефоне только английский и китайский языки (+ могут быть еще несколько других), нет русского, украинского и прочих. Такое устройство обычно приходит с заблокированным загрузчиком, в запечатанной коробке.
  • MIUI Global: смартфон прошит на глобальную прошивку, однако сам он китайской версии. При попытке обновления можно получить «кирпич». Также в подобных случаях продавцу могут прошивать китайские аппараты в обход разблокировки загрузчика, чтобы продать их под видом «глобальных» намного дороже.

Сторонняя прошивка

Первый и основной плюс – это возможность установки кастомных (неофициальных) и локализованных (официальных, но с доработками специально под ваш регион) MIUI прошивок. Что дает кастомная прошивка:

  • Более богатый функционал и расширенные опции, позволяющие контролировать всю работу смартфона;
  • Простой интерфейс с урезанным или улучшенным функционалом.
  • Продвинутый и чувствительный GPS-навигатор. Местоположение определяется в несколько раз быстрее, чем на стандартной версии.
  • Отлично оптимизированное ядро операционной системы, которое или повышает производительность телефона, или увеличивает время автономной работы.
  • Порты различных сборок от «ромоделов», начиная от Pixel Experience и заканчивая прошивками от других оболочек (OneUI, EMUI, Flyme и тд).

Стороннее Recovery

Разблокировав загрузчик, можно без труда устанавливать TWRP или CWM-рекавери, необходимое не только для получения рут-прав, но и для других важных операций на вашем смартфоне. Рассмотрим подробнее:

  • Доступ к установке новой прошивки;
  • Возможность установки Magisk.
  • Быстрое и простое создание резервных копий.
  • Получение рут-прав.
  • Установка Google Camera.
  • И многое другое.

Root-права

Имея разблокированный загрузчик, вы можете получить статус Суперпользователя. Почти во всех актуальных сборках используется Magisk, так как SuperSu уже давно не поддерживается и новые версии не выходят. Польза рут-прав огромна, начиная от удаления встроенной рекламы и заканчивая разгоном процессора.

Разблокировка бутлоадера – это неотъемлемая часть Пути Истинного СуперПользователя, т.к. без него невозможно установить кастомное Recovery и получить root права

Как узнать разблокирован ли загрузчик на Xiaomi или нет?

Есть как минимум 3 способа проверить разблокирован загрузчик или нет на смартфонах Xiaomi или Redmi.

Рекомендую делать проверку минимум 2 методами, так как до сих пор встречаются модели (купленные за «очень дешево» или б/у) которые были прошиты либо взломаны в обход разблокировки загрузчика.

В таком случае, первый способ может показать строку что загрузчик разблокирован, но при проверке через ADB — все будет иначе (правду покажет только ПК).

1 СПОСОБ: через меню в телефоне

Самый простой способ, встроенный в ваше устройство и не требующий дополнительных программ. Чтобы посмотреть, разблокирован ли у вас загрузчик, достаточно просто стать разработчиком! Нет, не буквально. Все, что нам нужно – это открыть меню настроек разработчика. Те, кто знает, как это сделать – листайте вниз до слов “Режим разработчика активирован”, остальные – повторяем за мной:

  1. Заходим в настройки -> пункт “О телефоне”
  2. Находим пункт “Версия MIUI”
  3. Тапаем на него до тех пор, пока не появится надпись “Вы стали разработчиком!”
  4. Возвращаемся назад, ищем пункт “Расширенные настройки”
  5. В расширенных настройках появился новый пункт “Для разработчиков”, переходим
  6. Активируем “Режим разработчика”

Поздравляю! У нас открылись новые возможности. Неопытным пользователям в раздел “Для разработчиков” свой нос лучше не совать, но сейчас нам надо проверить статус нашего загрузчика.

Как открыть настройки для разработчиковКак открыть настройки для разработчиковКак открыть настройки для разработчиковКак открыть настройки для разработчиковКак открыть настройки для разработчиковКак открыть настройки для разработчиков

Как вы могли заметить, у меня стоит MIUI 12. Если у Вас версия ниже 12, не переживайте, все вышесказанные действия можно проделать на любой версии MIUI и Android, но если Вы хотите MIUI 12, можете написать этому парню, в любое время он Вам поможет

Источник: https://zen.yandex.ru/media/id/5e84e201dc7a763a3ee9dc42/chto-takoe-zagruzchik-bootloader-na-xiaomi-i-kakie-pliushki-on-daet-5f2fc5147dc86f5efd45b927

Микроконтроллер и Bootloader. Описание и принцип работы

Бутлоадер

Приветствую всех на нашем сайте и сегодня мы после небольшого перерыва вернемся к теме микроконтроллеров.

А если быть совсем точным, то мы начинаем обсуждать одну очень интересную и важную тему, а именно использование bootloader (загрузчика) при программировании контроллеров.

Сегодня мы разберем теоретическую часть – зачем bootloader нужен, как он работает и что это вообще такое. Следующая статья будет посвящена целиком и полностью практике. Забегая вперед скажу, что мы напишем свой bootloader для любимых микроконтроллеров STM32!

Итак, простыми словами, bootloader – это специальная программа, которая располагается в памяти микроконтроллера и может самостоятельно перепрограммировать его. Давайте для лучшего понимания процесса посмотрим как вообще выполняется программа, прошитая в микроконтроллер, и где она располагается.

Как вы помните из статьи, посвященной flash-памяти микроконтроллеров STM32, основная пользовательская программа начинается с первой страницы памяти, а точнее с адреса 0х08000000. То есть при подаче питания контроллер сразу же убегает по этому адресу.

При использовании загрузчика все выглядит несколько иначе. Основная программа записывается уже по другим адресам и располагается начиная, например, с адреса 0х0800A000. А область памяти (0х08000000 – 0х0800А000) целиком и полностью отдается bootloader’у. В итоге в flash-памяти контроллера у нас находятся две полноценные программы.

При включении устройства управление получает bootloader (поскольку он находится в области, начинающейся со “стартового” адреса 0х08000000), а при дальнейшей работе bootloader, выполнив все свои задачи передает управление нашей основной программе, которая располагается по адресу 0х0800А000 (этот адрес мы взяли для примера).

Вот небольшая схемка для демонстрации работы загрузчика:

Вроде бы понятно как устроено, но возникает вопрос – зачем все это надо? Давайте разбираться!

Первостепенной задачей bootloader’а является программирование микроконтроллера. Он не просто выполняет какие-то действия, а затем передает управление основной программе (переходит на адрес, который соответствует началу основной программы), он, в первую очередь, самостоятельно записывает эту основную программу в flash-память по нужным адресам.

Давайте разберем небольшой пример для лучшего понимания. Пусть мы создали bootloader (bootloader – точно такой же обычный проект, как и любая другая программа для микроконтроллера), который реализует взаимодействие с внешней картой памяти, ищет на карте файл программы и, если находит, записывает программу в нужную область памяти.

Небольшое отступление от основной темы… Поясню, что я тут имею ввиду под “файлом программы”.

Когда мы создаем проект (Keil, IAR – без разницы), то на выходе (после сборки проекта) мы получаем скомпилированный файл для прошивки в микроконтроллер. Чаще всего мы использовали .hex файл программы. Так вот именно этот файл нам и нужен в данном случае.

Но именно hex-файл не совсем подходит для наших целей, поскольку помимо кода нашей программы он несет в себе дополнительную служебную информацию. Чтобы ее не обрабатывать и не вытаскивать из hex-файла нужный нам код, который bootloader должен записать во flash, мы в настройках компилятора во вкладке Output попросим его генерировать нам вместо hex-файла bin-файл.

Бинарник, в отличие от hex, содержит в себе только последовательный код программы и ничего больше. То есть bootloader’у остается только читать байты из bin-файла и записывать их во flash-память. То есть в нашем примере задачей загрузчика является чтение байт из файла на карте памяти и запись их по адресам, начиная с 0х0800A000. Вот псевдокод для наглядности:

void main(){ // Инициализируем интерфейс SDIO для общения с картой памяти SDIO_Init(); while(1) { // Ищем файл прошивки if (f_open(файл.bin) == FR_OK) { ProgramFlash(); JumpToMainProgram(); } }}

Конечно, это сильно упрощенная версия загрузчика.

Тут мы в вечном цикле пытаемся открыть файл с программой, а как только это нам удается (пользователь записал на карту долгожданный файл) bootloader программирует flash-память и перескакивает на адрес записанной им же программы.

После этого контроллер начинает выполнять пользовательскую программу. Еще раз повторюсь, это всего лишь псевдокод для примера, полноценный bootloader для STM32 мы обязательно напишем в следующей статье!

Все это, конечно, очень интересно, но по-прежнему, непонятно, зачем нужны все эти сложности….

С этим на самом деле все просто – вот, например, первая ситуация – есть огромное количество устройств, на заводе работники прошили в каждый контроллер (например, при помощи ST-Link) на каждой плате bootloader, который при подключении к плате флешки (в заранее предусмотренный разъем) ищет на ней файл прошивки и выполняет программирование. Основную программу, конечно же, тоже можно прошить вместе с bootloader’ом через ST-Link. Но тонкость тут в том, что проект bootloader’а остается всегда неизменным и перепрошивать его не надо, а вот версия основной программы может обновляться кучу раз в процессе тестирования устройств.

И тут уже гораздо проще один раз подключить ST-Link и прошить загрузчик, а впоследствии просто скидывать новую версию основной программы на флешку и втыкать ее в готовое устройство, где перепрошивкой займется bootloader, чем по сто раз бегать от одной платы к другой, втыкать ST-Link, при этом перенося с собой ноутбук с ST-Link Utility

Источник: https://microtechnics.ru/mikrokontroller-i-bootloader-opisanie-i-princip-raboty/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.