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
28
29#include <stdint.h>
30
31#include "ra8_attributes.h"
32#include "ra8_board_ek_ra8d2.h"
33#include "ra8_boot_entry.h"
34#include "ra8_cgc.h"
35#include "ra8_err.h"
36#include "ra8_isr.h"
37#include "ra8_rtc.h"
38#include "ra8_time.h"
39
47
54
63
65static const uint8_t s_rtc_demo_log_msg[] = "rtc_per: tick\r\n";
66static const uint8_t s_rtc_demo_boot_msg[] = "rtc_per: boot\r\n";
67
85{
86 while (1) {
87 __asm__ volatile("wfi");
88 }
89}
90
110{
111 uint32_t cpuclk0_hz = 0U;
112 if (ra8_cgc_init() != k_ra8_ok) {
114 }
117 }
118 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
120 }
123 }
124 if (ra8_rtc_init() != k_ra8_ok) {
126 }
127 const ra8_rtc_datetime_t seed = {
128 .year = (uint16_t)(k_rtc_demo_year_base + k_rtc_demo_seed_year_lo),
129 .month = (uint8_t)k_rtc_demo_seed_month,
130 .day = (uint8_t)k_rtc_demo_seed_day,
131 .weekday = 0U,
132 .hour = 0U,
133 .minute = 0U,
134 .second = 0U,
135 };
136 if (ra8_rtc_set(&seed) != k_ra8_ok) {
138 }
139}
140
169[[nodiscard]] RA8_INTERNAL static ra8_err_t
171{
172 ra8_rtc_datetime_t a = *now;
173 uint16_t s = (uint16_t)a.second + (uint16_t)k_rtc_demo_alarm_offset_s;
174 a.second = (uint8_t)(s % (uint16_t)k_rtc_demo_secs_per_min);
175 uint16_t add_min = (uint16_t)(s / (uint16_t)k_rtc_demo_secs_per_min);
176 uint16_t m = (uint16_t)a.minute + add_min;
177 a.minute = (uint8_t)(m % (uint16_t)k_rtc_demo_mins_per_hour);
178 uint16_t add_hr = (uint16_t)(m / (uint16_t)k_rtc_demo_mins_per_hour);
179 uint16_t h = (uint16_t)a.hour + add_hr;
180 a.hour = (uint8_t)(h % (uint16_t)k_rtc_demo_hours_per_day);
182 if (err != k_ra8_ok) {
183 return err;
184 }
185 /* Enable BOTH alarm and periodic IRQ flags so the demo gates on
186 * whichever fires first. The periodic interval is selected by
187 * RCR1.PES inside ra8_rtc_init's default config; the bench cares
188 * only that ra8_rtc_get_status reports a periodic-or-alarm event. */
190 (uint8_t)((uint8_t)k_ra8_rtc_irq_alarm | (uint8_t)k_ra8_rtc_irq_periodic));
191}
192
193void main(void)
194{
197
198 /* Boot banner -- emit before the RTC poll loop so the HIL host can
199 * confirm the firmware booted even when the sub-clock crystal is not
200 * running and the alarm-fired path never reaches its own write. */
202 (size_t)(sizeof(s_rtc_demo_boot_msg) - 1U));
203
204 while (1) {
205 ra8_rtc_datetime_t now = {};
206 if (ra8_rtc_get(&now) != k_ra8_ok) {
207 break;
208 }
210 break;
211 }
212
213 /* Poll for the periodic flag (or alarm as a fallback). On real
214 * silicon RCR1.PIE drives an NVIC line, but for this demo we
215 * just spin against the status bit. */
216 uint8_t status = 0U;
217 const uint8_t any_mask = (uint8_t)k_ra8_rtc_irq_alarm | (uint8_t)k_ra8_rtc_irq_periodic;
218 do {
220 if (ra8_rtc_get_status(&status) != k_ra8_ok) {
222 }
223 } while ((status & any_mask) == 0U);
224
226 (size_t)(sizeof(s_rtc_demo_log_msg) - 1U));
228 (uint8_t)((uint8_t)k_ra8_rtc_irq_alarm | (uint8_t)k_ra8_rtc_irq_periodic)) != k_ra8_ok) {
229 break;
230 }
232 }
234}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static void internal_rtc_demo_setup_or_halt(void)
Initialize clocks, timekeeping, console, and RTC calendar state.
Definition main.c:109
rtc_demo_seed_t
Alarm offset from the current RTC reading.
Definition main.c:56
@ k_rtc_demo_seed_day
Rtc demo seed day.
Definition main.c:61
@ k_rtc_demo_seed_month
Rtc demo seed month.
Definition main.c:60
@ k_rtc_demo_alarm_offset_s
Rtc demo alarm offset s.
Definition main.c:57
@ k_rtc_demo_seed_year_lo
2026 - 2000.
Definition main.c:58
@ k_rtc_demo_year_base
Calendar epoch base for the year field.
Definition main.c:59
static const uint8_t s_rtc_demo_log_msg[]
Definition main.c:64
static const uint8_t s_rtc_demo_boot_msg[]
Definition main.c:65
static void internal_rtc_demo_panic_halt(void)
Park the processor after an unrecoverable RTC demo failure.
Definition main.c:84
static ra8_err_t internal_rtc_demo_arm_alarm(const ra8_rtc_datetime_t *now)
Program a +5 s alarm relative to now and enable AIE.
Definition main.c:183
rtc_demo_calendar_t
Calendar-arithmetic moduli for the +5 s alarm calc.
Definition main.c:49
@ k_rtc_demo_mins_per_hour
Rtc demo mins per hour.
Definition main.c:51
@ k_rtc_demo_hours_per_day
Rtc demo hours per day.
Definition main.c:52
@ k_rtc_demo_secs_per_min
Rtc demo secs per minimum.
Definition main.c:50
rtc_demo_const_t
Demo tunables.
Definition main.c:41
@ k_rtc_demo_ms_per_sec
Rtc demo ms per sec.
Definition main.c:45
@ k_rtc_demo_baud
Rtc demo baud.
Definition main.c:42
@ k_rtc_demo_poll_ms
Rtc demo poll ms.
Definition main.c:43
@ k_rtc_demo_advance_secs
Rtc demo advance secs.
Definition main.c:44
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_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
Real-Time Clock driver (BCD calendar mode).
ra8_err_t ra8_rtc_set_alarm(const ra8_rtc_datetime_t *alarm)
Programme the alarm-match registers (hour/minute/second).
Definition ra8_rtc.c:437
ra8_err_t ra8_rtc_init(void)
Start the RTC in 24-hour calendar mode.
Definition ra8_rtc.c:308
ra8_err_t ra8_rtc_clear_status(uint8_t mask)
Clear RCR1 IRQ enable bits.
Definition ra8_rtc.c:513
ra8_err_t ra8_rtc_set(const ra8_rtc_datetime_t *dt)
Write the calendar registers.
Definition ra8_rtc.c:343
@ k_ra8_rtc_irq_periodic
RCR1.PIE.
Definition ra8_rtc.h:141
@ k_ra8_rtc_irq_alarm
RCR1.AIE.
Definition ra8_rtc.h:139
ra8_err_t ra8_rtc_get(ra8_rtc_datetime_t *out)
Read the calendar registers.
Definition ra8_rtc.c:385
ra8_err_t ra8_rtc_get_status(uint8_t *out_mask)
Read RCR1 IRQ enable bits.
Definition ra8_rtc.c:506
ra8_err_t ra8_rtc_set_irq_enable(uint8_t mask)
Enable one or more RTC IRQ sources via RCR1.
Definition ra8_rtc.c:498
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
Calendar date + time decoded from BCD.
Definition ra8_rtc.h:31
uint8_t hour
0..23.
Definition ra8_rtc.h:36
uint8_t minute
0..59.
Definition ra8_rtc.h:37
uint8_t second
0..59.
Definition ra8_rtc.h:38