95 for (uint32_t i = 0U; i < limit; ++i) {
150 for (uint32_t i = 0U; i < limit; ++i) {
205 for (uint32_t i = 0U; i < limit; ++i) {
307#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
313uint8_t g_ra8_flash_maci_cmd8_log[k_ra8_flash_maci_log_cap];
314uint32_t g_ra8_flash_maci_cmd8_len;
315uint16_t g_ra8_flash_maci_cmd16_log[k_ra8_flash_maci_log_cap];
316uint32_t g_ra8_flash_maci_cmd16_len;
318void ra8_flash_internal_maci_log_reset(
void)
320 g_ra8_flash_maci_cmd8_len = 0U;
321 g_ra8_flash_maci_cmd16_len = 0U;
345#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
346 if (g_ra8_flash_maci_cmd8_len < (uint32_t)k_ra8_flash_maci_log_cap) {
347 g_ra8_flash_maci_cmd8_log[g_ra8_flash_maci_cmd8_len] = byte;
348 g_ra8_flash_maci_cmd8_len++;
373#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
374 if (g_ra8_flash_maci_cmd16_len < (uint32_t)k_ra8_flash_maci_log_cap) {
375 g_ra8_flash_maci_cmd16_log[g_ra8_flash_maci_cmd16_len] = half;
376 g_ra8_flash_maci_cmd16_len++;
400 const uint32_t mrcfreq_word =
405 const uint32_t mrefreq_word =
410 uint16_t mrceecc_bits = 0U;
417 uint16_t mrcdecc_bits = 0U;
507 bool prefetch =
true;
549 if (win_low == 0U && win_high == 0U) {
552 const uintptr_t end_excl = (uintptr_t)((uint64_t)addr + (uint64_t)len);
553 if (addr < win_low) {
556 if (end_excl > win_high) {
630 const uint32_t end_excl =
631 (uint32_t)((uint64_t)mram_addr + (uint64_t)len);
639 if ((mram_addr & ~page_mask) != ((end_excl - 1U) & ~page_mask)) {
689 volatile uint8_t* dst = (
volatile uint8_t*)(uintptr_t)mram_addr;
690 for (uint32_t i = 0U; i < len; ++i) {
694 __asm__
volatile(
"" :::
"memory");
741 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
742 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
743 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU, 0xFFU,
755 if (permanent && !lock) {
802 const uint16_t v = *entry_reg;
804#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
805 ready = ra8_fake_mmio_poll(entry_reg, i, ready);
822 const uint16_t v = *entry_reg;
824#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
825 ready = ra8_fake_mmio_poll(entry_reg, i, ready);
846 const uint16_t v = *entry_reg;
848#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
849 ready = ra8_fake_mmio_poll(entry_reg, i, ready);
868 const uint16_t v = *entry_reg;
870#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
871 ready = ra8_fake_mmio_poll(entry_reg, i, ready);
885 if ((addr < code_lo) || (addr >= code_hi)) {
891 k_ra8_mrcbprot_key_byte_mask = 0xFF00U,
892 k_ra8_mrcbprot_key_ns = 0x8800U,
893 k_ra8_mrcbprot_key_s = 0x4400U,
896 k_ra8_mrcbprot_secure_bit = 0x00080000UL,
898 const uint16_t key = (uint16_t)(lock_bits & k_ra8_mrcbprot_key_byte_mask);
899 const bool key_ns = (key == k_ra8_mrcbprot_key_ns);
900 const bool key_s = (key == k_ra8_mrcbprot_key_s);
901 if (!key_ns && !key_s) {
905 const bool is_secure = ((addr & (uintptr_t)k_ra8_mrcbprot_secure_bit) != 0U);
Annotation-attribute framework macros for ra8-firmware.
#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_VALIDATE_INIT(initialized, tag, message)
Precondition: module must be initialized.
#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_out_of_range
Sensor or peripheral output out of valid range.
@ 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.
@ k_ra8_err_hw_error
Generic hardware fault detected (error flag set, fault interrupt).
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
bool priv_ra8_flash_internal_window_allows_pure(uintptr_t addr, uint32_t len, uintptr_t win_low, uintptr_t win_high)
Pure (state-free) window allow/deny predicate – see priv_ra8_flash_internal_window_allows_pure in ra8...
ra8_err_t ra8_flash_init(const ra8_flash_cfg_t *cfg)
Initialise the MRAM controller for safe read access.
void priv_ra8_flash_internal_maci_cmd8(uint8_t byte)
Send a single byte through the MACI command-issuing area.
ra8_err_t ra8_flash_write_block(uint32_t mram_addr, const uint8_t *src, uint32_t len, ra8_flash_world_t world)
Program 1..32 contiguous bytes into one MRAM page.
ra8_err_t ra8_flash_erase_block(uint32_t mram_addr, ra8_flash_world_t world)
Erase (= program to all 0xFF) one 32-byte MRAM block.
ra8_flash_runtime_t g_flash_rt
Single shared ra8_flash runtime-state instance.
ra8_err_t ra8_flash_lock_set(uintptr_t addr, uint16_t lock_bits)
Programme MRCBPROT0/1 lock bits at addr.
static ra8_err_t internal_flash_program_window(uint32_t mram_addr, const uint8_t *src, uint32_t len, ra8_flash_world_t world)
Steps 2-6 of the HUM block-write sequence.
ra8_err_t ra8_flash_reset(void)
Reset the MRAM peripheral and clear status.
ra8_err_t ra8_flash_suspend(void)
Pause an in-flight MRAM program/erase operation.
void priv_ra8_flash_internal_set_prefetch(bool enable)
Set MRCPFB.MPFBEN to enable/disable the prefetch buffer.
ra8_err_t priv_ra8_flash_internal_wait_mrdy(uint32_t limit)
Spin until MSTATR.MRDY rises or limit elapses.
ra8_err_t ra8_flash_set_rww_disable(bool disable)
Disable the read-while-write prefetch buffer.
ra8_err_t priv_ra8_flash_internal_wait_buffer_ready_call(uint32_t limit)
Test-access wrapper for internal_wait_buffer_ready.
bool priv_ra8_flash_internal_window_allows(uintptr_t addr, uint32_t len)
Test whether [addr, addr+len) lies inside the configured soft window.
static ra8_err_t internal_wait_buffer_ready(uint32_t limit)
Wait for MRCPS.PRGBSYC = 0 and ABUFFULL = 0 (buffer ready).
void priv_ra8_flash_internal_maci_cmd16(uint16_t half)
Send a halfword through the MACI command-issuing area.
ra8_err_t ra8_flash_get_status(uint8_t *out_status)
Snapshot the program-status register.
static ra8_err_t internal_validate_write_block(uint32_t mram_addr, uint32_t len)
Validate the write_block destination range and alignment.
static ra8_err_t internal_wait_commit_done(uint32_t limit)
Wait for MRCPS.ABUFEMP = 1 and PRGBSYC = 0 (commit done).
ra8_err_t priv_ra8_flash_internal_wait_commit_done_call(uint32_t limit)
Test-access wrapper for internal_wait_commit_done.
ra8_err_t ra8_flash_get_extended_status(ra8_flash_status_ext_t *out)
Snapshot every status register the HUM exposes.
ra8_err_t ra8_flash_enter_pe_mode(void)
Enter MRAM P/E mode.
const char * g_flash_tag
Shared log tag string for the ra8_flash module.
ra8_err_t ra8_flash_resume(void)
Resume a previously-paused MRAM operation.
ra8_err_t ra8_flash_block_protect_set(ra8_flash_world_t world, bool lock, bool permanent)
Set or clear the per-world block-protection lock.
ra8_err_t ra8_flash_clear_status(uint8_t mask)
Clear sticky program-error bits in MRCPS.
static void internal_set_program_gate(ra8_flash_world_t world, bool enable)
Open or close the per-world program-control gate.
ra8_err_t ra8_flash_force_stop(void)
Issue the MACI forced stop command.
ra8_err_t ra8_flash_deinit(void)
Deinitialise: lock all program gates and re-enable prefetch.
ra8_err_t ra8_flash_exit_pe_mode(void)
Exit MRAM P/E mode (return to read mode).
static void internal_set_hsp_mode(bool enable)
Toggle high-speed program mode (MRPSC.MHSPEN).
Code MRAM + Extra MRAM + Option-Setting driver – DANGEROUS, brick-capable.
Test-access surface for ra8_flash internal helpers (MC/DC).
@ k_ra8_flash_mrefreq_key
RA8 flash mrefreq key.
@ k_ra8_flash_mrcfreq_key
RA8 flash mrcfreq key.
@ k_ra8_flash_freq_key_shift
KEY[7:0] @ [31:24] in MRCFREQ/MREFREQ.
@ k_ra8_flash_pe_spin_limit
P/E entry spin limit.
@ k_ra8_flash_max_mrcfreq_mhz
MRCMHZ <= 250.
@ k_ra8_flash_maci_spin_limit
MACI command spin limit.
@ k_ra8_flash_max_mrefreq_mhz
MREMHZ <= 125.
@ k_ra8_flash_busy_spin_limit
Direct-write busy spin.
Flash / MRAM controller register layout for the Renesas RA8D2.
@ k_ra8_mrcbprot0_key_unlock
Cancel block protect.
@ k_ra8_mrcbprot0_key_lock
Keep block protect on.
@ k_ra8_mrcbprot1_key_lock
RA8 mrcbprot1 key lock.
@ k_ra8_mrcbprot1_key_unlock
RA8 mrcbprot1 key unlock.
static volatile uint8_t * ra8_mram_reg8(uint16_t off)
Pointer to a byte-wide MRMS register at offset off.
static volatile uint16_t * ra8_mram_cmd16(void)
Pointer to the MACI command-issuing area, halfword-wide.
static volatile uint8_t * ra8_mram_cmd8(void)
Pointer to the MACI command-issuing area, byte-wide.
@ k_ra8_mrcpc1_key_enable
RA8 mrcpc1 key enable.
@ k_ra8_mrcpc1_key_disable
RA8 mrcpc1 key disable.
@ k_ra8_mrceecc_mask_eccen
Encoder enable bit.
@ k_ra8_mrceecc_key_shift
Pre-shifted KEY[15:8]=0xC0.
@ k_ra8_mastat_mask_cmdlk
Command lock latched.
@ k_ra8_flash_code_size
1 MiB of code MRAM.
@ k_ra8_flash_code_start
Start of code MRAM region.
static volatile uint16_t * ra8_mram_reg16(uint16_t off)
Pointer to a halfword-wide MRMS register at offset off.
@ k_ra8_mrcflr_key_flush
RA8 mrcflr key flush.
@ k_ra8_mrcpc0_key_disable
RA8 mrcpc0 key disable.
@ k_ra8_mrcpc0_key_enable
RA8 mrcpc0 key enable.
@ k_ra8_mstatr_mask_mrdy
MRE ready.
@ k_ra8_mrpsc_mask_mhspen
High-speed program enable.
@ k_ra8_mentryr_mask_pcka
Pause / resume gate bit.
@ k_ra8_mentryr_mask_pe_mode
MENTRY status bit.
@ k_ra8_mentryr_pe_resume
KEY=0xAA, MENTRY=1, PCKA=0.
@ k_ra8_mentryr_pe_enter
KEY=0xAA, MENTRY=1.
@ k_ra8_mentryr_pe_pause
KEY=0xAA, MENTRY=1, PCKA=1.
@ k_ra8_mentryr_read_mode
KEY=0xAA, MENTRY=0.
static volatile uint32_t * ra8_mram_reg32(uint16_t off)
Pointer to a word-wide MRMS register at offset off.
@ k_ra8_maci_cmd_forced_stop
Abort in-flight command processing.
@ k_ra8_maci_cmd_status_clear
Clear the command-locked state.
@ k_ra8_mram_block_size_bytes
One programmable block.
@ k_ra8_mram_write_size_bytes
Minimum programmable unit.
@ k_ra8_mram_off_mentryr
RA8 MRAM off mentryr.
@ k_ra8_mram_off_mrcps
RA8 MRAM off mrcps.
@ k_ra8_mram_off_mrcfreq
RA8 MRAM off mrcfreq.
@ k_ra8_mram_off_mrefreq
RA8 MRAM off mrefreq.
@ k_ra8_mram_off_mrceecc
RA8 MRAM off mrceecc.
@ k_ra8_mram_off_mrcbprot1
RA8 MRAM off mrcbprot1.
@ k_ra8_mram_off_mrcflr
RA8 MRAM off mrcflr.
@ k_ra8_mram_off_mrcraes
RA8 MRAM off mrcraes.
@ k_ra8_mram_off_mrcpfb
RA8 MRAM off mrcpfb.
@ k_ra8_mram_off_mcmdr
RA8 MRAM off mcmdr.
@ k_ra8_mram_off_mrcdecc
RA8 MRAM off mrcdecc.
@ k_ra8_mram_off_mrcpc0
RA8 MRAM off mrcpc0.
@ k_ra8_mram_off_mrcbprot0
RA8 MRAM off mrcbprot0.
@ k_ra8_mram_off_mrezs
RA8 MRAM off mrezs.
@ k_ra8_mram_off_mrpsc
RA8 MRAM off mrpsc.
@ k_ra8_mram_off_mastat
RA8 MRAM off mastat.
@ k_ra8_mram_off_mrcpc1
RA8 MRAM off mrcpc1.
@ k_ra8_mram_off_mstatr
RA8 MRAM off mstatr.
@ k_ra8_mram_off_mreraes
RA8 MRAM off mreraes.
@ k_ra8_mrcdecc_mask_dececen
Decoder enable (ECCSELC).
@ k_ra8_mrcdecc_key_shift
Pre-shifted KEY[15:8]=0x8C.
@ k_ra8_mrcps_mask_errors
W1C: PRGERRC + ECCERRC.
@ k_ra8_mrcps_mask_prgbsyc
Code MRAM program busy.
@ k_ra8_mrcps_mask_abufemp
Address buffer empty.
@ k_ra8_mrcps_mask_abuffull
Address buffer full.
ra8_flash_world_t
Which secure-attribution gate to open for a write.
@ k_ra8_flash_world_s
Open MRCPC1 (secure half).
@ k_ra8_flash_world_ns
Open MRCPC0 (non-secure half).
Bounded wait-flag primitives for RA8D2 HAL drivers.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_warn(tag, message)
RA8 log warn.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
#define ra8_log_error_val(tag, message, value)
RA8 log error val.
Initialisation descriptor for ra8_flash_init.
uint8_t mrefreq_mhz
Extra MRAM clock in MHz, 0..0x07D (125 MHz).
bool prefetch_en
true -> leave prefetch enabled at init.
bool ecc_encoder_enable
true -> MRCEECC.ECCEN=1 (default).
uint16_t mrcfreq_mhz
Code MRAM clock in MHz, 0..0x0FA (250 MHz).
bool ecc_decoder_enable
true -> MRCDECC.DECECEN=1 (default).
File-scope runtime state shared across the ra8_flash TUs.
Extended status snapshot (MRCPS + MSTATR + MASTAT + MREZS).
uint8_t mrcps
MRCPS bits (HUM Ch 59 p 3601).
uint32_t mstatr
MSTATR bits (HUM Ch 59 p 3578).
uint8_t mastat
MASTAT bits (HUM Ch 59 p 3577).
uint16_t mcmdr
MCMDR bits (HUM Ch 59 p 3589).
uint8_t mrezs
MREZS bits (HUM Ch 59 p 3565).