ra8-firmware 0.1.0
Bare-metal firmware for the Renesas RA8 family (RA8D2 / RA8P1)
Loading...
Searching...
No Matches
ra8_sdcard.c
Go to the documentation of this file.
1
32
33#include "ra8_sdcard.h"
34
35#include <stdint.h>
36
37#include "ra8_attributes.h"
38#include "ra8_check.h"
39#include "ra8_err.h"
40#include "ra8_log.h"
41#include "ra8_sdhi.h"
42
44static const char* s_tag = "SDCARD";
45
62
83
104
127
145
148
149/* Issue ACMD41 with the host capacity-support bit set and loop -- see implementation for details. */
151static ra8_err_t internal_run_acmd41(uint8_t instance, uint32_t* out_ocr)
152{
153 RA8_CHECK_NULL_PTR(out_ocr, s_tag, "ocr");
154
155 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
156 uint32_t ocr = 0U;
157 uint8_t done = 0U;
158 for (uint32_t i = 0U; i < (uint32_t)k_ra8_sdcard_init_retry_max; ++i) {
159 /* HUM Ch 47.2.1 "SD_CMD : Command Type Register" p 3123 */
160 /* CMD55 prefix is required before every ACMDxx. */
161 const ra8_err_t e55 =
162 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd55_app_cmd, 0U, rsp);
163 if (e55 != k_ra8_ok) {
164 return e55;
165 }
166 /* HUM Ch 47.2.2 "SD_ARG : SD Command Argument" p 3124 */
167 /* HCS=1 (host supports SDHC/SDXC) | voltage window 2.7-3.6 V. */
168 const uint32_t arg =
170 const ra8_err_t e41 =
171 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_acmd41_send_op_cond, arg, rsp);
172 if (e41 != k_ra8_ok) {
173 return e41;
174 }
175 ocr = rsp[0];
176 if ((ocr & (uint32_t)k_ra8_sdcard_ocr_busy_done_mask) != 0U) {
177 done = 1U;
178 break;
179 }
180 }
181 if (done == 0U) {
183 }
184 *out_ocr = ocr;
185 return k_ra8_ok;
186}
187
212static ra8_err_t internal_decode_csd(const uint32_t* rsp, uint32_t* out_blocks)
213{
214 RA8_CHECK_NULL_PTR(rsp, s_tag, "rsp");
215 RA8_CHECK_NULL_PTR(out_blocks, s_tag, "blocks");
216
217 /* CSD_STRUCTURE is rsp[3][31:30]. SDHI shifts the response left by
218 * 8 (CRC drop), so the architectural CSD[127:126] lands at
219 * rsp[3][31:30] -- the same place FSP r_sdhi.c reads it from. */
220 const uint8_t csd_structure = (uint8_t)((rsp[3] >> k_sd_csd_struct_shift) & 0x3U);
221 if (csd_structure == 1U) {
222 /* CSD v2 (SDHC/SDXC): C_SIZE is bits [69:48], i.e. rsp[1][29:8]
223 * once you account for the CRC shift. The 22-bit field needs the
224 * low 6 bits of rsp[2] OR'd with the high 16 bits of rsp[1]. */
225 const uint32_t c_size =
226 (((rsp[2] & k_sd_csize_v2_lo_mask) << 16U) | ((rsp[1] >> 16U) & k_sd_csize_v2_mid_mask)) &
228 *out_blocks = (c_size + 1U) * (uint32_t)k_ra8_sdcard_csd_v2_blocks_per_unit;
229 return k_ra8_ok;
230 }
231 if (csd_structure == 0U) {
232 /* CSD v1 (SDSC): READ_BL_LEN [83:80], C_SIZE [73:62],
233 * C_SIZE_MULT [49:47]. Compute capacity in bytes then divide by
234 * 512 to land on the block count. */
235 const uint8_t read_bl_len = (uint8_t)((rsp[2] >> 16U) & k_sd_read_bl_mask);
236 const uint16_t c_size =
237 (uint16_t)((((rsp[2] & 0x00000003UL) << k_sd_csize_v1_shift) |
240 const uint8_t c_size_mult = (uint8_t)((rsp[1] >> k_sd_csize_mult_shift) & k_sd_csize_mult_mask);
241 const uint32_t mult = 1U << ((uint32_t)c_size_mult + 2U);
242 const uint32_t block_len = 1U << (uint32_t)read_bl_len;
243 const uint32_t blocknr = ((uint32_t)c_size + 1U) * mult;
244 /* Convert to 512-byte sectors. */
245 *out_blocks = (blocknr * block_len) / k_sd_block_size_bytes;
246 return k_ra8_ok;
247 }
249}
250
275static ra8_err_t internal_sdcard_identify(uint8_t instance)
276{
277 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
278
279 /* HUM Ch 47.2.1 "SD_CMD : Command Type Register" p 3123 */
280 /* CMD0 GO_IDLE_STATE -- no response, but send_command still polls
281 * RSPEND so the host stays in lockstep with the bus state machine. */
282 const ra8_err_t e0 =
283 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd0_go_idle, 0U, rsp);
284 RA8_RETURN_ON_ERROR(e0, s_tag, "cmd0");
285
286 /* HUM Ch 47.2.5 "SD_RSP10 : Response Register 10" p 3132 */
287 /* CMD8 SEND_IF_COND -- echoes the low 12 bits of the argument back
288 * in R7. Mismatch means a v1 (no-CMD8) card or no card at all. */
289 const ra8_err_t e8 = ra8_sdhi_send_command(instance,
292 rsp);
293 /* GCOVR_EXCL_BR_START -- no failing SDHI fake drives this cmd err */
294 RA8_RETURN_ON_ERROR(e8, s_tag, "cmd8");
295 /* GCOVR_EXCL_BR_STOP */
296 if ((rsp[0] & (uint32_t)k_ra8_sdcard_cmd8_pattern_mask) !=
299 }
300 return k_ra8_ok;
301}
302
327static ra8_err_t internal_sdcard_publish_rca(uint8_t instance, uint16_t* out_rca)
328{
329 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
330
331 /* HUM Ch 47.2.5 "SD_RSP10..76 : Response Registers" p 3132 */
332 /* CMD2 ALL_SEND_CID -- 136-bit R2; we don't decode the CID. */
333 const ra8_err_t e2 =
334 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd2_all_send_cid, 0U, rsp);
335 /* GCOVR_EXCL_BR_START -- SD command fail never injected by suite */
336 RA8_RETURN_ON_ERROR(e2, s_tag, "cmd2");
337 /* GCOVR_EXCL_BR_STOP */
338
339 /* CMD3 SEND_RELATIVE_ADDR -- card publishes its RCA in rsp[0][31:16]. */
340 const ra8_err_t e3 =
341 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd3_send_rca, 0U, rsp);
342 /* GCOVR_EXCL_BR_START -- cmd error propagation arm not driven */
343 RA8_RETURN_ON_ERROR(e3, s_tag, "cmd3");
344 /* GCOVR_EXCL_BR_STOP */
345 *out_rca = (uint16_t)((rsp[0] >> 16U) & k_sd_rca_mask);
346 return k_ra8_ok;
347}
348
375static ra8_err_t
376internal_sdcard_publish_and_select(uint8_t instance, uint16_t* out_rca, uint32_t* out_blocks)
377{
378 uint16_t rca = 0U;
379 const ra8_err_t rca_err = internal_sdcard_publish_rca(instance, &rca);
380 if (rca_err != k_ra8_ok) {
381 return rca_err;
382 }
383 const uint32_t rca_arg = ((uint32_t)rca) << 16U;
384 uint32_t rsp[4] = {0U, 0U, 0U, 0U};
385
386 /* CMD9 SEND_CSD -- arg = RCA<<16; R2 holds the 128-bit CSD. */
387 const ra8_err_t e9 =
388 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd9_send_csd, rca_arg, rsp);
389 /* GCOVR_EXCL_BR_START -- SDHI fake never fails this transfer */
390 RA8_RETURN_ON_ERROR(e9, s_tag, "cmd9");
391 /* GCOVR_EXCL_BR_STOP */
392
393 const ra8_err_t dec_err = internal_decode_csd(rsp, out_blocks);
394 if (dec_err != k_ra8_ok) {
395 return dec_err;
396 }
397
398 /* CMD7 SELECT_CARD -- arg = RCA<<16 to put this card into TRAN. */
399 const ra8_err_t e7 =
400 ra8_sdhi_send_command(instance, (uint32_t)k_ra8_sdcard_cmd7_select_card, rca_arg, rsp);
401 /* GCOVR_EXCL_BR_START -- no test injects SD read failure here */
402 RA8_RETURN_ON_ERROR(e7, s_tag, "cmd7");
403 /* GCOVR_EXCL_BR_STOP */
404
405 *out_rca = rca;
406 return k_ra8_ok;
407}
408
434static ra8_sdcard_card_type_t internal_classify(uint8_t high_capacity, uint32_t blocks)
435{
436 if (high_capacity == 0U) {
438 }
439 if (blocks > (uint32_t)k_ra8_sdcard_sdhc_threshold_blocks * 16U) {
441 }
443}
444
470static void
471internal_sdcard_negotiate_width(uint8_t instance, ra8_sdhi_bus_width_t width, uint16_t rca)
472{
473 if (width != k_ra8_sdhi_bus_width_4bit) {
474 return;
475 }
476 const ra8_err_t we = ra8_sdhi_set_bus_width_4bit(instance, rca);
477 if (we != k_ra8_ok) {
478 /* Best-effort: fall back to the proven 1-bit mode. */
479 ra8_log_info_val(s_tag, "4-bit negotiation failed; staying 1-bit", (uint32_t)we);
480 }
481}
482
513 uint16_t* out_rca,
514 uint32_t* out_blocks,
515 uint8_t* out_high_capacity)
516{
517 /* HUM Ch 47.1 "SDHI Overview" p 3122 */ /* module bring-up first. */
518 const ra8_err_t hw_err = ra8_sdhi_init(instance);
519 RA8_RETURN_ON_ERROR(hw_err, s_tag, "sdhi_init");
520
521 const ra8_err_t id_err = internal_sdcard_identify(instance);
522 if (id_err != k_ra8_ok) {
523 (void)ra8_sdhi_deinit(instance);
524 return id_err;
525 }
526
527 /* ACMD41 op-cond loop -- card moves from idle to ready. */
528 uint32_t ocr = 0U;
529 const ra8_err_t e41 = internal_run_acmd41(instance, &ocr);
530 if (e41 != k_ra8_ok) {
531 (void)ra8_sdhi_deinit(instance);
532 return e41;
533 }
534 *out_high_capacity = ((ocr & (uint32_t)k_ra8_sdcard_ocr_ccs_mask) != 0U) ? 1U : 0U;
535
536 const ra8_err_t pub_err = internal_sdcard_publish_and_select(instance, out_rca, out_blocks);
537 if (pub_err != k_ra8_ok) {
538 (void)ra8_sdhi_deinit(instance);
539 return pub_err;
540 }
541 return k_ra8_ok;
542}
543
545{
546 RA8_CHECK_NULL_PTR(cfg, s_tag, "cfg");
547 if (s_sdcard.initialized != 0U) {
549 }
550
551 uint16_t rca = 0U;
552 uint32_t blocks = 0U;
553 uint8_t high_capacity = 0U;
554 const ra8_err_t on_err =
555 internal_sdcard_card_online(cfg->instance, &rca, &blocks, &high_capacity);
556 if (on_err != k_ra8_ok) {
557 return on_err;
558 }
559
560 /* Optional bus-width widening (best-effort, never fatal) while still
561 * at the identification clock, before the default-speed clock bump. */
563
564 /* HUM Ch 47.2.18 "SD_CLK_CTRL : SD Clock Control Register" p 3138 */
565 /* Bump the bus from the 400 kHz identification rate to default
566 * speed. The SDR50 / DDR50 negotiation lives in the future
567 * ::ra8_sdcard_set_speed extension. */
569 /* GCOVR_EXCL_BR_START -- card error unwind not staged on host */
570 RA8_RETURN_ON_ERROR(eclk, s_tag, "set_clock");
571 /* GCOVR_EXCL_BR_STOP */
572
573 s_sdcard.instance = cfg->instance;
574 s_sdcard.rca = rca;
575 s_sdcard.capacity_blocks = blocks;
576 s_sdcard.type = internal_classify(high_capacity, blocks);
577 s_sdcard.initialized = 1U;
578
579 ra8_log_info_val(s_tag, "sdcard init blocks", blocks);
580 return k_ra8_ok;
581}
582
604static uint32_t internal_to_card_address(uint32_t lba)
605{
606 if (s_sdcard.type == k_ra8_sdcard_type_sdsc) {
607 return lba * k_sd_block_size_bytes;
608 }
609 return lba;
610}
611
612ra8_err_t ra8_sdcard_read_blocks(uint32_t lba, uint8_t* buf, uint32_t count)
613{
614 RA8_CHECK_NULL_PTR(buf, s_tag, "buf");
615 if (count == 0U) {
617 }
618 if (s_sdcard.initialized == 0U) {
620 }
621 if ((lba + count) > s_sdcard.capacity_blocks) {
623 }
624 const uint32_t card_lba = internal_to_card_address(lba);
625 return ra8_sdhi_read_block(s_sdcard.instance, card_lba, buf, count);
626}
627
628ra8_err_t ra8_sdcard_write_blocks(uint32_t lba, const uint8_t* buf, uint32_t count)
629{
630 RA8_CHECK_NULL_PTR(buf, s_tag, "buf");
631 if (count == 0U) {
633 }
634 if (s_sdcard.initialized == 0U) {
636 }
637 if ((lba + count) > s_sdcard.capacity_blocks) {
639 }
640 const uint32_t card_lba = internal_to_card_address(lba);
641 return ra8_sdhi_write_block(s_sdcard.instance, card_lba, buf, count);
642}
643
645{
646 RA8_CHECK_NULL_PTR(out_blocks, s_tag, "out_blocks");
647 if (s_sdcard.initialized == 0U) {
649 }
650 *out_blocks = s_sdcard.capacity_blocks;
651 return k_ra8_ok;
652}
653
655{
656 RA8_CHECK_NULL_PTR(out_type, s_tag, "out_type");
657 if (s_sdcard.initialized == 0U) {
659 }
660 *out_type = s_sdcard.type;
661 return k_ra8_ok;
662}
663
665{
666 if (s_sdcard.initialized == 0U) {
667 return k_ra8_ok;
668 }
669 const uint8_t inst = s_sdcard.instance;
670 s_sdcard.initialized = 0U;
671 s_sdcard.capacity_blocks = 0U;
672 s_sdcard.rca = 0U;
674 const ra8_err_t err = ra8_sdhi_deinit(inst);
675 if (err != k_ra8_ok) {
676 /* ra8_sdhi_deinit fails only if ra8_mstp_disable times out on the MSTP
677 * readback loop. Reached on host by arming the ra8_fake_mmio seam on the
678 * SDHI module's MSTPCR register so that readback never settles. */
680 }
681 return k_ra8_ok;
682}
static const char * s_tag
Logging / check tag.
Definition ra8_app.c:17
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.
Definition ra8_check.h:184
#define RA8_CHECK_NULL_PTR(ptr, tag, message)
Reject nullptr pointer, returning k_ra8_err_null_ptr.
Definition ra8_check.h:243
Error Code Definitions for ra8-firmware.
@ k_ra8_err_hw_init_failed
Hardware peripheral failed to initialise.
Definition ra8_err.h:290
@ k_ra8_err_out_of_range
Sensor or peripheral output out of valid range.
Definition ra8_err.h:337
@ k_ra8_err_invalid_arg
Invalid function argument.
Definition ra8_err.h:152
@ k_ra8_err_invalid_state
Module in wrong state for requested operation.
Definition ra8_err.h:161
@ k_ra8_ok
Success – operation completed with all postconditions satisfied.
Definition ra8_err.h:119
ra8_err_codes_t ra8_err_t
Canonical error-return type used by every ra8-firmware API.
Definition ra8_err.h:546
Lightweight Logging Interface for ra8-firmware.
#define ra8_log_info_val(tag, message, value)
RA8 log info val.
Definition ra8_log.h:366
static ra8_err_t internal_sdcard_identify(uint8_t instance)
Drive CMD0 + CMD8 to take the card from power-on into idle.
Definition ra8_sdcard.c:275
static ra8_err_t internal_decode_csd(const uint32_t *rsp, uint32_t *out_blocks)
Decode a CSD response (v1 or v2) into a capacity-in-blocks count.
Definition ra8_sdcard.c:212
ra8_err_t ra8_sdcard_write_blocks(uint32_t lba, const uint8_t *buf, uint32_t count)
Write count 512-byte blocks starting at lba.
Definition ra8_sdcard.c:628
static void internal_sdcard_negotiate_width(uint8_t instance, ra8_sdhi_bus_width_t width, uint16_t rca)
Negotiate the requested SD data-bus width after card selection.
Definition ra8_sdcard.c:471
static ra8_err_t internal_sdcard_publish_and_select(uint8_t instance, uint16_t *out_rca, uint32_t *out_blocks)
Publish the RCA, decode the CSD, and put the card in TRAN.
Definition ra8_sdcard.c:376
static ra8_err_t internal_sdcard_publish_rca(uint8_t instance, uint16_t *out_rca)
Run CMD2 + CMD3 so the card publishes its relative address.
Definition ra8_sdcard.c:327
static uint32_t internal_to_card_address(uint32_t lba)
Translate a logical block address into the SD on-card argument.
Definition ra8_sdcard.c:604
ra8_err_t ra8_sdcard_get_capacity(uint32_t *out_blocks)
Return card capacity in 512-byte blocks.
Definition ra8_sdcard.c:644
ra8_sdcard_proto_t
SD protocol-level constants.
Definition ra8_sdcard.c:94
@ k_ra8_sdcard_cmd8_pattern
VHS=0001, check=0xAA.
Definition ra8_sdcard.c:95
@ k_ra8_sdcard_init_retry_max
ACMD41 retry budget.
Definition ra8_sdcard.c:101
@ k_ra8_sdcard_default_clk_div
CLKSEL=4 -> 25 MHz at 200 MHz PCLKB.
Definition ra8_sdcard.c:102
@ k_ra8_sdcard_ocr_busy_done_mask
OCR.busy clears when ready.
Definition ra8_sdcard.c:99
@ k_ra8_sdcard_acmd41_hcs
HCS bit – request HC support.
Definition ra8_sdcard.c:97
@ k_ra8_sdcard_acmd41_voltage_win
OCR voltage window 2.7-3.6 V.
Definition ra8_sdcard.c:98
@ k_ra8_sdcard_cmd8_pattern_mask
low 12 bits echoed
Definition ra8_sdcard.c:96
@ k_ra8_sdcard_ocr_ccs_mask
OCR.CCS = 1 -> SDHC/SDXC.
Definition ra8_sdcard.c:100
static ra8_sdcard_state_t s_sdcard
Module-private state.
Definition ra8_sdcard.c:147
ra8_err_t ra8_sdcard_get_type(ra8_sdcard_card_type_t *out_type)
Return the detected card type (SDSC / SDHC / SDXC).
Definition ra8_sdcard.c:654
ra8_sdcard_csd_t
CSD register decoding constants.
Definition ra8_sdcard.c:123
@ k_ra8_sdcard_csd_v2_blocks_per_unit
512 KiB / 512 B
Definition ra8_sdcard.c:124
@ k_ra8_sdcard_sdhc_threshold_blocks
2 GiB / 512 B = SDXC boundary
Definition ra8_sdcard.c:125
static ra8_err_t internal_sdcard_card_online(uint8_t instance, uint16_t *out_rca, uint32_t *out_blocks, uint8_t *out_high_capacity)
Take an identified SDHI card from power-on to TRAN state.
Definition ra8_sdcard.c:512
ra8_err_t ra8_sdcard_init(const ra8_sdcard_cfg_t *cfg)
Bring up the SDHI block and perform full SD card initialization.
Definition ra8_sdcard.c:544
ra8_err_t ra8_sdcard_deinit(void)
Tear down the card driver and release the SDHI block.
Definition ra8_sdcard.c:664
static ra8_err_t internal_run_acmd41(uint8_t instance, uint32_t *out_ocr)
Definition ra8_sdcard.c:151
sd_csd_field_t
SD CSD register field masks, shifts and block size.
Definition ra8_sdcard.c:47
@ k_sd_block_size_bytes
SD logical block size.
Definition ra8_sdcard.c:48
@ k_sd_csd_struct_shift
CSD_STRUCTURE field shift.
Definition ra8_sdcard.c:49
@ k_sd_csize_v1_lo_shift
CSD v1 C_SIZE low-bit shift.
Definition ra8_sdcard.c:56
@ k_sd_csize_v2_mask
CSD v2 C_SIZE (22-bit).
Definition ra8_sdcard.c:54
@ k_sd_csize_v2_mid_mask
CSD v2 C_SIZE byte-1 bits.
Definition ra8_sdcard.c:53
@ k_sd_rca_mask
Relative card address (16-bit).
Definition ra8_sdcard.c:50
@ k_sd_csize_mult_mask
C_SIZE_MULT (3-bit).
Definition ra8_sdcard.c:60
@ k_sd_csize_v1_mask
CSD v1 C_SIZE (12-bit).
Definition ra8_sdcard.c:58
@ k_sd_csize_v1_shift
CSD v1 C_SIZE high-bit shift.
Definition ra8_sdcard.c:55
@ k_sd_csize_v2_lo_mask
CSD v2 C_SIZE byte-2 bits.
Definition ra8_sdcard.c:52
@ k_sd_read_bl_mask
READ_BL_LEN (4-bit).
Definition ra8_sdcard.c:51
@ k_sd_csize_mult_shift
C_SIZE_MULT shift.
Definition ra8_sdcard.c:59
@ k_sd_csize_v1_lo_mask
CSD v1 C_SIZE low 10 bits.
Definition ra8_sdcard.c:57
static ra8_sdcard_card_type_t internal_classify(uint8_t high_capacity, uint32_t blocks)
Classify card type from OCR.CCS and decoded block count.
Definition ra8_sdcard.c:434
ra8_err_t ra8_sdcard_read_blocks(uint32_t lba, uint8_t *buf, uint32_t count)
Read count 512-byte blocks starting at lba.
Definition ra8_sdcard.c:612
ra8_sdcard_cmd_t
SD Physical Layer command indices used by ra8_sdcard_init.
Definition ra8_sdcard.c:73
@ k_ra8_sdcard_cmd8_send_if_cond
CMD8 SEND_IF_COND.
Definition ra8_sdcard.c:78
@ k_ra8_sdcard_cmd7_select_card
CMD7 SELECT_CARD.
Definition ra8_sdcard.c:77
@ k_ra8_sdcard_cmd2_all_send_cid
CMD2 ALL_SEND_CID.
Definition ra8_sdcard.c:75
@ k_ra8_sdcard_acmd41_send_op_cond
ACMD41 SD_SEND_OP_COND.
Definition ra8_sdcard.c:81
@ k_ra8_sdcard_cmd0_go_idle
CMD0 GO_IDLE_STATE.
Definition ra8_sdcard.c:74
@ k_ra8_sdcard_cmd3_send_rca
CMD3 SEND_RELATIVE_ADDR.
Definition ra8_sdcard.c:76
@ k_ra8_sdcard_cmd9_send_csd
CMD9 SEND_CSD.
Definition ra8_sdcard.c:79
@ k_ra8_sdcard_cmd55_app_cmd
CMD55 APP_CMD prefix.
Definition ra8_sdcard.c:80
SD card driver layered on top of the RA8D2 SDHI peripheral.
ra8_sdcard_card_type_t
Detected SD card capacity / addressing class.
Definition ra8_sdcard.h:57
@ k_ra8_sdcard_type_sdsc
Standard-capacity, byte-addressed (<= 2 GB).
Definition ra8_sdcard.h:59
@ k_ra8_sdcard_type_sdxc
Extended-capacity, block-addressed (>32 GB).
Definition ra8_sdcard.h:61
@ k_ra8_sdcard_type_unknown
Not yet probed or no card present.
Definition ra8_sdcard.h:58
@ k_ra8_sdcard_type_sdhc
High-capacity, block-addressed (2-32 GB).
Definition ra8_sdcard.h:60
SD/MMC Host Interface (SDHI) driver scaffold.
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.
Definition ra8_sdhi.c:677
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.
Definition ra8_sdhi.c:702
ra8_err_t ra8_sdhi_set_clock(uint8_t instance, uint32_t divider)
Set the SD bus clock divider (SD_CLK_CTRL).
Definition ra8_sdhi.c:223
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.
Definition ra8_sdhi.c:184
ra8_err_t ra8_sdhi_init(uint8_t instance)
Initialise an SDHI instance.
Definition ra8_sdhi.c:106
ra8_err_t ra8_sdhi_deinit(uint8_t instance)
Tear down an SDHI instance.
Definition ra8_sdhi.c:165
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.
Definition ra8_sdhi.c:269
ra8_sdhi_bus_width_t
SD data-bus width accepted by ra8_sdhi_set_bus_width.
Definition ra8_sdhi.h:66
@ k_ra8_sdhi_bus_width_4bit
Four data lanes (SD default-speed wide).
Definition ra8_sdhi.h:69
User-supplied configuration for ra8_sdcard_init.
Definition ra8_sdcard.h:88
uint8_t instance
SDHI instance index (0 or 1).
Definition ra8_sdcard.h:89
ra8_sdhi_bus_width_t bus_width
Target bus width (0/1-bit default, 4-bit).
Definition ra8_sdcard.h:90
Internal per-driver state.
Definition ra8_sdcard.c:138
ra8_sdcard_card_type_t type
SDSC / SDHC / SDXC.
Definition ra8_sdcard.c:141
uint16_t rca
Card-assigned relative address.
Definition ra8_sdcard.c:140
uint32_t capacity_blocks
512-byte block count, 0 if not init'd
Definition ra8_sdcard.c:139
uint8_t instance
SDHI instance index.
Definition ra8_sdcard.c:142
uint8_t initialized
Non-zero once init succeeded.
Definition ra8_sdcard.c:143