Перейти к содержанию

srec_cat, man не показал, но подразумевал

srec_cat УДИВИТЕЛЬНО мощная вещь для работы с файлами прошивок. Умеет делать все и даже немного больше, чем нужно. К сожалению, примеров нашлось очень мало, поэтому пришлось немного поэкспериментировать.

Нужно было сделать специфичные действия с прошивкой и наткнулся на эту ветку:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=159604

Я решил не обращать внимание на совет Гуру: писать свой питон/баш/батч-скрипт, а лучше чуть глубже познакомиться с инструментом.


Он умеет в chaining. Нужно лишь добавить скобки и можно эту часть воспринимать как ОТДЕЛЬНЫЙ файл, который мы подаем далее на вход. Таким образом, над одним файлом можно проводить ужасные эксперименты – вырезать, вставлять и т.д., а потом эти эксперименты свести в один итоговый файл!

ПРИМЕРЫ

Сначала вырезал нужный фрагмент адресов в файл

srec_cat.exe main_fw.srec -crop 0x08003000 0x08003020 -o cropped_fw.srec

Посчитать CRC (Checksum_Negative_Little_Endian – two’s complement (negative) checksum of the data) файла и записать по адресу 0xFFFC (это просто рандомно выбранный адрес)

srec_cat.exe main_fw.srec -l-e-checksum-neg 0xFFFC 4 4 -o out_fw.srec

или так

srec_cat.exe main_fw.srec -Checksum_Negative_Little_Endian 0xFFFC 4 4 -o out_fw.srec

Есть загрузчик (OpenBLT), который записывает CRC во флешку при запуске. Мне нужно было записать эту CRC до запуска приложения, чтобы эти данные уже были в прошивке.

Вот так я создал файл с FF-ками (по адресу 0x08003188), где должна располагаться CRC

srec_cat.exe main.srec -exclude 0x08003188 0x08003190 -generate 0x08003188 0x0800318C -l-e-constant 0xffffffff 4 -o main_fw_2.srec

Проверил – всё затерто. Имитация “объединенного, непопуще..запущенного срека” готова

Далее вертим его так:

srec_cat.exe '(' main_fw_2.srec -crop 0x08003000 0x08003020 -l-e-checksum-neg 0x08003188 4 4 ')' main_fw_2.srec -exclude 0x08003188 0x0800318C -o ready_fw.srec

И, готово – на нужном месте есть нужная CRC.

Можно добавить хедер в исходники для их идентификации (ключ –obs – это длина поля данных в прошивке):

srec_cat.exe main_fw.srec -header "BAANAN is a BOPE gorilla sheeeeeeet" -o ready_fw.srec -obs 16

ИЛИ – можно все тоже самое проделать одной командой.

srec_cat.exe ( fw.srec -exclude 0x08003188 0x08003190 -generate 0x08003188 0x08003190 -constant 0xFF -exclude 0x08003188 0x0800318C ) ( fw.srec -crop 0x08003000 0x08003020 -Checksum_Negative_Little_Endian 0x08003188 4 4 -exclude 0x08003000 0x08003020 ) -header=new_relase_1_1_2 -o ready_fw.srec -obs=16

Литература

https://manpages.ubuntu.com/manpages/bionic/man1/srec_examples.1.html

https://manpages.ubuntu.com/manpages/bionic/man1/srec_input.1.html

https://stackoverflow.com/questions/52414651/how-to-insert-two-constants-using-srec-cat/54238366

Comment

programel