36static const char*
const s_tag =
"ra8_io_blockdev_xspi";
44typedef enum : uint32_t {
126 const uint32_t remaining = len - done;
127 const uint32_t chunk =
175 const uint32_t remaining = len - done;
176 const uint32_t chunk =
333 while (done < count) {
334 const uint32_t blk = lba + done;
336 const uint32_t sector_lba = blk - first_blk;
338 const uint32_t left = count - done;
339 const uint32_t n_blocks = (left < room) ? left : room;
399 while (blk < lba + count) {
505 uint32_t block_count,
525 "sector must equal blocks_per_sector * logical block size");
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_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
@ k_ra8_err_out_of_range
Sensor or peripheral output out of valid range.
@ 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.
void * memcpy(void *dst, const void *src, size_t n)
Copy memory area between non-overlapping regions.
ra8_io block-device fabric – one LBA vtable across every storage medium.
struct ra8_io_blockdev_iface ra8_io_blockdev_iface_t
@ k_ra8_io_erase_value_ones
Block reads back as 0xFF after erase.
@ k_ra8_io_block_size_bytes
Bytes per logical block (the only size).
Backend implementation contract for the ra8_io block-device fabric.
static ra8_err_t internal_xspi_get_caps(const void *ctx, ra8_io_blockdev_caps_t *out)
xSPI backend: report medium capabilities.
static ra8_err_t internal_xspi_program_chunked(uint8_t instance, uint32_t flash_addr, const uint8_t *data, uint32_t len)
Program len flash bytes at flash_addr, chunked to the HAL limit.
static ra8_err_t internal_xspi_write(void *ctx, uint32_t lba, uint32_t count, const uint8_t *buf)
xSPI backend: write count blocks from buf at lba.
static ra8_err_t internal_write_one_sector(const ra8_io_blockdev_xspi_state_t *st, uint32_t sector_lba, uint32_t first_blk, uint32_t n_blocks, const uint8_t *src)
Read-modify-write one 4 KiB sector, overlaying the touched blocks.
static ra8_err_t internal_xspi_read(void *ctx, uint32_t lba, uint32_t count, uint8_t *buf)
xSPI backend: read count blocks at lba into buf.
static ra8_err_t internal_xspi_erase(void *ctx, uint32_t lba, uint32_t count)
xSPI backend: erase sector-aligned count blocks at lba.
static const ra8_io_blockdev_iface_t s_xspi_iface
OSPI NOR backend vtable.
static ra8_err_t internal_xspi_read_chunked(uint8_t instance, uint32_t flash_addr, uint8_t *buf, uint32_t len)
Read len flash bytes at flash_addr, chunked to the HAL limit.
ra8_io_xspi_const_t
OSPI NOR backend layout constants.
@ k_xspi_zero_blocks
Sentinel for an empty block range.
@ k_xspi_blocks_per_sector
512-byte blocks per 4 KiB sector.
@ k_xspi_sector_bytes
Erase sector size in bytes.
@ k_xspi_min_instance
Lowest valid xSPI instance index.
@ k_xspi_program_bytes
NOR page-program granularity in bytes.
static ra8_err_t internal_xspi_bounds(const ra8_io_blockdev_xspi_state_t *st, uint32_t lba, uint32_t count)
Reject an out-of-range [lba, lba+count) block range.
ra8_err_t ra8_io_blockdev_xspi_init(ra8_io_blockdev_t *bd, ra8_io_blockdev_xspi_state_t *state, uint8_t instance, uint32_t base_off, uint32_t block_count, bool read_only)
Bind an OSPI NOR block-device backend into a caller-owned handle.
static uint8_t s_sector[k_xspi_sector_bytes]
Whole-sector read-modify-write scratch (zero-malloc, NASA Rule 3).
static ra8_err_t internal_xspi_check_geom(uint8_t instance, uint32_t base_off, uint32_t block_count)
Validate the window geometry for ra8_io_blockdev_xspi_init.
ra8_io block-device backend over OSPI NOR flash via ra8_xspi.
xSPI / Octo-SPI controller register layout for the Renesas RA8D2
@ k_ra8_xspi_max_xfer
Maximum bytes per flash read/program call.
@ k_ra8_xspi_instance_count
XSPI0 and XSPI1.
xSPI / Octo-SPI driver (flash read/program/erase + ID/status)
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.
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.
ra8_err_t ra8_xspi_flash_erase_sector(uint8_t instance, uint32_t flash_addr)
Erase the 4 KiB sector containing flash_addr.
Static properties a backend reports about its medium.
uint32_t erase_unit_blocks
Erase granularity, in logical blocks.
uint32_t block_count
Total addressable logical blocks.
bool must_erase_before_write
true => program needs a prior erase.
bool read_only
true => writes/erases are rejected.
uint8_t erase_value
Post-erase byte (ra8_io_erase_value_t).
uint16_t logical_block_bytes
Logical block size (always 512).
uint32_t program_size_bytes
Minimum program granularity in bytes.
Caller-allocated block-device handle binding a backend to its context.
const ra8_io_blockdev_iface_t * iface
Bound backend vtable (private).
void * ctx
Backend-private context (private).
Caller-owned private state for an OSPI NOR block device.
uint32_t base_off
Flash byte offset of logical block 0 (private).
bool read_only
true => writes and erases are rejected (private).
uint32_t block_count
Number of 512-byte logical blocks (private).
uint8_t instance
xSPI HAL instance index, 0 or 1 (private).