Skip to content

Commit 48d826b

Browse files
committed
Never reset SD card pins
1 parent 38d2472 commit 48d826b

File tree

4 files changed

+38
-9
lines changed

4 files changed

+38
-9
lines changed

ports/broadcom/common-hal/sdioio/SDCard.c

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
303318
STATIC 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

309324
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+
}
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

327343
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+
}
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

341359
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+
}
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

366387
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]);
367394
}

ports/broadcom/common-hal/sdioio/SDCard.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ typedef struct {
3737
uint8_t num_data;
3838
bool state_programming;
3939
bool has_lock;
40+
bool init;
4041
uint8_t command_pin;
4142
uint8_t clock_pin;
4243
uint8_t data_pins[4];

ports/broadcom/supervisor/internal_flash.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ void supervisor_flash_init(void) {
6060
NULL, NULL,
6161
0, NULL, 8000000);
6262
#endif
63+
common_hal_sdioio_sdcard_never_reset(&sd);
6364

6465
uint32_t buffer[512 / sizeof(uint32_t)];
6566
mp_buffer_info_t bufinfo;

0 commit comments

Comments
 (0)