Перейти к содержанию
    

Автономный микропрограмматор BootProg для прошивки boot-а (а может и не только)

Начну с того, для чего это потребовалось и "откуда ноги растут".

Три года назад сделал по заказу девайсы на ATMega16, софт к ним. Девайсы имели интерфейс с компьютером по RS-232 и я заложил в схему возможность запуска boot-загрузчика (перемычку). Но тогда по запарке, а может из экономии денег (не помню точно), заказчик решил не делать boot-загрузчик и прошивать девайсы только программатором. За три года много девайсов разошлось по миру и никому не требовалось что-то менять в девайсах.

Но тут вдруг в Германии нашлись потребители, которые захотели-таки немного "заточить" девайсы под себя. И встал вопрос а как быть? Ну, софт доработать не проблема, а как его заменить в девайсах? И при этом не открыть прошивку, т.е. не отдать её в чужие руки в открытом виде. Ехать кому-то в Германию с программатором, софтом и т.п. накладно. Отдать прошивку (если они сами найдут программатор) нельзя, мало ли что. Девайсы то по железу простые, скопировать раз плюнуть. Просить чтобы прислали девайсы сюда тоже накладно, долго, проблемы таможни и т.д. Что делать?

И тут появилась идея автономного (т.е. без компьютера) микропрограмматора. Это маленькое устройство, которое подключается к разъёму ISP девайса (питается от него же) и программирует его после включения питания. Тогда мы им высылаем этот маленький программатор и они с его помощью "оприходуют" все свои девайсы. Для простоты было решено таки программировать AES-boot загрузчик, а потом уже с компьютера заливать в девайсы новую версию софта (а потом и следующие обновления, если будут). К тому же загрузчик мал по размеру (менее 2К), так что нет проблемы его "запихать" в память контроллера микропрограмматора. Конечно, возможность "перехвата" кода остаётся - если "снять" весь обмен по ISP в момент программирования. Но всё же это потребует некоторых "спец" средств, которых может не быть под рукой. Да и желание "связываться" может отпадёт. Для "надёжности" ещё решено применить счётчик программирований, - задать количество девайсов, которые можно будет прошить микропрограмматором. Счётчик будет в eeprom, декрементироваться после каждого удачного программирования. При обнулении счётчика - в отказ.

 

Теперь о железе микропрорамматора. Это 5-ть деталей: контроллер ATMega48V (в DIP-корпусе), светодиод, резистор 470 Ом (или около того), панелька 28 ног для контроллера и разъём ISP (в моём случае 6 пин) для втыкания в целевой девайс. Схему тут не привожу, т.к. её рисовать дольше чем написать текстом: выводы земли и питания с ISP разъёма подаются на ноги котроллера 8,22 и 7,20 соответственно; сигналы MOSI, MISO, SCK на одноимённые выводы контроллера - 17,18,19; сигнал RESET - на вывод 16; светодиод катодом на вывод 6 и анодом через резистор на плюс питания (нумерация ног для DIP-корпуса!). Тактирование делается внутренним RC-генератором, на который контроллер "настроен" с завода. Я только сбросил фуз-бит делителя на 8, чтобы контроллер начал работать на тактовой 8 МГц. Панелька нужна для того чтобы вынуть контроллер и зашить его в программаторе. Но можно доработать схему для того чтобы шить контроллер не вынимая, - для этого надо добавить переключатель, который переключает сигнал RESET с разъёма ISP между выводами 16 и 1 контроллера. Я так не делал, чтобы избежать каких-либо проблем с немцами или при пересылке, - вдруг перемычка сорвётся, будет переставлена и т.д., надо чтобы всё было "железно".

 

Как работает. Подключаем к ISP разъёму, включаем питание целевого девайса, начинается программирование. Поскольку оно очень быстрое, то индикация сделана только "по результатам". Если не удалось войти в режим программирования, то длинная вспышка светодиода и такая же пауза, попытки войти в режим программирования циклически повторяются. Если контроллер девайса не тот, который должен прошиваться (не тот ID кристалла), то короткая вспышка с длинной паузой. Если истёк счётчик прошиваний, то короткая вспышка и короткая пауза. Если всё в норме, то постоянное свечение. В последних трёх случаях микропрограмматор в итоге зацикливается на высветке.

 

Софт микропрограмматора сделан путём кастрации софта из моей темы про программатор Dimoniprog (тут). Для упрощения все ожидания завершения программирования флеша или фузов с локами сделаны просто на задержках.

Для использования проекта в своих целях надо адаптировать под нужный целевой кристалл (код кристалла, задержки, значения фузов и локов). Это делается настройками определений в начале файла isp.c. У меня всё настроено для программирования целевого кристалла ATMega16. Возможно, для надёжности следует уточнить коды команд интерфейса сериального программирования по даташиту целевого кристалла (хотя это вроде у всех АВР Атмелов однохренственно). В файле main.c надо задать счётчик возможных программирований и вставить код своего boot-загрузчика. Внимание! В приводимом исходнике main.c код загрузчика по понятным причинам искажён (потому работать и не будет) и приводится для наглядности. Код загрузчика (для тех кто в танке) берётся из Application Note AVR231.

Для того чтобы легко получить код своего загрузчика в виде исходного текста, я наваял програмку Hex2Src, которая принимает через командную строку имя файла загрузчика, например, boot.hex (можно не только в intel-hex формате, но и в motorola и tektronix). После запуска будет создан файл с тем же именем, но расширением .c. Из него надо взять нужное и с небольшими правками перенести в файл main.c. Думаю, трудностей возникнуть не должно.

После внесения всех правок компилируем проект BootProg. Поскольку в проекте используется eeprom, то выходной файл компилятора задан в simple формате. Так что для получения из него файла кода в hex-формате надо применить POSTLINK команду. Для простоты я её добавляю в оболочку IAR через "Configure Tools...". Надо ввести следующее:

Menu Text: Postlink
Command: $TOOLKIT_DIR$\bin\POSTLINK.BAT
Argument: $TARGET_FNAME$ $TOOLKIT_DIR$\bin\POSTLINK.EXE
Initial Directory: $TARGET_DIR$

И поставить галку "Redirect to Output window". Сам файлик POSTLINK.BAT (оригинальный в директории BIN софта IAR) надо подменить на поправленный, который можно взять из темы тут.

После компиляции вызываем из меню "Tools" команду "Postlink". В результате получаем hex-файл прошивки ATMega48V. Зашиваем флеш, а зашивать eeprom нет необходимости - инициализация счётчика загрузок делается программно. Микропрограмматор готов!

---------------------------------------------------

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

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

BootProg.rar

Hex2Src.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно, возможность "перехвата" кода остаётся - если "снять" весь обмен по ISP в момент программирования. Но всё же это потребует некоторых "спец" средств, которых может не быть под рукой. Да и желание "связываться" может отпадёт.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для работы на производстве оптимальный вариант такого программатора- простой дешевый МК (Тини2313 - SPI делаем софтово) и программа для целевого кристалла во внешнем EEPROM (24С512 в количестве n штук на одной шине) - иначе как вы зашьете что либо кроме boot'a? Для обновления прошивки и настройки фьюзов следует применить USART - тогда вообще отпадает необходимость во внешнем программаторе.

Кстати-если отправлять такую прошивалку на сторону - то достаточно весьма простого шифрования содержимого 24С512 - от дилетантов поможет а не дилетант перехватит поток на SPI шине (да хотя бы повесит в паралель еще один МК который будет кидать данные во внешнее ОЗУ и далее в комп)

- тогда делаем так: берем как контроллер Tiny2313 (SPI и I2C - софтовые), то что будем шить (образ FLASH+EEPROM+FUSE+LOCK) храним в 24С512 (если 64кб не хватило то ставим еще n штук 24С512 или заменяем их на изделия из серии AT45 (они тоже в SO8 но интерфейс SPI)). Для обновления заливки вешаем FT232(у меня стояла старая, еще с внешнем 93С46) (ну или MAX232 - в зависимости от ваших потребностей).

Такой программатор реализовывал у меня двухступенчатую прошивку target'a - сначала загружал тестово-калибровочную прошивку, запускал ее на выполнение (отпускал reset) и после успешного завершения калибровки (ждали ответ) писал рабочую прошивку и лочил по LOCK-битам и RSTDISABLE кристалл.

 

Конечно, возможность "перехвата" кода остаётся - если "снять" весь обмен по ISP в момент программирования. Но всё же это потребует некоторых "спец" средств, которых может не быть под рукой.
- эти "средства" - еще одна мега с достаточным объемом оперативной памяти - если захотят - то прошивку сольют... Правда пробовал делать такой брелок-программатор (специально для наглых и вредных) который проверял наличие сторонних подключений (нет, не сложнее вашего - одна 168 мега (с затертой маркировкой), один резистор, светодиод и блокировочный конденсатор по питанию + кварц, вся "соль" - в программе (сами догадаетесь что там было, скажу лишь что именно ЭТО и потребовало кварца))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Граждане! При желании можно скопировать всё и вся, я же это не отрицаю! То что для этого нужен ещё контроллер и т.д. - это я и назвал спецсредствами. Думаете, что у тех людей, которые ставят приборы на эксплуатацию, когда надо делать всё вовремя и к сроку, это всё есть и оно на мази, типа потирая руки ждут шанса скопировать код устройства? Да не смешите мои тапочки. Это у вас есть (или можете наваять), а у них врядли, да и некогда им этим заниматься. Я скорее обезопасился от случайного "уплывания" прошивки налево. И всё.

 

А потом главная мысль в теме ведь не эта, а мысль иметь простое устройство для автономного (без компьютера с кучей софта и подключённого к нему программатора) и быстрого (почти моментального)программирования девайсов, одной "серии" или разных на совместимых контроллерах.

Конечно, можно сделать и более навороченное устройство, нет сомнений, но это уже печатная плата и т.д. А у меня панелька под контроллер - это и есть плата. Спаял за 20 мин, из них половину времени потратил на разделку кабеля.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... Думаете, что у тех людей, которые ставят приборы на эксплуатацию, когда надо делать всё вовремя и к сроку, это всё есть и оно на мази, типа потирая руки ждут шанса скопировать код устройства? Да не смешите мои тапочки. Это у вас есть (или можете наваять), а у них врядли, да и некогда им этим заниматься. Я скорее обезопасился от случайного "уплывания" прошивки налево. И всё.

:a14:

ИМХО очень правильно. Такая девайсина, залитая компаундом с разъёмом на конце :). "Те люди, которые ставят приборы..." вскоре придумают наукообразное название ( например, "ключ на разлочку") и будут давать друг другу попользоваться "на 1 раз". Только нужно, чтобы всё работало как часы, и было очень эргономично, т.е. просто и понятно. Потому что эта штука не должна попасть в руки "умников", которым слить трафик - раз плюнуть. По крайней мере, живая. А закончился ресурс прошивок - и сотри флеш... Светодиод я, пожалуй, оставил бы - типа индикатор 5 вольт :biggrin:

Изменено пользователем Maik-vs

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Светодиод я, пожалуй, оставил бы - типа индикатор 5 вольт :biggrin:

У светодиода всё же более интеллектуальная задача - сигнализировать результат.

Врочем, если вдруг не горит, то это как раз означает, что питания нет :)

 

Вот зафотил девайс:

3d6621ab2463.jpg

С другой стороны залил герметиком:

85a45d60a41b.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это может быть востребовано на производстве

Хорошая идея :a14: , но главное, чтобы его не забыли в готовом приборе. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ценно! Для себя. Поэтому AES тут не нужен. А в чужих руках AES не поможет - SPI же открыт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык AES будет нужен потом, когда будет заливаться (или обновляться) прошивка с компьютера через этот AES-boot загрузчик.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так ведь речь зашла о назначении AES, а он не связан со SPI загрузкой. Потому и нужность AES с ней тоже никак не связана. А вот потом при обновлении через AES-boot уже будет лучше не просто boot, а шифрованный AES-boot.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, это ж банально - стоимость взлома защиты должна быть больше стоимости защищаемого. С одной стороны хорошо, закрыли AES`ом, а с другой - дыра-SPI и работы на день-два. Неужели Ваша прога стоит меньше ? Имхо, хорошее решение - заменить у клиентов железо полностью или частично (лучше за их счет, т.к. это новая фича). И вот тогда таки да, AES. А в топике - девайс для "внутреннего" использования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имхо, хорошее решение - заменить у клиентов железо полностью или частично (лучше за их счет, т.к. это новая фича).

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

Так что не всё так просто...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного доработал програмку преобразования кода в исходник Hex2Src.

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

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

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

Это всё я сделал к тому, что мало ли вдруг захочется программировать не только boot, но и вообще весь код полностью. При этом надо только взять контроллер с подходящим объёмом памяти и перекомпилить под него проект. Меня как раз попросили сделать именно такой прошивальщик, так что пришлось перейти на ATMega168.

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

Hex2Src.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...