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
24
25#include <stdint.h>
26
27#include "ra8_attributes.h"
28#include "ra8_board_ek_ra8d2.h"
29#include "ra8_boot_entry.h"
30#include "ra8_canfd.h"
31#include "ra8_canfd_regs.h"
32#include "ra8_cgc.h"
33#include "ra8_err.h"
34#include "ra8_isr.h"
35#include "ra8_time.h"
36
38typedef enum : uint32_t {
41 k_can_demo_id = 0x456U,
43
45typedef enum : uint8_t {
49
60
61/* CFDC[0].CTR test-mode bits live in ra8_canfd_set_test_mode() now.
62 * Bit positions (CTME = bit 24, CTMS = bits [26:25]) and the
63 * Self-test 1 / internal-loopback selector (CTMS = 11b) come from
64 * HUM Ch 41 "CFDCnCTR" p 2710. */
65
81volatile uint32_t g_can_match = 0U;
82
97volatile uint32_t g_can_mismatch = 0U;
98
116{
117 while (1) {
118 __asm__ volatile("wfi");
119 }
120}
121
147[[nodiscard]] RA8_INTERNAL static ra8_err_t
152
173{
174 uint32_t cpuclk0_hz = 0U;
175 if (ra8_cgc_init() != k_ra8_ok) {
177 }
180 }
181 if (ra8_time_init(cpuclk0_hz) != k_ra8_ok) {
183 }
186 }
189 }
190 if (ra8_canfd_init((uint8_t)k_can_demo_channel) != k_ra8_ok) {
192 }
193 /* Classic CAN: data_bitrate_bps == 0. */
194 if (ra8_canfd_set_bitrate((uint8_t)k_can_demo_channel, (uint32_t)k_can_demo_bitrate, 0U) !=
195 k_ra8_ok) {
197 }
200 }
201}
202
214{
215 ra8_canfd_frame_t tx = {
216 .id = (uint32_t)k_can_demo_id,
217 .dlc = (uint8_t)k_can_demo_dlc,
218 .is_extended = 0U,
219 .is_fd = 0U, /* classic */
220 .is_brs = 0U,
221 .data = {seq,
228 (uint8_t)k_can_demo_byte_marker_g},
229 };
230 if (ra8_canfd_transmit((uint8_t)k_can_demo_channel, &tx) != k_ra8_ok) {
231 return k_ra8_err_hw_error;
232 }
233 ra8_canfd_frame_t rx = {};
234 if (ra8_canfd_receive((uint8_t)k_can_demo_channel, &rx) != k_ra8_ok) {
235 return k_ra8_err_no_data;
236 }
237 return k_ra8_ok;
238}
239
240void main(void)
241{
244
245 uint8_t seq = 0U;
246 while (1) {
249 g_can_match += 1U;
250 } else {
252 g_can_mismatch += 1U;
253 }
254 seq++;
256 }
258}
void main(void)
Secure fallback main entry point.
Definition main.c:37
can_demo_const_t
Demo tunables.
Definition main.c:38
@ k_can_demo_period_ms
CAN demo period ms.
Definition main.c:39
@ k_can_demo_bitrate
CAN demo bitrate.
Definition main.c:40
@ k_can_demo_id
CAN demo ID.
Definition main.c:41
can_demo_layout_t
Channel + payload layout.
Definition main.c:45
@ k_can_demo_channel
CAN demo channel.
Definition main.c:46
@ k_can_demo_dlc
CAN demo dlc.
Definition main.c:47
volatile uint32_t g_can_mismatch
HIL failure counter – incremented every time TX or RX returned a non-ok status.
Definition main.c:97
static ra8_err_t internal_can_demo_enable_internal_loopback(uint8_t channel)
Enable Self-test 1 (internal loopback) on channel.
Definition main.c:148
volatile uint32_t g_can_match
HIL liveness counter – incremented on every successful TX -> internal loopback -> RX round-trip.
Definition main.c:81
static ra8_err_t internal_can_demo_one_round_trip(uint8_t seq)
One classic-CAN TX/RX round-trip.
Definition main.c:213
static void internal_can_demo_setup_or_halt(void)
Bring CGC + SysTick + LEDs + CANFD0 (classic mode) up.
Definition main.c:172
can_demo_byte_t
Constant payload bytes for the heartbeat frame.
Definition main.c:51
@ k_can_demo_byte_marker_g
CAN demo byte marker g.
Definition main.c:58
@ k_can_demo_byte_marker_d
CAN demo byte marker d.
Definition main.c:55
@ k_can_demo_byte_marker_a
CAN demo byte marker a.
Definition main.c:52
@ k_can_demo_byte_marker_c
CAN demo byte marker c.
Definition main.c:54
@ k_can_demo_byte_marker_f
CAN demo byte marker f.
Definition main.c:57
@ k_can_demo_byte_marker_b
CAN demo byte marker b.
Definition main.c:53
@ k_can_demo_byte_marker_e
CAN demo byte marker e.
Definition main.c:56
static void internal_can_demo_panic_halt(void)
Park forever after a fatal classic-CAN demo failure.
Definition main.c:115
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).
Boot entry points shared between a vector table and its startup code.
CANFD Lite driver (bit-timing, TX, RX, error state).
ra8_err_t ra8_canfd_transmit(uint8_t channel, const ra8_canfd_frame_t *frame)
Queue a frame into the TX message buffer and trigger transmission.
ra8_err_t ra8_canfd_set_bitrate(uint8_t channel, uint32_t bitrate_bps, uint32_t data_bitrate_bps)
Programme nominal (and optional data) bit-timing registers.
ra8_err_t ra8_canfd_receive(uint8_t channel, ra8_canfd_frame_t *out_frame)
Poll the RX FIFO for the next available frame.
ra8_err_t ra8_canfd_init(uint8_t channel)
Take a CANFD channel out of reset into operation mode.
Definition ra8_canfd.c:510
ra8_err_t ra8_canfd_set_test_mode(uint8_t channel, ra8_ctms_mode_t mode)
Enable a CFDC[0].CTR test mode (basic / listen-only / loopback).
Definition ra8_canfd.c:731
CANFD controller register layout for the Renesas RA8D2.
@ k_ra8_ctms_self_test_1
11b: Self-test 1 (internal loopback).
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_err_no_data
No application data available (e.g.
Definition ra8_err.h:202
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
@ k_ra8_err_hw_error
Generic hardware fault detected (error flag set, fault interrupt).
Definition ra8_err.h:310
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
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
A single CAN / CAN-FD frame as seen by the driver public API.
Definition ra8_canfd.h:52