16#if defined(ESP32) || defined(ESP_PLATFORM)
18#include <driver/sdmmc_host.h>
19#include <driver/sdmmc_defs.h>
96 const sdmmc_host_t& host_cfg,
97 const sdmmc_slot_config_t& slot_cfg)
117 bool begin(
bool mode1bit =
false,
int max_freq_khz = SDMMC_FREQ_DEFAULT) {
118 return begin(mode1bit, max_freq_khz,
119 SDMMC_HOST_DEFAULT(),
120 SDMMC_SLOT_CONFIG_DEFAULT());
132 bool begin(
bool mode1bit,
int max_freq_khz,
133 sdmmc_host_t host_cfg, sdmmc_slot_config_t slot_cfg) {
150 esp_err_t err = sdmmc_host_init();
157 err = sdmmc_host_init_slot(SDMMC_HOST_SLOT_1, &
slot_config);
165 if (
card ==
nullptr) {
166 card = (sdmmc_card_t*)malloc(
sizeof(sdmmc_card_t));
167 if (
card ==
nullptr) {
173 memset(
card, 0,
sizeof(sdmmc_card_t));
192 if (
card->ocr & SD_OCR_SDHC_CAP) {
207 if (
card !=
nullptr) {
221 if (drv != 0)
return STA_NOINIT;
253 if (drv != 0)
return STA_NOINIT;
265 DRESULT
disk_read(BYTE drv, BYTE* buff, LBA_t sector, UINT count)
override {
266 if (drv != 0 || !count)
return RES_PARERR;
267 if (
stat & STA_NOINIT)
return RES_NOTRDY;
268 if (
card ==
nullptr)
return RES_NOTRDY;
271 esp_err_t err = sdmmc_read_sectors(
card, buff, sector, count);
273 return (err == ESP_OK) ? RES_OK : RES_ERROR;
286 UINT count)
override {
287 if (drv != 0 || !count)
return RES_PARERR;
288 if (
stat & STA_NOINIT)
return RES_NOTRDY;
289 if (
stat & STA_PROTECT)
return RES_WRPRT;
290 if (
card ==
nullptr)
return RES_NOTRDY;
293 esp_err_t err = sdmmc_write_sectors(
card, buff, sector, count);
295 return (err == ESP_OK) ? RES_OK : RES_ERROR;
307 DRESULT
disk_ioctl(BYTE drv, ioctl_cmd_t cmd,
void* buff)
override {
308 if (drv != 0)
return RES_PARERR;
309 if (
stat & STA_NOINIT)
return RES_NOTRDY;
311 DRESULT res = RES_ERROR;
319 case GET_SECTOR_COUNT:
322 uint64_t capacity = ((uint64_t)
card->csd.capacity) *
card->csd.sector_size;
323 *(DWORD*)buff = (DWORD)(capacity / 512);
328 case GET_SECTOR_SIZE:
340 uint32_t erase_size =
card->csd.sector_size;
341 if (erase_size < 512) erase_size = 512;
342 *(DWORD*)buff = erase_size / 512;
343 if (*(DWORD*)buff == 0) *(DWORD*)buff = 1;
363 memcpy(buff, &
card->csd,
sizeof(
card->csd));
371 memcpy(buff, &
card->cid,
sizeof(
card->cid));
379 *(DWORD*)buff =
card->ocr;
406 if (
card ==
nullptr)
return 0;
407 return ((uint64_t)
card->csd.capacity) *
card->csd.sector_size;
423 if (
stat & STA_NOINIT ||
card ==
nullptr)
return 0;
448 return card ?
card->max_freq_khz : 0;
452 volatile DSTATUS
stat = STA_NOINIT;
Empty IO implementation that we can use to test the compilation.
Definition BaseIO.h:10
Accessing an SD card via the ESP32 SDMMC interface using low-level API.
Definition Esp32SdmmcIO.h:60
Esp32SdmmcIO(bool mode1bit, int max_freq_khz=SDMMC_FREQ_DEFAULT)
Constructor with bus mode and frequency.
Definition Esp32SdmmcIO.h:78
bool init_mode1bit
Stored 1-bit mode setting.
Definition Esp32SdmmcIO.h:460
uint64_t cardSize() const
Get the card size in bytes.
Definition Esp32SdmmcIO.h:405
bool isMMC() const
Check if card is MMC.
Definition Esp32SdmmcIO.h:439
BYTE CardType
Card type flags.
Definition Esp32SdmmcIO.h:453
bool auto_init
Whether to auto-init on first use.
Definition Esp32SdmmcIO.h:459
sdmmc_card_t * card
Pointer to card structure.
Definition Esp32SdmmcIO.h:454
DRESULT disk_write(BYTE drv, const BYTE *buff, LBA_t sector, UINT count) override
Write sector(s)
Definition Esp32SdmmcIO.h:285
bool begin(bool mode1bit, int max_freq_khz, sdmmc_host_t host_cfg, sdmmc_slot_config_t slot_cfg)
Initialize with custom host and slot configuration.
Definition Esp32SdmmcIO.h:132
DRESULT disk_ioctl(BYTE drv, ioctl_cmd_t cmd, void *buff) override
Miscellaneous drive controls.
Definition Esp32SdmmcIO.h:307
Esp32SdmmcIO(bool mode1bit, int max_freq_khz, const sdmmc_host_t &host_cfg, const sdmmc_slot_config_t &slot_cfg)
Constructor with custom host and slot configuration.
Definition Esp32SdmmcIO.h:95
bool begin(bool mode1bit=false, int max_freq_khz=SDMMC_FREQ_DEFAULT)
Initialize the SDMMC interface and mount the SD card.
Definition Esp32SdmmcIO.h:117
DSTATUS disk_status(BYTE drv) override
Get disk status.
Definition Esp32SdmmcIO.h:252
~Esp32SdmmcIO()
Destructor - cleanup resources.
Definition Esp32SdmmcIO.h:106
Esp32SdmmcIO()
Default constructor - card must be initialized with begin()
Definition Esp32SdmmcIO.h:65
sdmmc_card_t * getCard()
Get pointer to the card structure (for advanced use)
Definition Esp32SdmmcIO.h:431
sdmmc_host_t host_config
Host configuration.
Definition Esp32SdmmcIO.h:455
uint64_t totalSectors() const
Get the total number of sectors.
Definition Esp32SdmmcIO.h:422
DSTATUS disk_initialize(BYTE drv) override
Initialize disk drive.
Definition Esp32SdmmcIO.h:220
volatile DSTATUS stat
Physical drive status.
Definition Esp32SdmmcIO.h:452
DRESULT disk_read(BYTE drv, BYTE *buff, LBA_t sector, UINT count) override
Read sector(s)
Definition Esp32SdmmcIO.h:265
uint8_t cardType() const
Get the card type flags.
Definition Esp32SdmmcIO.h:414
sdmmc_slot_config_t slot_config
Slot configuration.
Definition Esp32SdmmcIO.h:456
void end()
End SDMMC interface and unmount SD card.
Definition Esp32SdmmcIO.h:206
uint32_t getFreqKHz() const
Get card frequency in kHz.
Definition Esp32SdmmcIO.h:447
int init_max_freq_khz
Stored max frequency setting.
Definition Esp32SdmmcIO.h:461