1
- // Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD
1
+ // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
2
2
//
3
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
4
// you may not use this file except in compliance with the License.
12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- #include " pins_arduino.h"
16
15
#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
18
17
#include " vfs_api.h"
19
18
19
+ extern " C" {
20
+ #include < sys/unistd.h>
21
+ #include < sys/stat.h>
20
22
#include < dirent.h>
21
23
#include " esp_vfs_fat.h"
22
24
#include " driver/sdmmc_host.h"
23
25
#include " driver/sdmmc_defs.h"
24
26
#include " sdmmc_cmd.h"
25
- # include " soc/sdmmc_pins.h "
27
+ }
26
28
#include " ff.h"
27
29
28
30
using namespace fs ;
31
+ /*
29
32
33
+ */
30
34
31
35
SDMMCFS::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
+ {}
86
38
87
39
bool SDMMCFS::begin (const char * mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency)
88
40
{
@@ -91,33 +43,27 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
91
43
}
92
44
// mount
93
45
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;
112
47
host.flags = SDMMC_HOST_FLAG_4BIT;
113
48
host.slot = SDMMC_HOST_SLOT_1;
114
49
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 ;
115
61
#ifdef BOARD_HAS_1BIT_SDMMC
116
62
mode1bit = true ;
117
63
#endif
118
64
if (mode1bit) {
119
65
host.flags = SDMMC_HOST_FLAG_1BIT; // use 1-line SD mode
120
- slot_config.width = 1 ;
66
+ slot_config.width = 1 ;
121
67
}
122
68
123
69
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
135
81
log_w (" SD Already mounted" );
136
82
return true ;
137
83
} 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);
139
85
}
140
86
_card = NULL ;
141
87
return false ;
@@ -198,4 +144,4 @@ uint64_t SDMMCFS::usedBytes()
198
144
}
199
145
200
146
SDMMCFS SD_MMC = SDMMCFS(FSImplPtr(new VFSImpl()));
201
- #endif /* SOC_SDMMC_HOST_SUPPORTED */
147
+ #endif /* CONFIG_IDF_TARGET_ESP32 */
0 commit comments