Пуленепробиваемые обновления прошивки

16

Какие методы используются для того, чтобы пользователь мог безопасно обновить встроенное ПО устройства после продажи? Я хочу сделать это с микроконтроллером Cortex M3 / 4, но я думаю, что методы для любого микро должны подойти.

Желательно, конечно, с наименьшим количеством дополнительных компонентов.

Imbrondir
источник

Ответы:

16

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

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

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

JPC
источник
10
Как пользователь электроники, я мог бы добавить, что было бы неплохо иметь во время загрузки кнопку, которую можно было бы удерживать при загрузке, чтобы загрузить старую прошивку, в случае, если новая имеет правильную контрольную сумму, но в самой программе есть ошибка.
Зан Рысь
4
«Проблема», которую я вижу в этом решении, заключается в том, что вам нужна какая-то таблица перемещения или полный код, независимый от позиции. В противном случае ваш код не будет работать.
Нико Эрфурт
2
@Masta - Вы не понимаете ту часть, где прошивка копируется в ее окончательное (нормальное) местоположение.
Кевин Вермеер
3
@jpc - Мы используем эту технику с внешней последовательной флеш-микросхемой на некоторых внутренних инструментах на работе. Вам не нужно иметь микроконтроллер с флэш-памятью более чем в два раза, если у вас есть место для 8-контактной части SOIC или QFN. Серийная флэш-память объемом 1 МБ может храниться менее чем за доллар, поэтому, возможно, дешевле пойти по этому пути, чем обновить микроконтроллер в некоторых случаях!
Кевин Вермеер
@zan - Да, мы тоже это используем. Одной из проблем или преимуществ является то, что устройство переустанавливается на настройки по умолчанию, когда вы переписываете старую прошивку (у нас на микросхеме нет EEPROM; мы сохраняем данные конфигурации, такие как MAC-адрес и IP-адрес, в самописной Flash). Для нас это позволяет легко найти доску, когда мы забываем IP-адрес.
Кевин Вермеер
12

Используйте загрузчик и несколько КБ дополнительной прошивки.

Обновление выполняется загрузчиком, посылая специальную команду через UART, USB, I2C или другой протокол. Обновляется только основной код - код загрузчика никогда не затрагивается, кроме как через внешний программатор (например, JTAG / PICkit для PIC и т. Д.)

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

В каком-то байте может быть установлен флаг, который предотвращает неправильное выполнение основного кода, поскольку он не был полностью обновлен.

Томас О
источник
Вы также можете принудительно запустить загрузчик, если загрузка происходит из-за включения питания. Это поможет, если вы загрузите плохую прошивку, которая сразу вылетает. Загрузчику потребуется время для запуска приложения через X секунд.
Роберт
Это хорошая идея, если вы можете использовать простой протокол (например, асинхронный последовательный порт, TTL или 485). Для более сложных случаев (SD-карты, GPRS, USB) я бы не включал комплексный код поддержки в (не обновляемый) загрузчик. Ethernet OTOH (raw UDP или TFTP) достаточно прост для этого.
JPC
3

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

(как правило, эта техника требует либо внешнего хранилища, либо хитрого использования jtag ..)

Имейте фиксированную программу micro (например, небольшую PIC), которая может остановить систему и перепрограммировать ее.

потому что вы не можете изменить прошивку «обновить процессор», она никогда не может пойти не так.

1) пользователь может обновить устройство

2) если обновление не удается, они всегда могут попробовать еще раз. Это не может быть заложено

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

работает для FPGA, DSP и других странных целей.

Может иметь действительно аккуратный пользовательский интерфейс (даже PIC может запустить веб-сервер ....)

Тим Виллискрофт
источник
2

Убедитесь, что ваш продукт имеет простой последовательный интерфейс, предпочтительно EIA232. Нестандартный разъем в порядке, если у вас нет места для DB-9. Например, разъем TRS - это все, что вам нужно для TxD, RxD и заземления.

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

Затем разъем TRS. Используйте разъем с переключателем, чтобы вы могли определить наличие разъема. Просто проверьте сразу после сброса и запустите загрузчик, если есть плагин, иначе запустите приложение. Таким образом, загрузчик и пользовательская прикладная программа остаются хорошо разделенными. (Проверка на самом деле является частью загрузчика; она нам понадобится независимо от версии приложения, в противном случае мы не сможем войти в загрузчик!)

stevenvh
источник
Зачем вам обновлять загрузчик? Как бы вы убедились, что процесс обновления не будет кирпич устройства? Если бы это было возможно, какие новые функции были бы настолько привлекательными, что вы бы рискнули кирпичом для обновления?
Кевин Вермеер
5
@Kevin - Я думаю, он имел в виду, что загрузчик должен быть настолько простым, что вы никогда даже не подумаете о его «обновлении».
JPC
@jpc - Ах, ты прав, неправильно это понял. Мы согласны!
Кевин Вермеер
1

Какое оборудование будет доступно для «модернизации»? ПК, флешка, микро SD карта?

Одним из способов было бы поместить приложение в съемный элемент (флешка, SD-карта и т. Д.). Чип загружает свое приложение из предмета. Ваш апгрейд просто меняет предмет и перезагружается.

Я знаю, что микросхемы микроконтроллеров ARM и Cortex (NXP, Atmel) имеют встроенный последовательный загрузчик, поэтому, если ваш модуль обновления поставляется с ПК и последовательным кабелем (и вы подготовили интерфейс COM-порта), он может просто загрузить свой Обновить.

Воутер ван Оойен
источник
Так что, просто подключив контакты UART к порту, при подключении к COM-порту и ПК, вы можете прошить прошивку без кода вообще на mcu? Хороший совет.
Имброндир
Проверьте таблицу данных, раздел «загрузчик». Чтобы сделать это на самом деле «руками», вам понадобится: 1. сбросить чип; 2. активировать загрузчик (чип проверяет кератиновый штифт). Это может быть сделано с помощью перемычки и переключателя (сброса), но более удобный способ (особенно на вашем столе) - использовать две линии рукопожатия, чтобы выполнить трюк «без рук». Большинство программ для загрузки с ПК (например, flashmagic, lpc21isp) могут сделать магию рукопожатия за вас (если вы правильно подключили линии рукопожатия).
Воутер ван Оойен