|
ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
|
examples/ek_ra8d2/hil_needs_revalidation/cpu1_pingpong_ipc/src/system_init.c More...
#include <stdint.h>#include "ra8_attributes.h"#include "ra8_boot_entry.h"#include "trustzone_init.h"Go to the source code of this file.
Enumerations | |
| enum | ra8_core_addr_t : uintptr_t { k_ra8_scb_vtor_addr = 0xE000ED08UL , k_ra8_scb_ccr_addr = 0xE000ED14UL , k_ra8_scb_shcsr_addr = 0xE000ED24UL , k_ra8_scb_cpacr_addr = 0xE000ED88UL , k_ra8_scb_nsacr_addr = 0xE000ED8CUL , k_ra8_scb_iciallu = 0xE000EF50UL , k_ra8_scb_dciallu = 0xE000EF58UL , k_ra8_scb_csselr = 0xE000ED84UL , k_ra8_scb_ccsidr = 0xE000ED80UL , k_ra8_scb_dcisw = 0xE000EF60UL , k_ra8_fpu_fpccr_addr = 0xE000EF34UL , k_ra8_nvic_aircr = 0xE000ED0CUL , k_ra8_mpu_type_addr = 0xE000ED90UL , k_ra8_mpu_ctrl_addr = 0xE000ED94UL , k_ra8_mpu_rnr_addr = 0xE000ED98UL , k_ra8_mpu_rbar_addr = 0xE000ED9CUL , k_ra8_mpu_rlar_addr = 0xE000EDA0UL , k_ra8_mpu_mair0_addr = 0xE000EDC0UL , k_ra8_mpu_mair1_addr = 0xE000EDC4UL } |
| enum | : uint32_t { k_ra8_rbar_attr_ro_x = 0x02U , k_ra8_rbar_attr_rw_xn = 0x03U , k_ra8_rbar_attr_device_rw = 0x23U , k_ra8_mpu_rlar_enable = 1UL << 0 } |
| Programme and enable the Cortex-M85 core MPU. More... | |
| enum | : uint32_t { k_ra8_mpu_mram_base = 0x02000000UL , k_ra8_mpu_mram_limit = 0x020FFFE0UL , k_ra8_mpu_sram_base = 0x22000000UL , k_ra8_mpu_sram_limit = 0x221FFFE0UL , k_ra8_mpu_sdram_base = 0x68000000UL , k_ra8_mpu_sdram_limit = 0x6BFFFFE0UL , k_ra8_mpu_peri_base = 0x40000000UL , k_ra8_mpu_peri_limit = 0x47FFFFE0UL } |
Functions | |
| static uint32_t | internal_read32 (uintptr_t addr) |
| Read one 32-bit core register through a volatile MMIO access. | |
| static void | internal_write32 (uintptr_t addr, uint32_t value) |
| Write one 32-bit value to a core register. | |
| static void | internal_dsb (void) |
| Complete outstanding explicit memory accesses on the target. | |
| static void | internal_isb (void) |
| Flush the target instruction pipeline after a control-state change. | |
| static void | internal_disable_irq (void) |
| Mask configurable interrupts during early core initialization. | |
| static void | internal_set_vtor (void) |
| Point VTOR at the physical vector table base. | |
| static void | internal_enable_fpu (void) |
| Grant full access to CP10 / CP11 (the FPU coprocessors). | |
| static void | internal_enable_fpu_lazy_stack (void) |
| Turn on FPU lazy stacking (FPCCR.LSPEN = 1, ASPEN = 1). | |
| static void | internal_enable_icache (void) |
| Invalidate and enable the Cortex-M85 I-cache. | |
| static void | internal_enable_dcache (void) |
| Invalidate and enable the Cortex-M85 D-cache. | |
| static void | internal_enable_branch_predictor (void) |
| Enable branch-target prediction (CCR.BP on Cortex-M85). | |
| static void | internal_set_priority_grouping (void) |
| Set NVIC priority grouping to 4 preempt bits / 0 sub-priority. | |
| static void | internal_mpu_set_region (uint32_t region, uint32_t base_attr, uint32_t limit_enable) |
| Program a single MPU region via RNR/RBAR/RLAR. | |
| static void | internal_mpu_init (void) |
| Programme and enable the Cortex-M85 core MPU. | |
| void | SystemInit (void) |
| Earliest C code the image runs: bring the core up before RAM init. | |
Variables | |
| const uint32_t | g_ra8_vector_table_start [] |
| uint32_t | g_ra8_ls_stack_top |
examples/ek_ra8d2/hil_needs_revalidation/cpu1_pingpong_ipc/src/system_init.c
Cortex-M85 / RA8D2 core bring-up for cpu1_pingpong_ipc
SystemInit() follows the CMSIS naming convention and runs as the first C function out of reset, before Reset_Handler copies .data or zeroes .bss. Its responsibilities are strictly CPU-core level – anything peripheral-bus-side belongs in ra8_infrastructure_init() called from main() after the C runtime is live.
The function is C, not naked asm, so stack and BSS must already be usable. Reset_Handler loads SP from the vector table before calling SystemInit(), so the stack is fine; BSS is zeroed only after SystemInit() returns but SystemInit() writes to no BSS or data-section variables, so the ordering is safe.
Definition in file system_init.c.
| anonymous enum : uint32_t |
Programme and enable the Cortex-M85 core MPU.
Installs four regions and enables the MPU with PRIVDEFENA so privileged mode still sees the default memory map for anything not explicitly covered:
Attribute indirection table:
Region base + limit addresses are encoded per ARMv8-M main-profile PMSAv8 rules: low 5 bits of RBAR hold AP[2:0] / SH[4:3] / XN, and RLAR holds the upper bound OR the enable flag in bit 0.
Definition at line 364 of file system_init.c.
| anonymous enum : uint32_t |
Definition at line 374 of file system_init.c.
| enum ra8_core_addr_t : uintptr_t |
Definition at line 55 of file system_init.c.
|
inlinestatic |
Mask configurable interrupts during early core initialization.
Emits cpsid i on the target before any driver state exists; off-target builds retain the call structure without target assembly.
Definition at line 171 of file system_init.c.
References RA8_INTERNAL.
|
inlinestatic |
Complete outstanding explicit memory accesses on the target.
Emits a full-system DSB on ARM builds and retains an empty, compile-checkable body for off-target builds.
Definition at line 134 of file system_init.c.
References RA8_INTERNAL.
|
static |
Enable branch-target prediction (CCR.BP on Cortex-M85).
< RA8 ccr bp.
Definition at line 309 of file system_init.c.
References internal_dsb(), internal_isb(), internal_read32(), internal_write32(), k_ra8_scb_ccr_addr, and RA8_INTERNAL.
|
static |
Invalidate and enable the Cortex-M85 D-cache.
The invalidate-by-set/way loop is omitted here for brevity – on the RA8D2 the boot ROM leaves the D-cache with all lines marked invalid, so a bulk CCR.DC = 1 write is safe. A production build should add a real CCSIDR-driven loop.
< RA8 ccr dc.
Definition at line 290 of file system_init.c.
References internal_dsb(), internal_isb(), internal_read32(), internal_write32(), k_ra8_scb_ccr_addr, and RA8_INTERNAL.
|
static |
Grant full access to CP10 / CP11 (the FPU coprocessors).
Sets both CPACR access fields and synchronizes the processor before subsequent floating-point instructions can execute.
< RA8 cpacr cp10 cp11 full access.
Definition at line 214 of file system_init.c.
References internal_dsb(), internal_isb(), internal_read32(), internal_write32(), k_ra8_scb_cpacr_addr, and RA8_INTERNAL.
|
static |
Turn on FPU lazy stacking (FPCCR.LSPEN = 1, ASPEN = 1).
Preserves existing FPCCR state while enabling automatic and lazy floating-point context preservation for exception entry.
< RA8 fpccr lspen.
< RA8 fpccr aspen.
Definition at line 237 of file system_init.c.
References internal_read32(), internal_write32(), k_ra8_fpu_fpccr_addr, and RA8_INTERNAL.
|
static |
Invalidate and enable the Cortex-M85 I-cache.
Invalidates all instruction-cache entries, sets CCR.IC, and uses architectural barriers around the transition.
< RA8 ccr ic.
Definition at line 259 of file system_init.c.
References internal_dsb(), internal_isb(), internal_read32(), internal_write32(), k_ra8_scb_ccr_addr, k_ra8_scb_iciallu, and RA8_INTERNAL.
|
inlinestatic |
Flush the target instruction pipeline after a control-state change.
Emits a full-system ISB on ARM builds and retains an empty, compile-checkable body for off-target builds.
Definition at line 153 of file system_init.c.
References RA8_INTERNAL.
|
static |
Programme and enable the Cortex-M85 core MPU.
Installs the four memory-map regions documented above, programs their MAIR attributes, and enables privileged default mapping.
< RA8 MPU control enable.
< RA8 MPU control privdefena.
< RA8 mair0 default.
Definition at line 417 of file system_init.c.
References internal_dsb(), internal_isb(), internal_mpu_set_region(), internal_write32(), k_ra8_mpu_ctrl_addr, k_ra8_mpu_ctrl_enable, k_ra8_mpu_ctrl_privdefena, k_ra8_mpu_mair0_addr, k_ra8_mpu_mair1_addr, k_ra8_mpu_mram_base, k_ra8_mpu_mram_limit, k_ra8_mpu_peri_base, k_ra8_mpu_peri_limit, k_ra8_mpu_rlar_enable, k_ra8_mpu_sdram_base, k_ra8_mpu_sdram_limit, k_ra8_mpu_sram_base, k_ra8_mpu_sram_limit, k_ra8_rbar_attr_device_rw, k_ra8_rbar_attr_ro_x, k_ra8_rbar_attr_rw_xn, and RA8_INTERNAL.
|
static |
Program a single MPU region via RNR/RBAR/RLAR.
| [in] | region | MPU region number to select. |
| [in] | base_attr | Encoded RBAR base address and access attributes. |
| [in] | limit_enable | Encoded RLAR limit, MAIR index, and enable bit. |
Definition at line 398 of file system_init.c.
References internal_write32(), k_ra8_mpu_rbar_addr, k_ra8_mpu_rlar_addr, and k_ra8_mpu_rnr_addr.
|
inlinestatic |
Read one 32-bit core register through a volatile MMIO access.
Performs the minimal width-specific access used by the remaining early-boot helpers without depending on initialized runtime state.
| [in] | addr | Aligned register address in the core peripheral window. |
| 0x00000000..0xFFFFFFFF | Exact 32-bit value returned by the register. |
Definition at line 99 of file system_init.c.
References RA8_INTERNAL.
|
static |
Set NVIC priority grouping to 4 preempt bits / 0 sub-priority.
Writes AIRCR with its mandatory key and the firmware's selected PRIGROUP encoding.
< Required write key.
< PRIGROUP = 3 -> 4 bits.
Definition at line 330 of file system_init.c.
References internal_write32(), k_ra8_nvic_aircr, and RA8_INTERNAL.
|
static |
Point VTOR at the physical vector table base.
Writes the linker-provided vector-table address before any interrupt can be accepted by the application.
Definition at line 195 of file system_init.c.
References g_ra8_vector_table_start, internal_write32(), k_ra8_scb_vtor_addr, and RA8_INTERNAL.
|
inlinestatic |
Write one 32-bit value to a core register.
Performs the minimal width-specific access used by early boot and leaves ordering decisions to the helper that owns the register.
| [in] | addr | Aligned register address in the core peripheral window. |
| [in] | value | Value to store. |
Definition at line 117 of file system_init.c.
References RA8_INTERNAL.
| void SystemInit | ( | void | ) |
Earliest C code the image runs: bring the core up before RAM init.
Called by Reset_Handler before .data is copied and .bss is zeroed, so it must not touch initialised or zero-initialised statics. Each image supplies its own definition – the shared board one under the board boot directories, or an application-local system_init.c where the clock tree or memory map diverges.
The name is the CMSIS convention; the startup code reaches it by that name, which is why it has external linkage.
Definition at line 459 of file system_init.c.
References internal_disable_irq(), internal_enable_branch_predictor(), internal_enable_dcache(), internal_enable_fpu(), internal_enable_fpu_lazy_stack(), internal_enable_icache(), internal_mpu_init(), internal_set_priority_grouping(), internal_set_vtor(), and ra8_trustzone_init().
|
extern |
|
extern |
Definition at line 294 of file vector_table.c.