@@ -235,16 +235,22 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
235
235
if (clock != NULL ) {
236
236
gpio_set_function (clock -> number , GPIO_GPFSEL4_FSEL48_SD1_CLK );
237
237
gpio_set_pull (clock -> number , BP_PULL_NONE );
238
+ self -> clock_pin = clock -> number ;
238
239
gpio_set_function (command -> number , GPIO_GPFSEL4_FSEL49_SD1_CMD );
239
240
gpio_set_pull (command -> number , BP_PULL_UP );
241
+ self -> command_pin = command -> number ;
240
242
gpio_set_function (data [0 ]-> number , GPIO_GPFSEL5_FSEL50_SD1_DAT0 );
241
243
gpio_set_pull (data [0 ]-> number , BP_PULL_UP );
244
+ self -> data_pins [0 ] = data [0 ]-> number ;
242
245
gpio_set_function (data [1 ]-> number , GPIO_GPFSEL5_FSEL51_SD1_DAT1 );
243
246
gpio_set_pull (data [1 ]-> number , BP_PULL_UP );
247
+ self -> data_pins [1 ] = data [1 ]-> number ;
244
248
gpio_set_function (data [2 ]-> number , GPIO_GPFSEL5_FSEL52_SD1_DAT2 );
245
249
gpio_set_pull (data [2 ]-> number , BP_PULL_UP );
250
+ self -> data_pins [2 ] = data [2 ]-> number ;
246
251
gpio_set_function (data [3 ]-> number , GPIO_GPFSEL5_FSEL53_SD1_DAT3 );
247
252
gpio_set_pull (data [3 ]-> number , BP_PULL_UP );
253
+ self -> data_pins [3 ] = data [3 ]-> number ;
248
254
} else {
249
255
// Switch the sdcard to use the old arasan interface.
250
256
GPIO -> EXTRA_MUX_b .SDIO = GPIO_EXTRA_MUX_SDIO_ARASAN ;
@@ -280,7 +286,19 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
280
286
// Start clocking the card.
281
287
_set_card_clk (0 , 400 );
282
288
283
- sdmmc_card_init (& self -> host_info , & self -> card_info );
289
+ sdmmc_err_t err = SDMMC_ERR_INVALID_RESPONSE ;
290
+ size_t tries = 3 ;
291
+ while (err == SDMMC_ERR_INVALID_RESPONSE && tries > 0 ) {
292
+ err = sdmmc_card_init (& self -> host_info , & self -> card_info );
293
+ if (err != SDMMC_OK ) {
294
+ mp_printf (& mp_plat_print , "SD card init failed %d\n" , err );
295
+ } else if (tries < 3 ) {
296
+ mp_printf (& mp_plat_print , "SD card init success\n" );
297
+ }
298
+ tries -- ;
299
+ }
300
+
301
+ self -> init = err == SDMMC_OK ;
284
302
285
303
self -> capacity = self -> card_info .csd .capacity ;
286
304
}
@@ -297,21 +315,19 @@ uint8_t common_hal_sdioio_sdcard_get_width(sdioio_sdcard_obj_t *self) {
297
315
return self -> num_data ;
298
316
}
299
317
300
- STATIC void check_for_deinit (sdioio_sdcard_obj_t * self ) {
301
- }
302
-
303
318
STATIC void check_whole_block (mp_buffer_info_t * bufinfo ) {
304
319
if (bufinfo -> len % 512 ) {
305
320
mp_raise_ValueError (translate ("Buffer length must be a multiple of 512" ));
306
321
}
307
322
}
308
323
309
324
int common_hal_sdioio_sdcard_writeblocks (sdioio_sdcard_obj_t * self , uint32_t start_block , mp_buffer_info_t * bufinfo ) {
310
- check_for_deinit (self );
325
+ if (!self -> init ) {
326
+ return - EIO ;
327
+ }
311
328
check_whole_block (bufinfo );
312
329
self -> state_programming = true;
313
330
314
- // mp_printf(&mp_plat_print, "write %d %d %d %d\n", start_block, bufinfo->len / 512, self->card_info.csd.capacity, self->card_info.csd.sector_size);
315
331
sdmmc_err_t error = sdmmc_write_sectors (& self -> card_info , bufinfo -> buf ,
316
332
start_block , bufinfo -> len / 512 );
317
333
@@ -325,7 +341,9 @@ int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t sta
325
341
}
326
342
327
343
int common_hal_sdioio_sdcard_readblocks (sdioio_sdcard_obj_t * self , uint32_t start_block , mp_buffer_info_t * bufinfo ) {
328
- check_for_deinit (self );
344
+ if (!self -> init ) {
345
+ return - EIO ;
346
+ }
329
347
check_whole_block (bufinfo );
330
348
sdmmc_err_t error = sdmmc_read_sectors (& self -> card_info , bufinfo -> buf ,
331
349
start_block , bufinfo -> len / 512 );
@@ -339,7 +357,9 @@ int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t star
339
357
}
340
358
341
359
bool common_hal_sdioio_sdcard_configure (sdioio_sdcard_obj_t * self , uint32_t frequency , uint8_t bits ) {
342
- check_for_deinit (self );
360
+ if (!self -> init ) {
361
+ return false;
362
+ }
343
363
return true;
344
364
}
345
365
@@ -361,7 +381,14 @@ void common_hal_sdioio_sdcard_deinit(sdioio_sdcard_obj_t *self) {
361
381
self -> data_pins [1 ] = COMMON_HAL_MCU_NO_PIN ;
362
382
self -> data_pins [2 ] = COMMON_HAL_MCU_NO_PIN ;
363
383
self -> data_pins [3 ] = COMMON_HAL_MCU_NO_PIN ;
384
+ self -> init = false;
364
385
}
365
386
366
387
void common_hal_sdioio_sdcard_never_reset (sdioio_sdcard_obj_t * self ) {
388
+ never_reset_pin_number (self -> command_pin );
389
+ never_reset_pin_number (self -> clock_pin );
390
+ never_reset_pin_number (self -> data_pins [0 ]);
391
+ never_reset_pin_number (self -> data_pins [1 ]);
392
+ never_reset_pin_number (self -> data_pins [2 ]);
393
+ never_reset_pin_number (self -> data_pins [3 ]);
367
394
}
0 commit comments