78static const char*
s_tag =
"RMAC";
81typedef enum : uint32_t {
90typedef enum : uint32_t {
105typedef enum : uint8_t {
196 if (eswclk_hz == 0U) {
204 uint32_t psmcs = ((eswclk_hz / mdc_hz) / 2U);
253 return pis | lsc | pipp | psmcs_field;
336#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
338 if (ra8_fake_mmio_wait_eval(®->
MPSM, i, done)) {
393 uint32_t mff_bit = 0UL;
395 mff_bit = (1UL << 2U);
507 s_slots[(uint8_t)port].cb =
nullptr;
508 s_slots[(uint8_t)port].ctx =
nullptr;
510 s_slots[(uint8_t)port].in_use = 1U;
543 s_slots[(uint8_t)port].cb =
nullptr;
544 s_slots[(uint8_t)port].ctx =
nullptr;
545 s_slots[(uint8_t)port].in_use = 0U;
594 const uint32_t mrmac0 =
597 const uint32_t mrmac1 =
617 s_slots[(uint8_t)port].cached_filter = filter;
658 if (min_size > max_size) {
741 uint32_t meeec = 0UL;
757 uint32_t v = reg->
MRGC;
805 const uint32_t existing_psmcs =
940 s_slots[(uint8_t)port].cb = cb;
941 s_slots[(uint8_t)port].ctx = ctx;
953 const uint32_t err = reg->
MEIS;
954 const uint32_t m0 = reg->
MMIS0;
955 const uint32_t m1 = reg->
MMIS1;
956 const uint32_t m2 = reg->
MMIS2;
958 void*
const ctx =
s_slots[(uint8_t)port].ctx;
969 fn(ctx, port, err, m0, m1, m2);
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).
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_err_hw_timeout
Hardware timed out waiting for a flag or handshake.
@ 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.
static bool internal_port_ok(ra8_etha_port_t port)
Range-check a port argument.
Ethernet controller base addresses for the Renesas RA8D2.
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_clear32(volatile const uint32_t *reg, uint32_t mask, uint32_t budget)
Spin until (*reg & mask) == 0 or budget runs out.
Shared CPU-intrinsic seam for the HAL drivers (host/target split).
static void ra8_hw_dsb(void)
Data Synchronisation Barrier (full system).
static ra8_isr_slot_t s_slots[k_ra8_isr_slot_count]
Per-slot dispatch table.
Lightweight Logging Interface for ra8-firmware.
#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.
Module Stop Control (MSTP) register layout for the Renesas RA8D2.
@ k_ra8_mstp_eswm
MSTPC30 ESWM.
ra8_rmac_bit_pos_t
Bit positions for register fields not covered by the register-header enum file.
@ k_ra8_rmac_shift_mpfc_te1
MPFC.TEF1 (PTP table entry 1 enable).
@ k_ra8_rmac_shift_mtpfc2_pfm
MTPFC2.PFM (1 = PFC frame, 0 = pause).
@ k_ra8_rmac_shift_mpfc_te0
MPFC.TEF0 (PTP table entry 0 enable).
@ k_ra8_rmac_shift_mtpfc_pfrlv
MTPFC.PFRLV[31:27] retry-level field.
ra8_rmac_internal_t
Driver-private constants (poll budgets, sentinel values).
@ k_ra8_rmac_mdio_poll_budget
Bounded MDIO poll loop.
ra8_err_t ra8_rmac_mdio_c45_read(ra8_rmac_port_t port, uint8_t phy_addr, uint8_t dev_addr, uint16_t reg_addr, uint16_t *out_value)
Trigger an MDIO Clause-45 register read.
static uint32_t internal_make_mpic(ra8_rmac_pis_t iface, ra8_rmac_lsc_t speed, ra8_rmac_duplex_t duplex, uint32_t psmcs)
Build the MPIC value from interface / speed / duplex inputs.
ra8_err_t ra8_rmac_set_vlan_framing(ra8_rmac_port_t port, bool disable_pad, bool use_mcrc)
Configure VLAN double-tagging behaviour via MTFFC.
ra8_err_t ra8_rmac_enter_stop(ra8_rmac_port_t port)
Enter low-power "stop" by disabling RX address filtering.
ra8_err_t ra8_rmac_set_magic_packet(ra8_rmac_port_t port, bool enable)
Enable / disable magic-packet wake-on-LAN detection.
static void internal_program_irq_block(volatile r_rmac_regs_t *reg, const ra8_rmac_config_t *cfg)
Reset/disable every IRQ status + enable register.
ra8_err_t ra8_rmac_exit_stop(ra8_rmac_port_t port)
Exit low-power "stop" by reasserting the saved RX filter.
ra8_err_t ra8_rmac_attach_handler(ra8_rmac_port_t port, ra8_rmac_event_fn_t cb, void *ctx)
Attach a per-port IRQ handler for RMAC events.
ra8_err_t ra8_rmac_mdio_c45_write(ra8_rmac_port_t port, uint8_t phy_addr, uint8_t dev_addr, uint16_t reg_addr, uint16_t value)
Trigger an MDIO Clause-45 register write.
rmac_field_t
RMAC field constants.
@ k_rmac_pfrlv_mask
5-bit pause-frame retry level.
@ k_rmac_pipp_pos
PIPP (in-pause) bit position.
ra8_err_t ra8_rmac_set_rx_filter(ra8_rmac_port_t port, ra8_rmac_mrafc_t filter)
Program the RX address filter mask (MRAFC).
static ra8_err_t internal_mdio_drain(volatile r_rmac_regs_t *reg)
Drain any in-flight MDIO transaction (poll MPSM.PSME -> 0).
ra8_err_t ra8_rmac_set_pause_frame(ra8_rmac_port_t port, ra8_rmac_pause_mode_t mode, uint16_t pause_time, uint8_t retry_time, uint8_t retry_level)
Program a TX pause / PFC frame template.
static ra8_err_t internal_mdio_wait(volatile r_rmac_regs_t *reg, uint32_t mask)
Wait for an MDIO transaction to complete, with a bounded poll budget.
ra8_err_t ra8_rmac_set_lpi(ra8_rmac_port_t port, bool enable)
Enable / disable Energy Efficient Ethernet LPI request.
ra8_err_t ra8_rmac_deinit(ra8_rmac_port_t port)
Tear down an RMAC port.
static void internal_program_mac_config(volatile r_rmac_regs_t *reg, const ra8_rmac_config_t *cfg)
Reset every per-MAC config register to its post-init baseline.
ra8_err_t ra8_rmac_mdio_c22_write(ra8_rmac_port_t port, uint8_t phy_addr, uint8_t reg_addr, uint16_t value)
Trigger an MDIO Clause-22 register write on the off-chip PHY.
static void internal_mpsm_issue(volatile r_rmac_regs_t *reg, uint8_t pda_5bit, uint8_t pra_5bit, ra8_rmac_mdio_op_t op, uint16_t prd_16bit, bool mff)
Issue a raw MPSM transaction.
static uint32_t internal_calc_psmcs(uint32_t eswclk_hz, uint32_t mdc_hz)
Compute the MPIC.PSMCS divider code for a target MDC rate.
ra8_err_t ra8_rmac_set_link(ra8_rmac_port_t port, ra8_rmac_pis_t iface, ra8_rmac_lsc_t speed, ra8_rmac_duplex_t duplex)
Configure the link layer (interface, speed, duplex) atomically.
ra8_err_t ra8_rmac_set_frame_size(ra8_rmac_port_t port, bool is_pframe, uint16_t min_size, uint16_t max_size)
Configure jumbo-frame minimum / maximum sizes.
static bool internal_pis_ok(ra8_rmac_pis_t iface)
Validate an MPIC.PIS interface selector.
ra8_err_t ra8_rmac_mdio_c22_read(ra8_rmac_port_t port, uint8_t phy_addr, uint8_t reg_addr, uint16_t *out_value)
Trigger an MDIO Clause-22 register read on the off-chip PHY.
ra8_err_t ra8_rmac_set_ptp_filter(ra8_rmac_port_t port, uint8_t index, uint8_t byte_offset, uint8_t value, bool tef0, bool tef1)
Program a PTP-frame filter table entry (MPFCt, t = 0..15).
ra8_err_t ra8_rmac_init(ra8_rmac_port_t port, const ra8_rmac_config_t *cfg)
Initialise an RMAC port (MSTP gate + reset regs + filter mode).
ra8_err_t ra8_rmac_set_loopback(ra8_rmac_port_t port, bool enable)
Enable / disable internal MAC loopback.
ra8_err_t ra8_rmac_set_pfc_group(ra8_rmac_port_t port, ra8_rmac_pfc_group_t group, uint8_t pcp_mask)
Configure a PFC (802.1Qbb) priority group bitmap.
void ra8_rmac_dispatch(ra8_rmac_port_t port)
Dispatch a pending RMAC IRQ.
ra8_err_t ra8_rmac_set_mac_address(ra8_rmac_port_t port, const uint8_t mac[k_ra8_rmac_mac_byte_count])
Program the reception MAC address (MRMAC0 / MRMAC1).
Per-port Ethernet MAC (RMAC) driver – HUM Ch 33.
void(* ra8_rmac_event_fn_t)(void *ctx, ra8_rmac_port_t port, uint32_t err_msk, uint32_t mon0_msk, uint32_t mon1_msk, uint32_t mon2_msk)
Per-port RMAC IRQ callback.
@ k_ra8_rmac_mdc_default_hz
1 MHz MDC – well below the 2.5 MHz ceiling.
@ k_ra8_rmac_mdc_psmcs_max
MPIC.PSMCS[22:16] is 7 bits wide.
Ethernet MAC (RMAC) per-port register layout for the RA8D2.
@ k_ra8_rmac_mac_byte_count
Bytes in a unicast MAC.
ra8_rmac_pfc_group_t
PFC priority group index (MTPFC3t, t = 0..1).
@ k_ra8_rmac_pfc_group_count
RA8 rmac pfc group count.
ra8_rmac_mrafc_t
MRAFC reception address filter mode bits (HUM Ch 33.4).
@ k_ra8_rmac_ptp_filter_count
16 filter entries total.
@ k_ra8_rmac_mtffc_fcm
Frame-check mode (mCRC vs CRC).
@ k_ra8_rmac_mtffc_dpad
Disable padding.
@ k_ra8_rmac_meeec_lpitr
LPI transmit request.
ra8_rmac_pis_t
Physical interface selector for MPIC.PIS[2:0].
@ k_ra8_rmac_pis_mii
MII (000b) – internal xMII for 10/100 Mbps.
@ k_ra8_rmac_pis_gmii
GMII (010b) – internal xMII for 1 Gbps.
@ k_ra8_rmac_mac_byte_0
First byte (high octet, OUI).
@ k_ra8_rmac_mac_byte_2
RA8 rmac MAC byte 2.
@ k_ra8_rmac_mac_byte_4
RA8 rmac MAC byte 4.
@ k_ra8_rmac_mac_byte_3
RA8 rmac MAC byte 3.
@ k_ra8_rmac_mac_byte_1
RA8 rmac MAC byte 1.
@ k_ra8_rmac_mac_byte_5
Last byte (low octet).
@ k_ra8_rmac_mrgc_mpde
Magic-packet detect enable.
ra8_rmac_lsc_t
Link-speed selector for MPIC.LSC[5:3] (HUM Ch 33.4).
@ k_ra8_rmac_lsc_count
Sentinel.
ra8_rmac_pause_mode_t
Selects PFM bit in MTPFC2 – pause vs PFC frame.
@ k_ra8_rmac_pause_mode_pfc
IEEE 802.1Qbb PFC frame.
ra8_rmac_mdio_op_t
MPSM.POP[14:13] PHY MDIO operation selector.
@ k_ra8_rmac_mdio_op_c45_write
01 – C45 write.
@ k_ra8_rmac_mdio_op_c45_read
11 – C45 read.
@ k_ra8_rmac_mdio_op_c22_read
10 – C22 read.
@ k_ra8_rmac_mdio_op_c22_write
01 – C22 write.
@ k_ra8_rmac_mdio_op_c45_address
00 – C45 address.
@ k_ra8_rmac_mlbc_lbme
Loopback mode enable.
static volatile r_rmac_regs_t * ra8_rmac(ra8_rmac_port_t port)
Compile-time check that the RMAC register window matches FSP.
ra8_rmac_port_t
RMAC port index (m = 0, 1).
@ k_ra8_rmac_port_count
Number of RMAC ports.
ra8_rmac_duplex_t
Duplex selection (programmed via MPIC.PIPP / MPIC.PIP).
@ k_ra8_rmac_duplex_full
Full duplex.
@ k_ra8_rmac_mask_mtpfc_pfrt
MTPFC.PFRT[23:16].
@ k_ra8_rmac_mask_all
Wildcard write.
@ k_ra8_rmac_mask_mpsm_data
MPSM.PRD[31:16].
@ k_ra8_rmac_mask_mrfsc
16-bit frame size.
@ k_ra8_rmac_mask_mpsm_phy_reg
5-bit PHY reg/dev.
@ k_ra8_rmac_mask_mpic_lsc
MPIC.LSC[5:3].
@ k_ra8_rmac_mask_mpic_pis
MPIC.PIS[2:0].
@ k_ra8_rmac_mask_mrmac0_mau
MRMAC0.MAU valid.
@ k_ra8_rmac_mask_mpsm_op
MPSM.POP[14:13].
@ k_ra8_rmac_mask_pfc_priority
8-bit prio bitmap.
@ k_ra8_rmac_mask_mtpfc_pt
MTPFC.PT[15:0].
@ k_ra8_rmac_mask_mpic_psmcs
MPIC.PSMCS[22:16].
@ k_ra8_rmac_mask_byte
One MAC octet.
@ k_ra8_rmac_mpsm_psme
PHY Station Management Enable / busy.
@ k_ra8_rmac_mmis1_pwacs
PHY write access complete.
@ k_ra8_rmac_mmis1_paacs
PHY address access cmpl.
@ k_ra8_rmac_mmis1_pracs
PHY read access complete.
@ k_ra8_rmac_shift_mpic_pis
MPIC.PIS[2:0].
@ k_ra8_rmac_shift_byte2
Third byte position.
@ k_ra8_rmac_shift_mrfsce_max
MRFSCE.EMXS[15:0].
@ k_ra8_rmac_shift_byte1
Second byte position.
@ k_ra8_rmac_shift_mpsm_pda
MPSM.PDA[7:3].
@ k_ra8_rmac_shift_mtpfc_pfrt
MTPFC.PFRT[23:16].
@ k_ra8_rmac_shift_high16
MRMAC0.MAU low half.
@ k_ra8_rmac_shift_mrfsce_min
MRFSCE.EMNS[31:16].
@ k_ra8_rmac_shift_mpfc_val
MPFCt.PFBV[15:8].
@ k_ra8_rmac_shift_mpic_psmcs
MPIC.PSMCS[22:16].
@ k_ra8_rmac_shift_byte0
First byte position.
@ k_ra8_rmac_shift_mtpfc_pt
MTPFC.PT[15:0].
@ k_ra8_rmac_shift_mpsm_prd
MPSM.PRD[31:16].
@ k_ra8_rmac_shift_mpic_lsc
MPIC.LSC[5:3].
@ k_ra8_rmac_shift_mpsm_pra
MPSM.PRA[12:8].
@ k_ra8_rmac_shift_high24
MRMAC0.MAU high half.
@ k_ra8_rmac_shift_mpsm_pop
MPSM.POP[14:13].
@ k_ra8_rmac_shift_byte3
Fourth byte position.
Full RMAC per-port register window (HUM Ch 33.3, FSP R_RMAC0_Type).
volatile uint32_t MMID0
+0x0218 Monitor Disable 0.
volatile uint32_t MMIE2
+0x0234 Monitor Enable 2.
volatile uint32_t MMIS0
+0x0210 Monitor Status 0.
volatile uint32_t MMID2
+0x0238 Monitor Disable 2.
volatile uint32_t MTPFC
+0x0024 TX Pause/PFC Frame Cfg.
volatile uint32_t MTFFC
+0x0020 TX Frame Format Cfg.
volatile uint32_t MEEEC
+0x0184 EEE Configuration.
volatile uint32_t MRGC
+0x0080 RX General Cfg.
volatile uint32_t MEIS
+0x0200 Error IRQ Status.
volatile uint32_t MMIE0
+0x0214 Monitor Enable 0.
volatile uint32_t MPFC[k_ra8_rmac_ptp_filter_count]
+0x0100..0x013C
volatile uint32_t MRFSCP
+0x00A0 RX Frame Size Cfg P.
volatile uint32_t MRMAC1
+0x0088 RX MAC Address 1.
volatile uint32_t MEID
+0x0208 Error IRQ Disable.
volatile uint32_t MPSM
+0x0000 PHY Station Mgmt.
volatile uint32_t MLBC
+0x0188 Loopback Cfg.
volatile uint32_t MMIS2
+0x0230 Monitor Status 2.
volatile uint32_t MMIS1
+0x0220 Monitor Status 1.
volatile uint32_t MTPFC2
+0x0028 TX Pause/PFC Frame Cfg2.
volatile uint32_t MMID1
+0x0228 Monitor Disable 1.
volatile uint32_t MRAFC
+0x008C RX Address Filter Cfg.
volatile uint32_t MMIE1
+0x0224 Monitor Enable 1.
volatile uint32_t MRMAC0
+0x0084 RX MAC Address 0.
volatile uint32_t MTPFC3[k_ra8_rmac_pfc_group_count]
+0x0030..0x0034
volatile uint32_t MIOC
+0x0010 I/O Configuration.
volatile uint32_t MEIE
+0x0204 Error IRQ Enable.
volatile uint32_t MRFSCE
+0x009C RX Frame Size Cfg E.
volatile uint32_t MPIC
+0x0004 PHY Interfaces Cfg.
Per-port RMAC configuration knobs.
uint32_t mon0_irq_enable
Bits to OR into MMIE0.
uint32_t mon2_irq_enable
Bits to OR into MMIE2.
ra8_rmac_lsc_t link_speed
Initial MPIC.LSC encoding.
uint32_t eswclk_hz
Live ESWCLK frequency in Hz (input to the MDC divider).
ra8_rmac_mrafc_t rx_filter
Initial MRAFC mask.
ra8_rmac_duplex_t duplex
Initial MPIC.PIPP encoding.
uint32_t mdc_hz
Target MDC (PHY station-management clock) frequency in Hz.
uint32_t mon1_irq_enable
Bits to OR into MMIE1.
ra8_rmac_pis_t phy_interface
Initial MPIC.PIS encoding.
uint32_t err_irq_enable
Bits to OR into MEIE on init.
void * ctx
Opaque cookie passed to cb.
uint8_t in_use
1 once init succeeds, 0 after deinit
ra8_rmac_event_fn_t cb
Attached callback (nullptr).
ra8_rmac_mrafc_t cached_filter
Last filter for stop/exit.