aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rp2040/bootrom.c12
-rw-r--r--src/rp2040/chipid.c6
-rw-r--r--src/rp2040/internal.h4
3 files changed, 13 insertions, 9 deletions
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 <stdint.h> // uint16_t, uint32_t, uintptr_t
#include <string.h> // 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