1- // Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD
1+ // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
22//
33// Licensed under the Apache License, Version 2.0 (the "License");
44// you may not use this file except in compliance with the License.
1212// See the License for the specific language governing permissions and
1313// limitations under the License.
1414
15- #include " pins_arduino.h"
1615#include " SD_MMC.h"
17- #ifdef SOC_SDMMC_HOST_SUPPORTED
16+ #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) // SDMMC does not work on ESP32S2
1817#include " vfs_api.h"
1918
19+ extern " C" {
20+ #include < sys/unistd.h>
21+ #include < sys/stat.h>
2022#include < dirent.h>
2123#include " esp_vfs_fat.h"
2224#include " driver/sdmmc_host.h"
2325#include " driver/sdmmc_defs.h"
2426#include " sdmmc_cmd.h"
25- # include " soc/sdmmc_pins.h "
27+ }
2628#include " ff.h"
2729
2830using namespace fs ;
31+ /*
2932
33+ */
3034
3135SDMMCFS::SDMMCFS (FSImplPtr impl)
32- : FS(impl), _card(nullptr )
33- {
34- #if defined(SOC_SDMMC_USE_GPIO_MATRIX) && defined(BOARD_HAS_SDMMC)
35- _pin_clk = SDMMC_CLK;
36- _pin_cmd = SDMMC_CMD;
37- _pin_d0 = SDMMC_D0;
38- #ifndef BOARD_HAS_1BIT_SDMMC
39- _pin_d1 = SDMMC_D1;
40- _pin_d2 = SDMMC_D2;
41- _pin_d3 = SDMMC_D3;
42- #endif // BOARD_HAS_1BIT_SDMMC
43- #endif // defined(SOC_SDMMC_USE_GPIO_MATRIX) && defined(BOARD_HAS_SDMMC)
44- }
45-
46- bool SDMMCFS::setPins (int clk, int cmd, int d0)
47- {
48- return setPins (clk, cmd, d0, GPIO_NUM_NC, GPIO_NUM_NC, GPIO_NUM_NC);
49- }
50-
51- bool SDMMCFS::setPins (int clk, int cmd, int d0, int d1, int d2, int d3)
52- {
53- if (_card != nullptr ) {
54- log_e (" SD_MMC.setPins must be called before SD_MMC.begin" );
55- return false ;
56- }
57- #ifdef SOC_SDMMC_USE_GPIO_MATRIX
58- // SoC supports SDMMC pin configuration via GPIO matrix. Save the pins for later use in SDMMCFS::begin.
59- _pin_clk = (int8_t ) clk;
60- _pin_cmd = (int8_t ) cmd;
61- _pin_d0 = (int8_t ) d0;
62- _pin_d1 = (int8_t ) d1;
63- _pin_d2 = (int8_t ) d2;
64- _pin_d3 = (int8_t ) d3;
65- return true ;
66- #elif CONFIG_IDF_TARGET_ESP32
67- // ESP32 doesn't support SDMMC pin configuration via GPIO matrix.
68- // Since SDMMCFS::begin hardcodes the usage of slot 1, only check if
69- // the pins match slot 1 pins.
70- bool pins_ok = (clk == SDMMC_SLOT1_IOMUX_PIN_NUM_CLK) &&
71- (cmd == SDMMC_SLOT1_IOMUX_PIN_NUM_CMD) &&
72- (d0 == SDMMC_SLOT1_IOMUX_PIN_NUM_D0) &&
73- ((d1 == d2 == d3 == -1 ) ||
74- (d1 == SDMMC_SLOT1_IOMUX_PIN_NUM_D1) &&
75- (d1 == SDMMC_SLOT1_IOMUX_PIN_NUM_D2) &&
76- (d1 == SDMMC_SLOT1_IOMUX_PIN_NUM_D3));
77- if (!pins_ok) {
78- log_e (" SDMMCFS: specified pins are not supported by this chip." );
79- return false ;
80- }
81- return true ;
82- #else
83- #error SoC not supported
84- #endif
85- }
36+ : FS(impl), _card(NULL )
37+ {}
8638
8739bool SDMMCFS::begin (const char * mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency)
8840{
@@ -91,33 +43,27 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
9143 }
9244 // mount
9345 sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT ();
94- #ifdef SOC_SDMMC_USE_GPIO_MATRIX
95- // SoC supports SDMMC pin configuration via GPIO matrix.
96- // Chech that the pins have been set either in the constructor or setPins function.
97- if (_pin_cmd == -1 || _pin_clk == -1 || _pin_d0 == -1
98- || (!mode1bit && (_pin_d1 == -1 || _pin_d2 == -1 || _pin_d3 == -1 ))) {
99- log_e (" SDMMCFS: some SD pins are not set" );
100- return false ;
101- }
102-
103- slot_config.clk = (gpio_num_t ) _pin_clk;
104- slot_config.cmd = (gpio_num_t ) _pin_cmd;
105- slot_config.d0 = (gpio_num_t ) _pin_d0;
106- slot_config.d1 = (gpio_num_t ) _pin_d1;
107- slot_config.d2 = (gpio_num_t ) _pin_d2;
108- slot_config.d3 = (gpio_num_t ) _pin_d3;
109- slot_config.width = 4 ;
110- #endif // SOC_SDMMC_USE_GPIO_MATRIX
111- sdmmc_host_t host = SDMMC_HOST_DEFAULT ();
46+ sdmmc_host_t host;
11247 host.flags = SDMMC_HOST_FLAG_4BIT;
11348 host.slot = SDMMC_HOST_SLOT_1;
11449 host.max_freq_khz = sdmmc_frequency;
50+ host.io_voltage = 3 .3f ;
51+ host.init = &sdmmc_host_init;
52+ host.set_bus_width = &sdmmc_host_set_bus_width;
53+ host.get_bus_width = &sdmmc_host_get_slot_width;
54+ host.set_bus_ddr_mode = &sdmmc_host_set_bus_ddr_mode;
55+ host.set_card_clk = &sdmmc_host_set_card_clk;
56+ host.do_transaction = &sdmmc_host_do_transaction;
57+ host.deinit = &sdmmc_host_deinit;
58+ host.io_int_enable = &sdmmc_host_io_int_enable;
59+ host.io_int_wait = &sdmmc_host_io_int_wait;
60+ host.command_timeout_ms = 0 ;
11561#ifdef BOARD_HAS_1BIT_SDMMC
11662 mode1bit = true ;
11763#endif
11864 if (mode1bit) {
11965 host.flags = SDMMC_HOST_FLAG_1BIT; // use 1-line SD mode
120- slot_config.width = 1 ;
66+ slot_config.width = 1 ;
12167 }
12268
12369 esp_vfs_fat_sdmmc_mount_config_t mount_config = {
@@ -135,7 +81,7 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
13581 log_w (" SD Already mounted" );
13682 return true ;
13783 } else {
138- log_e (" Failed to initialize the card (0x%x ). Make sure SD card lines have pull-up resistors in place." , ret);
84+ log_e (" Failed to initialize the card (%d ). Make sure SD card lines have pull-up resistors in place." , ret);
13985 }
14086 _card = NULL ;
14187 return false ;
@@ -198,4 +144,4 @@ uint64_t SDMMCFS::usedBytes()
198144}
199145
200146SDMMCFS SD_MMC = SDMMCFS(FSImplPtr(new VFSImpl()));
201- #endif /* SOC_SDMMC_HOST_SUPPORTED */
147+ #endif /* CONFIG_IDF_TARGET_ESP32 */
0 commit comments