2424#include " sdmmc_cmd.h"
2525#include " soc/sdmmc_pins.h"
2626#include " ff.h"
27+ #include " esp32-hal-periman.h"
2728
2829using namespace fs ;
2930
30-
3131SDMMCFS::SDMMCFS (FSImplPtr impl)
3232 : FS(impl), _card(nullptr )
3333{
@@ -40,7 +40,25 @@ SDMMCFS::SDMMCFS(FSImplPtr impl)
4040 _pin_d2 = SDMMC_D2;
4141 _pin_d3 = SDMMC_D3;
4242#endif // BOARD_HAS_1BIT_SDMMC
43- #endif // defined(SOC_SDMMC_USE_GPIO_MATRIX) && defined(BOARD_HAS_SDMMC)
43+
44+ #elif SOC_SDMMC_USE_IOMUX
45+ _pin_clk = SDMMC_SLOT1_IOMUX_PIN_NUM_CLK;
46+ _pin_cmd = SDMMC_SLOT1_IOMUX_PIN_NUM_CMD;
47+ _pin_d0 = SDMMC_SLOT1_IOMUX_PIN_NUM_D0;
48+ #ifndef BOARD_HAS_1BIT_SDMMC
49+ _pin_d1 = SDMMC_SLOT1_IOMUX_PIN_NUM_D1;
50+ _pin_d2 = SDMMC_SLOT1_IOMUX_PIN_NUM_D2;
51+ _pin_d3 = SDMMC_SLOT1_IOMUX_PIN_NUM_D3;
52+ #endif // BOARD_HAS_1BIT_SDMMC
53+ #endif
54+ }
55+
56+ bool SDMMCFS::sdmmcDetachBus (void * bus_pointer){
57+ SDMMCFS *bus = (SDMMCFS *) bus_pointer;
58+ if (bus->_card ) {
59+ bus->end ();
60+ }
61+ return true ;
4462}
4563
4664bool SDMMCFS::setPins (int clk, int cmd, int d0)
@@ -68,12 +86,12 @@ bool SDMMCFS::setPins(int clk, int cmd, int d0, int d1, int d2, int d3)
6886 // Since SDMMCFS::begin hardcodes the usage of slot 1, only check if
6987 // the pins match slot 1 pins.
7088 bool pins_ok = (clk == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_CLK) &&
71- (cmd == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_CMD) &&
72- (d0 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D0) &&
73- (((d1 == -1 ) && (d2 == -1 ) && (d3 == -1 )) ||
74- ((d1 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D1) &&
75- (d2 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D2) &&
76- (d3 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D3)));
89+ (cmd == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_CMD) &&
90+ (d0 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D0) &&
91+ (((d1 == -1 ) && (d2 == -1 ) && (d3 == -1 )) ||
92+ ((d1 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D1) &&
93+ (d2 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D2) &&
94+ (d3 == (int )SDMMC_SLOT1_IOMUX_PIN_NUM_D3)));
7795 if (!pins_ok) {
7896 log_e (" SDMMCFS: specified pins are not supported by this chip." );
7997 return false ;
@@ -89,11 +107,13 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
89107 if (_card) {
90108 return true ;
91109 }
110+ perimanSetBusDeinit (ESP32_BUS_TYPE_SDMMC, SDMMCFS::sdmmcDetachBus);
111+
92112 // mount
93113 sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT ();
94114#ifdef SOC_SDMMC_USE_GPIO_MATRIX
95115 // SoC supports SDMMC pin configuration via GPIO matrix.
96- // Chech that the pins have been set either in the constructor or setPins function.
116+ // Check that the pins have been set either in the constructor or setPins function.
97117 if (_pin_cmd == -1 || _pin_clk == -1 || _pin_d0 == -1
98118 || (!mode1bit && (_pin_d1 == -1 || _pin_d2 == -1 || _pin_d3 == -1 ))) {
99119 log_e (" SDMMCFS: some SD pins are not set" );
@@ -108,6 +128,16 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
108128 slot_config.d3 = (gpio_num_t ) _pin_d3;
109129 slot_config.width = 4 ;
110130#endif // SOC_SDMMC_USE_GPIO_MATRIX
131+
132+ if (!perimanSetPinBus (_pin_cmd, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
133+ if (!perimanSetPinBus (_pin_clk, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
134+ if (!perimanSetPinBus (_pin_d0, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
135+ if (!mode1bit) {
136+ if (!perimanSetPinBus (_pin_d1, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
137+ if (!perimanSetPinBus (_pin_d2, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
138+ if (!perimanSetPinBus (_pin_d3, ESP32_BUS_TYPE_INIT, NULL )){ return false ; }
139+ }
140+
111141 sdmmc_host_t host = SDMMC_HOST_DEFAULT ();
112142 host.flags = SDMMC_HOST_FLAG_4BIT;
113143 host.slot = SDMMC_HOST_SLOT_1;
@@ -119,6 +149,7 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
119149 host.flags = SDMMC_HOST_FLAG_1BIT; // use 1-line SD mode
120150 slot_config.width = 1 ;
121151 }
152+ _mode1bit = mode1bit;
122153
123154 esp_vfs_fat_sdmmc_mount_config_t mount_config = {
124155 .format_if_mount_failed = format_if_mount_failed,
@@ -142,7 +173,21 @@ bool SDMMCFS::begin(const char * mountpoint, bool mode1bit, bool format_if_mount
142173 return false ;
143174 }
144175 _impl->mountpoint (mountpoint);
176+
177+ if (!perimanSetPinBus (_pin_cmd, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
178+ if (!perimanSetPinBus (_pin_clk, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
179+ if (!perimanSetPinBus (_pin_d0, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
180+ if (!mode1bit) {
181+ if (!perimanSetPinBus (_pin_d1, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
182+ if (!perimanSetPinBus (_pin_d2, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
183+ if (!perimanSetPinBus (_pin_d3, ESP32_BUS_TYPE_SDMMC, (void *)(this ))){ goto err; }
184+ }
145185 return true ;
186+
187+ err:
188+ log_e (" Failed to set all pins bus to SDMMC" );
189+ SDMMCFS::sdmmcDetachBus ((void *)(this ));
190+ return false ;
146191}
147192
148193void SDMMCFS::end ()
@@ -151,6 +196,14 @@ void SDMMCFS::end()
151196 esp_vfs_fat_sdcard_unmount (_impl->mountpoint (), _card);
152197 _impl->mountpoint (NULL );
153198 _card = NULL ;
199+ perimanSetPinBus (_pin_cmd, ESP32_BUS_TYPE_INIT, NULL );
200+ perimanSetPinBus (_pin_clk, ESP32_BUS_TYPE_INIT, NULL );
201+ perimanSetPinBus (_pin_d0, ESP32_BUS_TYPE_INIT, NULL );
202+ if (!_mode1bit) {
203+ perimanSetPinBus (_pin_d1, ESP32_BUS_TYPE_INIT, NULL );
204+ perimanSetPinBus (_pin_d2, ESP32_BUS_TYPE_INIT, NULL );
205+ perimanSetPinBus (_pin_d3, ESP32_BUS_TYPE_INIT, NULL );
206+ }
154207 }
155208}
156209
0 commit comments