From 4a18b828bc81522a654f51a73f20faece4dc313c Mon Sep 17 00:00:00 2001 From: Florent Kermarrec Date: Mon, 20 Jul 2020 12:28:29 +0200 Subject: [PATCH] software/liblitesdcard/spisdcard: remove optimization on receive_block (not working on all configs) and increase max clk_freq to 20MHz. --- litex/soc/software/liblitesdcard/spisdcard.c | 21 ++++++-------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/litex/soc/software/liblitesdcard/spisdcard.c b/litex/soc/software/liblitesdcard/spisdcard.c index d4c3370d..01c62d4c 100644 --- a/litex/soc/software/liblitesdcard/spisdcard.c +++ b/litex/soc/software/liblitesdcard/spisdcard.c @@ -24,7 +24,7 @@ #define SPISDCARD_CLK_FREQ_INIT 400000 #endif #ifndef SPISDCARD_CLK_FREQ -#define SPISDCARD_CLK_FREQ 12500000 +#define SPISDCARD_CLK_FREQ 20000000 #endif /*-----------------------------------------------------------------------*/ @@ -40,7 +40,7 @@ static void spi_set_clk_freq(uint32_t clk_freq) { uint32_t divider; - divider = CONFIG_CLOCK_FREQUENCY/clk_freq; + divider = CONFIG_CLOCK_FREQUENCY/clk_freq + 1; divider = max(divider, 2); divider = min(divider, 256); #ifdef SPISDCARD_DEBUG @@ -135,7 +135,6 @@ static void busy_wait_us(unsigned int us) static uint8_t spisdcardreceive_block(uint8_t *buf) { uint16_t i; - uint8_t done; uint32_t timeout; /* Wait 100ms for a start of block */ @@ -151,18 +150,10 @@ static uint8_t spisdcardreceive_block(uint8_t *buf) { /* Receive block */ spisdcard_mosi_write(0xff); - i = 0; - for (;;) { - done = spisdcard_status_read() & SPI_DONE; - if (done) { - spisdcard_control_write(8*SPI_LENGTH | SPI_START); - *buf = spisdcard_miso_read(); - if (i == 512) - break; - if (i != 0) - buf++; - i++; - } + for (i=0; i<512; i++) { + spisdcard_control_write(8*SPI_LENGTH | SPI_START); + while (spisdcard_status_read() != SPI_DONE); + *buf++ = spisdcard_miso_read(); } /* Discard CRC */ -- 2.30.2