45static const char*
s_tag =
"CANFD";
58typedef enum : uint32_t {
66typedef enum : uint8_t {
103 if ((frame->
is_brs != 0U) && (frame->
is_fd == 0U)) {
179 if (frame->
is_fd != 0U) {
182 if (frame->
is_brs != 0U) {
218 enum : uint8_t { k_ra8_tmsts_tmtrf_done = 0x04U };
220#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
221 if (ra8_fake_mmio_wait_eval(
359 const uint32_t sts = reg->
CFDC[0].
STS;
static const char * s_tag
Logging / check tag.
Annotation-attribute framework macros for ra8-firmware.
#define RA8_INTERNAL
Marker that a function is intended to be static (file-local).
CANFD Lite driver (bit-timing, TX, RX, error state).
static void internal_write_tx_data(volatile r_canfd_t *reg, const ra8_canfd_frame_t *frame)
Copy the frame payload into CFDTM[0].DF[].
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.
static uint32_t internal_tx_id(const ra8_canfd_frame_t *frame)
Assemble the CFDTM[0].ID word (raw ID plus IDE flag).
ra8_canfd_buffer_idx_t
Indices the driver currently owns within the channel block.
@ k_ra8_canfd_tx_mb_default
Driver uses TX MB 0 for fire-and-forget.
@ k_ra8_canfd_rx_fifo_default
Driver uses RX FIFO 0 for poll-receive.
static uint32_t internal_tx_fdctr(const ra8_canfd_frame_t *frame)
Assemble the CFDTM[0].FDCTR word (FDF/BRS/ESI flags).
static void internal_wait_tx_complete(volatile r_canfd_t *reg)
Best-effort bounded spin until CFDTMSTSj.TMTRF reads "complete".
ra8_err_t ra8_canfd_receive(uint8_t channel, ra8_canfd_frame_t *out_frame)
Poll the RX FIFO for the next available frame.
static ra8_err_t internal_validate_frame(const ra8_canfd_frame_t *frame)
Range-check a ra8_canfd_frame_t against the protocol limits.
ra8_err_t ra8_canfd_get_error_state(uint8_t channel, uint8_t *tx_err, uint8_t *rx_err)
Read the TX and RX error counters.
static void internal_read_rx_data(volatile r_canfd_t *reg, ra8_canfd_frame_t *out)
Copy 64 bytes of RX FIFO data from CFDRF[0].DF[] into the caller buffer.
ra8_canfd_frame_spin_t
TX-completion poll budget owned by the frame data path.
@ k_ra8_canfd_tx_spin
TX-completion poll: 500 us @ 1 GHz / 5 cyc.
static void internal_decode_rx_header(uint32_t id_word, uint32_t ptr_word, uint32_t fdsts_word, ra8_canfd_frame_t *out)
Decode the raw CFDRF[0].ID/PTR/FDSTS into out.
CANFD controller register layout for the Renesas RA8D2.
@ k_ra8_canfd_fd_brs
BRS: bit-rate switch.
@ k_ra8_canfd_fd_fdf
FDF: frame is CAN-FD.
@ k_ra8_rfpctr_value_ack
Dummy write to pop entry.
@ k_ra8_canfd_dlc_max
4-bit DLC max value (64 bytes).
@ k_ra8_canfd_data_bytes_max
CAN-FD payload cap in bytes.
@ k_ra8_canfd_ptr_mask_dlc
4-bit DLC mask.
@ k_ra8_rfsts_bit_empty
RFEMP: FIFO empty flag.
@ k_ra8_canfd_tmc_txreq
TMTR: transmit request.
@ k_ra8_canfd_ptr_shift_dlc
DLC field shift.
@ k_ra8_cnsts_mask_tec
TEC field mask (post-shift).
@ k_ra8_cnsts_mask_rec
REC field mask (post-shift).
@ k_ra8_canfd_id_std_mask
11-bit standard ID.
@ k_ra8_canfd_id_ext_mask
29-bit extended ID.
@ k_ra8_canfd_id_ide
IDE: extended flag.
@ k_ra8_cnsts_bit_rec
REC[23:16] in STS.
@ k_ra8_cnsts_bit_tec
TEC[31:24] in STS.
static volatile r_canfd_t * ra8_canfd(uint8_t channel)
Get pointer to CANFD instance N (0..1).
Validation and Error-Checking Macros for ra8-firmware.
#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_no_data
No application data available (e.g.
@ 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.
Bounded wait-flag primitives for RA8D2 HAL drivers.
volatile uint32_t STS
+0x008 Channel Status.
volatile uint32_t PTR
+0x004 RFTS + RFDLC.
volatile uint8_t DF[k_ra8_canfd_data_bytes_max]
+0x00C 64-byte data field.
volatile uint32_t ID
+0x000 RFID + RFRTR + RFIDE.
volatile uint32_t FDSTS
+0x008 RFESI + RFBRS + RFFDF + ...
volatile uint32_t FDCTR
+0x008 TMESI + TMBRS + TMFDF + ...
volatile uint32_t PTR
+0x004 TMTS + TMDLC.
volatile uint8_t DF[k_ra8_canfd_data_bytes_max]
+0x00C 64-byte data field.
volatile uint32_t ID
+0x000 TMID + THLEN + TMRTR + IDE.
volatile uint32_t CFDRFPCTR[k_ra8_canfd_rx_fifo_count]
CFDRFPCTR reg (offset 0x04C..0x053).
volatile uint32_t CFDRFSTS[k_ra8_canfd_rx_fifo_count]
CFDRFSTS register (offset 0x044..0x04B).
volatile uint8_t CFDTMC[k_ra8_canfd_tx_mb_count]
CFDTMC register (offset 0x070).
r_canfd_cfdtm_t CFDTM[k_ra8_canfd_tx_mb_count]
CFDTM register (offset 0x604..0x733).
r_canfd_cfdrf_t CFDRF[k_ra8_canfd_rx_fifo_count]
CFDRF register (offset 0x520..0x5B7).
volatile uint8_t CFDTMSTS[k_ra8_canfd_tx_mb_count]
CFDTMSTS register (offset 0x074).
r_canfd_cfdc_t CFDC[1]
CFDC register.
A single CAN / CAN-FD frame as seen by the driver public API.
uint8_t is_fd
0 = classic CAN, 1 = CAN-FD.
uint8_t is_brs
1 = bit-rate switch in data phase.
uint32_t id
Arbitration-ID field.
uint8_t dlc
DLC code (0..15).
uint8_t data[k_ra8_canfd_data_bytes_max]
Payload bytes.
uint8_t is_extended
0 = 11-bit ID, 1 = 29-bit ID.