Skip to content

Commit a02ecf3

Browse files
committed
feat(sdmmc): Add support for P4
1 parent 3733c87 commit a02ecf3

File tree

6 files changed

+83
-21
lines changed

6 files changed

+83
-21
lines changed

Diff for: cores/esp32/esp32-hal-periman.c

+3
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ const char *perimanGetTypeName(peripheral_bus_type_t type) {
8787
case ESP32_BUS_TYPE_SDMMC_D1: return "SDMMC_D1";
8888
case ESP32_BUS_TYPE_SDMMC_D2: return "SDMMC_D2";
8989
case ESP32_BUS_TYPE_SDMMC_D3: return "SDMMC_D3";
90+
#if SOC_SDMMC_IO_POWER_EXTERNAL
91+
case ESP32_BUS_TYPE_SDMMC_POWER: return "SDMMC_POWER";
92+
#endif
9093
#endif
9194
#if SOC_TOUCH_SENSOR_SUPPORTED
9295
case ESP32_BUS_TYPE_TOUCH: return "TOUCH";

Diff for: cores/esp32/esp32-hal-periman.h

+9-6
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,15 @@ typedef enum {
7979
ESP32_BUS_TYPE_SPI_MASTER_SS, // IO is used as SPI master SS pin
8080
#endif
8181
#if SOC_SDMMC_HOST_SUPPORTED
82-
ESP32_BUS_TYPE_SDMMC_CLK, // IO is used as SDMMC CLK pin
83-
ESP32_BUS_TYPE_SDMMC_CMD, // IO is used as SDMMC CMD pin
84-
ESP32_BUS_TYPE_SDMMC_D0, // IO is used as SDMMC D0 pin
85-
ESP32_BUS_TYPE_SDMMC_D1, // IO is used as SDMMC D1 pin
86-
ESP32_BUS_TYPE_SDMMC_D2, // IO is used as SDMMC D2 pin
87-
ESP32_BUS_TYPE_SDMMC_D3, // IO is used as SDMMC D3 pin
82+
ESP32_BUS_TYPE_SDMMC_CLK, // IO is used as SDMMC CLK pin
83+
ESP32_BUS_TYPE_SDMMC_CMD, // IO is used as SDMMC CMD pin
84+
ESP32_BUS_TYPE_SDMMC_D0, // IO is used as SDMMC D0 pin
85+
ESP32_BUS_TYPE_SDMMC_D1, // IO is used as SDMMC D1 pin
86+
ESP32_BUS_TYPE_SDMMC_D2, // IO is used as SDMMC D2 pin
87+
ESP32_BUS_TYPE_SDMMC_D3, // IO is used as SDMMC D3 pin
88+
#if SOC_SDMMC_IO_POWER_EXTERNAL
89+
ESP32_BUS_TYPE_SDMMC_POWER, // IO is used as SDMMC POWER pin
90+
#endif
8891
#endif
8992
#if SOC_TOUCH_SENSOR_SUPPORTED
9093
ESP32_BUS_TYPE_TOUCH, // IO is used as TOUCH pin

Diff for: libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino

+27-10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Connections for ║ ║ ╔═══╩═║═║═══╗ ║ ║ ║
1515
* full-sized ║ ║ ║ ╔═╝ ║ ║ ║ ║ ║
1616
* SD card ║ ║ ║ ║ ║ ║ ║ ║ ║
17+
* ESP32-P4 Func EV | 40 39 GND 43 3V3 GND 44 43 42 |
1718
* ESP32-S3 DevKit | 21 47 GND 39 3V3 GND 40 41 42 |
1819
* ESP32-S3-USB-OTG | 38 37 GND 36 3V3 GND 35 34 33 |
1920
* ESP32 | 4 2 GND 14 3V3 GND 15 13 12 |
@@ -42,6 +43,7 @@
4243
#include "FS.h"
4344
#include "SD_MMC.h"
4445

46+
#ifdef CONFIG_IDF_TARGET_ESP32S3
4547
// Default pins for ESP-S3
4648
// Warning: ESP32-S3-WROOM-2 is using most of the default GPIOs (33-37) to interface with on-board OPI flash.
4749
// If the SD_MMC is initialized with default pins it will result in rebooting loop - please
@@ -54,6 +56,18 @@ int d0 = 37;
5456
int d1 = 38;
5557
int d2 = 33;
5658
int d3 = 39; // GPIO 34 is not broken-out on ESP32-S3-DevKitC-1 v1.1
59+
int power = -1; // SDMMC IO power controlled internally
60+
61+
#elif CONFIG_IDF_TARGET_ESP32P4
62+
// Pin definition for ESP32-P4 Function EV board V1.4
63+
int clk = 43;
64+
int cmd = 44;
65+
int d0 = 39;
66+
int d1 = 40;
67+
int d2 = 41;
68+
int d3 = 42;
69+
int power = 4;
70+
#endif
5771

5872
void listDir(fs::FS &fs, const char *dirname, uint8_t levels) {
5973
Serial.printf("Listing directory: %s\n", dirname);
@@ -211,16 +225,17 @@ void testFileIO(fs::FS &fs, const char *path) {
211225
void setup() {
212226
Serial.begin(115200);
213227
/*
214-
// If you want to change the pin assignment on ESP32-S3 uncomment this block and the appropriate
228+
// If you want to change the pin assignment or you get an error that some pins or power pin
229+
// is not assigned on ESP32-S3/ESP32-P4 uncomment this block and the appropriate
215230
// line depending if you want to use 1-bit or 4-bit line.
216-
// Please note that ESP32 does not allow pin change and will always fail.
217-
//if(! SD_MMC.setPins(clk, cmd, d0)){
218-
//if(! SD_MMC.setPins(clk, cmd, d0, d1, d2, d3)){
219-
Serial.println("Pin change failed!");
220-
return;
221-
}
222-
*/
223-
231+
// Please note that ESP32 does not allow pin change and setPins() will always fail.
232+
//if(! SD_MMC.setPins(clk, cmd, d0, power)){
233+
//if(! SD_MMC.setPins(clk, cmd, d0, d1, d2, d3, power)){
234+
// Serial.println("Pin change failed!");
235+
// return;
236+
//}
237+
*/
238+
224239
if (!SD_MMC.begin()) {
225240
Serial.println("Card Mount Failed");
226241
return;
@@ -262,4 +277,6 @@ void setup() {
262277
Serial.printf("Used space: %lluMB\n", SD_MMC.usedBytes() / (1024 * 1024));
263278
}
264279

265-
void loop() {}
280+
void loop() {
281+
delay(10);
282+
}

Diff for: libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
* Connections for ║ ║ ╔═══╩═║═║═══╗ ║ ║ ║
1515
* full-sized ║ ║ ║ ╔═╝ ║ ║ ║ ║ ║
1616
* SD card ║ ║ ║ ║ ║ ║ ║ ║ ║
17+
* ESP32-P4 Func EV | 40 39 GND 43 3V3 GND 44 43 42 | + POWER (4)
1718
* ESP32-S3 DevKit | 21 47 GND 39 3V3 GND 40 41 42 |
1819
* ESP32-S3-USB-OTG | 38 37 GND 36 3V3 GND 35 34 33 |
1920
* ESP32 | 4 2 GND 14 3V3 GND 15 13 12 |

Diff for: libraries/SD_MMC/src/SD_MMC.cpp

+38-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
#include "ff.h"
3333
#include "esp32-hal-periman.h"
3434

35+
#if SOC_SDMMC_IO_POWER_EXTERNAL
36+
#include "sd_pwr_ctrl_by_on_chip_ldo.h"
37+
#endif
38+
3539
using namespace fs;
3640

3741
SDMMCFS::SDMMCFS(FSImplPtr impl) : FS(impl), _card(nullptr) {
@@ -77,11 +81,11 @@ bool SDMMCFS::sdmmcDetachBus(void *bus_pointer) {
7781
return true;
7882
}
7983

80-
bool SDMMCFS::setPins(int clk, int cmd, int d0) {
81-
return setPins(clk, cmd, d0, GPIO_NUM_NC, GPIO_NUM_NC, GPIO_NUM_NC);
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);
8286
}
8387

84-
bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3) {
88+
bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3, int power) {
8589
if (_card != nullptr) {
8690
log_e("SD_MMC.setPins must be called before SD_MMC.begin");
8791
return false;
@@ -94,6 +98,7 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3) {
9498
d1 = digitalPinToGPIONumber(d1);
9599
d2 = digitalPinToGPIONumber(d2);
96100
d3 = digitalPinToGPIONumber(d3);
101+
power = digitalPinToGPIONumber(power);
97102

98103
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
99104
// SoC supports SDMMC pin configuration via GPIO matrix. Save the pins for later use in SDMMCFS::begin.
@@ -103,6 +108,9 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3) {
103108
_pin_d1 = (int8_t)d1;
104109
_pin_d2 = (int8_t)d2;
105110
_pin_d3 = (int8_t)d3;
111+
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
112+
_pin_power = (int8_t)power;
113+
#endif
106114
return true;
107115
#elif CONFIG_IDF_TARGET_ESP32
108116
// ESP32 doesn't support SDMMC pin configuration via GPIO matrix.
@@ -133,6 +141,9 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
133141
perimanSetBusDeinit(ESP32_BUS_TYPE_SDMMC_D2, SDMMCFS::sdmmcDetachBus);
134142
perimanSetBusDeinit(ESP32_BUS_TYPE_SDMMC_D3, SDMMCFS::sdmmcDetachBus);
135143
}
144+
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
145+
perimanSetBusDeinit(ESP32_BUS_TYPE_SDMMC_POWER, SDMMCFS::sdmmcDetachBus);
146+
#endif
136147
//mount
137148
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
138149
#ifdef SOC_SDMMC_USE_GPIO_MATRIX
@@ -142,6 +153,12 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
142153
log_e("SDMMCFS: some SD pins are not set");
143154
return false;
144155
}
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
145162

146163
slot_config.clk = (gpio_num_t)_pin_clk;
147164
slot_config.cmd = (gpio_num_t)_pin_cmd;
@@ -186,6 +203,19 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
186203
}
187204
_mode1bit = mode1bit;
188205

206+
#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;
217+
#endif
218+
189219
esp_vfs_fat_sdmmc_mount_config_t mount_config = {
190220
.format_if_mount_failed = format_if_mount_failed,
191221
.max_files = maxOpenFiles,
@@ -231,6 +261,11 @@ bool SDMMCFS::begin(const char *mountpoint, bool mode1bit, bool format_if_mount_
231261
goto err;
232262
}
233263
}
264+
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
265+
if (!perimanSetPinBus(_pin_power, ESP32_BUS_TYPE_SDMMC_POWER, (void *)(this), -1, -1)) {
266+
goto err;
267+
}
268+
#endif
234269
return true;
235270

236271
err:

Diff for: libraries/SD_MMC/src/SD_MMC.h

+5-2
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,16 @@ class SDMMCFS : public FS {
4444
int8_t _pin_d1 = -1;
4545
int8_t _pin_d2 = -1;
4646
int8_t _pin_d3 = -1;
47+
#ifdef SOC_SDMMC_IO_POWER_EXTERNAL
48+
int8_t _pin_power = -1;
49+
#endif
4750
uint8_t _pdrv = 0xFF;
4851
bool _mode1bit = false;
4952

5053
public:
5154
SDMMCFS(FSImplPtr impl);
52-
bool setPins(int clk, int cmd, int d0);
53-
bool setPins(int clk, int cmd, int d0, int d1, int d2, int d3);
55+
bool setPins(int clk, int cmd, int d0, int power = -1);
56+
bool setPins(int clk, int cmd, int d0, int d1, int d2, int d3, int power = -1);
5457
bool begin(
5558
const char *mountpoint = "/sdcard", bool mode1bit = false, bool format_if_mount_failed = false, int sdmmc_frequency = BOARD_MAX_SDMMC_FREQ,
5659
uint8_t maxOpenFiles = 5

0 commit comments

Comments
 (0)