/* ====================================================================
* CUSTOM ARCHITECTURAL LINKER WRAPPER FOR MONOLITHIC SDRAM EXECUTION
* ====================================================================
* Скрипт полностью повторяет идеологию NXP: код и данные работают
* в раздельных регионах SDRAM (0x80... и 0x8040...), но их LMA
* принудительно подменяется в непрерывный Flash-образ.
*
* ВНИМАНИЕ: Мы не трогаем системные макросы GROUP_LINK_IN,
* что гарантирует сборку БЕЗ "syntax error" на строках 155 и 391.
*/
/* 1. Подключаем базовые заголовочные макросы архитектуры Zephyr */
#include <zephyr/linker/sections.h>
#include <zephyr/devicetree.h>
#include <zephyr/linker/devicetree_regions.h>
#include <zephyr/linker/linker-defs.h>
#include <zephyr/linker/linker-tool.h>
/* 2. ПЕРЕОПРЕДЕЛЯЕМ ФИЗИЧЕСКУЮ ТАБЛИЦУ ПАМЯТИ
Мы заново объявляем имена регионов, которые Zephyr берет из DTS,
но переписываем их внутреннюю суть для GNU Линкера.
Спецификация GNU LD позволяет указать виртуальный регион загрузки (LMA)
прямо в объявлении памяти, если он отличается от VMA!
Для этого используется скрытый внутренний макрос линкера. */
MEMORY
{
/* Виртуальный Flash-регион, который не виден в DTS, но используется для сборки HEX */
LMA_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x400000 /* 4MB */
}
/* 3. КЛЮЧЕВОЙ ХАК ДЛЯ СДВИГА LMA ПО ЛОГИКЕ NXP:
Мы переопределяем базовые регионы Zephyr, подменяя их LMA-составляющую.
Поскольку Zephyr во фрагментах использует макросы ROMABLE_REGION и RAMABLE_REGION,
мы принудительно заставляем его считать, что:
- ROMABLE_REGION (LMA прошивки) — это наш скрытый LMA_FLASH (0x60000000)
- RAMABLE_REGION (VMA выполнения) — это исходная sdram_data (0x80400000) */
#undef ROMABLE_REGION
#define ROMABLE_REGION LMA_FLASH
#undef RAMABLE_REGION
#define RAMABLE_REGION sdram_data
/* 4. Включаем оригинальный мастер-скрипт Zephyr для архитектуры ARM Cortex-M.
Препроцессор развернет его в стандартном фабричном синтаксисе.
Ошибки на строках 155 и 391 пропадут, так как мы не ломали GROUP_LINK_IN. */
#include <zephyr/arch/arm/cortex_m/scripts/linker.ld>
/* Финальная страховка */
#undef ROMABLE_REGION
#define ROMABLE_REGION LMA_FLASH