Fix SD card integration and Lua game loading
- Fix SD card MISO pin (was using display MISO instead of SD MISO) - Add FatFS mounting after SD card initialization - Restore SPI baudrate on all SD init failure paths - Add case-insensitive .lua file extension check - Filter out hidden 8.3 filename entries - Add SPI speed management functions for shared SPI bus - Wrap all FatFS operations with SPI speed switching - Restore display SPI speed (32 MHz) after SD operations - Add debug output to Lua game loader This fixes slow display refresh when SD card is present and enables reliable Lua game loading from SD card /games directory.
This commit is contained in:
@@ -105,7 +105,7 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
// Configure MISO pin for SPI (MUST be done for SD card reads to work)
|
||||
gpio_set_function(config->gpio_miso, GPIO_FUNC_SPI);
|
||||
|
||||
// Save current SPI speed
|
||||
// Save current SPI speed to restore on failure
|
||||
uint baudrate = spi_get_baudrate(config->spi);
|
||||
|
||||
// Slow down SPI for SD card initialization (100-400 kHz recommended)
|
||||
@@ -128,6 +128,7 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
|
||||
if (r1 != SD_R1_IDLE_STATE) {
|
||||
printf("[SD] Card not responding to CMD0\n");
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false; // Card not responding
|
||||
}
|
||||
|
||||
@@ -151,6 +152,7 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
// Check if voltage range is supported
|
||||
if (ocr[2] != 0x01 || ocr[3] != 0xAA) {
|
||||
printf("[SD] Voltage range not supported\n");
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -173,6 +175,7 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
|
||||
if (r1 != SD_R1_READY) {
|
||||
printf("[SD] ACMD41 initialization timeout\n");
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false; // Initialization failed
|
||||
}
|
||||
|
||||
@@ -222,10 +225,12 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
|
||||
g_card_info.type = SD_CARD_TYPE_SD1;
|
||||
} else {
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false; // Not supported
|
||||
}
|
||||
|
||||
if (r1 != SD_R1_READY) {
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -237,6 +242,7 @@ bool sd_card_init(const sd_card_config_t *config) {
|
||||
sd_card_deselect();
|
||||
|
||||
if (r1 != SD_R1_READY) {
|
||||
spi_set_baudrate(config->spi, baudrate); // Restore original speed
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -392,14 +398,28 @@ bool sd_card_init_with_board_config(void) {
|
||||
static const sd_card_config_t config = {
|
||||
.spi = SD_SPI_PORT,
|
||||
.gpio_cs = SD_CS_PIN,
|
||||
.gpio_miso = DISPLAY_MISO_PIN,
|
||||
.gpio_mosi = DISPLAY_MOSI_PIN,
|
||||
.gpio_sck = DISPLAY_SCK_PIN
|
||||
.gpio_miso = SD_MISO_PIN,
|
||||
.gpio_mosi = SD_MOSI_PIN,
|
||||
.gpio_sck = SD_SCK_PIN
|
||||
};
|
||||
|
||||
return sd_card_init(&config);
|
||||
}
|
||||
|
||||
uint sd_card_set_spi_speed(void) {
|
||||
if (!g_config) return 0;
|
||||
|
||||
// Save current speed and set to SD card speed
|
||||
uint current_speed = spi_get_baudrate(g_config->spi);
|
||||
spi_set_baudrate(g_config->spi, 12500 * 1000); // 12.5 MHz for SD card
|
||||
return current_speed;
|
||||
}
|
||||
|
||||
void sd_card_restore_spi_speed(uint baudrate) {
|
||||
if (!g_config || baudrate == 0) return;
|
||||
spi_set_baudrate(g_config->spi, baudrate);
|
||||
}
|
||||
|
||||
bool sd_card_test_fatfs(void) {
|
||||
if (!g_card_info.initialized) {
|
||||
printf("SD Card not initialized\n");
|
||||
|
||||
@@ -75,6 +75,19 @@ bool sd_card_init(const sd_card_config_t *config);
|
||||
*/
|
||||
bool sd_card_init_with_board_config(void);
|
||||
|
||||
/**
|
||||
* Set SPI speed to SD card speed (12.5 MHz) before SD operations
|
||||
* Call this before any FatFS file operations if SPI is shared with display
|
||||
* @return Previous baudrate to restore later
|
||||
*/
|
||||
uint sd_card_set_spi_speed(void);
|
||||
|
||||
/**
|
||||
* Restore SPI speed after SD card operations
|
||||
* @param baudrate Previous baudrate to restore
|
||||
*/
|
||||
void sd_card_restore_spi_speed(uint baudrate);
|
||||
|
||||
/**
|
||||
* Get card information
|
||||
* @param info Pointer to info structure to fill
|
||||
|
||||
Reference in New Issue
Block a user