diff --git a/src/rp2040/bootrom.c b/src/rp2040/bootrom.c index b0cfeefb..99e60f2d 100644 --- a/src/rp2040/bootrom.c +++ b/src/rp2040/bootrom.c @@ -7,15 +7,15 @@ #include // uint16_t, uint32_t, uintptr_t #include // memcpy #include "compiler.h" // noinline, __section +#include "internal.h" // _ramfunc #define ROM_TABLE_CODE(c1, c2) ((c1) | ((c2) << 8)) // All functions in here need to be RAM-resident, as we may need // to (especially for the flash functions) call while the XIP layer // is unavailable. -#define noinline_ram noinline __section(".ramfunc.read_chip_id") -static void * noinline_ram +static void * _ramfunc rom_func_lookup(uint32_t code) { // Table and lookup function are provided by the BOOTROM @@ -25,7 +25,7 @@ rom_func_lookup(uint32_t code) return fn(table, code); } -void noinline_ram +void _ramfunc reset_to_usb_boot(uint32_t gpio_activity_pin_mask , uint32_t disable_interface_mask) { @@ -33,21 +33,21 @@ reset_to_usb_boot(uint32_t gpio_activity_pin_mask fn(gpio_activity_pin_mask, disable_interface_mask); } -void noinline_ram +void _ramfunc connect_internal_flash(void) { void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('I', 'F')); fn(); } -void noinline_ram +void _ramfunc flash_exit_xip(void) { void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('E', 'X')); fn(); } -void noinline_ram +void _ramfunc flash_flush_cache(void) { void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('F', 'C')); diff --git a/src/rp2040/chipid.c b/src/rp2040/chipid.c index 2997c158..95e760d1 100644 --- a/src/rp2040/chipid.c +++ b/src/rp2040/chipid.c @@ -30,7 +30,7 @@ usbserial_get_serialid(void) // Functions for reading out the flash chip ID. Adapted from the official // Pi SDK. -static void noinline __section(".ramfunc.read_chip_id") +static void _ramfunc flash_cs_force(int high) { uint32_t field_val = high ? @@ -60,7 +60,7 @@ flash_enter_xip_prepare(void) barrier(); } -static void noinline __section(".ramfunc.read_chip_id") +static void _ramfunc flash_enter_xip_perform(void) { ((void (*)(void))boot2_copy+1)(); @@ -71,7 +71,7 @@ flash_enter_xip_perform(void) #define FLASH_RUID_DATA_BYTES 8 #define FLASH_RUID_TOTAL_BYTES (1+FLASH_RUID_DUMMY_BYTES+FLASH_RUID_DATA_BYTES) -static void noinline __section(".ramfunc.read_chip_id") +static void _ramfunc read_unique_id(uint8_t *out) { uint8_t txbuf[FLASH_RUID_TOTAL_BYTES] = {0}; diff --git a/src/rp2040/internal.h b/src/rp2040/internal.h index f126fa84..8553278d 100644 --- a/src/rp2040/internal.h +++ b/src/rp2040/internal.h @@ -14,4 +14,8 @@ void connect_internal_flash(void); void flash_exit_xip(void); void flash_flush_cache(void); +// Force a function to run from ram +#define UNIQSEC __FILE__ "." __stringify(__LINE__) +#define _ramfunc noinline __section(".ramfunc." UNIQSEC) + #endif // internal.h