/* ====================================================================
* CUSTOM ARCHITECTURAL LINKER WRAPPER FOR MONOLITHIC SDRAM EXECUTION
* ====================================================================
* Скрипт полностью повторяет идеологию NXP: код и данные работают
* в раздельных регионах SDRAM (0x80... и 0x8040...), но их LMA
* принудительно подменяется в непрерывный Flash-образ.
*
* Мы не трогаем капризные макросы GROUP_LINK_IN, чтобы избежать syntax error.
* Мы подменяем физический смысл регионов памяти для GNU LD.
*/
/* 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. ОБЪЯВЛЯЕМ РЕАЛЬНЫЕ ФИЗИЧЕСКИЕ РЕГИОНЫ ПАМЯТИ
Вместо абстрактных имен, даем линкеру четкие физические координаты. */
MEMORY
{
/* Куда программатор физически запишет прошивку (LMA) */
PHYS_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x400000 /* 4MB */
/* Где код PJSIP и ОС будет физически выполняться (VMA) */
VMA_CODE (rx) : ORIGIN = 0x80000000, LENGTH = 0x400000 /* 4MB */
/* Где данные PJSIP будут физически выполняться (VMA) */
VMA_DATA (wx) : ORIGIN = 0x80400000, LENGTH = 0x1C00000 /* 28MB */
}
/* 3. МАГИЯ АЛИАСОВ: ПОДМЕНА СУТИ ДЛЯ СИСТЕМЫ СБОРКИ ZEPHYR
В вашем DTS указано zephyr,flash = &sdram_code и zephyr,sram = &sdram_data.
Линкер Zephyr автоматически создаст регионы памяти с именами "sdram_code" и "sdram_data".
Мы принудительно перехватываем эти имена на уровне GNU LD и говорим:
- Если Zephyr шлет код выполнения в "sdram_code" -> выполнять в VMA_CODE, но загружать (LMA) из PHYS_FLASH!
- Если Zephyr шлет данные в "sdram_data" -> выполнять в VMA_DATA, но загружать (LMA) из PHYS_FLASH!
Синтаксис команды: REGION_ALIAS(alias_name, vma_region, lma_region)
Это базовая фича GNU LD, которая жестко раздваивает VMA и LMA без изменения макросов! */
REGION_ALIAS("sdram_code", VMA_CODE, PHYS_FLASH);
REGION_ALIAS("sdram_data", VMA_DATA, PHYS_FLASH);
/* 4. Настраиваем базовые макросы Zephyr, чтобы они не конфликтовали с алиасами */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH
#undef RAMABLE_REGION
#define RAMABLE_REGION VMA_DATA
/* 5. Включаем оригинальный мастер-скрипт Zephyr для архитектуры ARM Cortex-M.
Он отработает штатно, без синтаксических ошибок, но линкер автоматически
подменит LMA всех секций на 0x60000000. */
#include <zephyr/arch/arm/cortex_m/scripts/linker.ld>
/* Финальная страховка */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH