56static const char*
s_tag =
"SDHI";
82typedef enum : uint32_t {
102typedef enum : uint32_t {
202#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
203 if (ra8_fake_mmio_poll(®->
SD_INFO1,
209 if (out_rsp !=
nullptr) {
233 const uint32_t preserved =
274 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
282 const uint32_t cmd55_rsp = rsp[0];
291 const uint32_t acmd6_rsp = rsp[0];
299 if ((!app_cmd_ready) || (!acmd6_clean)) {
312 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
368 if (reg ==
nullptr) {
372 const uint32_t mask = reg->
SD_INFO1;
377 fn(ctx, instance, mask);
407typedef enum : uint32_t {
420typedef enum : uint32_t {
469#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
470 if (ra8_fake_mmio_poll(®->
SD_INFO1,
511 if (block_count > 1U) {
553 uint8_t* cursor = buf;
554 for (uint32_t w = 0U; w < words; ++w) {
557#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
558 if (ra8_fake_mmio_poll(®->
SD_INFO2,
570 const uint32_t word = reg->
SD_BUF0;
611 const uint8_t* cursor = buf;
612 for (uint32_t w = 0U; w < words; ++w) {
615#if defined(RA8_OFF_TARGET) && defined(UNIT_TEST)
616 if (ra8_fake_mmio_poll(®->
SD_INFO2,
666 if (block_count > 1U) {
680 if (block_count == 0U) {
705 if (block_count == 0U) {
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_not_supported
Requested feature not compiled in, not wired, or not supported by this MCU variant.
@ 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.
Bounded wait-flag primitives for RA8D2 HAL drivers.
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
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.
ra8_err_t ra8_mstp_disable(ra8_mstp_t id)
Reference-counted "gate this peripheral" request.
Module Stop Control (MSTP) register layout for the Renesas RA8D2.
ra8_mstp_t
Packed (reg << 8) | bit module-stop identifier.
@ k_ra8_mstp_sdhi1
MSTPC11 SDHI1.
@ k_ra8_mstp_sdhi0
MSTPC12 SDHI0.
static ra8_err_t internal_sdhi_send(volatile r_sdhi_regs_t *reg, uint32_t cmd, uint32_t arg)
Issue a data-transfer command and wait for RSPEND.
ra8_err_t ra8_sdhi_read_block(uint8_t instance, uint32_t lba, uint8_t *buf, uint32_t block_count)
Read one or more 512-byte SD blocks via the SD_BUF0 FIFO.
ra8_err_t ra8_sdhi_get_status(uint8_t instance, uint32_t *out_mask)
Read the SD_INFO1 status register.
static ra8_err_t internal_sdhi_drain(volatile r_sdhi_regs_t *reg, uint8_t *buf, uint32_t words)
Drain words 32-bit FIFO words from SD_BUF0 into buf.
ra8_sdhi_byte_split_t
Byte / shift constants for the 32-bit FIFO word splitter.
@ k_ra8_sdhi_shift_b1
bits 15..8 -> byte 1
@ k_ra8_sdhi_shift_b2
bits 23..16 -> byte 2
@ k_ra8_sdhi_byte_mask
low-byte select mask
@ k_ra8_sdhi_shift_b3
bits 31..24 -> byte 3
static void internal_sdhi_setup_xfer(volatile r_sdhi_regs_t *reg, uint32_t block_count)
Common data-phase setup shared by read_block / write_block.
ra8_err_t ra8_sdhi_write_block(uint8_t instance, uint32_t lba, const uint8_t *buf, uint32_t block_count)
Write one or more 512-byte SD blocks via the SD_BUF0 FIFO.
ra8_err_t ra8_sdhi_exit_stop(uint8_t instance)
Exit MSTP-gated stop.
static ra8_err_t internal_sdhi_fill(volatile r_sdhi_regs_t *reg, const uint8_t *buf, uint32_t words)
Push words 32-bit FIFO words from buf into SD_BUF0.
ra8_err_t ra8_sdhi_set_clock(uint8_t instance, uint32_t divider)
Set the SD bus clock divider (SD_CLK_CTRL).
ra8_err_t ra8_sdhi_send_command(uint8_t instance, uint32_t cmd, uint32_t arg, uint32_t *out_rsp)
Issue a single SD command and read the 4-word response.
ra8_sdhi_init_const_t
SDHI register-bring-up constants mirrored from FSP r_sdhi.c.
@ k_ra8_sdhi_soft_rst_release
release RST
@ k_ra8_sdhi_clk_ctrl_setting_mask
CLKSEL[7:0].
@ k_ra8_sdhi_clk_ctrl_clkctrlen_mask
SD_CLK_CTRL.CLKCTRLEN bit-9.
@ k_ra8_sdhi_clk_ctrl_clken_mask
SD_CLK_CTRL.CLKEN bit-8.
@ k_ra8_sdhi_clk_ctrl_default
CLKSEL=64, CLKEN/CLKCTRLEN=0.
@ k_ra8_sdhi_info1_rspend_mask
SD_INFO1.RSPEND bit-0.
@ k_ra8_sdhi_soft_rst_assert
drive RST low
void ra8_sdhi_dispatch(uint8_t instance)
Dispatch an SDHI event – snapshot status + fire callback.
static const ra8_mstp_t s_sdhi_mstp_table[k_ra8_sdhi_instance_count]
Per-instance MSTP id lookup.
static ra8_err_t internal_sdhi_finish_xfer(volatile r_sdhi_regs_t *reg, uint32_t block_count)
Tear down the data phase: optional CMD12 + flag cleanup.
static ra8_sdhi_event_fn_t s_sdhi_fn
ra8_sdhi_timing_t
Bounded spin budget for ra8_sdhi_send_command response wait.
@ k_ra8_sdhi_cmd_spin
RA8 SDHI cmd spin.
ra8_err_t ra8_sdhi_clear_status(uint8_t instance, uint32_t mask)
Clear SD_INFO1 status bits via write-0-to-clear.
ra8_err_t ra8_sdhi_attach_dma(uint8_t instance, uint8_t enable)
Enable or disable DMAC-driven SDHI transfers.
ra8_err_t ra8_sdhi_init(uint8_t instance)
Initialise an SDHI instance.
ra8_err_t ra8_sdhi_attach_handler(ra8_sdhi_event_fn_t fn, void *ctx)
Attach an SDHI event callback (shared across instances).
ra8_err_t ra8_sdhi_deinit(uint8_t instance)
Tear down an SDHI instance.
ra8_err_t ra8_sdhi_enter_stop(uint8_t instance)
Put an SDHI instance into MSTP-gated stop.
ra8_err_t ra8_sdhi_set_bus_width(uint8_t instance, ra8_sdhi_bus_width_t width)
Program the host-side SD data-bus width (SD_OPTION.WIDTH / WIDTH8).
ra8_sdhi_fifo_timing_t
Bounded spin budget for the per-word BRE / BWE poll.
@ k_ra8_sdhi_fifo_spin
RA8 SDHI FIFO spin.
ra8_err_t ra8_sdhi_set_bus_width_4bit(uint8_t instance, uint16_t rca)
Negotiate a 4-bit data bus with the card via CMD55 + ACMD6.
ra8_err_t ra8_sdhi_set_bus_width_8bit(uint8_t instance)
Negotiate an 8-bit data bus with an eMMC device via CMD6 SWITCH.
SD/MMC Host Interface (SDHI) driver scaffold.
void(* ra8_sdhi_event_fn_t)(void *ctx, uint8_t instance, uint32_t status_mask)
SDHI event callback.
ra8_sdhi_bus_width_t
SD data-bus width accepted by ra8_sdhi_set_bus_width.
@ k_ra8_sdhi_bus_width_1bit
Single data lane (power-on safe default).
@ k_ra8_sdhi_bus_width_4bit
Four data lanes (SD default-speed wide).
@ k_ra8_sdhi_bus_width_8bit
Eight data lanes (eMMC only).
SDHI (SD/MMC host interface) register layout for the Renesas RA8D2.
@ k_ra8_sdhi_rca_arg_shift
RCA occupies SD_ARG[31:16].
@ k_ra8_sdhi_option_bus_1bit
1-bit safe default: WIDTH=1, WIDTH8=0 (0xC0E0).
@ k_ra8_sdhi_option_width_bit
WIDTH (bit 15): 1 -> narrow bus.
@ k_ra8_sdhi_option_width8_bit
WIDTH8 (bit 13): 1 -> 8-bit.
@ k_ra8_sdhi_option_width_mask
Combined WIDTH+WIDTH8 clear mask for read-modify-write.
@ k_ra8_sdhi_block_bytes
SD block size in bytes.
@ k_ra8_sdhi_words_per_block
512 / 4 = 128 word fills per block
@ k_ra8_sdhi_fifo_word_bytes
SD_BUF0 FIFO word width.
@ k_ra8_sdhi_r1_app_cmd_mask
R1 bit 5 APP_CMD acknowledged.
@ k_ra8_sdhi_r1_error_mask
R1 error/violation bit-mask.
@ k_ra8_sdhi_acmd6_arg_4bit
ACMD6 arg: 4-bit data bus.
static volatile r_sdhi_regs_t * ra8_sdhi(uint8_t instance)
Get pointer to SDHI instance N (0 or 1).
@ k_ra8_sdhi_cmd6_arg_8bit
Whole CMD6 SWITCH argument: BUS_WIDTH <- 8-bit (0x03B70200).
@ k_ra8_sdhi_instance_count
RA8 SDHI instance count.
@ k_ra8_sdhi_info2_bre_mask
SD_INFO2.BRE bit 8.
@ k_ra8_sdhi_info2_bwe_mask
SD_INFO2.BWE bit 9.
@ k_ra8_sdhi_stop_seccnt_en
SD_STOP.SEC bit 8.
@ k_ra8_sdhi_info2_brem_bwem
SD_INFO2_MASK.
@ k_ra8_sdhi_dmaen_set
SD_DMAEN.DMAEN bit 1.
@ k_ra8_sdhi_cmd_emmc_switch
CMD6 SWITCH (eMMC EXT_CSD).
@ k_ra8_sdhi_cmd_write_multi_block
CMD25 WRITE_MULTIPLE_BLOCK.
@ k_ra8_sdhi_cmd_stop_transmission
CMD12 STOP_TRANSMISSION.
@ k_ra8_sdhi_cmd_read_multi_block
CMD18 READ_MULTIPLE_BLOCK.
@ k_ra8_sdhi_cmd_app_cmd
CMD55 APP_CMD prefix.
@ k_ra8_sdhi_cmd_write_single_block
CMD24 WRITE_SINGLE_BLOCK.
@ k_ra8_sdhi_cmd_set_bus_width
ACMD6 SET_BUS_WIDTH (SD).
@ k_ra8_sdhi_cmd_read_single_block
CMD17 READ_SINGLE_BLOCK.
volatile uint32_t SD_SECCNT
+0x14 Block Count.
volatile uint32_t SD_ARG
+0x08 Argument (32-bit).
volatile uint32_t SD_INFO1_MASK
+0x40 Interrupt Mask 1.
volatile uint32_t SOFT_RST
+0x1C0 Software Reset.
volatile uint32_t SD_INFO2_MASK
+0x44 Interrupt Mask 2.
volatile uint32_t SD_CMD
+0x00 Command Type Register.
volatile uint32_t SD_INFO1
+0x38 Interrupt Flag 1.
volatile uint32_t SD_RSP32
+0x20 Response 32.
volatile uint32_t SD_STOP
+0x10 Stop.
volatile uint32_t SD_OPTION
+0x50 Access Control Option.
volatile uint32_t SD_INFO2
+0x3C Interrupt Flag 2.
volatile uint32_t SDIF_MODE
+0x1CC SD Interface Mode.
volatile uint32_t SD_SIZE
+0x4C Transfer Data Length.
volatile uint32_t SD_DMAEN
+0x1B0 DMA Mode Enable.
volatile uint32_t SD_BUF0
+0x60 Buffer Register.
volatile uint32_t SDIO_MODE
+0x68 SDIO Mode Control.
volatile uint32_t EXT_SWAP
+0x1E0 Endian Swap Control.
volatile uint32_t SD_RSP10
+0x18 Response 10.
volatile uint32_t SD_RSP54
+0x28 Response 54.
volatile uint32_t SD_RSP76
+0x30 Response 76.
volatile uint32_t SD_CLK_CTRL
+0x48 Clock Control.