aboutsummaryrefslogtreecommitdiffstats
path: root/src/rp2040/bootrom.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rp2040/bootrom.c')
-rw-r--r--src/rp2040/bootrom.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/rp2040/bootrom.c b/src/rp2040/bootrom.c
index da2da18e..b0cfeefb 100644
--- a/src/rp2040/bootrom.c
+++ b/src/rp2040/bootrom.c
@@ -5,8 +5,17 @@
// This file may be distributed under the terms of the GNU GPLv3 license.
#include <stdint.h> // uint16_t, uint32_t, uintptr_t
+#include <string.h> // memcpy
+#include "compiler.h" // noinline, __section
-static void *
+#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
rom_func_lookup(uint32_t code)
{
// Table and lookup function are provided by the BOOTROM
@@ -16,10 +25,31 @@ rom_func_lookup(uint32_t code)
return fn(table, code);
}
-void
+void noinline_ram
reset_to_usb_boot(uint32_t gpio_activity_pin_mask
, uint32_t disable_interface_mask)
{
- void (*reset_to_usb_boot)(uint32_t, uint32_t) = rom_func_lookup(0x4255);
- reset_to_usb_boot(gpio_activity_pin_mask, disable_interface_mask);
+ void (*fn)(uint32_t, uint32_t) = rom_func_lookup(ROM_TABLE_CODE('U', 'B'));
+ fn(gpio_activity_pin_mask, disable_interface_mask);
+}
+
+void noinline_ram
+connect_internal_flash(void)
+{
+ void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('I', 'F'));
+ fn();
+}
+
+void noinline_ram
+flash_exit_xip(void)
+{
+ void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('E', 'X'));
+ fn();
+}
+
+void noinline_ram
+flash_flush_cache(void)
+{
+ void (*fn)(void) = rom_func_lookup(ROM_TABLE_CODE('F', 'C'));
+ fn();
}