ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
main.c
Go to the documentation of this file.
1
33
34#include <stddef.h>
35#include <stdint.h>
36
37#include "ra8_board_ek_ra8d2.h"
38#include "ra8_boot_entry.h"
39#include "ra8_cgc.h"
40#include "ra8_err.h"
41#include "ra8_isr.h"
42#include "ra8_mstp.h"
43#include "ra8_scb.h"
44#include "ra8_time.h"
45
47typedef enum : uint32_t {
48 k_scb_demo_baud = 115200U,
51
58
59/* Console line fragments (each write is one shift-register fill). */
60static const uint8_t k_scb_demo_vtor_prefix[] = "scb: vtor=";
61static const uint8_t k_scb_demo_trace_prefix[] = "scb: trace=";
62static const uint8_t k_scb_demo_cfsr_prefix[] = "scb: cfsr=";
63static const uint8_t k_scb_demo_hfsr_sep[] = " hfsr=";
64static const uint8_t k_scb_demo_dfsr_prefix[] = "scb: dfsr=";
65static const uint8_t k_scb_demo_afsr_sep[] = " afsr=";
66static const uint8_t k_scb_demo_mmfar_prefix[] = "scb: mmfar=";
67static const uint8_t k_scb_demo_bfar_sep[] = " bfar=";
68static const uint8_t k_scb_demo_sfsr_prefix[] = "scb: sfsr=";
69static const uint8_t k_scb_demo_sfar_sep[] = " sfar=";
70static const uint8_t k_scb_demo_crlf[] = "\r\n";
71static const uint8_t k_scb_demo_verdict_pass[] = "scb: probe PASS\r\n";
72static const uint8_t k_scb_demo_verdict_fail[] = "scb: probe FAIL\r\n";
73
81static void scb_demo_panic_halt(void)
82{
83 while (1) {
84 __asm__ volatile("wfi");
85 }
86}
87
99static void scb_demo_write(const uint8_t* data, uint32_t len)
100{
101 (void)ra8_board_uart_console_write(data, (size_t)len);
102}
103
115static void scb_demo_write_hex32(uint32_t val)
116{
117 static const uint8_t k_hex[] = "0123456789ABCDEF";
118 uint8_t buf[2U + k_scb_demo_hex_digits];
119 buf[0] = (uint8_t)'0';
120 buf[1] = (uint8_t)'x';
121 for (uint32_t i = 0U; i < (uint32_t)k_scb_demo_hex_digits; i++) {
122 const uint32_t shift =
123 ((uint32_t)k_scb_demo_hex_digits - 1U - i) * (uint32_t)k_scb_demo_nibble_bits;
124 const uint32_t nibble = (val >> shift) & (uint32_t)k_scb_demo_nibble_mask;
125 buf[2U + i] = k_hex[nibble];
126 }
127 scb_demo_write(buf, (uint32_t)sizeof(buf));
128}
129
148{
150
153 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
154
157 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
158
160 const ra8_err_t err = ra8_scb_read_fault_status(&fs);
161
164 scb_demo_write(k_scb_demo_hfsr_sep, (uint32_t)(sizeof(k_scb_demo_hfsr_sep) - 1U));
166 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
167
170 scb_demo_write(k_scb_demo_afsr_sep, (uint32_t)(sizeof(k_scb_demo_afsr_sep) - 1U));
172 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
173
176 scb_demo_write(k_scb_demo_bfar_sep, (uint32_t)(sizeof(k_scb_demo_bfar_sep) - 1U));
178 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
179
182 scb_demo_write(k_scb_demo_sfar_sep, (uint32_t)(sizeof(k_scb_demo_sfar_sep) - 1U));
184 scb_demo_write(k_scb_demo_crlf, (uint32_t)(sizeof(k_scb_demo_crlf) - 1U));
185
186 return (err == k_ra8_ok) && (fs.cfsr == 0U) && (fs.hfsr == 0U);
187}
188
198static void scb_demo_setup_or_halt(void)
199{
200 uint32_t cpuclk0_hz = 0U;
201 if (ra8_cgc_init() != k_ra8_ok) {
203 }
206 }
207 if (ra8_mstp_init() != k_ra8_ok) {
209 }
210 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
212 }
215 }
218 }
219}
220
221void main(void)
222{
225
226 while (1) {
227 const bool clean = scb_demo_probe_and_report();
228 if (clean) {
230 } else {
232 }
234 break;
235 }
237 }
239}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static const uint8_t k_scb_demo_hfsr_sep[]
Definition main.c:63
static void scb_demo_panic_halt(void)
Park forever after a fatal init error.
Definition main.c:81
scb_demo_const_t
Demo tunables.
Definition main.c:47
@ k_scb_demo_baud
SCI8 console baud.
Definition main.c:48
@ k_scb_demo_period_ms
Delay between probe cycles.
Definition main.c:49
static const uint8_t k_scb_demo_crlf[]
Definition main.c:70
static const uint8_t k_scb_demo_afsr_sep[]
Definition main.c:65
static const uint8_t k_scb_demo_trace_prefix[]
Definition main.c:61
static void scb_demo_setup_or_halt(void)
Core bring-up: CGC -> MSTP -> TIME -> console + LED.
Definition main.c:198
static const uint8_t k_scb_demo_verdict_pass[]
Definition main.c:71
static const uint8_t k_scb_demo_sfsr_prefix[]
Definition main.c:68
static const uint8_t k_scb_demo_verdict_fail[]
Definition main.c:72
static const uint8_t k_scb_demo_dfsr_prefix[]
Definition main.c:64
static bool scb_demo_probe_and_report(void)
Read + log the SCB state and return whether the boot is fault-clean.
Definition main.c:147
static void scb_demo_write_hex32(uint32_t val)
Log one 32-bit value as 0x + eight fixed hex digits.
Definition main.c:115
scb_demo_fmt_t
Hex-formatting constants.
Definition main.c:53
@ k_scb_demo_hex_digits
Hex digits in a uint32_t.
Definition main.c:54
@ k_scb_demo_nibble_bits
Bits per hex nibble.
Definition main.c:55
@ k_scb_demo_nibble_mask
Low-nibble mask.
Definition main.c:56
static const uint8_t k_scb_demo_cfsr_prefix[]
Definition main.c:62
static const uint8_t k_scb_demo_sfar_sep[]
Definition main.c:69
static void scb_demo_write(const uint8_t *data, uint32_t len)
Write a byte span to the SCI8 console, discarding the status.
Definition main.c:99
static const uint8_t k_scb_demo_vtor_prefix[]
Definition main.c:60
static const uint8_t k_scb_demo_mmfar_prefix[]
Definition main.c:66
static const uint8_t k_scb_demo_bfar_sep[]
Definition main.c:67
Board-support layer for the Renesas EK-RA8D2 v1 evaluation kit.
ra8_err_t ra8_board_led_toggle(ra8_board_led_id_t led)
Toggle led's output state.
ra8_err_t ra8_board_led_init(ra8_board_led_id_t led)
Configure led as a digital output, initial level low (off).
@ k_ra8_board_led1
LED1, BLUE, P600 (jumper E27).
ra8_err_t ra8_board_uart_console_write(const uint8_t *data, size_t len)
Polled blocking write to the J-Link OB VCOM console.
ra8_err_t ra8_board_uart_console_init(uint32_t baud)
Configure SCI8 + PD02/PD03 as the debug-console UART.
Boot entry points shared between a vector table and its startup code.
High-level Clock Generation Circuit driver.
ra8_err_t ra8_cgc_get_clock_hz(ra8_clock_id_t id, uint32_t *out_hz)
Query the current frequency of a clock-tree domain.
Definition ra8_cgc.c:132
@ k_ra8_clock_id_cpuclk0
Cortex-M85 CPUCLK0.
Definition ra8_cgc.h:70
ra8_err_t ra8_cgc_init(void)
Configure the clock tree to a safe default.
Definition ra8_cgc.c:727
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
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_init(void)
Re-establish the ra8_mstp ref-count table from current hardware state.
Definition ra8_mstp.c:291
Cortex-M85 System Control Block: VTOR relocation + fault-status decode.
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
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
void ra8_scb_trace_enable(void)
Set DEMCR.TRCENA to power up the trace subsystem.
Definition ra8_scb.c:131
SysTick-based tick counter, delay and timestamp helpers.
ra8_err_t ra8_time_init(uint32_t cpu_hz)
Initialise SysTick for a 1 kHz tick interrupt.
Definition ra8_time.c:59
void ra8_delay_ms(uint32_t ms)
Busy-wait for at least ms milliseconds.
Definition ra8_time.c:129
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