@@ -235,16 +235,22 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
235235 if (clock != NULL ) {
236236 gpio_set_function (clock -> number , GPIO_GPFSEL4_FSEL48_SD1_CLK );
237237 gpio_set_pull (clock -> number , BP_PULL_NONE );
238+ self -> clock_pin = clock -> number ;
238239 gpio_set_function (command -> number , GPIO_GPFSEL4_FSEL49_SD1_CMD );
239240 gpio_set_pull (command -> number , BP_PULL_UP );
241+ self -> command_pin = command -> number ;
240242 gpio_set_function (data [0 ]-> number , GPIO_GPFSEL5_FSEL50_SD1_DAT0 );
241243 gpio_set_pull (data [0 ]-> number , BP_PULL_UP );
244+ self -> data_pins [0 ] = data [0 ]-> number ;
242245 gpio_set_function (data [1 ]-> number , GPIO_GPFSEL5_FSEL51_SD1_DAT1 );
243246 gpio_set_pull (data [1 ]-> number , BP_PULL_UP );
247+ self -> data_pins [1 ] = data [1 ]-> number ;
244248 gpio_set_function (data [2 ]-> number , GPIO_GPFSEL5_FSEL52_SD1_DAT2 );
245249 gpio_set_pull (data [2 ]-> number , BP_PULL_UP );
250+ self -> data_pins [2 ] = data [2 ]-> number ;
246251 gpio_set_function (data [3 ]-> number , GPIO_GPFSEL5_FSEL53_SD1_DAT3 );
247252 gpio_set_pull (data [3 ]-> number , BP_PULL_UP );
253+ self -> data_pins [3 ] = data [3 ]-> number ;
248254 } else {
249255 // Switch the sdcard to use the old arasan interface.
250256 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,
280286 // Start clocking the card.
281287 _set_card_clk (0 , 400 );
282288
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 ;
284302
285303 self -> capacity = self -> card_info .csd .capacity ;
286304}
@@ -297,21 +315,19 @@ uint8_t common_hal_sdioio_sdcard_get_width(sdioio_sdcard_obj_t *self) {
297315 return self -> num_data ;
298316}
299317
300- STATIC void check_for_deinit (sdioio_sdcard_obj_t * self ) {
301- }
302-
303318STATIC void check_whole_block (mp_buffer_info_t * bufinfo ) {
304319 if (bufinfo -> len % 512 ) {
305320 mp_raise_ValueError (translate ("Buffer length must be a multiple of 512" ));
306321 }
307322}
308323
309324int 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+ }
311328 check_whole_block (bufinfo );
312329 self -> state_programming = true;
313330
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);
315331 sdmmc_err_t error = sdmmc_write_sectors (& self -> card_info , bufinfo -> buf ,
316332 start_block , bufinfo -> len / 512 );
317333
@@ -325,7 +341,9 @@ int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t sta
325341}
326342
327343int 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+ }
329347 check_whole_block (bufinfo );
330348 sdmmc_err_t error = sdmmc_read_sectors (& self -> card_info , bufinfo -> buf ,
331349 start_block , bufinfo -> len / 512 );
@@ -339,7 +357,9 @@ int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t star
339357}
340358
341359bool 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+ }
343363 return true;
344364}
345365
@@ -361,7 +381,14 @@ void common_hal_sdioio_sdcard_deinit(sdioio_sdcard_obj_t *self) {
361381 self -> data_pins [1 ] = COMMON_HAL_MCU_NO_PIN ;
362382 self -> data_pins [2 ] = COMMON_HAL_MCU_NO_PIN ;
363383 self -> data_pins [3 ] = COMMON_HAL_MCU_NO_PIN ;
384+ self -> init = false;
364385}
365386
366387void 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 ]);
367394}
0 commit comments