Загрузка данных


#!/usr/bin/env python3
import sys
import subprocess
import os
import struct

def main():
    if len(sys.argv) < 2:
        sys.exit(1)

    real_objcopy = sys.argv[1]
    args = sys.argv[2:]
    
    # 1. Сначала даем Zephyr собрать стандартные файлы прошивки (они пока в адресах 0x80000000)
    final_cmd = [real_objcopy] + args
    subprocess.run(final_cmd, check=True)

    # Перехватываем этап генерации финального HEX-файла
    if "--output-target=ihex" in " ".join(args):
        elf_path = "zephyr.elf"
        for arg in args:
            if arg.endswith("zephyr.elf"):
                elf_path = arg
                break
        
        build_dir = os.path.dirname(elf_path)
        bin_path = os.path.join(build_dir, "zephyr.bin")
        hex_path = os.path.join(build_dir, "zephyr.hex")
        gdb_elf_path = os.path.join(build_dir, "zephyr_gdb.elf")

        if os.path.exists(bin_path):
            image_size = os.path.getsize(bin_path)
            
            # Шаг А: Правим заголовок Boot Data Length (размер прошивки для BootROM)
            with open(bin_path, "r+b") as f:
                f.seek(0x24)
                f.write(struct.pack("<I", image_size))
            print(f"[LMA Filter] BootROM Patch: Fixed Boot Data Length to {image_size} bytes")

            # Шаг Б: Смещаем LMA всего HEX-файла на физический адрес Flash (0x60000000).
            # Вместо изменения отдельных секций, мы берем чистый бинарник (где адресов нет)
            # и упаковываем его в HEX с нужного нам базового адреса флеш-памяти!
            gen_hex_cmd = [
                real_objcopy,
                "-I", "binary",
                "-O", "ihex",
                "--change-addresses", "0x60000000",
                bin_path,
                hex_path
            ]
            subprocess.run(gen_hex_cmd, check=True)
            print("[LMA Filter] Successfully generated 0x60000000 LMA shifted zephyr.hex")

            # Шаг В: Создаем корректный ELF для GDB-отладчика без разрушения сегментов.
            # Мы смещаем ВСЕ адреса (LMA и VMA) в копии ELF-файла назад на величину 0x20000000.
            # Это сдвинет LMA в честные 0x60000000, не ломая структуру сегментов!
            gen_elf_cmd = [
                real_objcopy,
                "--change-addresses", "-0x20000000",
                elf_path,
                gdb_elf_path
            ]
            try:
                subprocess.run(gen_elf_cmd, check=True)
                print(f"[LMA Filter] Generated clean {gdb_elf_path} for debugger.")
            except Exception as e:
                print(f"[LMA Filter] GDB ELF Generation failed: {e}")

if __name__ == "__main__":
    main()