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
31
32#include <stdint.h>
33
34#include "ra8_board_ek_ra8d2.h"
35#include "ra8_boot_entry.h"
36#include "ra8_cgc.h"
37#include "ra8_err.h"
38#include "ra8_isr.h"
39#include "ra8_time.h"
40#include "ra8_wdt.h"
41
47
67
68static const uint8_t k_wdt_window_demo_msg_refresh[] = "wdt: window_tick=ok\r\n";
69static const uint8_t k_wdt_window_demo_msg_boot[] = "wdt: window-mode boot\r\n";
70
72{
73 while (1) {
74 __asm__ volatile("wfi");
75 }
76}
77
97
106static bool wdt_window_demo_in_window(uint16_t counter)
107{
108 return (counter >= (uint16_t)k_wdt_window_demo_window_low) &&
109 (counter <= (uint16_t)k_wdt_window_demo_window_high);
110}
111
126static void wdt_window_demo_banner(const uint8_t* msg, uint32_t len)
127{
128 (void)ra8_board_uart_console_write(msg, (size_t)len);
129}
130
131static const uint8_t k_wdt_window_demo_msg_init_failed[] = "wdt: init failed\r\n";
132static const uint8_t k_wdt_window_demo_msg_counter_failed[] = "wdt: get_counter failed\r\n";
133static const uint8_t k_wdt_window_demo_msg_refresh_failed[] = "wdt: refresh_for failed\r\n";
134static const uint8_t k_wdt_window_demo_msg_clear_failed[] = "wdt: clear_status failed\r\n";
135
149static bool wdt_window_demo_iter(void)
150{
151 uint16_t counter = 0U;
152 if (ra8_wdt_get_counter(&counter) != k_ra8_ok) {
154 (uint32_t)(sizeof(k_wdt_window_demo_msg_counter_failed) - 1U));
155 return false;
156 }
157 if (!wdt_window_demo_in_window(counter)) {
158 return true;
159 }
162 (uint32_t)(sizeof(k_wdt_window_demo_msg_refresh_failed) - 1U));
163 return false;
164 }
167 (uint32_t)(sizeof(k_wdt_window_demo_msg_clear_failed) - 1U));
168 return false;
169 }
172 (uint32_t)(sizeof(k_wdt_window_demo_msg_refresh) - 1U));
173 return true;
174}
175
176void main(void)
177{
180
181 /* Boot banner -- emit before ra8_wdt_init so the HIL host can see
182 * the firmware booted even if the WDT bring-up fails. */
184 (size_t)(sizeof(k_wdt_window_demo_msg_boot) - 1U));
185
186 /* on_expiry=k_ra8_wdt_on_expiry_nmi (RSTIRQS=0) routes a window
187 * violation through NMI/IRQ instead of a silent reset, so a bug
188 * in the demo's window math shows up as a banner-loss rather than
189 * a reset-loop that confuses HIL bench parsing. */
190 const ra8_wdt_cfg_t cfg = {
191 .timeout = k_ra8_wdt_timeout_1024,
192 .clock_div = k_ra8_wdt_clkdiv_4,
193 .window_start = k_ra8_wdt_window_start_75,
194 .window_end = k_ra8_wdt_window_end_25,
195 .on_expiry = k_ra8_wdt_on_expiry_nmi,
196 .stop_in_sleep = k_ra8_wdt_sleep_stop_count,
197 };
198 if (ra8_wdt_init(&cfg) != k_ra8_ok) {
200 (uint32_t)(sizeof(k_wdt_window_demo_msg_init_failed) - 1U));
202 }
203
204 while (wdt_window_demo_iter()) {
206 }
208}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static void wdt_window_demo_panic_halt(void)
Definition main.c:71
static const uint8_t k_wdt_window_demo_msg_refresh_failed[]
Definition main.c:133
static const uint8_t k_wdt_window_demo_msg_clear_failed[]
Definition main.c:134
static const uint8_t k_wdt_window_demo_msg_boot[]
Definition main.c:69
static bool wdt_window_demo_iter(void)
Inner loop body – one polling iteration.
Definition main.c:149
wdt_window_demo_const_t
Demo tunables.
Definition main.c:43
@ k_wdt_window_demo_baud
Wdt window demo baud.
Definition main.c:44
@ k_wdt_window_demo_poll_ms
Wdt window demo poll ms.
Definition main.c:45
static void wdt_window_demo_setup_or_halt(void)
Definition main.c:78
static void wdt_window_demo_banner(const uint8_t *msg, uint32_t len)
Print a short ASCII banner and never block the caller.
Definition main.c:126
static bool wdt_window_demo_in_window(uint16_t counter)
Decide whether the live counter sits inside the legal window.
Definition main.c:106
wdt_window_demo_window_t
Window bounds in WDT-counter units.
Definition main.c:63
@ k_wdt_window_demo_window_low
Wdt window demo window low.
Definition main.c:64
@ k_wdt_window_demo_window_high
Wdt window demo window high.
Definition main.c:65
static const uint8_t k_wdt_window_demo_msg_counter_failed[]
Definition main.c:132
static const uint8_t k_wdt_window_demo_msg_refresh[]
Definition main.c:68
static const uint8_t k_wdt_window_demo_msg_init_failed[]
Definition main.c:131
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
NVIC + ICU IELSR allocator.
void ra8_isr_globals_enable(void)
Globally enable maskable interrupts (PRIMASK = 0).
Definition ra8_isr.c:439
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
Software Watchdog Timer (WDT) driver header.
@ k_ra8_wdt_timeout_1024
1024 cycles.
Definition ra8_wdt.h:147
@ k_ra8_wdt_clkdiv_4
PCLKB / 4.
Definition ra8_wdt.h:126
ra8_err_t ra8_wdt_refresh_for(ra8_wdt_instance_t which)
Refresh a specific WDT instance.
Definition ra8_wdt.c:356
ra8_err_t ra8_wdt_init(const ra8_wdt_cfg_t *cfg)
Initialise the WDT in register-start mode.
Definition ra8_wdt.c:296
@ k_ra8_wdt_window_start_75
75 %.
Definition ra8_wdt.h:165
@ k_ra8_wdt_on_expiry_nmi
RSTIRQS=0 – route to NMI / IRQ.
Definition ra8_wdt.h:201
ra8_err_t ra8_wdt_clear_status(void)
Clear the WDTSR underflow / refresh-error flags.
Definition ra8_wdt.c:379
@ k_ra8_wdt_sleep_stop_count
SLCSTP=1 – counter halts in Sleep.
Definition ra8_wdt.h:219
ra8_err_t ra8_wdt_get_counter(uint16_t *out_count)
Read the live CNTVAL[13:0] down-counter value.
Definition ra8_wdt.c:428
@ k_ra8_wdt_window_end_25
25 %.
Definition ra8_wdt.h:184
@ k_ra8_wdt0
WDT0 – Cortex-M85 side.
Register-start-mode configuration block.
Definition ra8_wdt.h:305