ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_scb.c
Go to the documentation of this file.
1
22
23#include "ra8_scb.h"
24
25#include <stdint.h>
26
27#include "ra8_attributes.h"
28#include "ra8_check.h"
29#include "ra8_err.h"
30
38typedef enum : uintptr_t {
39 k_ra8_scb_vtor = 0xE000ED08UL,
40 k_ra8_scb_cfsr = 0xE000ED28UL,
41 k_ra8_scb_hfsr = 0xE000ED2CUL,
42 k_ra8_scb_dfsr = 0xE000ED30UL,
43 k_ra8_scb_mmfar = 0xE000ED34UL,
44 k_ra8_scb_bfar = 0xE000ED38UL,
45 k_ra8_scb_afsr = 0xE000ED3CUL,
46 k_ra8_scb_sfsr = 0xE000EDE4UL,
47 k_ra8_scb_sfar = 0xE000EDE8UL,
48 k_ra8_scb_demcr = 0xE000EDFCUL,
50
56typedef enum : uint32_t {
57 k_ra8_scb_demcr_trcena = 0x01000000UL,
59
80RA8_HW_REGISTER_ACCESS RA8_INTERNAL static inline volatile uint32_t*
82{
83 return (volatile uint32_t*)addr;
84}
85
87{
90 static const char* const tag = "ra8_scb";
91
92 RA8_CHECK_NULL_PTR(out, tag, "read_fault_status: out");
93 /* Arm v8-M ARM B3.2 "System Control Block": configurable / hard / debug
94 * fault status, then the MemManage / BusFault / Auxiliary registers. Plain
95 * reads -- no side effect, nothing is cleared. */
102 /* Arm v8-M ARM (Security Extension): SFSR / SFAR are banked to the Secure
103 * state. Read from Secure they carry the real cause / address; read from
104 * Non-secure they are RAZ -- never a fault -- so this is safe in either
105 * world without a guard. */
108 return k_ra8_ok;
109}
110
111void ra8_scb_set_vtor(uintptr_t base)
112{
113 /* Arm v8-M ARM B3.2.2 "VTOR, Vector Table Offset Register": point the core
114 * at a new vector-table base. Hardware ignores the low alignment bits. */
115 *internal_scb_reg(k_ra8_scb_vtor) = (uint32_t)base;
116}
117
118uintptr_t ra8_scb_get_vtor(void)
119{
120 /* Arm v8-M ARM B3.2.2 "VTOR": current vector-table base address. */
121 return (uintptr_t)*internal_scb_reg(k_ra8_scb_vtor);
122}
123
125{
126 /* Arm v8-M ARM (Debug) DEMCR.TRCENA (bit 24): trace subsystem power. */
127 const uint32_t demcr = *internal_scb_reg(k_ra8_scb_demcr);
128 return (demcr & (uint32_t)k_ra8_scb_demcr_trcena) != 0U;
129}
130
132{
133 /* Arm v8-M ARM (Debug) DEMCR.TRCENA (bit 24): set it, preserving every
134 * other bit -- a read-modify-write, not a blind store. */
135 const uint32_t demcr = *internal_scb_reg(k_ra8_scb_demcr);
137}
Annotation-attribute framework macros for ra8-firmware.
#define RA8_HW_REGISTER_ACCESS
Mark an MMIO accessor function (returns volatile register pointer).
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
uintptr_t ra8_scb_get_vtor(void)
Read the current vector-table base from SCB->VTOR.
Definition ra8_scb.c:118
bool ra8_scb_trace_enabled(void)
Report whether DEMCR.TRCENA (trace subsystem enable) is set.
Definition ra8_scb.c:124
static volatile uint32_t * internal_scb_reg(ra8_scb_reg_addr_t addr)
Typed pointer to a 32-bit SCB register.
Definition ra8_scb.c:81
void ra8_scb_set_vtor(uintptr_t base)
Relocate the vector table by writing SCB->VTOR.
Definition ra8_scb.c:111
ra8_scb_reg_addr_t
Arm v8-M SCB register addresses (PPB window 0xE000EDxx).
Definition ra8_scb.c:38
@ k_ra8_scb_dfsr
Debug Fault Status Register (DFSR).
Definition ra8_scb.c:42
@ k_ra8_scb_hfsr
HardFault Status Register (HFSR).
Definition ra8_scb.c:41
@ k_ra8_scb_demcr
Debug Exception + Monitor Ctrl (DEMCR).
Definition ra8_scb.c:48
@ k_ra8_scb_sfsr
SecureFault Status (SFSR, S-banked).
Definition ra8_scb.c:46
@ k_ra8_scb_afsr
Auxiliary Fault Status (AFSR).
Definition ra8_scb.c:45
@ k_ra8_scb_vtor
Vector Table Offset Register (VTOR).
Definition ra8_scb.c:39
@ k_ra8_scb_mmfar
MemManage Fault Address (MMFAR).
Definition ra8_scb.c:43
@ k_ra8_scb_sfar
SecureFault Address (SFAR, S-banked).
Definition ra8_scb.c:47
@ k_ra8_scb_bfar
BusFault Address Register (BFAR).
Definition ra8_scb.c:44
@ k_ra8_scb_cfsr
Configurable Fault Status (CFSR).
Definition ra8_scb.c:40
ra8_err_t ra8_scb_read_fault_status(ra8_scb_fault_status_t *out)
Read the Cortex-M85 SCB fault-status registers into one struct.
Definition ra8_scb.c:86
ra8_scb_bits_t
Named bit fields within the SCB registers this driver touches.
Definition ra8_scb.c:56
@ k_ra8_scb_demcr_trcena
DEMCR.TRCENA – bit 24.
Definition ra8_scb.c:57
void ra8_scb_trace_enable(void)
Set DEMCR.TRCENA to power up the trace subsystem.
Definition ra8_scb.c:131
Cortex-M85 System Control Block: VTOR relocation + fault-status decode.
One snapshot of the Cortex-M85 SCB fault-status registers.
Definition ra8_scb.h:86
uint32_t mmfar
MemManage Fault Address Register (if CFSR.MMARVALID).
Definition ra8_scb.h:90
uint32_t dfsr
Debug Fault Status Register.
Definition ra8_scb.h:89
uint32_t hfsr
HardFault Status Register.
Definition ra8_scb.h:88
uint32_t afsr
Auxiliary Fault Status Register.
Definition ra8_scb.h:92
uint32_t cfsr
Configurable Fault Status Register (MMFSR|BFSR|UFSR).
Definition ra8_scb.h:87
uint32_t sfsr
SecureFault Status Register (Secure-banked, RAZ NS).
Definition ra8_scb.h:93
uint32_t bfar
BusFault Address Register (if CFSR.BFARVALID).
Definition ra8_scb.h:91
uint32_t sfar
SecureFault Address Register (if SFSR.SFARVALID).
Definition ra8_scb.h:94