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
30
31#include <stdint.h>
32
33#include "ra8_attributes.h"
34#include "ra8_board_ek_ra8d2.h"
35#include "ra8_boot_entry.h"
36#include "ra8_canfd.h"
37#include "ra8_canfd_regs.h"
38#include "ra8_cgc.h"
39#include "ra8_err.h"
40#include "ra8_isr.h"
41#include "ra8_time.h"
42
44typedef enum : uint32_t {
47 k_canfd_demo_id = 0x123U,
50
52typedef enum : uint8_t {
56
67
68/* CFDC[0].CTR test-mode bits live in ra8_canfd_set_test_mode() now.
69 * Bit positions (CTME = bit 24, CTMS = bits [26:25]) and the
70 * Self-test 1 / internal-loopback selector (CTMS = 11b) come from
71 * HUM Ch 41 "CFDCnCTR" p 2710. */
72
88volatile uint32_t g_canfd_match = 0U;
89
104volatile uint32_t g_canfd_mismatch = 0U;
105
107volatile uint32_t g_canfd_init_step = 0U;
108
110volatile uint32_t g_canfd_ncfg_after_setbitrate = 0U;
111
129{
130 while (1) {
131 __asm__ volatile("wfi");
132 }
133}
134
158[[nodiscard]] RA8_INTERNAL static ra8_err_t
163
215
227{
228 ra8_canfd_frame_t tx = {
229 .id = (uint32_t)k_canfd_demo_id,
230 .dlc = (uint8_t)k_canfd_demo_dlc,
231 .is_extended = 0U,
232 .is_fd = 0U,
233 .is_brs = 0U,
234 .data = {seq,
241 (uint8_t)k_canfd_demo_payload_b7},
242 };
243 if (ra8_canfd_transmit((uint8_t)k_canfd_demo_channel, &tx) != k_ra8_ok) {
244 return k_ra8_err_hw_error;
245 }
246 /* Poll for the loopback frame: 500 kbit/s + 8 data bytes ~ 240 us
247 * round-trip, so wait up to ~10 ms before declaring no_data. */
248 ra8_canfd_frame_t rx = {};
249 for (uint32_t i = 0U; i < (uint32_t)k_canfd_demo_rx_spin; i++) {
250 if (ra8_canfd_receive((uint8_t)k_canfd_demo_channel, &rx) == k_ra8_ok) {
251 return k_ra8_ok;
252 }
253 }
254 return k_ra8_err_no_data;
255}
256
257void main(void)
258{
261
262 uint8_t seq = 0U;
263 while (1) {
266 g_canfd_match += 1U;
267 } else {
269 g_canfd_mismatch += 1U;
270 }
271 seq++;
273 }
275}
void main(void)
Secure fallback main entry point.
Definition main.c:37
static ra8_err_t internal_canfd_demo_one_round_trip(uint8_t seq)
One TX/RX round-trip.
Definition main.c:226
static ra8_err_t internal_canfd_demo_enable_internal_loopback(uint8_t channel)
Enable Self-test 1 (internal loopback) on channel.
Definition main.c:159
canfd_demo_layout_t
Channel + payload layout.
Definition main.c:52
@ k_canfd_demo_channel
CANFD demo channel.
Definition main.c:53
@ k_canfd_demo_dlc
CANFD demo dlc.
Definition main.c:54
volatile uint32_t g_canfd_ncfg_after_setbitrate
NCFG readback latched at end of set_bitrate (proves NCFG write).
Definition main.c:110
canfd_demo_const_t
Demo tunables.
Definition main.c:44
@ k_canfd_demo_bitrate
CANFD demo bitrate.
Definition main.c:46
@ k_canfd_demo_id
CANFD demo ID.
Definition main.c:47
@ k_canfd_demo_period_ms
CANFD demo period ms.
Definition main.c:45
@ k_canfd_demo_rx_spin
~10 ms RX poll budget at 1 GHz CPU.
Definition main.c:48
static void internal_canfd_demo_panic_halt(void)
Park the processor after a fatal CAN-FD loopback failure.
Definition main.c:128
volatile uint32_t g_canfd_init_step
Bring-up step tracker: 1=init ok, 2=set_bitrate ok, 3=loopback ok.
Definition main.c:107
volatile uint32_t g_canfd_match
HIL liveness counter – incremented on every successful TX -> internal loopback -> RX round-trip.
Definition main.c:88
canfd_demo_payload_t
Constant payload bytes for the heartbeat frame.
Definition main.c:58
@ k_canfd_demo_payload_b7
CANFD demo payload b7.
Definition main.c:65
@ k_canfd_demo_payload_b6
CANFD demo payload b6.
Definition main.c:64
@ k_canfd_demo_payload_b4
CANFD demo payload b4.
Definition main.c:62
@ k_canfd_demo_payload_b5
CANFD demo payload b5.
Definition main.c:63
@ k_canfd_demo_payload_b3
CANFD demo payload b3.
Definition main.c:61
@ k_canfd_demo_payload_b1
CANFD demo payload b1.
Definition main.c:59
@ k_canfd_demo_payload_b2
CANFD demo payload b2.
Definition main.c:60
static void internal_canfd_demo_setup_or_halt(void)
Bring CGC + SysTick + LEDs + CANFD0 up.
Definition main.c:181
volatile uint32_t g_canfd_mismatch
HIL failure counter – incremented every time TX or RX returned a non-ok status.
Definition main.c:104
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).
static volatile r_canfd_t * ra8_canfd(uint8_t channel)
Get pointer to CANFD instance N (0..1).
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
volatile uint32_t NCFG
+0x000 Nominal Bitrate Config.
r_canfd_cfdc_t CFDC[1]
CFDC register.
A single CAN / CAN-FD frame as seen by the driver public API.
Definition ra8_canfd.h:52