--- a/include/zephyr/arch/arm/cortex_m/scripts/linker.ld
+++ b/include/zephyr/arch/arm/cortex_m/scripts/linker.ld
@@ -87,6 +87,9 @@ MEMORY
#endif
FLASH (rx) : ORIGIN = ROM_ADDR, LENGTH = ROM_SIZE
RAM (wx) : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE
+#if defined(CONFIG_SDRAM_LMA_ADJUST)
+ NXP_FLASH_LMA (rx) : ORIGIN = 0x60000000, LENGTH = 4M
+#endif
#if defined(CONFIG_LINKER_DEVNULL_MEMORY)
DEVNULL_ROM (rx) : ORIGIN = DEVNULL_ADDR, LENGTH = DEVNULL_SIZE
#endif
@@ -95,6 +98,28 @@ MEMORY
IDT_LIST (wx) : ORIGIN = 0xFFFF7FFF, LENGTH = 32K
}
+#if defined(CONFIG_SDRAM_LMA_ADJUST)
+ /* 1. Отменяем некорректные для нашей задачи макросы Zephyr */
+ #undef GROUP_LINK_IN
+ #undef GROUP_ROM_LINK_IN
+ #undef GROUP_DATA_LINK_IN
+ #undef GROUP_NOLOAD_LINK_IN
+
+ /* 2. Переписываем их под чистый синтаксис GNU LD (LMA -> Flash, VMA -> RAM) */
+
+ /* Для обычного кода и констант: выполняются во FLASH (который 0x80...), хранятся в реальном флэше */
+ #define GROUP_LINK_IN(where) > where AT> NXP_FLASH_LMA
+
+ /* Для ROM-секций ядра (исправляем баг mwdt-заглушки): принудительно разводим VMA и LMA */
+ #define GROUP_ROM_LINK_IN(vregion, lregion) > vregion AT> NXP_FLASH_LMA
+
+ /* Для инициализированных данных (datas, nocache): VMA идет в RAM (0x81...), LMA пакуется во флэш */
+ #define GROUP_DATA_LINK_IN(vregion, lregion) > vregion AT> NXP_FLASH_LMA
+
+ /* Для пустых буферов (bss, noinit): только аллокация в RAM, физического LMA во флэш быть не должно */
+ #define GROUP_NOLOAD_LINK_IN(vregion, lregion) > vregion
+#endif
+
ENTRY(CONFIG_KERNEL_ENTRY)
SECTIONS