19
19
#include "esp_log.h"
20
20
static const char * TAG = "SDCard.c" ;
21
21
22
- static bool sdio_host_init = false;
22
+ static bool slot_in_use [2 ];
23
+ static bool never_reset_sdio [2 ] = { false, false };
23
24
24
25
static void common_hal_sdioio_sdcard_check_for_deinit (sdioio_sdcard_obj_t * self ) {
25
26
if (common_hal_sdioio_sdcard_deinited (self )) {
@@ -32,8 +33,12 @@ static int check_pins(const mcu_pin_obj_t *clock, const mcu_pin_obj_t *command,
32
33
// ESP32-S3 and P4 can use any pin for any SDMMC func in either slot
33
34
// Default to SLOT_1 for SD cards
34
35
ESP_LOGI (TAG , "Using chip with CONFIG_SOC_SDMMC_USE_GPIO_MATRIX" );
35
- return SDMMC_HOST_SLOT_1 ;
36
- #endif
36
+ if (!slot_in_use [1 ]) {
37
+ return SDMMC_HOST_SLOT_1 ;
38
+ } else {
39
+ return SDMMC_HOST_SLOT_0 ;
40
+ }
41
+ #else
37
42
if (command -> number == GPIO_NUM_11 && clock -> number == GPIO_NUM_6 && data [0 ]-> number == GPIO_NUM_7 ) {
38
43
// Might be slot 0
39
44
if (num_data == 1 || (num_data == 4 && data [1 ]-> number == GPIO_NUM_8 && data [2 ]-> number == GPIO_NUM_9 && data [3 ]-> number == GPIO_NUM_10 )) {
@@ -46,6 +51,15 @@ static int check_pins(const mcu_pin_obj_t *clock, const mcu_pin_obj_t *command,
46
51
}
47
52
}
48
53
return -1 ;
54
+ #endif
55
+ }
56
+
57
+ uint8_t get_slot_index (sdioio_sdcard_obj_t * self ) {
58
+ if (self -> slot == SDMMC_HOST_SLOT_0 ) {
59
+ return 0 ;
60
+ } else {
61
+ return 1 ;
62
+ }
49
63
}
50
64
51
65
void common_hal_sdioio_sdcard_construct (sdioio_sdcard_obj_t * self ,
@@ -72,15 +86,14 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
72
86
host .max_freq_khz = frequency / 1000 ;
73
87
74
88
sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT ();
75
- slot_config .width = 1 ;
89
+ slot_config .width = num_data ;
76
90
slot_config .clk = clock -> number ;
77
91
self -> clock = clock -> number ;
78
92
slot_config .cmd = command -> number ;
79
93
self -> command = command -> number ;
80
94
slot_config .d0 = data [0 ]-> number ;
81
95
self -> data [0 ] = data [0 ]-> number ;
82
96
if (num_data == 4 ) {
83
- slot_config .width = 4 ;
84
97
slot_config .d1 = data [1 ]-> number ;
85
98
self -> data [1 ] = data [1 ]-> number ;
86
99
slot_config .d2 = data [2 ]-> number ;
@@ -93,13 +106,11 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
93
106
slot_config .width , slot_config .clk , slot_config .cmd ,
94
107
slot_config .d0 , slot_config .d1 , slot_config .d2 , slot_config .d3 );
95
108
96
- if (!sdio_host_init ) {
97
- err = sdmmc_host_init ();
98
- if (err != ESP_OK ) {
99
- mp_raise_OSError_msg_varg (MP_ERROR_TEXT ("SDIO Init Error %x" ), err );
100
- }
101
- // sdio_host_init = true;
109
+ err = sdmmc_host_init ();
110
+ if (err != ESP_OK ) {
111
+ mp_raise_OSError_msg_varg (MP_ERROR_TEXT ("SDIO Init Error %x" ), err );
102
112
}
113
+
103
114
err = sdmmc_host_init_slot (sd_slot , & slot_config );
104
115
if (err != ESP_OK ) {
105
116
ESP_LOGW (TAG , "Failed to initialize SDMMC slot: %x" , err );
@@ -115,13 +126,12 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
115
126
116
127
common_hal_sdioio_sdcard_check_for_deinit (self );
117
128
129
+ slot_in_use [get_slot_index (self )] = true;
130
+
118
131
claim_pin (clock );
119
132
claim_pin (command );
120
- claim_pin (data [0 ]);
121
- if (num_data == 4 ) {
122
- claim_pin (data [1 ]);
123
- claim_pin (data [2 ]);
124
- claim_pin (data [3 ]);
133
+ for (size_t i = 0 ; i < num_data ; i ++ ) {
134
+ claim_pin (data [i ]);
125
135
}
126
136
127
137
ESP_LOGI (TAG , "Initialized SD card with ID %d:%d-%s" ,
@@ -194,30 +204,47 @@ void common_hal_sdioio_sdcard_deinit(sdioio_sdcard_obj_t *self) {
194
204
if (common_hal_sdioio_sdcard_deinited (self )) {
195
205
return ;
196
206
}
207
+
208
+ never_reset_sdio [get_slot_index (self )] = false;
209
+ slot_in_use [get_slot_index (self )] = false;
210
+
197
211
sdmmc_host_deinit ();
198
212
reset_pin_number (self -> command );
199
213
self -> command = COMMON_HAL_MCU_NO_PIN ;
200
214
reset_pin_number (self -> clock );
201
215
self -> clock = COMMON_HAL_MCU_NO_PIN ;
202
- reset_pin_number (self -> data [0 ]);
203
- self -> data [0 ] = COMMON_HAL_MCU_NO_PIN ;
204
- if (self -> num_data == 4 ) {
205
- reset_pin_number (self -> data [1 ]);
206
- self -> data [1 ] = COMMON_HAL_MCU_NO_PIN ;
207
- reset_pin_number (self -> data [2 ]);
208
- self -> data [2 ] = COMMON_HAL_MCU_NO_PIN ;
209
- reset_pin_number (self -> data [3 ]);
210
- self -> data [3 ] = COMMON_HAL_MCU_NO_PIN ;
216
+ for (size_t i = 0 ; i < self -> num_data ; i ++ ) {
217
+ reset_pin_number (self -> data [i ]);
218
+ self -> data [i ] = COMMON_HAL_MCU_NO_PIN ;
211
219
}
220
+
212
221
return ;
213
222
}
214
223
215
224
void common_hal_sdioio_sdcard_never_reset (sdioio_sdcard_obj_t * self ) {
216
225
if (common_hal_sdioio_sdcard_deinited (self )) {
217
226
return ;
218
227
}
228
+
229
+ if (never_reset_sdio [get_slot_index (self )]) {
230
+ return ;
231
+ }
232
+
233
+ never_reset_sdio [get_slot_index (self )] = true;
234
+
235
+ never_reset_pin_number (self -> command );
236
+ never_reset_pin_number (self -> clock );
237
+
238
+ for (size_t i = 0 ; i < self -> num_data ; i ++ ) {
239
+ never_reset_pin_number (self -> data [i ]);
240
+ }
219
241
}
220
242
221
243
void sdioio_reset () {
244
+ for (size_t i = 0 ; i < MP_ARRAY_SIZE (slot_in_use ); i ++ ) {
245
+ if (!never_reset_sdio [i ]) {
246
+ slot_in_use [i ] = false;
247
+ }
248
+ }
222
249
return ;
223
250
}
0 commit comments