From 803aa7bc1b2ef9dd75bd2b925a35b5fee6946bcf Mon Sep 17 00:00:00 2001 From: Hubert Badocha Date: Wed, 2 Oct 2024 17:19:39 +0200 Subject: [PATCH] imxrt: move all required code to noxip JIRA: RTOS-??? --- _startc.c | 8 ++++++-- devices/flash-imxrt/fspi/fspi_rt105x.h | 4 ++-- devices/flash-imxrt/fspi/fspi_rt106x.h | 4 ++-- devices/flash-imxrt/fspi/fspi_rt117x.h | 4 ++-- hal/armv7m/cpu.c | 2 +- hal/armv7m/cpu.h | 21 +++++---------------- hal/armv7m/imxrt/10xx/console.c | 2 +- hal/armv7m/string.c | 8 ++++---- 8 files changed, 23 insertions(+), 30 deletions(-) diff --git a/_startc.c b/_startc.c index b162365b..a149a5e9 100644 --- a/_startc.c +++ b/_startc.c @@ -33,8 +33,12 @@ void _startc(int argc, char **argv, char **env) size_t i, size; /* Load .fastram.text, .data and .rodata sections */ - if (__ramtext_start != __ramtext_load) - hal_memcpy(__ramtext_start, __ramtext_load, __ramtext_end - __ramtext_start); + if (__ramtext_start != __ramtext_load) { + /* hal_memcpy may reside in fastram. */ + for (i = 0; i <= __ramtext_end - __ramtext_start; i++) { + __ramtext_start[i] = __ramtext_load[i]; + } + } if (__data_start != __data_load) hal_memcpy(__data_start, __data_load, __data_end - __data_start); diff --git a/devices/flash-imxrt/fspi/fspi_rt105x.h b/devices/flash-imxrt/fspi/fspi_rt105x.h index f2160b3a..24c0ff62 100644 --- a/devices/flash-imxrt/fspi/fspi_rt105x.h +++ b/devices/flash-imxrt/fspi/fspi_rt105x.h @@ -30,12 +30,12 @@ enum { mcr0 = 0, mcr1, mcr2, ahbcr, inten, intr, lutkey, lutcr, ahbrxbuf0cr0, ah #define AHBRXBUF_CNT 4 -static inline addr_t flexspi_ahbAddr(int instance) +__attribute__((section(".noxip"))) static inline addr_t flexspi_ahbAddr(int instance) { return (instance == flexspi_instance1) ? 0x60000000 : 0; } -static inline void *flexspi_getBase(int instance) +__attribute__((section(".noxip"))) static inline void *flexspi_getBase(int instance) { return instance == flexspi_instance1 ? (void *)0x402a8000 : NULL; } diff --git a/devices/flash-imxrt/fspi/fspi_rt106x.h b/devices/flash-imxrt/fspi/fspi_rt106x.h index 3b9ba1ca..b0accba8 100644 --- a/devices/flash-imxrt/fspi/fspi_rt106x.h +++ b/devices/flash-imxrt/fspi/fspi_rt106x.h @@ -30,7 +30,7 @@ enum { mcr0 = 0, mcr1, mcr2, ahbcr, inten, intr, lutkey, lutcr, ahbrxbuf0cr0, ah #define AHBRXBUF_CNT 4 -static addr_t flexspi_ahbAddr(int instance) +__attribute__((section(".noxip"))) static addr_t flexspi_ahbAddr(int instance) { switch (instance) { case flexspi_instance1: return 0x60000000; @@ -40,7 +40,7 @@ static addr_t flexspi_ahbAddr(int instance) } -static void *flexspi_getBase(int instance) +__attribute__((section(".noxip"))) static void *flexspi_getBase(int instance) { switch (instance) { case flexspi_instance1: return (void *)0x402a8000; diff --git a/devices/flash-imxrt/fspi/fspi_rt117x.h b/devices/flash-imxrt/fspi/fspi_rt117x.h index 0df20f5b..99099a1e 100644 --- a/devices/flash-imxrt/fspi/fspi_rt117x.h +++ b/devices/flash-imxrt/fspi/fspi_rt117x.h @@ -33,7 +33,7 @@ enum { mcr0 = 0, mcr1, mcr2, ahbcr, inten, intr, lutkey, lutcr, ahbrxbuf0cr0, ah #define AHBRXBUF_CNT 8 -static addr_t flexspi_ahbAddr(int instance) +__attribute__((section(".noxip"))) static addr_t flexspi_ahbAddr(int instance) { switch (instance) { case flexspi_instance1: return 0x30000000; @@ -43,7 +43,7 @@ static addr_t flexspi_ahbAddr(int instance) } -static void *flexspi_getBase(int instance) +__attribute__((section(".noxip"))) static void *flexspi_getBase(int instance) { switch (instance) { case flexspi_instance1: return (void *)0x400cc000; diff --git a/hal/armv7m/cpu.c b/hal/armv7m/cpu.c index fe0444b1..8559f10e 100644 --- a/hal/armv7m/cpu.c +++ b/hal/armv7m/cpu.c @@ -298,7 +298,7 @@ unsigned int hal_cpuID(void) } -void hal_cpuReboot(void) +__attribute__((section(".noxip"))) void hal_cpuReboot(void) { hal_cpuDataSyncBarrier(); *(cpu_common.scb + scb_aircr) = ((0x5fa << 16) | (*(cpu_common.scb + scb_aircr) & (0x700)) | (1 << 0x02)); diff --git a/hal/armv7m/cpu.h b/hal/armv7m/cpu.h index dff06d69..d3a13b9e 100644 --- a/hal/armv7m/cpu.h +++ b/hal/armv7m/cpu.h @@ -21,28 +21,17 @@ #include -static inline void hal_cpuDataMemoryBarrier(void) -{ - __asm__ volatile ("dmb"); -} +/* NOTE: defined as macros to make sure there are no calls to code in flash in .noxip sections. */ +#define hal_cpuDataMemoryBarrier() do { __asm__ volatile ("dmb"); } while(0) -static inline void hal_cpuDataSyncBarrier(void) -{ - __asm__ volatile ("dsb"); -} +#define hal_cpuDataSyncBarrier() do { __asm__ volatile ("dsb"); } while(0) -static inline void hal_cpuInstrBarrier(void) -{ - __asm__ volatile ("isb"); -} +#define hal_cpuInstrBarrier() do { __asm__ volatile ("isb"); } while(0) -static inline void hal_cpuHalt(void) -{ - __asm__ volatile ("wfi"); -} +#define hal_cpuHalt() do { __asm__ volatile ("wfi"); } while(0) extern void hal_scbSetPriorityGrouping(u32 group); diff --git a/hal/armv7m/imxrt/10xx/console.c b/hal/armv7m/imxrt/10xx/console.c index 17674916..a6a6bbe5 100644 --- a/hal/armv7m/imxrt/10xx/console.c +++ b/hal/armv7m/imxrt/10xx/console.c @@ -76,7 +76,7 @@ void hal_consoleSetHooks(ssize_t (*writeHook)(int, const void *, size_t)) } -void hal_consolePrint(const char *s) +__attribute__((section(".noxip"))) void hal_consolePrint(const char *s) { const char *ptr; diff --git a/hal/armv7m/string.c b/hal/armv7m/string.c index 1e5e5850..c43d63df 100644 --- a/hal/armv7m/string.c +++ b/hal/armv7m/string.c @@ -17,7 +17,7 @@ #include -void *hal_memcpy(void *dst, const void *src, size_t l) +__attribute__((section(".noxip"))) void *hal_memcpy(void *dst, const void *src, size_t l) { void *ret = dst; @@ -105,7 +105,7 @@ void hal_memset(void *dst, int v, size_t l) } -size_t hal_strlen(const char *s) +__attribute__((section(".noxip"))) size_t hal_strlen(const char *s) { size_t k = 0; @@ -186,7 +186,7 @@ int hal_strncmp(const char *s1, const char *s2, size_t count) } -char *hal_strcpy(char *dest, const char *src) +__attribute__((section(".noxip"))) char *hal_strcpy(char *dest, const char *src) { char *p = dest; @@ -240,7 +240,7 @@ char *hal_strchr(const char *s, int c) } -int hal_i2s(char *prefix, char *s, unsigned int i, unsigned char b, char zero) +__attribute__((section(".noxip"))) int hal_i2s(char *prefix, char *s, unsigned int i, unsigned char b, char zero) { static const char digits[] = "0123456789abcdef"; char c;