Как стать автором
Обновить

Комментарии 29

Интересное решение. А чего не прикинуться sd картой? Да, чуть сложнее, зато прошивальщик не нужен. Хотя, если взять готовое решение FS, то все решаемо.

Да, можно. Где-то такое уже видел. Да и про USB CDC загрузчик тоже видел на англоязычном ютубе, только там через Arduino IDE прошивают. У меня есть устройство, в котором связка МК+микросхема Flash памяти. И неудобно по отдельности прошивать МК и память, убирать перемычки с микросхемы памяти, подключать два программатора. И вот захотелось сделать загрузчик, который за один присест прошьет и МК, и память. Сейчас загрузку в МК реализовал, далее собираюсь добавлять поддержку прошивки памяти.

Для CDC нужен драйвер и приложение. Для HID - приложение. Для MSC - ничего.

Один присест (почти) сделать легко - два файла на виртуальной ФС. Один - память МК, другой - внешняя память.

Если интересно, могу показать.

В принципе можно сделать установочный файл, который будет и драйвера ставить, и приложение ставить. Но то, что для Mass Storage ничего не нужно весомый аргумент

Очень бы хотелось увидеть реализацию.

Видел один CDC который можно было прошить отправив hex-файл в устройство.

Поддерживаю, делал такое. Только эмуляция не "sd-карты", а usb massstorage. Размеры флеша не большие - fat12, насколько я помню, эмулировал. Вход в бутлоадер: по значению backup-регистра, нескольким перезагрузкам по wdt подряд или по отсутствию прошивки в районе основного приложения. Если включена защита от чтения, то отдаешь сектора заполненные 0xFF при чтении области основного приложения.

sd-карты так это я задал направление мысли)

А чего не прикинуться sd картой?
Потому что это намного сложнее. Надо либо полноценно эмулировать fat и отображать ее на реальную память, либо отдавать половину памяти под «флешку», а потом парсить и считывать прошивку.
С CDC же проще: драйвера в системе обычно уже есть, а для заливки достаточно cat file.bin > /dev/ttyACM0. Правда, в статье описан более сложный способ с полноценным командным обменом.

У обновления прошивки через USB CDC есть недостаток - в ОС надо ставить драйвер. Если изделие обновляется не специалистом - это может быть проблемой. Например пользователь может не иметь в системе прав администратора. Кроме того, в программе обновления надо выбирать конкретный UART порт из имеющихся в системе (или организовать сканирование с автоопределением).

Решение: USB HID. Драйвер ставить не нужно, он уже есть в ОС. Недостаток - достаточно медленная передача данных из за особенностей реализации в ОС.

Ну и загрузчик USB HID занимает много места. На F103 это критично.

Ну и загрузчик USB HID занимает много места.
Не знаю сколько занимает запись во флеш контроллера, но вряд ли больше половины от HID. Ну пусть даже столько же, суммарно что-то около 5 кБ. Из 64 кБ, доступных в f103c8t6. Менее 8%.
С HID в другом проблема: ему нужна программа-прошивальщик. Так просто (для пользователя) как с MSD или CDC уже не выйдет.

Идеальный вариант — web usb.
Драйвера не нужны
В хроме и ему подобном работает из коробки
Обновить прошивку можно прямо с сайта
Попробовать можно здесь
https://devanlai.github.io/webdfu/dfu-util/

идеальным такой вариант не может быть (как раз из-за хрома и веба)

<sаrcasm> ну да, зачем облегчать жизнь конечному пользователю
Он мог просто зайти на сайт и нажат кнопку обновить прошивку.
Но пользователь должен страдать, нужно заставить его ставить драйвера, перезагружаться чтобы включить поддержку драйверов без цифровой подписи и пр.
</sаrcasm>

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

Я тоже делал обновление прошивки через HID
Для того, чтобы обновить прошивку через HID нужно:
1) Зайти на сайт
2) Скачать и сохранить у себя файл прошивки
3) Скачать себе софтину для обновления прошивки
4) Выбрать в софтине для прошивки нужный файл прошивки и прошить


И как показала практика — 90% пользователей совершают ошибки в п2-4.
Поэтому для себя решил — что лучше не напрягать пользователя лишними этапами.
Все таки обновление прошивки нужно не пользователю, а вам, производителю.
Пользователь хочет получить просто работающий девайс, ну может быть какие то дополнительные плюшки, если девайс можно безболезненно прошить, ничего для этого не устанавливая на свой ПК и не скачивая никаких файлов.

Да, обновление прошивки конечный пользователь у нас не совершает. Но бывает, что прошивку нужно обновить и с хрюши, и с ноута с семеркой. Мы можем гарантировать, что наше ПО работает на всём. Но не можем гарантировать, что там будет хотя бы хром и уж тем более, что он работать будет.
За скобками оставляем тот факт, что браузер как бы и не должен иметь доступа к железу.

А что мешает стандартный драйвер использовать?

Не затронуты вопросы:

  1. Проверка целостности образа прошивки;

  2. Проверка версионности прошивки (обновление только в том случае, если версия образа >= версии в памяти МК);

  3. Шифрование прошивки;

  4. Что будет если новая прошивка начала заливаться и не закончила? Новая прошивка должна заливаться в резервную область (внешнюю память), там распаковываться, проверяться и если все норм уже копироваться в рабочую память

КМК без всего этого вопрос как заливать образ второстепенен... Даже если мы работаем по удобному MSD все равно найдется пользователь который скопирует туда что-то не то и получит кирпич.

Хорошие замечания. По сути в память МК сейчас возможно зашить любой мусор. Есть над чем работать. Тут действительно нужно довести до ума и подправить статью

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

Вот п.2 во многих случаях - зло. Скачал новую прошивку, залил ее, а в ней глюк. И уже не вернешься на старую, потому что "проверка версионности" :)

Мне кажется или STM32F103 серию убили? По крайней мере доступность этих чипов оставляет желать лучшего, как и цены на них.
Прекрасно понимаю, что никто не будет переписывать код, который был написан на CMSYS много лет назад под них.
Но может кто-то подскажет, на что лучше переехать с F103C8 серии? Сейчас присматриваюсь к G0, но пугает то, что они новые и по ним нет ERRATA и накопленного опыта...

Сам еще разбираюсь с этим вопросом. Осталась с давних времен отладочная с f103. Брал недавно как временный вариант stm32f103c6, но флеш памяти там уже 32 кб. Да придется рано или поздно на другую серию перейти

НЛО прилетело и опубликовало эту надпись здесь

Ее не убили. Это полупроводниковый кризис, который зародился еще почти год назад.

Я начинал с обновления прошивки по CDC. Но потом перешел на HID из-за отсутствия необходимости устанавливать драйвера :)

Да, нужно свое приложение, но это не проблема. У меня приложение в трех вариантах:
- пользовательский - позволяет выбрать вариант прошивки только из совместимых с подключенным девайсом и только обновить прошивку;
- сервисный - позволяет прошить любой вариант в любой девайс, и только обновление прошивки;
- производственный: позволяет прошить любой вариант, назначить серийный номер, внести данные об устройстве в базу данных, считать EPROM;

Скриншот

Все варианты прошивки сидят прямо в исполняемом файле, то есть не нужно качать отдельно саму прошивку и отдельно приложение. Скачал, запустил, прошил :)

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

Так же сделал свой пакетный протокол по принципу "запрос-ответ". Содержимое каждого пакета проверяется при получении на целостность.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории