software/liblitespi/spiflash: review/simplify/update and test on arty.
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 20 May 2020 09:13:25 +0000 (11:13 +0200)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 20 May 2020 09:16:39 +0000 (11:16 +0200)
litex/soc/software/bios/main.c
litex/soc/software/liblitespi/spiflash.c
litex/soc/software/liblitespi/spiflash.h

index dc2117ad433d59adf5d25faca22b703d1ba28153..077064459fe161150ec837581bcb3bf98526deec 100644 (file)
@@ -131,9 +131,9 @@ int main(int i, char **c)
                printf("Memory initialization failed\n");
        printf("\n");
 #endif
-//#ifdef CSR_SPI_BASE
-//     spi_autoconfig();
-//#endif
+#ifdef CSR_SPIFLASH_MMAP_BASE
+       spiflash_init();
+#endif
 
        if(sdr_ok) {
                printf("--============== \e[1mBoot\e[0m ==================--\n");
index 702c969d157afe608a8befca5c1b0e5c2a0ec030..7a161bf310c9c368cf353ba7904e82c7e7366014 100644 (file)
 
 #include "spiflash.h"
 
-#ifdef SPIXIP_BASE
+#ifdef CSR_SPIFLASH_MMAP_BASE
 
 #define DEBUG  0
 #define USER_DEFINED_DUMMY_BITS        0
 
 static spi_mode spi_get_mode(void)
 {
-       return (spi_mode)spi_cfg_read();
+       return (spi_mode)spiflash_mmap_cfg_read();
 }
 
 static void spi_set_mode(spi_mode mode)
 {
-       spi_cfg_write((unsigned char)mode);
+       spiflash_mmap_cfg_write((unsigned char)mode);
 }
 
-int spi_frequency_test(void)
+int spiflash_freq_init(void)
 {
-       unsigned int lowest_div = spi_clk_divisor_read();
-       unsigned int crc = crc32((unsigned char *)SPIXIP_BASE, SPI_FLASH_BLOCK_SIZE);
+       unsigned int lowest_div = spiflash_mmap_clk_divisor_read();
+       unsigned int crc = crc32((unsigned char *)SPIFLASH_BASE, SPI_FLASH_BLOCK_SIZE);
        unsigned int crc_test = crc;
 
 #if DEBUG
@@ -43,42 +43,45 @@ int spi_frequency_test(void)
 
        /* Check if block is erased (filled with 0xFF) */
        if(crc == CRC32_ERASED_FLASH) {
-               printf("Block of size %d, started on address 0x%x is erased. Cannot proceed with SPI frequency test.\n\r", SPI_FLASH_BLOCK_SIZE, SPIXIP_BASE);
+               printf("Block of size %d, started on address 0x%x is erased. Cannot proceed with SPI frequency test.\n\r", SPI_FLASH_BLOCK_SIZE, SPIFLASH_BASE);
                return -1;
        }
 
        for(int i = lowest_div; (crc == crc_test) && (i >= 0); i--) {
                lowest_div = i;
-               spi_clk_divisor_write((uint32_t)i);
-               crc_test = crc32((unsigned char *)SPIXIP_BASE, SPI_FLASH_BLOCK_SIZE);
+               spiflash_mmap_clk_divisor_write((uint32_t)i);
+               crc_test = crc32((unsigned char *)SPIFLASH_BASE, SPI_FLASH_BLOCK_SIZE);
 #if DEBUG
                printf("[DIV: %d] %08x\n\r", i, crc_test);
 #endif
        }
        lowest_div++;
-       printf("Maximum available frequency: %d Hz\n\r", (spi_sys_clk_freq_read()/(2*(1 + lowest_div))));
+       printf("SPIFlash freq configured to %d MHz\n", (spiflash_mmap_sys_clk_freq_read()/(2*(1 + lowest_div)))/1000000);
 
-       return lowest_div;
+       spiflash_mmap_clk_divisor_write(lowest_div);
+
+       return 0;
 }
 
 #endif
 
-void spi_dummy_bits_setup(unsigned int dummy_bits)
+void spiflash_dummy_bits_setup(unsigned int dummy_bits)
 {
-       spi_dummy_bits_write((uint32_t)dummy_bits);
+       spiflash_mmap_dummy_bits_write((uint32_t)dummy_bits);
 #if DEBUG
        printf("Dummy bits set to: %d\n\r", spi_dummy_bits_read());
 #endif
 }
 
-void spi_autoconfig(void)
+void spiflash_init(void)
 {
-       int ret = spi_frequency_test();
-       if(ret < 0) {
+       int ret;
+
+       printf("Initializing SPIFlash...\n");
+
+       ret = spiflash_freq_init();
+       if (ret < 0)
                return;
-       } else {
-               spi_clk_divisor_write((uint32_t)ret);
-       }
 #if (USER_DEFINED_DUMMY_BITS > 0)
        spi_dummy_bits_setup(USER_DEFINED_DUMMY_BITS);
 #endif
index b9d210c28e2b3458b57a0babf504b65a48604b41..f72867603095be84de0bbdb96b23047c93da5f63 100644 (file)
@@ -11,8 +11,8 @@ typedef enum {
        SPI_MODE_MASTER = 1,
 } spi_mode;
 
-int spi_frequency_test(void);
-void spi_dummy_bits_setup(unsigned int dummy_bits);
-void spi_autoconfig(void);
+int spiflash_freq_init(void);
+void spiflash_dummy_bits_setup(unsigned int dummy_bits);
+void spiflash_init(void);
 
 #endif /* __LITESPI_FLASH_H */