blob: c6ed4cf8e28f7e717f76d3872375a473f19fd758 [file] [log] [blame]
/*
* Copyright (c) 2024 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _PICO_RUNTIME_INITS_H
#define _PICO_RUNTIME_INITS_H
#include "pico.h"
#include "pico/runtime.h"
#ifdef __cplusplus
extern "C" {
#endif
/** \file pico/runtime_init.h
* \defgroup pico_runtime_init pico_runtime_init
*
* \brief Main runtime initialization functions required to set up the runtime environment before entering main
*
* The runtime initialization is registration based:
*
* For each step of the initialization there is a 5 digit ordinal which indicates
* the ordering (alphabetic increasing sort of the 5 digits) of the steps.
*
* e.g. for the step "bootrom_reset", there is:
*
* \code
* #ifndef PICO_RUNTIME_INIT_BOOTROM_RESET
* #define PICO_RUNTIME_INIT_BOOTROM_RESET "00050"
* #endif
* \endcode
*
* The user can override the order if they wish, by redefining PICO_RUNTIME_INIT_BOOTROM_RESET
*
* For each step, the automatic initialization may be skipped by defining (in this case)
* PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET = 1. The user can then choose to either omit the step
* completely or register their own replacement initialization.
*
* The default method used to perform the initialization is provided, in case the user
* wishes to call it manually; in this case:
*
* \code
* void runtime_init_bootrom_reset(void);
* \endcode
*
* If PICO_RUNTIME_NO_INIT_BOOTOROM_RESET define is set (NO vs SKIP above), then the function
* is not defined, allowing the user to provide a replacement (and also avoiding
* cases where the default implementation won't compile due to missing dependencies)
*/
// must have no dependency on any other initialization code
#define PICO_RUNTIME_INIT_EARLIEST "00001"
// -----------------------------------------------------------------------------------------------
// Reset of global bootrom state (can be skipped if boot path was via bootrom); not used on RP2040
// -----------------------------------------------------------------------------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET, Skip calling of `runtime_init_bootrom_reset` function during runtime init, type=bool, default=1 on RP2040, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_BOOTROM_RESET, Do not include SDK implementation of `runtime_init_bootrom_reset` function, type=bool, default=1 on RP2040, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_BOOTROM_RESET
#define PICO_RUNTIME_INIT_BOOTROM_RESET "00050"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET
#if PICO_RP2040 || (!LIB_PICO_MULTICORE && PICO_NO_FLASH)
#define PICO_RUNTIME_SKIP_INIT_BOOTROM_RESET 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_BOOTROM_RESET
#if PICO_RP2040 || (!LIB_PICO_MULTICORE && PICO_NO_FLASH)
#define PICO_RUNTIME_NO_INIT_BOOTROM_RESET 1
#endif
#endif
#ifndef __ASSEMBLER__
void runtime_init_bootrom_reset(void);
#endif
// ---------------------------------------------------------------------------------------
// Non-boot core eset of bootrom state, not needed if only using core 0 not used on RP2040
// ---------------------------------------------------------------------------------------
#ifndef PICO_RUNTIME_INIT_PER_CORE_BOOTROM_RESET
#define PICO_RUNTIME_INIT_PER_CORE_BOOTROM_RESET "00051"
#endif
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET, Skip calling of `runtime_init_per_core_bootrom_reset` function during per-core init, type=bool, default=1 on RP2040, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET, Do not include SDK implementation of `runtime_init_per_core_bootrom_reset` function, type=bool, default=1 on RP2040, group=pico_runtime_init
#ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET
#if PICO_RP2040
#define PICO_RUNTIME_SKIP_INIT_PER_CORE_BOOTROM_RESET 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET
#if PICO_RP2040
#define PICO_RUNTIME_NO_INIT_PER_CORE_BOOTROM_RESET 1
#endif
#endif
#ifndef __ASSEMBLER__
void runtime_init_per_core_bootrom_reset(void);
#endif
// ---------------------------
// Hazard3 processor IRQ setup
// ---------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS, Skip calling of `runtime_init_per_core_h3_irq_registers` function during per-core init, type=bool, default=1 on non RISC-V, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_PER_CORE_H3_IRQ_REGISTERS
#define PICO_RUNTIME_INIT_PER_CORE_H3_IRQ_REGISTERS "00060"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS
#ifndef __riscv
#define PICO_RUNTIME_SKIP_INIT_PER_CORE_H3_IRQ_REGISTERS 1
#endif
#endif
// -------------------------------
// Earliest resets (no clocks yet)
// -------------------------------
#ifndef PICO_RUNTIME_INIT_EARLY_RESETS
#define PICO_RUNTIME_INIT_EARLY_RESETS "00100"
#endif
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_EARLY_RESETS, Skip calling of `runtime_init_early_resets` function during runtime init, type=bool, default=1 on RP2040, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_EARLY_RESETS, Do not include SDK implementation of `runtime_init_early_resets` function, type=bool, default=1 on RP2040, group=pico_runtime_init
#ifndef PICO_RUNTIME_SKIP_INIT_EARLY_RESETS
#define PICO_RUNTIME_SKIP_INIT_EARLY_RESETS 0
#endif
#ifndef PICO_RUNTIME_NO_INIT_EARLY_RESETS
#define PICO_RUNTIME_NO_INIT_EARLY_RESETS 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_early_resets(void);
#endif
// --------------
// USB power down
// --------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN, Skip calling of `runtime_init_usb_power_down` function during runtime init, type=bool, default=0, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_USB_POWER_DOWN, Do not include SDK implementation of `runtime_init_usb_power_down` function, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_USB_POWER_DOWN
#define PICO_RUNTIME_INIT_USB_POWER_DOWN "00101"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN
#define PICO_RUNTIME_SKIP_INIT_USB_POWER_DOWN 0
#endif
#ifndef PICO_RUNTIME_NO_INIT_USB_POWER_DOWN
#define PICO_RUNTIME_NO_INIT_USB_POWER_DOWN 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_usb_power_down(void);
#endif
// ------------------------------------
// per core co-processor initialization
// ------------------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS, Skip calling of `runtime_init_per_core_enable_coprocessors` function during per-core init, type=bool, default=1 on RP2040 or RISC-V, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS, Do not include SDK implementation of `runtime_init_per_core_enable_coprocessors` function, type=bool, default=1 on RP2040 or RISC-V, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_PER_CORE_ENABLE_COPROCESSORS
#define PICO_RUNTIME_INIT_PER_CORE_ENABLE_COPROCESSORS "00200"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS
#if PICO_RP2040 || defined(__riscv)
#define PICO_RUNTIME_SKIP_INIT_PER_CORE_ENABLE_COPROCESSORS 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS
#if PICO_RP2040 || defined(__riscv)
#define PICO_RUNTIME_NO_INIT_PER_CORE_ENABLE_COPROCESSORS 1
#endif
#endif
#ifndef __ASSEMBLER__
void runtime_init_per_core_enable_coprocessors(void);
#endif
// AEABI init; this initialization is auto-injected byte pico_aeebi_mem_ops if present
#ifndef PICO_RUNTIME_INIT_AEABI_MEM_OPS
// on RP2040 we need to get memcpy and memset hooked up to bootrom
#define PICO_RUNTIME_INIT_AEABI_MEM_OPS "00300"
#endif
// AEABI init; this initialization is auto-injected byte pico_aeebi_bit_ops if present
#ifndef PICO_RUNTIME_INIT_AEABI_BIT_OPS
#define PICO_RUNTIME_INIT_AEABI_BIT_OPS "00275"
#endif
// AEABI init; this initialization is auto-injected byte pico_aeebi_float if present
#ifndef PICO_RUNTIME_INIT_AEABI_FLOAT
#define PICO_RUNTIME_INIT_AEABI_FLOAT "00350"
#endif
// AEABI init; this initialization is auto-injected byte pico_aeebi_double if present
#ifndef PICO_RUNTIME_INIT_AEABI_DOUBLE
#define PICO_RUNTIME_INIT_AEABI_DOUBLE "00350"
#endif
// ------------------------
// Initialization of clocks
// ------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_CLOCKS, Skip calling of `runtime_init_clocks` function during runtime init, type=bool, default=0, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_CLOCKS, Do not include SDK implementation of `runtime_init_clocks` function, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_CLOCKS
// on RP2040 we need some of the AEABI init by this point to do clock math
#define PICO_RUNTIME_INIT_CLOCKS "00500"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_CLOCKS
#define PICO_RUNTIME_SKIP_INIT_CLOCKS 0
#endif
#ifndef PICO_RUNTIME_NO_INIT_CLOCKS
#define PICO_RUNTIME_NO_INIT_CLOCKS 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_clocks(void);
/*! \brief Initialise the clock hardware
* \ingroup pico_runtime_init
*
* Must be called before any other clock function.
*/
static inline void clocks_init(void) {
// backwards compatibility with earlier SDK
runtime_init_clocks();
}
#endif
// ----------------------------------------
// Remaining h/w initialization post clocks
// ----------------------------------------
#ifndef PICO_RUNTIME_INIT_POST_CLOCK_RESETS
#define PICO_RUNTIME_INIT_POST_CLOCK_RESETS "00600"
#endif
// PICO_RUNTIME_INIT_POST_CLOCKS_RESETS defaults to 0
#ifndef __ASSEMBLER__
void runtime_init_post_clock_resets(void);
#endif
// ----------------------------------------
// RP2040 IE disable for GPIO 26-29
// ----------------------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE, Skip calling of `runtime_init_rp2040_gpio_ie_disable` function during runtime init, type=bool, default=0 on RP2040, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE, Do not include SDK implementation of `runtime_init_rp2040_gpio_ie_disable` function, type=bool, default=0 on RP2040, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_RP2040_GPIO_IE_DISABLE
#define PICO_RUNTIME_INIT_RP2040_GPIO_IE_DISABLE "00700"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE
#if !PICO_RP2040 || PICO_IE_26_29_UNCHANGED_ON_RESET
#define PICO_RUNTIME_SKIP_INIT_RP2040_GPIO_IE_DISABLE 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE
#if !PICO_RP2040
#define PICO_RUNTIME_NO_INIT_RP2040_GPIO_IE_DISABLE 1
#endif
#endif
#ifndef __ASSEMBLER__
void runtime_init_rp2040_gpio_ie_disable(void);
#endif
// -----------------------------
// Reset all spin SIO spin locks
// -----------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET, Skip calling of `runtime_init_spin_locks_reset` function during runtime init, type=bool, default=0, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET, Do not include SDK implementation of `runtime_init_spin_locks_reset` function, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_SPIN_LOCKS_RESET
// clearing of all spin locks
#define PICO_RUNTIME_INIT_SPIN_LOCKS_RESET "01000"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET
#define PICO_RUNTIME_SKIP_INIT_SPIN_LOCKS_RESET 0
#endif
#ifndef PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET
#define PICO_RUNTIME_NO_INIT_SPIN_LOCKS_RESET 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_spin_locks_reset(void);
#endif
// -----------------------------
// Reset all bootram boot locks
// -----------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET, Skip calling of `runtime_init_boot_locks_reset` function during runtime init, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_BOOT_LOCKS_RESET
// clearing of all spin locks
#define PICO_RUNTIME_INIT_BOOT_LOCKS_RESET "01000"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET
#define PICO_RUNTIME_SKIP_INIT_BOOT_LOCKS_RESET 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_boot_locks_reset(void);
#endif
// ------------------------------
// Enable bootrom locking support
// ------------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE, Skip calling of `runtime_init_bootrom_locking_enable` function during runtime init, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_BOOTROM_LOCKING_ENABLE
// clearing of all spin locks
#define PICO_RUNTIME_INIT_BOOTROM_LOCKING_ENABLE "01010"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE
#define PICO_RUNTIME_SKIP_INIT_BOOTROM_LOCKING_ENABLE 0
#endif
#ifndef __ASSEMBLER__
void runtime_init_bootrom_locking_enable(void);
#endif
// PICO_RUNTIME_INIT_MUTEX is registered automatically by pico_sync
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_MUTEX, Skip calling of `runtime_init_mutex` function during runtime init, type=bool, default=0, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_MUTEX, Do not include SDK implementation of `runtime_init_mutex` function, type=bool, default=0, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_MUTEX
// depends on SPIN_LOCKS
// initialize auto_init mutexes
#define PICO_RUNTIME_INIT_MUTEX "01100"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_MUTEX
#define PICO_RUNTIME_SKIP_INIT_MUTEX 0
#endif
#ifndef PICO_RUNTIME_NO_INIT_MUTEX
#define PICO_RUNTIME_NO_INIT_MUTEX 0
#endif
// ------------------------------------------------------------
// Initialization of IRQs, added by hardware_irq
// ------------------------------------------------------------
#ifndef PICO_RUNTIME_INIT_PER_CORE_IRQ_PRIORITIES
#define PICO_RUNTIME_INIT_PER_CORE_IRQ_PRIORITIES "01200"
#endif
// PICO_RUNTIME_SKIP_INIT_PER_CORE_TLS_SETUP defaults to 0
#ifndef PICO_RUNTIME_INIT_PER_CORE_TLS_SETUP
#define PICO_RUNTIME_INIT_PER_CORE_TLS_SETUP "10060"
#endif
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE, Skip calling of `runtime_init_install_ram_vector_table` function during runtime init, type=bool, default=0 unless RISC-V or RAM binary, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE, Do not include SDK implementation of `runtime_init_install_ram_vector_table` function, type=bool, default=0 unless RISC-V or RAM binary, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_INSTALL_RAM_VECTOR_TABLE
#define PICO_RUNTIME_INIT_INSTALL_RAM_VECTOR_TABLE "10080"
#endif
// ------------------------------------------------------
// Copy of ROM vector table to RAM; not used on RISC-V or
// no_flash which has a RAM vector table anyway
// ------------------------------------------------------
#ifndef PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE
#if PICO_NO_RAM_VECTOR_TABLE || PICO_NO_FLASH || defined(__riscv)
#define PICO_RUNTIME_SKIP_INIT_INSTALL_RAM_VECTOR_TABLE 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE
#if PICO_NO_RAM_VECTOR_TABLE || PICO_NO_FLASH || defined(__riscv)
#define PICO_RUNTIME_NO_INIT_INSTALL_RAM_VECTOR_TABLE 1
#endif
#endif
// ------------------------------------------------------------
// Default alarm pool initialization, added by pico_time unless
// PICO_TIME_DEFAULT_ALARM_POOL_DISABLED == 1
// ------------------------------------------------------------
#ifndef PICO_RUNTIME_INIT_DEFAULT_ALARM_POOL
#define PICO_RUNTIME_INIT_DEFAULT_ALARM_POOL "11000"
#endif
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL, Skip calling of `runtime_init_default_alarm_pool` function during runtime init, type=bool, default=1 if `PICO_TIME_DEFAULT_ALARM_POOL_DISABLED` is 1, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL, Do not include SDK implementation of `runtime_init_default_alarm_pool` function, type=bool, default=1 if `PICO_TIME_DEFAULT_ALARM_POOL_DISABLED` is , group=pico_runtime_init
#ifndef PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL
#if PICO_TIME_DEFAULT_ALARM_POOL_DISABLED
#define PICO_RUNTIME_SKIP_INIT_DEFAULT_ALARM_POOL 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL
#if PICO_TIME_DEFAULT_ALARM_POOL_DISABLED
#define PICO_RUNTIME_NO_INIT_DEFAULT_ALARM_POOL 1
#endif
#endif
// ------------------------------------------------------------------------------------------------
// stack guard; these are a special case as they take a parameter; however the normal defines apply
// ------------------------------------------------------------------------------------------------
// PICO_CONFIG: PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD, Skip calling of `runtime_init_per_core_install_stack_guard` function during runtime init, type=bool, default=1 unless `PICO_USE_STACK_GUARDS` is 1, group=pico_runtime_init
// PICO_CONFIG: PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD, Do not include SDK implementation of `runtime_init_per_core_install_stack_guard` function, type=bool, default=1 unless `PICO_USE_STACK_GUARDS` is 1, group=pico_runtime_init
#ifndef PICO_RUNTIME_INIT_PER_CORE_INSTALL_STACK_GUARD
#define PICO_RUNTIME_INIT_PER_CORE_INSTALL_STACK_GUARD "10050"
#endif
#ifndef PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD
#if !PICO_USE_STACK_GUARDS
#define PICO_RUNTIME_SKIP_INIT_PER_CORE_INSTALL_STACK_GUARD 1
#endif
#endif
#ifndef PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD
#if !PICO_USE_STACK_GUARDS
#define PICO_RUNTIME_NO_INIT_PER_CORE_INSTALL_STACK_GUARD 1
#endif
#endif
#ifndef __ASSEMBLER__
void runtime_init_per_core_install_stack_guard(void *stack_bottom);
// backwards compatibility
static __force_inline void runtime_install_stack_guard(void *stack_bottom) {
runtime_init_per_core_install_stack_guard(stack_bottom);
}
#endif
#ifdef __cplusplus
}
#endif
#endif