Оболочка для прошивки серийных устройств

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



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

Чтобы воспользоваться каким-то программатором, который есть в наличии, нужно иметь консольное ПО, которое работает с этим программатором и файл настроек, который скажет программе, какие аргументы этому ПО надо предавать для этих самых действий.
Для примера приведу простейший файл настроек программатора для Altera USB-Blaster:
<tool>
	<name value="Altera USB-Blaster" />
	<path value="C:\altera\11.0\qprogrammer\bin\quartus_pgm.exe" />
	<supported>
		<type value="altera" />
	</supported>
	<actions>
		<wflash>
			<command value=' -c "USB-Blaster [USB-0]" {filename}' />
			<error>
				<string value="Can not" />
				<string value="Error" />
				<string value="ERROR" />
			</error>
		</wflash>
	</actions>
</tool>


То есть, при конфигурировании памяти FPGA (EPSC) с указанным в скрипте файлом test.cdf будет вызвана командная строка:
C:\altera\11.0\qprogrammer\bin\quartus_pgm.exe -c "USB-Blaster [USB-0]" test.cdf

И если в выводе этого ПО не найдётся строк, указанных в теге error, то этап считается успешно выполненным (надо посмотреть, что программа выдаёт в связи с различными проблемами и выбрать характерные подстроки).
В архиве есть примеры таких файлов конфигурации для программаторов ST-Link (stm32 через ST-Link Utility и stm8 через stvp), J-Link (правда, только для стирания и прошивки), AVRISPmkII (через atprogram из Atmel Studio 7.0 и avrdude), JTAGICE3 (аналогично), Altera USB Blaster (через программатор квартуса), stm32 DFU (DfuSe), AVR USB DFU (который Flip использует, были какие-то проблемы, надо разбираться, но пока проверять не на чем). Подключить что-то другое тоже вряд ли большая проблема.

В файле конфигурации программатора (и проектов тоже) можно добавлять различные опции прошивки, например, тип интерфейса программирования (JTAG/SWD), скорость программирования или что-то в этом духе. Можно сделать поля ввода для ввода IP-адреса для обновления по эзернету, поля выбора ком-порта для обновления по последовательному порту или если программатор работает через него и т.д.

Проекты. Каждый проект — это один или нескольких алгоритмов прошивки какого-нибудь устройства. Если в устройстве, например, есть STM32 и FPGA, то можно сделать в проекте два скрипта: один конфигурирует FPGA, а второй шьёт стмку. После прошивки всего чего только можно должно получиться готовое, настроенное и даже рабочее изделие.
Если скрипт один, он при открытии проекта автоматически выберется, если несколько, то будет показано окно выбора скрипта.

Скрипт — это как раз набор этапов и настроек для получения прошитого как надо контроллера.
С помощью настроек можно выбирать файл для программирования из нескольких вариантов, файл для настроек и так далее.
Например, в данном примере выбирается из списка тип контроллера (определяется переменная device для программатора и выбирается бутлоадер, т.к. для каждого контроллера он уникальный), уникальный адрес устройства и тип устройства, где этот контроллер установлен (получается разный eeprom в итоге).
<script>
		<name value="Прошивка диммера 6/12 каналов" />
		<cathegory value="0" />
		<options>
			<list label="Device" id="avr.atmega1280_2560">
				<option label="atmega1280">
					<value name="device" val="atmega1280" />
					<value name="devicetype" val="1280" />
				</option>
				<option label="atmega2560" default="">
					<value name="device" val="atmega2560" />
					<value name="devicetype" val="2560" />
				</option>
			</list>
			<list label="Channels">
				<option label="6 каналов" default="" >
					<value name="channels" val="led6ch" />
				</option>
				<option label="12 каналов">
					<value name="channels" val="led12ch" />
				</option>
			</list>
		</options>
		<input value="MAC" name="rdmid" default="08:9A:00:30:00:00" id="newdimmer.rdmid" />
		<steps>
			<hexnyan value="-m{channels}.xml Address={rdmid} -slirdm.hex format=hex" comment="Генерация EEPROM" />

			<option value="FED9FC" comment="Обычные фьюзы" />
			<erase comment="Очистка памяти" />
			<wflash value="FwBootloader{devicetype}.hex" comment="Прошивка Boot" />
			<vflash value="FwBootloader{devicetype}.hex" comment="Проверка Boot" />
			<wflash value="NewDimmer.hex" comment="Прошивка ПО v6" />
			<vflash value="NewDimmer.hex" comment="Проверка ПО" />

			<wdata value="lirdm.hex" comment="Прошивка номера" />
			<lock value="FC" comment="Защита" />
		</steps>
	</script>

Вот как это выглядит в программе:

Слева опции программатора, справа — проекта и скрипта.

Идентификатор id, указанный у опций или полей ввода позволяет сохранять последнее использованное значение и подставлять его далее как значение по умолчанию. Кнопка "+" у полей ввода увеличивает номер на единицу, если это числовое поле.

Ещё можно в зависимости от заданных опций убирать отдельные этапы программирования. Например, через бутлоадер сам бутлоадер прошить нельзя, да и фьюзы какие-нибудь фиг изменишь.
Прошивка AVRISPmkII, если её выполнять программатором, состоит из четырёх этапов: прошивка и проверка бутлоадера и то же самое для ПО. А если прошивать через имеющийся бутлоадер (AVR USB DFU), то в первых двух этапах смысла нет:
<script>
		<name value="AVRISPmkII" />
		<device value="at90usb162" />
		<cathegory value="0" />
		<steps>
			<erase comment="Очистка памяти" />
			<wflash value="bl_usb_162v105.hex" comment="Прошивка Boot" cond="bootloader!=1" />
			<vflash value="bl_usb_162v105.hex" comment="Проверка Boot" cond="bootloader!=1" />
			<wflash value="120318_AVRISP_studio.hex" comment="Прошивка ПО" />
			<vflash value="120318_AVRISP_studio.hex" comment="Проверка ПО" />
		</steps>
	</script>

В файле конфигурации программатора переменная bootloader не указана. В файле конфигурации DFU указана как 1:
<options>
		<hidden name="bootloader" default="1"  />
	</options>

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

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

Более подробное описание в папке Help.
Файлы в топике: NyaProg.zip

Комментарии (10)

RSS свернуть / развернуть
<error>
  <string value="Can not" />
  <string value="Error" />
  <string value="ERROR" />
</error>

Это регэкспы или просто строка для поиска? Проверку возвращаемого программатором значения задать можно?
Не думал вместо XML прикрутить нормальный скриптовый язык, ту же луа?
0
  • avatar
  • Vga
  • 28 апреля 2017, 10:02
Пока строки, но сделать регэкспы, думаю, нетрудно. Не было необходимости просто. Программы выдают вполне себе однозначные результаты и пары-тройки строк вполне хватает для детекта ошибки. Особенно, если они пишут что-то вроде [ERROR] перед строками с ошибкой=)
Проверку значения, это того, которое возвращает функция main? Кстати, не задумывался об этом, что если не 0, то что-то пошло не так. Надо будет посмотреть.

Думал, и с луой я вполне себе знаком, и даже к с и c# её прикручивал когда-то, но пока не испытал для того какой-либо необходимости. Не очень представляю, что луа может дать такого.
ХМЛ это позволяет наглядно всё нарисовать и поля ввода сделать =) Хотя, конечно, это можно сделать и для луа, но трудозатраты на каждый такой скрипт будут, мне кажется, гораздо выше.

Просто выбор этапов и замена позволяют работать с почти всеми cli программками, если они управляются аргументами запуска. Единственная проблема, которую я предвижу — проги могут требовать разные названия контроллеров и надо придумывать какую-то функцию по подмене названий контроллеров из таблицы. Пока не сталкивался (avrdude и atprogram, например, понимают вполне, но фз, поймёт ли avreal какой-нибудь название atmega1280, когда он хочет mega1280), но всякое может быть…
0
Особенно, если они пишут что-то вроде [ERROR] перед строками с ошибкой=)
Но ведь бывают случаи сложнее. Плюс регэкспы позволяют выудить текст ощибки и показать его юзеру.
Проверку значения, это того, которое возвращает функция main? Кстати, не задумывался об этом, что если не 0, то что-то пошло не так. Надо будет посмотреть.
Да. Но стоит вообще иметь возможность задавать действия для разных значений, хотя обычно ненулевое озхначает ошибку (как раз для того, чтобы можно было прервать батчинг при ошибке).
Хотя, конечно, это можно сделать и для луа, но трудозатраты на каждый такой скрипт будут, мне кажется, гораздо выше.
В принципе, на луа можно делать XML-подобные файлы данных. А можно еще и наскриптовать чего-то дополнительно к этому. Нужно оно или нет — это уже другой вопрос.
Можно вообще целиком движок на луа написать) Правда, гуй IUP для нее довольно тяжеловесный, но можно, например, написать свой хост-интерпретатор с подобными твоей проге функциями создания кнопочек…
0
Плюс регэкспы позволяют выудить текст ощибки и показать его юзеру.
Да, это можно. Сейчас выводится строка, где есть вхождение, целиком.

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

Можно вообще целиком движок на луа написать
Можно, конечно, вопрос в том, есть ли в этом смысл>< Я не вижу особых преимуществ пока. Да и луа прекрасно подключается к чему угодно, если будет нужно сделать расширяемый функционал.
Максимум десяток безусловных этапов, включая пару генераторов настроек — это самое сложное, с чем сталкивался. В среднем этапов всего 3-5. Т.е. в большинстве случаев ничего хитрого вовсе не требуется, максимум исключение ненужных этапов и создание настроек, да и то только там, где они отличаются от устройства к устройству.
0
С луа круче и интереснее! Я бы сделал так только поэтому :D Ну и мне кажется, на луа можно сделать более лаконичные описания.
А так если этого хватает, то никакой нужды менять, конечно, нет.
0
Я, помню, lua для интереса цеплял к VSFilter (DirectShow фильтр, плагин VirtualDub и т.д.) — видеофильтр для рисования субтитров…

Регэкспы получились, вроде. Хотя выглядит, как и стоит ожидать, ужасно><
<regex value="(?<=\[ERROR\]\s)(.*?)(?=\.)" />
0
Я, помню, lua для интереса цеплял к VSFilter
С какой целью?)
Хотя выглядит, как и стоит ожидать, ужасно><
Регэкспы, сэр!
0
Хм, когда-то я делал караоке к анимешкам (т.е. сопровождение текста песни текстом на экране с какими-то видеоэффектами) и занимался оформлением субтитров. Вот этот фильтр часто использовался для оформления + скрипты на луа для программы aegisub, с помощью которых делалась анимация (строка разбивалась на отдельные слоги со своими эффектами оформления, точечки, кружочки, пятна и т.д.). Эффекты задаются тегами в субтитрах — цвет, шрифт, размер, граница, тень, перемещение и т.д. И захотелось сделать теги самопальные, а потом и подключить теги, заданные из внешних скриптов (обработка в нём точек пути текста до растеризации и обработка заливки поточечно) =)
Как-то так~
0
Ы. И как, сносно работало? VSFilter и без того весьма тормозной был >_<
0
Суперслоу! Но т.к. караоке в любом случае рендерилось в virtualdub, то можно и потерпеть =D
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.