/* ====================================================================
* CUSTOM ARCHITECTURAL LINKER WRAPPER FOR MONOLITHIC SDRAM EXECUTION
* ====================================================================
*/
#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>
/* Физическая Flash для хранения (LMA) */
MEMORY
{
PHYS_FLASH (rx) : ORIGIN = 0x60000000, LENGTH = 0x400000 /* 4MB встроенной Flash RT1024 */
}
/* Блокируем внутреннее переопределение регионов Zephyr.
Мы объявляем константный макрос, который заставит оригинальный скрипт
всегда использовать PHYS_FLASH, игнорируя дефолтные дефайны. */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH
#undef RAMABLE_REGION
#define RAMABLE_REGION RAM
/* УМНАЯ ЛОГИКА РАЗДЕЛЕНИЯ ПАМЯТИ:
Используем вариативные макросы для безопасной обработки любого количества аргументов. */
#define _CHOOSE_LINK_IN_RAM > RAM AT> PHYS_FLASH
#define _CHOOSE_LINK_IN_sdram_data > sdram_data AT> PHYS_FLASH
#define _CHOOSE_LINK_IN_ITCM > ITCM
#define _CHOOSE_LINK_IN_DTCM > DTCM
#define _CHOOSE_LINK_IN_IDT_LIST > IDT_LIST
/* Безопасные заглушки для пустых или нулевых секций, чтобы избежать syntax error */
#define _CHOOSE_LINK_IN_0
#define _CHOOSE_LINK_IN_
/* Перехватываем макрос GROUP_LINK_IN */
#undef GROUP_LINK_IN
#define GROUP_LINK_IN(vma) _CHOOSE_LINK_IN_##vma
/* Перехватываем макрос GROUP_DATA_LINK_IN.
Используем макрос, который отсекает второй (неиспользуемый нами) аргумент lma,
чтобы синтаксис линкера cmd-файла всегда оставался идеальным. */
#undef GROUP_DATA_LINK_IN
#define GROUP_DATA_LINK_IN(vma, ...) _CHOOSE_LINK_IN_##vma
/* Включаем оригинальный мастер-скрипт Zephyr */
#include <zephyr/arch/arm/cortex_m/scripts/linker.ld>
/* Финальный жесткий перехват: сбрасываем ROMABLE_REGION в PHYS_FLASH,
если оригинальный скрипт попытался переопределить его в середине файла. */
#undef ROMABLE_REGION
#define ROMABLE_REGION PHYS_FLASH