Генератор .hex/.bin файлов из командной строки

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

Пришлось написать программку, с помощью которой можно получать hex-файлы с нужным содержимым: hexnyan.


Описание
Программа поддерживает два режима работы:
  1. Структура и содержимое файла целиком задаётся через аргументы командной строки;
  2. Структура и значения задаются в xml-файле, через командную строку изменяются значения отдельных полей.

Типы данных, которые поддерживаются программой:
  • u8 — беззнаковое число размером 1 байт;
  • u16 — беззнаковое число размером 2 байта, little endian;
  • U16 — беззнаковое число размером 2 байта, big endian;
  • u32 — беззнаковое число размером 4 байта, little endian;
  • U32 — беззнаковое число размером 4 байта, big endian;
  • u48 — беззнаковое число размером 6 байт, little endian;
  • U48 — беззнаковое число размером 6 байт, big endian;
  • u64 — беззнаковое число размером 8 байт, little endian;
  • U64 — беззнаковое число размером 8 байт, big endian;
  • P<количество> — поле длиной <количество> байт, заполненное указанным значением;
  • X<количество> — поле длиной <количество> байт, заполненное указанной hex-строкой, неуказанные байты добиваются нулями;
  • S<количество> — поле длиной <количество> байт, заполненное указанной строкой, неуказанные символы добиваются нулями;

Допустим, есть некоторая структура, для которой надо изготовить hex-файл (желаемые значения указаны в комментариях от балды):
typedef struct
{
	uint8_t Magic;        // 123
	uint8_t Address[6];   // 12:34:56:AA:BB:CC
	uint8_t ID[6];        // *(uint64*)&ID[0] == 123456
	
	uint8_t A;            // 10
	uint8_t B;            // 20
	uint8_t C;            // 30

	uint8_t InternalData[16]; // 00..00

	char    Name[32];     // SuperPuperDevice
} TSettings;


Пример 1. Создание из командной строки
hexnyan -n u8=123 X6=123456AABBCC u48=123456 u8=10 u8=20 u8=30 P16=0 S32=SuperPuperDevice -stest.bin format=bin -stest.hex format=hex


Пример 2. Создание из xml-файла
Для такой структуры создадим файл test.xml:
<eeprom>
	<u8 name="Magic" default="123" comment="Signature" />
	<X6 name="Address" comment="MAC address" />
	<u48 name="UniqID" comment="Device ID" />
	
	<u8 name="A" comment="Some option 1" default="10" />
	<u8 name="B" comment="Some option 2" default="20" />
	<u8 name="C" comment="Some option 3" default="30" />

	<P16 name="InternalData" comment="16 byte padding" />
	<S32 name="Name" default="Imbodevice" />
</eeprom>


В командной строке перепишем некоторые поля другими значениями:
hexnyan -mtest.xml Address=123456AABBCC UniqID=123456 Name=SuperPuperDevice -stest.bin format=bin -stest.hex format=hex


Результат
В итоге имеем два файла: test.bin и test.hex следующего содержания:

:100000007B123456AABBCC40E2010000000A141E49
:1000100000000000000000000000000000000000E0
:100020005375706572507570657244657669636565
:1000300000000000000000000000000000000000C0
:00004000C0
:00000001FF


Кои уже можно использовать в полезных целях.
UPD от 27.04.2017: новая версия 1.1 с некоторыми исправлениями и двумя новыми человеческими типами: MAC и IP4:
<MAC name="MAC" default="00:11:22:33:44:55" />
<IP4 name="IP" default="192.168.0.199" />
Файлы в топике: hexnyan.zip

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

RSS свернуть / развернуть
Названия прог напоминают названия модулей VirtualDub'а)
0
  • avatar
  • Vga
  • 28 марта 2014, 19:09
Отличная программа. Сам был в такой ситуации, когда в серийном выпуске требовалось изменить ID или некоторые данные.
Предлагаю улучшения — Есть готовый Hex с программой. По определённому адресу расположен массив данных. Дальше — программа. Нужно пересобрать hex с новыми данными.
Полезно, когда правишь не eeprom, а готовую прошивку.
И второе предложение — автоматическая генерация серийных номеров. Задал начальный номер, размер и положение в hex, затем при каждом запуске программы этот номер инкрементируется. Облегчает прошивку серийных устройств. Написал батник — и записывай чипы.
0
  • avatar
  • SOVA
  • 29 марта 2014, 09:03
И второе предложение — автоматическая генерация серийных номеров.
Не эта ли функция имеется в PonyProg?
0
Да, автоинкремент я сделал, редактирование тоже весьма интересно, попробую освоить. Правда, как туда массивы загонять, я не очень представляю. Если только из бинарника…
0
Посмотрел — есть там эта функция. Но я имел ввиду программаторы для STM8 и STM32. И в общем виде, был у меня проект для встроенного устройства с Ethernet интерфейсом. Там бы очень пригодился генератор серийного номера и MAC адреса в заданном диапазоне. Проект отдавать на производство нельзя, а собирать заново для серийного программирования муторно. Понипрог там не помощник, так как камень ATSAM7X512.
0
  • avatar
  • SOVA
  • 29 марта 2014, 20:01
На STM есть же UID камня — готовый серийник/мак по сути.
0
Мы о чём разговариваем? Об улучшении программы или о Понипроге? Если в проекте не СТМ32, то о каком серийнике идёт речь? Как их, эти серийники, при производстве учитывать и заносить в паспорта устройств? Вы вместо одной головной боли три предлагаете?
Поэтому я и предложил улучшить функционал простой и полезной программы. Делать или не делать — автор решит сам. Кстати, где его он?
0
  • avatar
  • SOVA
  • 30 марта 2014, 09:50
Мы о чём разговариваем? Об улучшении программы или о Понипроге?
Лично я говорю о том, что при использовании STM генерация прошивок с разными серийниками не нужна.
Как их, эти серийники, при производстве учитывать и заносить в паспорта устройств?
Считать при программировании. Это не сложнее, чем генерировать уникальную прошивку для каждого. А в том случае, если требуется только уникальный MAC или что-то подобное — и это нетребуется.
Поэтому я и предложил улучшить функционал простой и полезной программы.
Не имею ничего против улучшения, просто напоминаю, что это далеко не единственный путь.
Алсо, в принципе, столь простую прожку написать (или доработать) способен любой, кто способен написать прошивку для МК.
0
P.S. Для ответа на конкретный комментарий есть кнопка «ответить» под ним. Используй ее, когда отвечаешь.
0
Алсо, в принципе, столь простую прожку написать (или доработать) способен любой, кто способен написать прошивку для МК.
Не для меня, например. Я Си изучал сразу для микроконтроллеров. И в VC библиотек не знаю. Да и формат intel hex разобрать — задача для меня не на пять минут. А прошивок я написал немножко. Если это уже кто-то сделал, почему не использовать?
0
Для такой задачи даже библиотеки практически не нужны, а С везде один и тот же. Достаточно стандартной libc. Да и из нее-то требуется только printf и работа с файлами.
iHEX генерить элементарно. Парсить чуть сложнее, но тоже просто.
По крайнйе мере, свою написать быстрее, чем дождатья отклика автора, хотя он скорее всего и сделает требуемое тебе.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.