Комментарии 29
Интересное решение. А чего не прикинуться sd картой? Да, чуть сложнее, зато прошивальщик не нужен. Хотя, если взять готовое решение FS, то все решаемо.
Да, можно. Где-то такое уже видел. Да и про USB CDC загрузчик тоже видел на англоязычном ютубе, только там через Arduino IDE прошивают. У меня есть устройство, в котором связка МК+микросхема Flash памяти. И неудобно по отдельности прошивать МК и память, убирать перемычки с микросхемы памяти, подключать два программатора. И вот захотелось сделать загрузчик, который за один присест прошьет и МК, и память. Сейчас загрузку в МК реализовал, далее собираюсь добавлять поддержку прошивки памяти.
Для CDC нужен драйвер и приложение. Для HID - приложение. Для MSC - ничего.
Один присест (почти) сделать легко - два файла на виртуальной ФС. Один - память МК, другой - внешняя память.
Если интересно, могу показать.
Поддерживаю, делал такое. Только эмуляция не "sd-карты", а usb massstorage. Размеры флеша не большие - fat12, насколько я помню, эмулировал. Вход в бутлоадер: по значению backup-регистра, нескольким перезагрузкам по wdt подряд или по отсутствию прошивки в районе основного приложения. Если включена защита от чтения, то отдаешь сектора заполненные 0xFF при чтении области основного приложения.
А чего не прикинуться 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 нужно:
1) Зайти на сайт
2) Скачать и сохранить у себя файл прошивки
3) Скачать себе софтину для обновления прошивки
4) Выбрать в софтине для прошивки нужный файл прошивки и прошить
И как показала практика — 90% пользователей совершают ошибки в п2-4.
Поэтому для себя решил — что лучше не напрягать пользователя лишними этапами.
Все таки обновление прошивки нужно не пользователю, а вам, производителю.
Пользователь хочет получить просто работающий девайс, ну может быть какие то дополнительные плюшки, если девайс можно безболезненно прошить, ничего для этого не устанавливая на свой ПК и не скачивая никаких файлов.
За скобками оставляем тот факт, что браузер как бы и не должен иметь доступа к железу.
А что мешает стандартный драйвер использовать?
Не затронуты вопросы:
Проверка целостности образа прошивки;
Проверка версионности прошивки (обновление только в том случае, если версия образа >= версии в памяти МК);
Шифрование прошивки;
Что будет если новая прошивка начала заливаться и не закончила? Новая прошивка должна заливаться в резервную область (внешнюю память), там распаковываться, проверяться и если все норм уже копироваться в рабочую память
КМК без всего этого вопрос как заливать образ второстепенен... Даже если мы работаем по удобному MSD все равно найдется пользователь который скопирует туда что-то не то и получит кирпич.
Хорошие замечания. По сути в память МК сейчас возможно зашить любой мусор. Есть над чем работать. Тут действительно нужно довести до ума и подправить статью
Вот п.2 во многих случаях - зло. Скачал новую прошивку, залил ее, а в ней глюк. И уже не вернешься на старую, потому что "проверка версионности" :)
Мне кажется или STM32F103 серию убили? По крайней мере доступность этих чипов оставляет желать лучшего, как и цены на них.
Прекрасно понимаю, что никто не будет переписывать код, который был написан на CMSYS много лет назад под них.
Но может кто-то подскажет, на что лучше переехать с F103C8 серии? Сейчас присматриваюсь к G0, но пугает то, что они новые и по ним нет ERRATA и накопленного опыта...
Сам еще разбираюсь с этим вопросом. Осталась с давних времен отладочная с f103. Брал недавно как временный вариант stm32f103c6, но флеш памяти там уже 32 кб. Да придется рано или поздно на другую серию перейти
Ее не убили. Это полупроводниковый кризис, который зародился еще почти год назад.
Я начинал с обновления прошивки по CDC. Но потом перешел на HID из-за отсутствия необходимости устанавливать драйвера :)
Да, нужно свое приложение, но это не проблема. У меня приложение в трех вариантах:
- пользовательский - позволяет выбрать вариант прошивки только из совместимых с подключенным девайсом и только обновить прошивку;
- сервисный - позволяет прошить любой вариант в любой девайс, и только обновление прошивки;
- производственный: позволяет прошить любой вариант, назначить серийный номер, внести данные об устройстве в базу данных, считать EPROM;
Скриншот
Все варианты прошивки сидят прямо в исполняемом файле, то есть не нужно качать отдельно саму прошивку и отдельно приложение. Скачал, запустил, прошил :)
Ну и да, сами прошивки в зашифрованном виде, загрузчик, принимая их от приложения, расшифровывает.
Так же сделал свой пакетный протокол по принципу "запрос-ответ". Содержимое каждого пакета проверяется при получении на целостность.
USB CDC Bootloader для STM32F103C8