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
52
53#include <stdint.h>
54
55#include "ra8_attributes.h"
56#include "ra8_board_ek_ra8d2.h"
57#include "ra8_boot_entry.h"
58#include "ra8_cgc.h"
59#include "ra8_check.h"
60#include "ra8_dotf.h"
61#include "ra8_err.h"
62#include "ra8_isr.h"
63#include "ra8_mstp.h"
64#include "ra8_time.h"
65
67static const char* s_tag = "dotf_demo";
68
70typedef enum : uint32_t {
71 k_dotf_demo_baud = 115200U,
74
76typedef enum : uint8_t {
80
82typedef enum : uint32_t {
83 k_dotf_demo_err_unset = 0xFFFFFFFFU,
85
87static const uint8_t s_dotf_demo_ok_msg[] = "dotf: ch0/1 init=ok selftest=run ok=Y\r\n";
88static const uint8_t s_dotf_demo_bad_msg[] = "dotf: selftest=FAIL ok=N\r\n";
89
96volatile uint32_t g_dotf_ok = 0U;
97
104volatile uint32_t g_dotf_init_err = (uint32_t)k_dotf_demo_err_unset;
105
112volatile uint32_t g_dotf_reg00 = 0U;
113
120volatile uint32_t g_dotf_st0_snap = 0U;
121
128volatile uint32_t g_dotf_st1_snap = 0U;
129
136volatile uint32_t g_dotf_heartbeat = 0U;
137
155{
156 while (1) {
157 __asm__ volatile("wfi");
158 }
159}
160
204
223[[nodiscard]] RA8_INTERNAL static uint8_t
225{
226 const bool ok = (st0_err == k_ra8_ok) && (st1_err == k_ra8_ok) && (status_err == k_ra8_ok);
227 return ok ? 1U : 0U;
228}
229
249[[nodiscard]] RA8_INTERNAL static ra8_err_t internal_dotf_demo_sample(uint8_t* out_ok)
250{
251 RA8_CHECK_NULL_PTR(out_ok, s_tag, "out_ok must not be nullptr");
252
253 uint32_t st0 = 0U;
254 const ra8_err_t st0_err = ra8_dotf_run_self_test((uint8_t)k_dotf_demo_ch0, &st0);
255 g_dotf_st0_snap = st0;
256
257 uint32_t st1 = 0U;
258 const ra8_err_t st1_err = ra8_dotf_run_self_test((uint8_t)k_dotf_demo_ch1, &st1);
259 g_dotf_st1_snap = st1;
260
261 uint32_t reg00 = 0U;
262 const ra8_err_t stat_err = ra8_dotf_get_status((uint8_t)k_dotf_demo_ch0, &reg00);
263 g_dotf_reg00 = reg00;
264
265 *out_ok = internal_dotf_demo_verdict(st0_err, st1_err, stat_err);
266 if (st0_err != k_ra8_ok) {
267 return st0_err;
268 }
269 if (st1_err != k_ra8_ok) {
270 return st1_err;
271 }
272 return stat_err;
273}
274
275void main(void)
276{
278 /* Clear PRIMASK so SysTick can dispatch and ra8_delay_ms() uses the
279 * SysTick path (ra8_emulator does not advance DWT_CYCCNT). No maskable NVIC
280 * source is armed; DOTF raises no IRQ of its own. */
282
283 const ra8_err_t init_err = ra8_dotf_init();
284 g_dotf_init_err = (uint32_t)init_err;
285 if (init_err != k_ra8_ok) {
287 }
288
289 while (1) {
290 uint8_t ok = 0U;
291 const ra8_err_t err = internal_dotf_demo_sample(&ok);
292 const uint8_t good = (err == k_ra8_ok && ok != 0U) ? 1U : 0U;
293 g_dotf_ok = (uint32_t)good;
294 if (good != 0U) {
296 (size_t)(sizeof(s_dotf_demo_ok_msg) - 1U));
298 } else {
300 (size_t)(sizeof(s_dotf_demo_bad_msg) - 1U));
302 }
305 }
307}
void main(void)
Secure fallback main entry point.
Definition main.c:37
volatile uint32_t g_dotf_reg00
Last REG00 snapshot from ra8_dotf_get_status(ch0).
Definition main.c:112
static void internal_dotf_demo_setup_or_halt(void)
Bring CGC, SysTick, SCI8, LEDs, and MSTP up.
Definition main.c:178
volatile uint32_t g_dotf_ok
1 when both channels' self-test + status calls returned k_ra8_ok.
Definition main.c:96
static void internal_dotf_demo_panic_halt(void)
Park the processor after an unrecoverable DOTF demo failure.
Definition main.c:154
static const uint8_t s_dotf_demo_bad_msg[]
Definition main.c:88
static ra8_err_t internal_dotf_demo_sample(uint8_t *out_ok)
Self-test both channels and read REG00 back; fold into the verdict.
Definition main.c:249
volatile uint32_t g_dotf_st0_snap
Channel-0 self-test REG00 snapshot (opaque on host / off-target).
Definition main.c:120
volatile uint32_t g_dotf_st1_snap
Channel-1 self-test REG00 snapshot (opaque on host / off-target).
Definition main.c:128
dotf_demo_config_t
Compile-time settings.
Definition main.c:70
@ k_dotf_demo_period_ms
Delay between self-tests.
Definition main.c:72
@ k_dotf_demo_baud
Console baud rate.
Definition main.c:71
dotf_demo_chan_t
DOTF channels exercised by the demo.
Definition main.c:76
@ k_dotf_demo_ch0
DOTF0 (paired with XSPI0).
Definition main.c:77
@ k_dotf_demo_ch1
DOTF1 (paired with XSPI1).
Definition main.c:78
static uint8_t internal_dotf_demo_verdict(ra8_err_t st0_err, ra8_err_t st1_err, ra8_err_t status_err)
Verdict: both channels' self-test + status calls succeeded.
Definition main.c:224
static const uint8_t s_dotf_demo_ok_msg[]
Output line tags.
Definition main.c:87
volatile uint32_t g_dotf_init_err
ra8_err_t from ra8_dotf_init (0 == k_ra8_ok).
Definition main.c:104
dotf_demo_sentinel_t
Sentinel for "ra8_dotf_init has not run yet" in g_dotf_init_err.
Definition main.c:82
@ k_dotf_demo_err_unset
Distinct from any ra8_err_t code.
Definition main.c:83
volatile uint32_t g_dotf_heartbeat
Bumps once per main-loop pass – liveness for headless probes.
Definition main.c:136
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
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_led2
LED2, GREEN, P303 (jumper E26).
@ 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
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
Decryption On The Fly (DOTF) HAL driver public API.
ra8_err_t ra8_dotf_get_status(uint8_t channel, uint32_t *out_mask)
Read REG00 (raw control / status snapshot).
Definition ra8_dotf.c:913
ra8_err_t ra8_dotf_init(void)
Power on the DOTF block and reset both channels.
Definition ra8_dotf.c:524
ra8_err_t ra8_dotf_run_self_test(uint8_t channel, uint32_t *out_status)
Trigger the built-in self-test (REG00 bit 20) for a channel.
Definition ra8_dotf.c:883
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
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