1
- // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
1
+ // Copyright 2015-2021 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"
15
16
#include " SD_MMC.h"
16
- #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) // SDMMC does not work on ESP32S2
17
+ #ifdef SOC_SDMMC_HOST_SUPPORTED
17
18
#include " vfs_api.h"
18
19
19
- extern " C" {
20
- #include < sys/unistd.h>
21
- #include < sys/stat.h>
22
20
#include < dirent.h>
23
21
#include " esp_vfs_fat.h"
24
22
#include " driver/sdmmc_host.h"
25
23
#include " driver/sdmmc_defs.h"
26
24
#include " sdmmc_cmd.h"
27
- }
25
+ # include " soc/sdmmc_pins.h "
28
26
#include " ff.h"
29
27
30
28
using namespace fs ;
31
- /*
32
29
33
- */
34
30
35
31
SDMMCFS::SDMMCFS (FSImplPtr impl)
36
- : FS(impl), _card(NULL )
37
- {}
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
+ }
38
86
39
87
bool SDMMCFS::begin (const char * mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency)
40
88
{
@@ -43,27 +91,33 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
43
91
}
44
92
// mount
45
93
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT ();
46
- sdmmc_host_t host;
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 ();
47
112
host.flags = SDMMC_HOST_FLAG_4BIT;
48
113
host.slot = SDMMC_HOST_SLOT_1;
49
114
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 ;
61
115
#ifdef BOARD_HAS_1BIT_SDMMC
62
116
mode1bit = true ;
63
117
#endif
64
118
if (mode1bit) {
65
119
host.flags = SDMMC_HOST_FLAG_1BIT; // use 1-line SD mode
66
- slot_config.width = 1 ;
120
+ slot_config.width = 1 ;
67
121
}
68
122
69
123
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
@@ -81,7 +135,7 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
81
135
log_w (" SD Already mounted" );
82
136
return true ;
83
137
} else {
84
- log_e (" Failed to initialize the card (%d ). Make sure SD card lines have pull-up resistors in place." , ret);
138
+ log_e (" Failed to initialize the card (0x%x ). Make sure SD card lines have pull-up resistors in place." , ret);
85
139
}
86
140
_card = NULL ;
87
141
return false ;
@@ -144,4 +198,4 @@ uint64_t SDMMCFS::usedBytes()
144
198
}
145
199
146
200
SDMMCFS SD_MMC = SDMMCFS(FSImplPtr(new VFSImpl()));
147
- #endif /* CONFIG_IDF_TARGET_ESP32 */
201
+ #endif /* SOC_SDMMC_HOST_SUPPORTED */
0 commit comments