51static const char*
s_tag =
"XSPI";
54typedef enum : uint32_t {
62typedef enum : uint8_t {
75typedef enum : uint8_t {
93typedef enum : uint32_t {
101typedef enum : uint8_t {
171typedef enum : uint8_t {
252#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
254 if (ra8_fake_mmio_poll(®->
INTS, i, cmdcmp)) {
420 for (uint32_t i = 0U; i < chunk; i++) {
421 const uint8_t cdbuf_word_idx =
425 const uint32_t word = reg->
CDBUF[cdbuf_word_idx];
426 buf[i] = (uint8_t)(word >> ((i % 4U) * 8U));
449 uint32_t chunk = len - off;
521 const uint8_t chunk =
610 uint32_t data_lo = 0U;
611 uint32_t data_hi = 0U;
612 for (uint32_t i = 0U; i < len; i++) {
613 const uint32_t shift = (uint32_t)((i % 4U) * 8U);
615 data_lo |= ((uint32_t)data[i]) << shift;
617 data_hi |= ((uint32_t)data[i]) << shift;
705 const uint32_t addr = flash_addr + off;
706 const uint32_t page_left =
708 uint32_t chunk = len - off;
712 if (chunk > page_left) {
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).
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_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_timeout
Operation exceeded its time budget.
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.
xSPI / Octo-SPI controller register layout for the Renesas RA8D2
@ k_ra8_xspi_cdt_trtype_read
Read transaction (host samples).
@ k_ra8_xspi_cdt_trtype_write
Write transaction (host drives).
@ k_ra8_xspi_ints_mask_cmdcmp
CMDCMP – command complete.
@ k_ra8_xspi_cdt_addsize_3
3-byte address (24-bit JEDEC).
@ k_ra8_xspi_cdt_addsize_0
No address phase (e.g.
@ k_ra8_xspi_cdt_pos_datasize
DATASIZE[8..5] data bytes.
@ k_ra8_xspi_cdt_pos_cmd
CMD[31..16] JEDEC opcode.
@ k_ra8_xspi_cdt_pos_cmdsize
CMDSIZE[1..0] command bytes.
@ k_ra8_xspi_cdt_pos_trtype
TRTYPE[15] 0=read 1=write.
@ k_ra8_xspi_cdt_pos_addsize
ADDSIZE[4..2] address bytes.
@ k_ra8_xspi_cdt_mask_addsize
ADDSIZE field is 3 bits.
@ k_ra8_xspi_cdt_mask_datasize
DATASIZE field is 4 bits.
@ k_ra8_xspi_cdt_mask_trtype
TRTYPE field is 1 bit.
@ k_ra8_xspi_cdt_mask_cmdsize
CMDSIZE field is 2 bits.
@ k_ra8_xspi_cdt_mask_cmd
CMD[31..16] is a 16-bit field.
@ k_ra8_xspi_cdctl0_mask_trreq
TRREQ (kick off xfer).
static volatile r_xspi_regs_t * ra8_xspi(uint8_t instance)
Get pointer to xSPI instance N (0..1).
@ k_ra8_xspi_page_len
Page size of standard NOR flash parts.
@ k_ra8_xspi_max_xfer
Maximum bytes per flash read/program call.
@ k_ra8_xspi_cdt_cmdsize_1
1-byte command (standard SPI).
xSPI / Octo-SPI driver (flash read/program/erase + ID/status)
static ra8_err_t internal_flash_stage_program(volatile r_xspi_regs_t *reg, uint32_t flash_addr, uint32_t len)
Stage WREN + page-program header (CDT + CDA only) without kicking.
ra8_spi_flash_resp_bytes_t
Per-opcode response-byte counts for read-direction commands.
@ k_ra8_xspi_resp_bytes_jedec
RDID returns MFR+TYPE+CAP.
@ k_ra8_xspi_resp_bytes_status
RDSR returns 1 status byte.
static void internal_build_chunk_header(volatile r_xspi_regs_t *reg, uint8_t opcode, uint32_t addr, uint8_t data_bytes, uint8_t is_write)
Build CDBUF[0] for a single CDD0/CDD1 chunk of an opcode + addr.
ra8_err_t priv_ra8_xspi_kick_command(volatile r_xspi_regs_t *reg)
Kick a prepared manual-command transfer by raising TRREQ.
static ra8_err_t internal_poll_wip_clear(uint8_t instance)
Poll the SPI-flash Status Register until Write-In-Progress clears.
ra8_err_t ra8_xspi_flash_program(uint8_t instance, uint32_t flash_addr, const uint8_t *data, uint32_t len)
Program (write) len bytes at flash_addr.
static void internal_xspi_stage_payload(volatile r_xspi_regs_t *reg, const uint8_t *data, uint32_t len)
Stage the page-program payload into CDBUF[CDD0] / CDBUF[CDD1].
xspi_mask_t
Low-byte mask for status/JEDEC-id extraction.
@ k_xspi_byte_mask
XSPI byte mask.
static ra8_err_t internal_wait_command_done(volatile r_xspi_regs_t *reg)
Wait for a manual XSPI command to retire, then clear its status bits.
ra8_err_t priv_ra8_xspi_issue_simple_opcode(volatile r_xspi_regs_t *reg, uint8_t opcode)
Build CDBUF[0] for a 1-byte opcode with no address / no data.
ra8_xspi_cdt_limits_t
Per-transaction byte-size limits encodable in CDT.
@ k_ra8_xspi_cdt_max_data_bytes
CDD0 + CDD1 = 8 bytes per slot.
ra8_spi_flash_op_t
Standard JEDEC NOR-flash command opcodes used by this driver.
@ k_ra8_spi_flash_op_page_program
0x02 page program.
@ k_ra8_spi_flash_op_read_id
0x9F JEDEC ID read.
@ k_ra8_spi_flash_op_read_status
0x05 read status reg.
@ k_ra8_spi_flash_op_read
0x03 normal read.
@ k_ra8_spi_flash_op_erase_sector
0x20 sector erase.
@ k_ra8_spi_flash_op_write_enable
0x06 WREN.
ra8_err_t ra8_xspi_flash_read(uint8_t instance, uint32_t flash_addr, uint8_t *buf, uint32_t len)
Read len bytes from external flash into buf.
static ra8_err_t internal_issue_read_opcode(volatile r_xspi_regs_t *reg, uint8_t opcode, uint8_t resp_bytes)
Issue a 1-byte opcode that returns 1..8 response data bytes.
static ra8_err_t internal_flash_program_chunk(volatile r_xspi_regs_t *reg, uint8_t instance, uint32_t flash_addr, const uint8_t *data, uint32_t chunk)
Program one page-program slot (<= 8 bytes) at flash_addr.
ra8_err_t ra8_xspi_flash_read_status(uint8_t instance, uint8_t *out_status)
Read the flash Status Register (opcode 0x05).
ra8_flash_status_bit_t
Bit positions in the SPI flash Status Register.
@ k_ra8_flash_status_bit_wip
Write-In-Progress (busy).
@ k_ra8_flash_status_bit_wel
Write Enable Latch.
ra8_xspi_addr_space_t
Reachable flash address space for the 3-byte JEDEC commands.
@ k_ra8_xspi_addr_space_3byte
2^24: 3-byte address limit.
ra8_err_t ra8_xspi_flash_erase_sector(uint8_t instance, uint32_t flash_addr)
Erase the 4 KiB sector containing flash_addr.
static ra8_err_t internal_flash_read_chunk(volatile r_xspi_regs_t *reg, uint32_t flash_addr, uint8_t *buf, uint32_t chunk)
Read one manual-command slot (<= 8 bytes) from flash into buf.
static ra8_err_t internal_flash_range_check(uint32_t flash_addr, uint32_t len)
Validate a [flash_addr, flash_addr + len) window against the 3-byte JEDEC address space.
ra8_err_t ra8_xspi_flash_read_id(uint8_t instance, uint32_t *out_id)
Read the JEDEC ID (opcode 0x9F), returning 24 bits in a uint32_t.
static uint32_t internal_make_cdt(uint8_t opcode, uint8_t cmd_bytes, uint8_t addr_bytes, uint8_t data_bytes, uint8_t is_write)
Encode a manual-command CDT word (opcode + size/type fields).
Module-private seam shared between the ra8_xspi translation units.
@ k_ra8_xspi_cdbuf_idx_data1
CDBUF[3] CDD1 – data bytes 4..7.
@ k_ra8_xspi_cdbuf_idx_data0
CDBUF[2] CDD0 – data bytes 0..3.
@ k_ra8_xspi_cdbuf_idx_cdt
CDBUF[0] CDT – type/opcode word.
@ k_ra8_xspi_cdbuf_idx_addr
CDBUF[1] CDA – flash address.
@ k_ra8_xspi_cmd_spin
CMDCMP poll budget for a single manual-command transfer.
@ k_ra8_flash_program_timeout_us
WIP-poll iteration cap for program / erase finish.
xSPI per-instance register window.
volatile uint32_t INTC
+0x194 Interrupt clear (W1C).
volatile uint32_t INTS
+0x190 Interrupt status (CMDCMP=b0).
volatile uint32_t CDCTL0
+0x070 Manual cmd ctl 0 (TRREQ/CSSEL)
volatile uint32_t CDBUF[16]
+0x080..+0x0BC Command buf (4x4 u32).