39
39
using namespace fs ;
40
40
41
41
SDMMCFS::SDMMCFS (FSImplPtr impl) : FS(impl), _card(nullptr ) {
42
- #if !defined(CONFIG_IDF_TARGET_ESP32P4)
43
- #if defined(SOC_SDMMC_USE_GPIO_MATRIX) && defined(BOARD_HAS_SDMMC)
42
+ #if defined(SOC_SDMMC_USE_GPIO_MATRIX) && defined(BOARD_HAS_SDMMC) && !defined(CONFIG_IDF_TARGET_ESP32P4)
44
43
_pin_clk = SDMMC_CLK;
45
44
_pin_cmd = SDMMC_CMD;
46
45
_pin_d0 = SDMMC_D0;
@@ -49,9 +48,8 @@ SDMMCFS::SDMMCFS(FSImplPtr impl) : FS(impl), _card(nullptr) {
49
48
_pin_d2 = SDMMC_D2;
50
49
_pin_d3 = SDMMC_D3;
51
50
#endif // BOARD_HAS_1BIT_SDMMC
52
- #endif // !defined(CONFIG_IDF_TARGET_ESP32P4)
53
51
54
- #elif SOC_SDMMC_USE_IOMUX && defined(BOARD_HAS_SDMMC) && defined(CONFIG_IDF_TARGET_ESP32)
52
+ #elif defined( SOC_SDMMC_USE_IOMUX) && defined(BOARD_HAS_SDMMC) && defined(CONFIG_IDF_TARGET_ESP32)
55
53
_pin_clk = SDMMC_SLOT1_IOMUX_PIN_NUM_CLK;
56
54
_pin_cmd = SDMMC_SLOT1_IOMUX_PIN_NUM_CMD;
57
55
_pin_d0 = SDMMC_SLOT1_IOMUX_PIN_NUM_D0;
@@ -61,7 +59,9 @@ SDMMCFS::SDMMCFS(FSImplPtr impl) : FS(impl), _card(nullptr) {
61
59
_pin_d3 = SDMMC_SLOT1_IOMUX_PIN_NUM_D3;
62
60
#endif // BOARD_HAS_1BIT_SDMMC
63
61
64
- #elif SOC_SDMMC_USE_IOMUX && defined(BOARD_HAS_SDMMC) && defined(CONFIG_IDF_TARGET_ESP32P4)
62
+ // ESP32-P4 can use either IOMUX or GPIO matrix
63
+ #elif defined(BOARD_HAS_SDMMC) && defined(CONFIG_IDF_TARGET_ESP32P4)
64
+ #if defined(BOARD_SDMMC_SLOT) && (BOARD_SDMMC_SLOT == 0)
65
65
_pin_clk = SDMMC_SLOT0_IOMUX_PIN_NUM_CLK;
66
66
_pin_cmd = SDMMC_SLOT0_IOMUX_PIN_NUM_CMD;
67
67
_pin_d0 = SDMMC_SLOT0_IOMUX_PIN_NUM_D0;
@@ -70,6 +70,19 @@ SDMMCFS::SDMMCFS(FSImplPtr impl) : FS(impl), _card(nullptr) {
70
70
_pin_d2 = SDMMC_SLOT0_IOMUX_PIN_NUM_D2;
71
71
_pin_d3 = SDMMC_SLOT0_IOMUX_PIN_NUM_D3;
72
72
#endif // BOARD_HAS_1BIT_SDMMC
73
+ #else
74
+ _pin_clk = SDMMC_CLK;
75
+ _pin_cmd = SDMMC_CMD;
76
+ _pin_d0 = SDMMC_D0;
77
+ #ifndef BOARD_HAS_1BIT_SDMMC
78
+ _pin_d1 = SDMMC_D1;
79
+ _pin_d2 = SDMMC_D2;
80
+ _pin_d3 = SDMMC_D3;
81
+ #endif // BOARD_HAS_1BIT_SDMMC
82
+ #endif // BOARD_SDMMC_SLOT_NO
83
+ #endif
84
+ #if defined(SOC_SDMMC_IO_POWER_EXTERNAL) && defined(BOARD_SDMMC_POWER_CHANNEL)
85
+ _power_channel = BOARD_SDMMC_POWER_CHANNEL;
73
86
#endif
74
87
}
75
88
@@ -81,11 +94,11 @@ bool SDMMCFS::sdmmcDetachBus(void *bus_pointer) {
81
94
return true ;
82
95
}
83
96
84
- bool SDMMCFS::setPins (int clk, int cmd, int d0, int power ) {
85
- return setPins (clk, cmd, d0, GPIO_NUM_NC, GPIO_NUM_NC, GPIO_NUM_NC, power );
97
+ bool SDMMCFS::setPins (int clk, int cmd, int d0) {
98
+ return setPins (clk, cmd, d0, GPIO_NUM_NC, GPIO_NUM_NC, GPIO_NUM_NC);
86
99
}
87
100
88
- bool SDMMCFS::setPins (int clk, int cmd, int d0, int d1, int d2, int d3, int power ) {
101
+ bool SDMMCFS::setPins (int clk, int cmd, int d0, int d1, int d2, int d3) {
89
102
if (_card != nullptr ) {
90
103
log_e (" SD_MMC.setPins must be called before SD_MMC.begin" );
91
104
return false ;
@@ -98,19 +111,15 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3, int powe
98
111
d1 = digitalPinToGPIONumber (d1);
99
112
d2 = digitalPinToGPIONumber (d2);
100
113
d3 = digitalPinToGPIONumber (d3);
101
- power = digitalPinToGPIONumber (power);
102
114
103
- #ifdef SOC_SDMMC_USE_GPIO_MATRIX
115
+ #if defined( SOC_SDMMC_USE_GPIO_MATRIX) && !defined(CONFIG_IDF_TARGET_ESP32P4)
104
116
// SoC supports SDMMC pin configuration via GPIO matrix. Save the pins for later use in SDMMCFS::begin.
105
117
_pin_clk = (int8_t )clk;
106
118
_pin_cmd = (int8_t )cmd;
107
119
_pin_d0 = (int8_t )d0;
108
120
_pin_d1 = (int8_t )d1;
109
121
_pin_d2 = (int8_t )d2;
110
122
_pin_d3 = (int8_t )d3;
111
- #ifdef SOC_SDMMC_IO_POWER_EXTERNAL
112
- _pin_power = (int8_t )power;
113
- #endif
114
123
return true ;
115
124
#elif CONFIG_IDF_TARGET_ESP32
116
125
// ESP32 doesn't support SDMMC pin configuration via GPIO matrix.
@@ -124,11 +133,40 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3, int powe
124
133
return false ;
125
134
}
126
135
return true ;
136
+ #elif defined(CONFIG_IDF_TARGET_ESP32P4)
137
+ #if defined(BOARD_SDMMC_SLOT) && (BOARD_SDMMC_SLOT == 0)
138
+ // ESP32-P4 can use either IOMUX or GPIO matrix
139
+ bool pins_ok =
140
+ (clk == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_CLK) && (cmd == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_CMD) && (d0 == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_D0)
141
+ && (((d1 == -1 ) && (d2 == -1 ) && (d3 == -1 )) || ((d1 == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_D1) && (d2 == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_D2) && (d3 == (int )SDMMC_SLOT0_IOMUX_PIN_NUM_D3)));
142
+ if (!pins_ok) {
143
+ log_e (" SDMMCFS: specified pins are not supported when using IOMUX (SDMMC SLOT 0)." );
144
+ return false ;
145
+ }
146
+ return true ;
147
+ #else
148
+ _pin_clk = (int8_t )clk;
149
+ _pin_cmd = (int8_t )cmd;
150
+ _pin_d0 = (int8_t )d0;
151
+ _pin_d1 = (int8_t )d1;
152
+ _pin_d2 = (int8_t )d2;
153
+ _pin_d3 = (int8_t )d3;
154
+ return true ;
155
+ #endif
127
156
#else
128
157
#error SoC not supported
129
158
#endif
130
159
}
131
160
161
+ bool SDMMCFS::setPowerChannel (int power_channel) {
162
+ if (_card != nullptr ) {
163
+ log_e (" SD_MMC.setPowerChannel must be called before SD_MMC.begin" );
164
+ return false ;
165
+ }
166
+ _power_channel = power_channel;
167
+ return true ;
168
+ }
169
+
132
170
bool SDMMCFS::begin (const char *mountpoint, bool mode1bit, bool format_if_mount_failed, int sdmmc_frequency, uint8_t maxOpenFiles) {
133
171
if (_card) {
134
172
return true ;
@@ -141,24 +179,16 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
141
179
perimanSetBusDeinit (ESP32_BUS_TYPE_SDMMC_D2, SDMMCFS::sdmmcDetachBus);
142
180
perimanSetBusDeinit (ESP32_BUS_TYPE_SDMMC_D3, SDMMCFS::sdmmcDetachBus);
143
181
}
144
- #ifdef SOC_SDMMC_IO_POWER_EXTERNAL
145
- perimanSetBusDeinit (ESP32_BUS_TYPE_SDMMC_POWER, SDMMCFS::sdmmcDetachBus);
146
- #endif
147
182
// mount
148
183
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT ();
149
- #ifdef SOC_SDMMC_USE_GPIO_MATRIX
184
+ #if (defined(SOC_SDMMC_USE_GPIO_MATRIX) && !defined(CONFIG_IDF_TARGET_ESP32P4)) || (defined(CONFIG_IDF_TARGET_ESP32P4) && ((defined(BOARD_SDMMC_SLOT) && (BOARD_SDMMC_SLOT == 1)) || !defined(BOARD_HAS_SDMMC)))
185
+ log_d (" pin_cmd: %d, pin_clk: %d, pin_d0: %d, pin_d1: %d, pin_d2: %d, pin_d3: %d" , _pin_cmd, _pin_clk, _pin_d0, _pin_d1, _pin_d2, _pin_d3);
150
186
// SoC supports SDMMC pin configuration via GPIO matrix.
151
187
// Check that the pins have been set either in the constructor or setPins function.
152
188
if (_pin_cmd == -1 || _pin_clk == -1 || _pin_d0 == -1 || (!mode1bit && (_pin_d1 == -1 || _pin_d2 == -1 || _pin_d3 == -1 ))) {
153
189
log_e (" SDMMCFS: some SD pins are not set" );
154
190
return false ;
155
191
}
156
- #ifdef SOC_SDMMC_IO_POWER_EXTERNAL
157
- if (_pin_power == -1 ) {
158
- log_e (" SDMMCFS: power pin is not set" );
159
- return false ;
160
- }
161
- #endif
162
192
163
193
slot_config.clk = (gpio_num_t )_pin_clk;
164
194
slot_config.cmd = (gpio_num_t )_pin_cmd;
@@ -192,7 +222,18 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
192
222
193
223
sdmmc_host_t host = SDMMC_HOST_DEFAULT ();
194
224
host.flags = SDMMC_HOST_FLAG_4BIT;
225
+ #if defined(CONFIG_IDF_TARGET_ESP32P4) && defined(BOARD_SDMMC_SLOT) && (BOARD_SDMMC_SLOT == 0)
226
+ host.slot = SDMMC_HOST_SLOT_0;
227
+ // reconfigure slot_config to remove all pins in order to use IO_MUX
228
+ slot_config = {
229
+ .cd = SDMMC_SLOT_NO_CD,
230
+ .wp = SDMMC_SLOT_NO_WP,
231
+ .width = 4 ,
232
+ .flags = 0 ,
233
+ };
234
+ #else
195
235
host.slot = SDMMC_HOST_SLOT_1;
236
+ #endif
196
237
host.max_freq_khz = sdmmc_frequency;
197
238
#ifdef BOARD_HAS_1BIT_SDMMC
198
239
mode1bit = true ;
@@ -204,16 +245,16 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
204
245
_mode1bit = mode1bit;
205
246
206
247
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
207
- sd_pwr_ctrl_ldo_config_t ldo_config = {
208
- .ldo_chan_id = _pin_power,
209
- };
210
- sd_pwr_ctrl_handle_t pwr_ctrl_handle = NULL ;
211
-
212
- if (sd_pwr_ctrl_new_on_chip_ldo (&ldo_config, &pwr_ctrl_handle) != ESP_OK) {
213
- log_e (" Failed to create a new on-chip LDO power control driver" );
214
- return false ;
215
- }
216
- host.pwr_ctrl_handle = pwr_ctrl_handle;
248
+ sd_pwr_ctrl_ldo_config_t ldo_config = {
249
+ .ldo_chan_id = _pin_power,
250
+ };
251
+ sd_pwr_ctrl_handle_t pwr_ctrl_handle = NULL ;
252
+
253
+ if (sd_pwr_ctrl_new_on_chip_ldo (&ldo_config, &pwr_ctrl_handle) != ESP_OK) {
254
+ log_e (" Failed to create a new on-chip LDO power control driver" );
255
+ return false ;
256
+ }
257
+ host.pwr_ctrl_handle = pwr_ctrl_handle;
217
258
#endif
218
259
219
260
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
@@ -263,7 +304,7 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
263
304
}
264
305
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
265
306
if (!perimanSetPinBus (_pin_power, ESP32_BUS_TYPE_SDMMC_POWER, (void *)(this ), -1 , -1 )) {
266
- goto err;
307
+ goto err;
267
308
}
268
309
#endif
269
310
return true ;
0 commit comments