Преобразование файлов hex и bin в файл dfu

Обновлено: 02.07.2024

Я собираюсь добавить поддержку файлов Intel HEX в dfu-util. Это позволит dfu-util считывать прошивку из текстового файла в формате Intel HEX, который обычно создается многими различными наборами инструментов, такими как GCC.

Я планирую добавить новый параметр командной строки, чтобы указать формат Intel HEX в качестве входных данных. Затем dfu-util декодирует файл в памяти, что, на мой взгляд, нормально, поскольку большинство образов прошивки в шестнадцатеричном формате занимают мегабайт или два максимума, обычно намного меньше.

Есть ли проблемы с этим? Я новичок в этом проекте, поэтому буду рад комментариям.

Обсуждение

Привет! Хорошо, что вы подняли эту тему заранее. Просто интересно, есть ли преимущество делать это внутри dfu-util вместо использования, например. objcopy для преобразования шестнадцатеричного файла? Когда я использую gcc, он обычно генерирует файл elf, который затем я могу преобразовать в двоичный файл с помощью objcopy. В общем, преимущество шестнадцатеричных файлов заключается в том, что они содержат адресную информацию, но она в любом случае не передается при стандартной передаче DFU.

Если вы хотите сослаться на этот комментарий где-то еще в этом проекте, скопируйте и вставьте следующую ссылку:

Я временно отложил эту работу, потому что есть проблема с libusb, из-за которой dfu-util не может работать на Windws. На самом деле есть несколько проблем, одну из которых я уже исправил, а другую может оказаться непреодолимой.

Если вы хотите сослаться на этот комментарий где-то еще в этом проекте, скопируйте и вставьте следующую ссылку:

Спасибо. Ваше преобразование ihex выглядит хорошо, но есть много вариантов шестнадцатеричных файлов, и уже есть инструменты, которые работают со всеми ними. Если мы собираемся начать поддерживать это в dfu-util, это означает дублирование усилий и решение проблем, которые были решены в других местах. Например, мы уже поставляем «dfu-suffix» для добавления суффикса DFU к простому двоичному файлу с различными опциями для указания идентификаторов устройств и так далее. Следует ли добавить все эти опции в ваш код и включить их в программу dfu-util?

На мой взгляд, dfu-util заботится об обмене данными с устройством и передаче файлов прошивки, как это определено в стандарте DFU, в то время как все виды подготовки файлов и преобразования могут выполняться в отдельных инструментах. Однако это не всегда так просто, например, для поддержки расширений протокола ST DfuSe анализ их специальных файлов необходим внутри dfu-util, потому что его нельзя преобразовать извне без передачи большого количества параметров.

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

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

Если вы хотите сослаться на этот комментарий где-то еще в этом проекте, скопируйте и вставьте следующую ссылку:

Я использовал dfuse-demo (STSW-STM32080) для преобразования файлов dfu в шестнадцатеричные файлы Binoder, но его заменил STM32CubProgrammer, и этот инструмент не предлагает преобразование dfu в bin, а также STSW-STM32080 работает только в Windows. Итак, есть ли альтернатива старому файловому менеджеру dfu и что мне использовать в Linux. КСТАТИ: почему прошивка предлагается в этом формате, не было бы удобнее предлагать ее в двоичном или шестнадцатеричном формате?

Обычно я использую pydfu.py (входит в состав Micropython) при работе с Linux. Вы также можете использовать dfu-util.

Если вы собираете прошивку самостоятельно, используя:

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

Большое спасибо. Когда я делаю свою собственную сборку, она работает нормально, потому что у меня есть все необходимые мне бинарные форматы (.bin, .hex и .dfu). Но я ищу простой способ загрузить прошивку для моих студентов. Они используют бинарные файлы загрузки на странице Micropython. Так что они получили только версию .dfu и работают с платами STM32L476RG NUCLEO64. Так что самый простой способ (ИМХО) — преобразовать файл .dfu в формат .bin и скопировать файл перетаскиванием на доску.

Но я не могу найти способ преобразовать его ни с помощью pydfu.py, ни с помощью dfu-util, как я могу сделать с помощью файлового менеджера Dfu в системах Windows. Есть идеи?

С уважением и благодарностью,
Вернер

Я не знаю, как можно "перетаскивать" bin-файл. Проблема с bin-файлами заключается в том, что они не содержат никакой информации о том, куда они должны быть запрограммированы.

Вы можете использовать dfu.py с параметром -d для создания двух файлов .bin. Например:

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

сервер:~/micropython/tools$ python3 dfu.py -d NUCLEO_L476RG-20200902-v1.13.dfu
Файл: "/mnt/c/Users/werner/OneDrive/microPython/MicroPython_Firmware/STM32/NUCLEO_L476RG-20200902-v1.13.dfu"
b'DfuSe' v1, размер изображения: 336901, target: 1
Traceback (последний последний вызов):
Файл "dfu.py", строка 160, в
parse(infile, dump_images=options.dump_images)
File " dfu.py", строка 42, в разборе
tprefix["name"] = cstring(tprefix["name"])
Файл "dfu.py", строка 23, в cstring
return string.split("\0", 1)[0]
TypeError: требуется байтовый объект, а не 'str'

Я пытаюсь обновить прошивку pinecil до последней версии, но когда я загружаю ее из репозитория pinecil или из репозитория ironOS, оба файла представляют собой шестнадцатеричные файлы, которые не работают с программным обеспечением pinecil. Как их конвертировать в bin файлы или как прошить без конвертации? Я думаю, что у меня новая партия пинецилов, потому что я заказал свой в ноябре, а мой прибыл только сегодня.

Вы можете использовать файл .dfu для обновления прошивки в соответствии с документацией по перепрошивке.

использование файла dfu в утилите обновления pinecil не помогло, равно как и использование шестнадцатеричного кода или преобразование в bin с помощью hex2bin, все они приводили к ошибке 74

(12-29-2021, 14:33) turbothewolfhog Написал: использование файла dfu в утилите обновления pinecil не сработало, равно как и использование hex или преобразование в bin с помощью hex2bin, все они привело к ошибке 74

Здесь Pinecil.zip, который вы можете загрузить, включает в себя файлы .bin, которые являются последней стабильной версией, однако последние версии RC1 и RC2 содержат только файлы с расширениями .hex и .dfu.

В любом случае, я скомпилировал последнюю версию примерно неделю назад, чтобы проверить, нормально ли работает опция, которую я добавил в систему меню, и были ли автоматически сгенерированы файлы .bin.

(30.12.2021, 18:36) VaZso Написал:

(12-29-2021, 14:33) turbothewolfhog Написал: использование файла dfu в утилите обновления pinecil не сработало, равно как и использование hex или преобразование в bin с помощью hex2bin, все они привело к ошибке 74

Здесь Pinecil.zip, который вы можете загрузить, включает в себя файлы .bin, которые являются последней стабильной версией, однако последние версии RC1 и RC2 содержат только файлы с расширениями .hex и .dfu.

В любом случае, я скомпилировал последнюю версию примерно неделю назад, чтобы проверить, нормально ли работает опция, которую я добавил в систему меню, и автоматически сгенерированы файлы .bin.
это объясняет, я пытался загрузить 2.16 на pinecil

(30-12-2021, 18:45) turbothewolfhog Написал: это объясняет, я пытался загрузить 2.16 на pinecil

Сегодня была официально выпущена версия 2.16, и Ралим сделал следующее примечание о файлах .dfu:

"Обратите внимание, что по сравнению с версией 2.15 файлы Pinecil теперь представляют собой файлы .dfu, которые необходимо упаковать в настройках устройства в файл, чтобы упростить перепрошивку.

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

(30-12-2021, 18:45) turbothewolfhog Написал: это объясняет, я пытался загрузить 2.16 на pinecil

Итак. Я обновил Pinecil до официальной версии 2.16

Моя хост-система (Debian 11) содержит dfu-util v0.9, который, как мне кажется, слишком стар для правильной обработки файлов .dfu, поставляемых с образом IronOS.
(Последняя версия 0.11)

Итак, вот команда, которую я использовал для преобразования .hex в .bin для обновления моего Pinecil старым способом:

Образ встроенного ПО должен быть в двоичном формате, поэтому файлы Intel HEX необходимо преобразовать в правильный формат.

В качестве альтернативы можно использовать hex2bin, доступный на SourceForge. Кроме того, каждая часть микропрограммы должна быть правильно выровнена, что подробно описано в следующих разделах.

Мы предоставляем скомпилированные HEX-файлы SoftDevice. Чтобы подготовить SoftDevice к обновлению, необходимо удалить часть MBR. В этой части есть несколько вызовов, которые используются загрузчиком для копирования новой прошивки (например, нового SoftDevice или загрузчика) и не могут быть перезаписаны.

MBR для nRF52 состоит из 0x3000 байт. Чтобы преобразовать softdevice.hex в softdevice.bin, используйте следующие команды:

Примечание. Если на устройстве уже установлено приложение при выполнении обновления SoftDevice, оно будет удалено. Поскольку DFU IoT запускается из контекста приложения, SoftDevice нельзя заменить как единую прошивку без части приложения. Дополнительные сведения об объединении двух двоичных файлов в один с помощью SoftDevice и приложения см. в разделе Объединение двоичных файлов.

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

Поле адресации внутри Intel HEX (информативное)

Строки в Intel HEX имеют следующий формат:

  • ":" – это символ, обозначающий начало строки.
  • AA – это количество байтов данных в одной строке.
  • BBBB – это адресное поле.
  • CC – это код типа команды.
  • DD..DD — это байты данных.
  • EE — это контрольная сумма одной строки

Каждое приложение (скомпилированное для использования SoftDevice) начинается с команды адреса.

Где XXXX — начальная точка адресации внутри следующих HEX-строк. Чтобы прочитать его, умножьте это значение на 2^16:

Следующий шаг — получить начальный адрес (BBBB) из первой строки с данными и добавить к нему предыдущее значение. Например:

Что, наконец, дает адрес:

Конверсия

После получения начального адреса файл HEX можно преобразовать в двоичную форму с помощью следующей команды:

Для приведенных выше примеров это будет:

Преобразование загрузчика аналогично преобразованию приложения. После получения правильного начального адреса работает следующая процедура.

Команды преобразования

Чтобы создать двоичный файл, состоящий из двоичных файлов программного устройства и приложения, выполните следующие команды:

Чтобы получить контрольную сумму двоичного файла, можно использовать нашу библиотеку CRC16. Его можно найти по адресу SDK_PATH/components/libraries/crc16/crc16.c. В следующем фрагменте кода показано, как использовать функцию crc16_compute и скомпилировать ее на компьютере:

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

Возможности Hex2bin/mot2bin

Он может работать с расширенным шестнадцатеричным форматом Intel в режимах сегментированных и линейных адресов. Записи не нужно сортировать, и между записями могут быть промежутки. Пустые/неиспользуемые байты могут быть указаны как любое другое значение, кроме FF. В двоичный файл можно вставить контрольную сумму.

Исходные файлы можно легко скомпилировать для Windows с помощью CodeBlocks + MinGW GCC или Microsoft Visual Studio (или Express). Для удобства распространяемый файл уже содержит 64-битные исполняемые файлы для Windows.

Лицензия

Hex2bin и mot2bin выпускаются с лицензией BSD.

Использование

Параметры чувствительны к регистру, а для параметров с параметрами требуется пробел между параметром и параметром. т.е. -s 0000 вместо -s0000.

Успешное выполнение завершается с кодом ошибки = 0. Если возникает какая-либо ошибка, программа немедленно завершается с кодом ошибки = 1.

Все значения представлены в шестнадцатеричном формате, 0x не требуется: например. не 0x0100, а 0100.

Пакетный/скриптовый режим

Обычно, если указанный шестнадцатеричный файл не существует, hex2bin/mot2bin повторно запрашивает допустимое имя файла. Предусмотрена опция пакетного режима/скрипта для выхода с ошибкой вместо запроса файла.

hex2bin -b xxxx.hex

Если файл xxxx.hex не существует, программа немедленно завершает работу с кодом ошибки = 1.

Контрольная сумма исходного файла

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

Если вы хотите получать отчеты об ошибках контрольной суммы, укажите параметр -c.

hex2bin -c пример.hex

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

hex2bin/mot2bin отображает ожидаемую контрольную сумму для каждой ошибочной записи.

Расширение выходного файла

По умолчанию расширение будет .bin . Можно указать другое значение.

hex2bin -e com пример.hex

Байт заполнения

По умолчанию неиспользуемые места будут заполнены FF. Можно указать другое значение.

hex2bin -p AA пример.hex

Начальный адрес и длина

Если младший адрес не равен 0000, например: 0100: (первая запись начинается с :nn010000xxx ), возникнут проблемы при использовании двоичного файла для программирования СППЗУ, поскольку первый байт, который должен иметь номер 0100, хранится в двоичный файл по адресу 0000.

вы можете указать начальный адрес двоичного файла в командной строке:

hex2bin -s 0000 start_at_0100.hex

Байты будут храниться в двоичном файле с заполнением от 0000 до наименьшего адреса минус 1 (в данном случае 00FF).

Аналогично двоичный файл может быть дополнен до длины -1 с помощью FF или другого байта.

Здесь пространство между последним байтом и 07FF будет заполнено FF.

hex2bin -l 0800 end_before_07FF.hex

Память EPROM, EEPROM и флэш-память содержат все FF после стирания.

Если исходный файл имеет имя for-example.test.hex, созданный двоичный файл будет иметь имя for-example.bin

часть ".test" будет удалена.

Hex2bin/mot2bin предполагает, что исходный файл не содержит перекрывающихся записей, в противном случае будет сообщено о перекрытии.

Минимальный размер блока

Размер выходного файла будет кратен минимальному размеру блока. Он будет заполнен FF или указанным шаблоном.

Длина должна быть степенью двойки в шестнадцатеричном формате [см. параметр -l].

Внимание, этот параметр СИЛЬНЕЕ, чем максимальная длина.

hex2bin -m [размер] пример.hex

Контрольная сумма или CRC вставлены внутрь двоичного файла

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

hex2bin -k 3 -E [0|1] -r [начало] [конец] -f [адрес] [значение]

-k Выберите тип контрольной суммы:

1 = 16-битная контрольная сумма (добавляет 16-битные слова в 16-битную сумму, данные и результат BE или LE)

5 = 16-битная контрольная сумма (добавляет байты в 16-битную сумму, результат BE или LE)

-E Порядок следования байтов для сохранения

0 = обратный порядок байтов

-r Диапазон для вычисления контрольной суммы или CRC (по умолчанию — мин. и макс. адреса)

-f Адрес контрольной суммы или CRC для записи

-d Отображает список типов контрольных сумм и выходов

Значение вставляется непосредственно в двоичный файл

Значение может быть вставлено напрямую (принудительно) в результирующий двоичный файл.

hex2bin -k [0|1|2] -E [0|1] -F [адрес] [значение]

-k Выберите тип длины значения:

0 = обратный порядок байтов

-F Адрес и контрольная сумма значения для записи

Поддержка файлов hex/S19 с заменой байтов

Некоторые компиляторы, такие как MPLAB IDE от Microchip, могут генерировать шестнадцатеричные файлы с заменой байтов.

hex2bin -w test-byte-swap.hex

-w Пословная замена: для каждой пары байтов поменять местами младшую и старшую части.

Поддержка шестнадцатеричных файлов размером в слово (только hex2bin)

Hex с типом записи, где данные представлены в формате Word (2 байта)

например, Texas Instruments: TMS320F2835, TMS320F28065.

hex2bin - пример-ti.hex

-слово выравнивания адреса.

Фильтрация записей в диапазоне

Записи вне этого диапазона удаляются

Hex2bin -t 0110 -T 0256 пример.hex

-t Адрес этажа

-T Верхний адрес

Статус

Hex2bin и mot2bin находятся в стадии разработки. Он хорошо работает для многих небольших приложений.

Хотя сейчас я работаю над другими проектами, hex2bin и mot2bin по-прежнему открыты для исправлений, запросов функций и т. д. Отправьте их здесь.

Читайте также: