3#if defined(ROO_TESTING)
5#include "roo_testing/microcontrollers/esp32/fake_esp32.h"
9#if (defined ESP_PLATFORM)
11#include "soc/soc_caps.h"
13#if SOC_SDMMC_HOST_SUPPORTED
17#if !defined(MLOG_roo_io_fs)
18#define MLOG_roo_io_fs 0
21#include "diskio_sdmmc.h"
22#include "driver/sdmmc_host.h"
23#include "esp_idf_version.h"
24#include "esp_vfs_fat.h"
26#include "roo_logging.h"
43void SdMmcFs::setPins(uint8_t pin_clk, uint8_t pin_cmd, uint8_t pin_d0) {
44 use_default_pins_ =
false;
45 pin_clk_ = (gpio_num_t)pin_clk;
46 pin_cmd_ = (gpio_num_t)pin_cmd;
47 pin_d0_ = (gpio_num_t)pin_d0;
51void SdMmcFs::setPins(uint8_t pin_clk, uint8_t pin_cmd, uint8_t pin_d0,
52 uint8_t pin_d1, uint8_t pin_d2, uint8_t pin_d3) {
53 use_default_pins_ =
false;
54 pin_clk_ = (gpio_num_t)pin_clk;
55 pin_cmd_ = (gpio_num_t)pin_cmd;
56 pin_d0_ = (gpio_num_t)pin_d0;
57 pin_d1_ = (gpio_num_t)pin_d1;
58 pin_d2_ = (gpio_num_t)pin_d2;
59 pin_d3_ = (gpio_num_t)pin_d3;
63MountImpl::MountResult SdMmcFs::mountImpl(std::function<
void()> unmount_fn) {
64 MLOG(roo_io_fs) <<
"Mounting SD card";
65#if defined(ROO_TESTING)
66 mount_base_path_ = FakeEsp32().fs_root();
68 mount_base_path_.clear();
70 mount_base_path_.append(mountPoint());
72 sdmmc_host_t host = SDMMC_HOST_DEFAULT();
74 sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
75 if (!use_default_pins_) {
76#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
77 slot_config.clk = pin_clk_;
78 slot_config.cmd = pin_cmd_;
79 slot_config.d0 = pin_d0_;
80 slot_config.d1 = pin_d1_;
81 slot_config.d2 = pin_d2_;
82 slot_config.d3 = pin_d3_;
84 LOG(WARNING) <<
"Custom SDMMC pins not supported on ESP-IDF < 5.0";
86 slot_config.width = width_;
88 esp_vfs_fat_sdmmc_mount_config_t mount_config = {
89 .format_if_mount_failed = formatIfMountFailed(),
90 .max_files = maxOpenFiles(),
91 .allocation_unit_size = 16 * 1024};
93 esp_err_t ret = esp_vfs_fat_sdmmc_mount(mount_base_path_.c_str(), &host,
94 &slot_config, &mount_config, &card_);
97 if (ret == ESP_FAIL) {
98 LOG(ERROR) <<
"Failed to mount the filesystem.";
101 LOG(ERROR) <<
"Failed to initialize the card: " << esp_err_to_name(ret);
103 return MountImpl::MountError(kGenericMountError);
105#if defined(ROO_TESTING)
108 pdrv_ = ff_diskio_get_pdrv_card(card_);
110 return MountImpl::Mounted(std::unique_ptr<MountImpl>(
111 new PosixMountImpl(mount_base_path_.c_str(), readOnly(), unmount_fn)));
114void SdMmcFs::unmountImpl() {
115 MLOG(roo_io_fs) <<
"Unmounting SD card";
116 CHECK_NOTNULL(card_);
118 esp_err_t ret = esp_vfs_fat_sdcard_unmount(mount_base_path_.c_str(), card_);
120 LOG(ERROR) <<
"Unmounting card failed: " << esp_err_to_name(ret);
124 mount_base_path_.clear();
127Filesystem::MediaPresence SdMmcFs::checkMediaPresence() {
130 char drv[3] = {(char)(48 + pdrv_),
':', 0};
131 if (f_getfree(drv, &fre_clust, &fsinfo) != 0) {
132 return Filesystem::kMediaAbsent;
134 return (fsinfo->csize == 0) ? Filesystem::kMediaAbsent
135 : Filesystem::kMediaPresent;
138SdMmcFs CreateSdMmcFs() {
return SdMmcFs(); }
140SdMmcFs SDMMC = CreateSdMmcFs();
roo::basic_string_view< CharT, Traits > basic_string_view