Never reset SD card pins

This commit is contained in:
Scott Shawcroft 2022-01-04 19:08:14 -08:00
parent 38d2472683
commit 48d826b15d
No known key found for this signature in database
GPG Key ID: 0DFD512649C052DA
4 changed files with 38 additions and 9 deletions

View File

@ -235,16 +235,22 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
if (clock != NULL) {
gpio_set_function(clock->number, GPIO_GPFSEL4_FSEL48_SD1_CLK);
gpio_set_pull(clock->number, BP_PULL_NONE);
self->clock_pin = clock->number;
gpio_set_function(command->number, GPIO_GPFSEL4_FSEL49_SD1_CMD);
gpio_set_pull(command->number, BP_PULL_UP);
self->command_pin = command->number;
gpio_set_function(data[0]->number, GPIO_GPFSEL5_FSEL50_SD1_DAT0);
gpio_set_pull(data[0]->number, BP_PULL_UP);
self->data_pins[0] = data[0]->number;
gpio_set_function(data[1]->number, GPIO_GPFSEL5_FSEL51_SD1_DAT1);
gpio_set_pull(data[1]->number, BP_PULL_UP);
self->data_pins[1] = data[1]->number;
gpio_set_function(data[2]->number, GPIO_GPFSEL5_FSEL52_SD1_DAT2);
gpio_set_pull(data[2]->number, BP_PULL_UP);
self->data_pins[2] = data[2]->number;
gpio_set_function(data[3]->number, GPIO_GPFSEL5_FSEL53_SD1_DAT3);
gpio_set_pull(data[3]->number, BP_PULL_UP);
self->data_pins[3] = data[3]->number;
} else {
// Switch the sdcard to use the old arasan interface.
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,
// Start clocking the card.
_set_card_clk(0, 400);
sdmmc_card_init(&self->host_info, &self->card_info);
sdmmc_err_t err = SDMMC_ERR_INVALID_RESPONSE;
size_t tries = 3;
while (err == SDMMC_ERR_INVALID_RESPONSE && tries > 0) {
err = sdmmc_card_init(&self->host_info, &self->card_info);
if (err != SDMMC_OK) {
mp_printf(&mp_plat_print, "SD card init failed %d\n", err);
} else if (tries < 3) {
mp_printf(&mp_plat_print, "SD card init success\n");
}
tries--;
}
self->init = err == SDMMC_OK;
self->capacity = self->card_info.csd.capacity;
}
@ -297,9 +315,6 @@ uint8_t common_hal_sdioio_sdcard_get_width(sdioio_sdcard_obj_t *self) {
return self->num_data;
}
STATIC void check_for_deinit(sdioio_sdcard_obj_t *self) {
}
STATIC void check_whole_block(mp_buffer_info_t *bufinfo) {
if (bufinfo->len % 512) {
mp_raise_ValueError(translate("Buffer length must be a multiple of 512"));
@ -307,11 +322,12 @@ STATIC void check_whole_block(mp_buffer_info_t *bufinfo) {
}
int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) {
check_for_deinit(self);
if (!self->init) {
return -EIO;
}
check_whole_block(bufinfo);
self->state_programming = true;
// 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);
sdmmc_err_t error = sdmmc_write_sectors(&self->card_info, bufinfo->buf,
start_block, bufinfo->len / 512);
@ -325,7 +341,9 @@ int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t sta
}
int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t start_block, mp_buffer_info_t *bufinfo) {
check_for_deinit(self);
if (!self->init) {
return -EIO;
}
check_whole_block(bufinfo);
sdmmc_err_t error = sdmmc_read_sectors(&self->card_info, bufinfo->buf,
start_block, bufinfo->len / 512);
@ -339,7 +357,9 @@ int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t star
}
bool common_hal_sdioio_sdcard_configure(sdioio_sdcard_obj_t *self, uint32_t frequency, uint8_t bits) {
check_for_deinit(self);
if (!self->init) {
return false;
}
return true;
}
@ -361,7 +381,14 @@ void common_hal_sdioio_sdcard_deinit(sdioio_sdcard_obj_t *self) {
self->data_pins[1] = COMMON_HAL_MCU_NO_PIN;
self->data_pins[2] = COMMON_HAL_MCU_NO_PIN;
self->data_pins[3] = COMMON_HAL_MCU_NO_PIN;
self->init = false;
}
void common_hal_sdioio_sdcard_never_reset(sdioio_sdcard_obj_t *self) {
never_reset_pin_number(self->command_pin);
never_reset_pin_number(self->clock_pin);
never_reset_pin_number(self->data_pins[0]);
never_reset_pin_number(self->data_pins[1]);
never_reset_pin_number(self->data_pins[2]);
never_reset_pin_number(self->data_pins[3]);
}

View File

@ -37,6 +37,7 @@ typedef struct {
uint8_t num_data;
bool state_programming;
bool has_lock;
bool init;
uint8_t command_pin;
uint8_t clock_pin;
uint8_t data_pins[4];

@ -1 +1 @@
Subproject commit 82c3fbb0d8622a0108003eb84d8fbdac0ac9d80e
Subproject commit 24578e029babb1a01ef8641ca6019f1a86992ff4

View File

@ -60,6 +60,7 @@ void supervisor_flash_init(void) {
NULL, NULL,
0, NULL, 8000000);
#endif
common_hal_sdioio_sdcard_never_reset(&sd);
uint32_t buffer[512 / sizeof(uint32_t)];
mp_buffer_info_t bufinfo;