ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_sdmmc_spi_internal.h
Go to the documentation of this file.
1
26
27#pragma once
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33#include <stdint.h>
34
35#include "ra8_attributes.h"
36#include "ra8_err.h"
37#include "ra8_sdmmc_spi.h"
38
39/* ---------------------------------------------------------------------------
40 * Protocol constants shared between the core/init and block-I/O TUs
41 * ---------------------------------------------------------------------------
42 */
43
71
82
97
102typedef enum : uint32_t {
103 /* CMD0 has a static CRC7-shifted-and-tagged byte of 0x95 (SD spec PHY
104 * v9 section 7.3.1.1 example). Pre-computing avoids running CRC7 over
105 * the all-zero argument every probe. */
107 /* CMD8 with argument 0x000001AA uses the documented "pattern 0xAA at
108 * 2.7-3.6 V" check (SD spec PHY v9 section 7.3.2.6). The CRC7-shifted
109 * byte for this exact frame is 0x87, also published in the spec. */
112 /* ACMD41 with HCS=1 for v2.x cards. */
113 k_sd_acmd41_arg_hcs = 0x40000000UL,
114 /* OCR bit set when CCS = 1 (block-addressed SDHC/SDXC). */
115 k_sd_ocr_ccs_bit = 0x40000000UL,
116 k_sd_ocr_busy_bit = 0x80000000UL,
117 /* Retry budgets -- bounded loops, NASA P10 Rule 2. */
128
133typedef enum : uint8_t {
138
152typedef enum : uint32_t {
156
157/* ---------------------------------------------------------------------------
158 * Shared driver state
159 * ---------------------------------------------------------------------------
160 */
161
174
186
187/* ---------------------------------------------------------------------------
188 * Low-level helpers shared with the block-I/O TU
189 * ---------------------------------------------------------------------------
190 */
191
209RA8_PRIV ra8_err_t priv_sdmmc_spi_xfer_one(uint8_t tx, uint8_t* rx);
210
226
241
257
276RA8_PRIV ra8_err_t priv_sdmmc_spi_send_command(sd_cmd_t cmd, uint32_t arg, uint8_t* out_r1);
277
295RA8_PRIV ra8_err_t priv_sdmmc_spi_send_acmd(sd_cmd_t acmd, uint32_t arg, uint8_t* out_r1);
296
318
335
354
371
388
405
406#ifdef __cplusplus
407}
408#endif
Annotation-attribute framework macros for ra8-firmware.
#define RA8_PRIV
Module-private helper: shared across TUs but only inside one library.
Error Code Definitions for ra8-firmware.
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
sd_state_t g_sdmmc_spi_state
Single driver instance (the module's one external definition).
SD card driver in SPI-mode (PMOD-attached cards).
ra8_sdmmc_spi_card_type_t
Detected SD card capacity / addressing class.
sd_data_token_t
Data tokens used for block I/O (SD spec PHY v9 section 7.3.3).
@ k_sd_token_stop_multi
Multi-block stop.
@ k_sd_token_data_start_single
Single-block start.
@ k_sd_token_idle
Idle bus.
@ k_sd_token_data_start_multi
Multi-block start.
ra8_err_t priv_sdmmc_spi_xfer_one(uint8_t tx, uint8_t *rx)
Shift out one byte and capture the response over the transport.
sd_protocol_const_t
Magic argument values and retry budgets.
@ k_sd_max_busy_poll_bytes
Worst-case write timeout.
@ k_sd_crc7_cmd0_byte
SD crc7 cmd0 byte.
@ k_sd_max_recover_attempts
Re-flush + retry CMD0 before failing.
@ k_sd_cmd8_arg_check_pattern
SD cmd8 arg check pattern.
@ k_sd_ocr_ccs_bit
SD ocr ccs bit.
@ k_sd_max_r1_wait_bytes
R1 must appear within 8 bytes per spec; 2x slack.
@ k_sd_max_erase_poll_bytes
Busy ceiling for a bulk CMD38 erase (seconds).
@ k_sd_recover_idle_bytes
512 CS-released clocks drain busy + reset framing.
@ k_sd_ocr_busy_bit
SD ocr busy bit.
@ k_sd_max_data_token_polls
~500 ms at 100 us / poll.
@ k_sd_crc7_cmd8_byte
SD crc7 cmd8 byte.
@ k_sd_max_acmd41_attempts
1 s at 1 ms / attempt.
@ k_sd_init_dummy_clocks
80 clocks = 10 bytes of 0xFF (>=74 required).
@ k_sd_acmd41_arg_hcs
SD acmd41 arg hcs.
@ k_sd_recover_flush_bytes
>= 512 data + 2 CRC + token to flush a stuck write.
ra8_err_t priv_sdmmc_spi_send_acmd(sd_cmd_t acmd, uint32_t arg, uint8_t *out_r1)
Send an ACMD by prefixing it with CMD55 (APP_CMD).
sd_byte_mask_t
Generic byte-extraction masks used across argument packing.
@ k_sd_mask_byte
Low 8 bits of a wider value.
@ k_sd_mask_12bit
CMD8 R7 echo voltage-range + check pattern.
ra8_err_t priv_sdmmc_spi_wait_not_busy(void)
Wait for the card to release the busy token (CIPO returns to 0xFF).
ra8_err_t priv_sdmmc_spi_cs_release(void)
Drive CS high after clocking one idle byte (SD spec section 7.2.4).
ra8_err_t priv_sdmmc_spi_send_idle(uint32_t n)
Shift n idle bytes (0xFF) and discard the response.
ra8_err_t priv_sdmmc_spi_send_command(sd_cmd_t cmd, uint32_t arg, uint8_t *out_r1)
Send a command frame and capture the R1 response byte.
ra8_err_t priv_sdmmc_spi_run_init_sequence(void)
Walk the full SD identification sequence and learn capacity / type.
ra8_err_t priv_sdmmc_spi_send_stop_transmission(uint8_t *out_r1)
Send CMD12 (STOP_TRANSMISSION) and capture its R1 response byte.
ra8_err_t priv_sdmmc_spi_wait_not_busy_bounded(uint32_t max_polls)
Wait for the card to release busy (CIPO -> 0xFF), bounded by max_polls.
ra8_err_t priv_sdmmc_spi_validate_transport(const ra8_sdmmc_spi_transport_t *transport)
Validate the transport descriptor: every callback non-NULL.
sd_data_response_t
Data-response token bit layout (SD spec PHY v9 section 7.3.3.1).
@ k_sd_data_response_write_err
0b01101 – write error.
@ k_sd_data_response_mask
SD data response mask.
@ k_sd_data_response_crc_err
0b01011 – CRC error.
@ k_sd_data_response_accepted
0b00101 – data accepted.
ra8_err_t priv_sdmmc_spi_cs_assert(void)
Drive CS low and clock a single idle byte so CIPO is sampled.
sd_cmd_t
Wire-byte for every command used by this driver.
@ k_sd_cmd_read_multi_block
CMD18.
@ k_sd_cmd_send_cid
CMD10.
@ k_sd_cmd_set_blocklen
CMD16.
@ k_sd_cmd_app_cmd
CMD55.
@ k_sd_cmd_read_single_block
CMD17.
@ k_sd_acmd_sd_send_op_cond
ACMD41.
@ k_sd_acmd_set_wr_blk_erase_count
ACMD23.
@ k_sd_cmd_erase_wr_blk_start
CMD32.
@ k_sd_cmd_stop_transmission
CMD12.
@ k_sd_cmd_send_csd
CMD9.
@ k_sd_cmd_send_if_cond
CMD8.
@ k_sd_cmd_erase_wr_blk_end
CMD33.
@ k_sd_cmd_write_single_block
CMD24.
@ k_sd_cmd_read_ocr
CMD58.
@ k_sd_cmd_write_multi_block
CMD25.
@ k_sd_cmd_erase
CMD38.
@ k_sd_cmd_go_idle_state
CMD0.
sd_bit_shift_t
Bit-shift constants reused across byte packing.
@ k_sd_bit_three_byte
SD bit three byte.
@ k_sd_bit_byte
SD bit byte.
@ k_sd_bit_two_byte
SD bit two byte.
ra8_err_t priv_sdmmc_spi_wait_data_token(void)
Poll for the data-start token (0xFE), bounded by a retry budget.
Driver-to-bus binding (Dependency Inversion seam).
Cached protocol state held across the driver public API.
ra8_sdmmc_spi_card_type_t card_type
Card class.
ra8_sdmmc_spi_transport_t transport
Transport callbacks.
uint32_t capacity_blocks
Block count.
bool initialized
Initialization state.