51static const char*
s_tag =
"CANFD";
70typedef enum : uint32_t {
103 (uint32_t)(1UL << status_bit),
150 uint32_t ctr = reg->
CFDC[0].
CTR;
178 const uint32_t reset_or_halt =
227 const uint32_t reset_or_halt =
313 k_rfcc_rfdc_4msgs = 1UL << 8U,
314 k_rfcc_rfpls_64 = 7UL << 4U,
316 reg->
CFDRFCC[0] = k_rfcc_rfdc_4msgs | k_rfcc_rfpls_64;
373 if (expected != 0U) {
428 static bool s_canfd_clock_inited =
false;
429 if (s_canfd_clock_inited) {
444 const uint8_t src_moco = 0x01U;
463 s_canfd_clock_inited =
true;
596 if (reg ==
nullptr) {
600 const uint32_t mask = reg->
CFDC[0].
ERFL;
605 fn(ctx, channel, mask);
633 const uint32_t cur_rnc =
636 if (cur_rnc < new_rnc) {
752 uint32_t ctr = reg->
CFDC[0].
CTR;
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_ISR_SAFE
The function is callable from interrupt context.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
static ra8_err_t internal_wait_canfdcksrdy(uint8_t expected)
Bounded wait on CANFDCKCR.CANFDCKSRDY reaching expected.
ra8_err_t ra8_canfd_enter_stop(uint8_t channel)
Put the CANFD channel into MSTP-gated stop.
ra8_err_t ra8_canfd_deinit(uint8_t channel)
Put the CANFD channel back into reset.
ra8_err_t ra8_canfd_filter_set(uint16_t filter_id, uint32_t accept_id, uint32_t mask, uint8_t dlc)
Programme one Global Acceptance-Filter-List (GAFL) entry.
static const ra8_mstp_t s_canfd_mstp_table[]
Channel-index -> MSTP id lookup.
static void internal_configure_rx_fifo0(volatile r_canfd_t *reg)
Enable RX FIFO 0 with a sensible default depth and payload.
static ra8_err_t internal_canfd_open_channel(volatile r_canfd_t *reg)
Push the CANFD global+channel state machines into OPERATION.
static void internal_enable_rx_fifo0(volatile r_canfd_t *reg)
Enable RX FIFO 0 (RFE=1) – must run in GL_HALT or GL_OPERATION.
static void * s_canfd_ctx
static void internal_bump_rnc0_locked(volatile r_canfd_t *reg, uint16_t filter_id)
Bump CFDGAFLCFG0.RNC0 to cover filter_id rules on page 0.
void ra8_canfd_dispatch(uint8_t channel)
Dispatch a CANFD event for a channel – snapshot + fire callback.
ra8_err_t ra8_canfd_clear_status(uint8_t channel, uint32_t mask)
Clear error flags in CFDCnERFL.
static ra8_err_t internal_canfd_clock_block_init(void)
Block-level CANFD clock init – run BEFORE the first MSTP release.
static ra8_canfd_event_fn_t s_canfd_fn
static void internal_write_afl_slot(volatile r_canfd_t *reg, uint16_t slot, uint32_t accept_id, uint32_t mask, uint8_t dlc)
Write one CFDGAFL slot (ID/M/P0/P1) with the loopback + FIFO-0 routing bits set.
ra8_canfd_internal_t
Internal tunables (mode-transition + clock-handshake spin budgets).
@ k_ra8_canfd_ckcr_spin
CANFDCKCR SREQ/SRDY budget.
@ k_ra8_canfd_spin
Bounded poll budget in iterations.
static ra8_err_t internal_set_global_mode(volatile r_canfd_t *reg, uint32_t gmdc_value)
Drive CFDGCTR.GMDC and wait for matching CFDGSTS bit.
ra8_err_t priv_ra8_canfd_internal_set_channel_mode(volatile r_canfd_t *reg, ra8_chmdc_mode_t mode)
Drive CFDC[0].CTR.CHMDC and wait for the matching status bit.
static ra8_err_t internal_wait_status_bit(volatile r_canfd_t *reg, uint8_t status_bit)
Bounded wait on a CFDC[0].STS flag (reset/halt/operation ack).
ra8_err_t ra8_canfd_init(uint8_t channel)
Take a CANFD channel out of reset into operation mode.
static void internal_install_default_afl(volatile r_canfd_t *reg)
Program a default pass-all AFL rule routed into RX FIFO 0.
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).
ra8_err_t ra8_canfd_exit_stop(uint8_t channel)
Exit MSTP-gated stop.
ra8_err_t ra8_canfd_get_status(uint8_t channel, uint32_t *out_mask)
Read the channel status register (CFDCnSTS).
@ k_ra8_canfd_afl_per_page
RA8 CANFD afl per page.
ra8_err_t ra8_canfd_attach_handler(ra8_canfd_event_fn_t fn, void *ctx)
Attach a callback for CANFD events (shared across channels).
ra8_err_t ra8_canfd_set_iso_mode(bool enable)
Select ISO 11898-1 vs non-ISO CAN-FD framing.
CANFD Lite driver (bit-timing, TX, RX, error state).
void(* ra8_canfd_event_fn_t)(void *ctx, uint8_t channel, uint32_t status_mask)
CANFD event callback.
CANFD controller register layout for the Renesas RA8D2.
@ k_ra8_gaflp1_bit_gaflfdp0
Route to RX FIFO 0.
@ k_ra8_canfd_dlc_max
4-bit DLC max value (64 bytes).
ra8_chmdc_mode_t
Channel Mode Control (CFDC[0].CTR.CHMDC[1:0]) values.
@ k_ra8_chmdc_operation
Bus operation mode.
@ k_ra8_chmdc_reset
Reset mode.
@ k_ra8_chmdc_halt
Halt mode.
@ k_ra8_canfd_instance_count
Number of CANFD channels.
@ k_ra8_canfd_ptr_mask_dlc
4-bit DLC mask.
@ k_ra8_canfd_ptr_shift_dlc
DLC field shift.
@ k_ra8_gctr_mask_gmdc
2-bit GMDC mask.
@ k_ra8_gctr_value_operation
GMDC = 0: operation.
@ k_ra8_gctr_mask_gslpr
RA8 gctr mask gslpr.
@ k_ra8_gctr_value_halt
GMDC = 2: halt.
@ k_ra8_gctr_value_reset
GMDC = 1: reset.
@ k_ra8_canfd_id_ext_mask
29-bit extended ID.
@ k_ra8_gaflectr_mask_aflpn
RA8 gaflectr mask aflpn.
@ k_ra8_gaflectr_bit_afldae
RA8 gaflectr bit afldae.
@ k_ra8_cnsts_bit_crstst
Channel Reset Status.
@ k_ra8_cnsts_bit_chltst
Channel Halt Status.
@ k_ra8_rfcc_bit_rfe
RFE: enable FIFO.
ra8_ctms_mode_t
Channel Test Mode Select values (CFDC[0].CTR.CTMS[1:0]).
@ k_ra8_ctms_self_test_1
11b: Self-test 1 (internal loopback).
@ k_ra8_cnctr_bit_ctms
Channel Test Mode Select [26:25].
static volatile r_canfd_t * ra8_canfd(uint8_t channel)
Get pointer to CANFD instance N (0..1).
@ k_ra8_gfdcfg_bit_niso
NISO: ISO mode select.
@ k_ra8_gaflcfg0_mask_rnc0
RNC0 field is 5 bits.
@ k_ra8_gaflcfg0_shift_rnc0
Position of RNC0[4:0].
@ k_ra8_canfd_afl_total
16 pages x 16 entries.
@ k_ra8_gaflm_bit_gafllb
Loopback Configuration bit.
@ k_ra8_cnctr_mask_ctme
CTME bit 24.
@ k_ra8_cnctr_mask_ctms
CTMS[1:0] at bits [26:25].
@ k_ra8_cnctr_mask_cslpr
CSLPR (bit 2).
@ k_ra8_cnctr_mask_chmdc
2-bit CHMDC mask.
@ k_ra8_gsts_bit_ghltsts
Global Halt Status.
@ k_ra8_gsts_bit_graminit
Global RAM Initialisation.
@ k_ra8_gsts_bit_grststs
Global Reset Status.
High-level Clock Generation Circuit driver.
Validation and Error-Checking Macros for ra8-firmware.
#define RA8_RETURN_ON_ERROR(err, tag, message)
Early return on error, propagating the code upward.
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Error Code Definitions for ra8-firmware.
@ k_ra8_err_invalid_arg
Invalid function argument.
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Cross-translation-unit private helpers shared inside ra8_hal.
Bounded wait-flag primitives for RA8D2 HAL drivers.
static ra8_err_t ra8_hw_wait_flag_clear8(volatile const uint8_t *reg, uint8_t mask, uint32_t budget)
Spin until (*reg & mask) == 0 or budget runs out.
static ra8_err_t ra8_hw_wait_flag_set32(volatile const uint32_t *reg, uint32_t mask, uint32_t budget)
Spin until (*reg & mask) != 0 or budget runs out.
static ra8_err_t ra8_hw_wait_flag_set8(volatile const uint8_t *reg, uint8_t mask, uint32_t budget)
Spin until (*reg & mask) != 0 or budget runs out.
static ra8_err_t ra8_hw_wait_flag_clear32(volatile const uint32_t *reg, uint32_t mask, uint32_t budget)
Spin until (*reg & mask) == 0 or budget runs out.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
#define ra8_log_info(tag, message)
RA8 log info.
#define ra8_log_error(tag, message)
RA8 log error.
Ref-counted Module Stop Control wrapper for the RA8D2.
ra8_err_t ra8_mstp_enable(ra8_mstp_t id)
Reference-counted "ungate this peripheral" request.
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
ra8_mstp_t
Packed (reg << 8) | bit module-stop identifier.
@ k_ra8_mstp_canfd1
MSTPC26 CANFD1.
@ k_ra8_mstp_canfd0
MSTPC27 CANFD0.
Scoped PRCR unlock helper.
#define RA8_PROTECTED_WRITE(unlock_val)
Scoped PRCR unlock block.
System Control (SYSC) register layout for the Renesas RA8D2.
@ k_ra8_prcr_unlock_cgc
RA8 prcr unlock cgc.
static volatile uint8_t * ra8_sys_canfdckcr(void)
Get pointer to the 8-bit CANFDCKCR (CANFD core clock source select).
@ k_ra8_usbckcr_bit_srdy
USBCKSRDY – handshake ready.
@ k_ra8_usbckcr_bit_sreq
USBCKSREQ – request switch.
static volatile uint8_t * ra8_sys_canfdckdivcr(void)
Get pointer to the 8-bit CANFDCKDIVCR (CANFD core clock divider).
volatile uint32_t ERFL
+0x00C Channel Error Flag.
volatile uint32_t CTR
+0x004 Channel Control.
volatile uint32_t STS
+0x008 Channel Status.
volatile uint32_t P1
+0x00C GAFLFDP.
volatile uint32_t M
+0x004 GAFLIDM + GAFLIFL1 + GAFLRTRM + IDEM.
volatile uint32_t P0
+0x008 GAFLDLC + GAFLIFL0 + GAFLRMDP + ...
volatile uint32_t ID
+0x000 GAFLID + GAFLLB + GAFLRTR + GAFLIDE.
volatile uint32_t CFDGAFLECTR
CFDGAFLECTR register (offset 0x028).
volatile uint32_t CFDGSTS
CFDGSTS register (offset 0x01C).
volatile uint32_t CFDGFDCFG
CFDGFDCFG register (offset 0x0B0).
volatile uint32_t CFDGCTR
CFDGCTR register (offset 0x018).
r_canfd_cfdgafl_t CFDGAFL[k_ra8_canfd_afl_page_size]
CFDGAFL register (offset 0x120 (0x100)).
volatile uint32_t CFDRFCC[k_ra8_canfd_rx_fifo_count]
CFDRFCC register (offset 0x03C..0x043).
r_canfd_cfdc_t CFDC[1]
CFDC register.
volatile uint32_t CFDGAFLCFG0
CFDGAFLCFG0 register (offset 0x02C).