From cb2a7890081cd50ae546796bba6e60d4425d4b57 Mon Sep 17 00:00:00 2001 From: "Lukas F. Hartmann" Date: Tue, 25 Apr 2023 13:30:07 +0200 Subject: [PATCH] bios/spiflash: bring back write and erase, add write from sdcard file cmd When shipping MNT RKX7, I pre-flash the SPI flash with a LiteX bitfile for testing. cmd_spiflash had regressed because of changed SPIFLASH defines and didn't offer the write functions anymore. This commit fixes that, and adds convenience functions: - flash_erase_range - flash_from_sdcard The latter reuses some boot code to copy the contents of the specified file from the boot FAT partition on the SD card to SPI flash (i.e. a bitstream). --- litex/soc/software/bios/cmds/cmd_spiflash.c | 111 ++++++++++++++++---- 1 file changed, 90 insertions(+), 21 deletions(-) diff --git a/litex/soc/software/bios/cmds/cmd_spiflash.c b/litex/soc/software/bios/cmds/cmd_spiflash.c index 1038f7a79..7b1dacc62 100644 --- a/litex/soc/software/bios/cmds/cmd_spiflash.c +++ b/litex/soc/software/bios/cmds/cmd_spiflash.c @@ -8,23 +8,26 @@ #include "../command.h" #include "../helpers.h" +#include +#include +#include + /** * Command "flash_write" * * Write data from a memory buffer to SPI flash * */ -#if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE) +#if (defined CSR_SPIFLASH_CORE_MASTER_CS_ADDR) static void flash_write_handler(int nb_params, char **params) { char *c; unsigned int addr; - unsigned int value; + unsigned int mem_addr; unsigned int count; - unsigned int i; if (nb_params < 2) { - printf("flash_write [count]"); + printf("flash_write [count (bytes)]"); return; } @@ -34,9 +37,9 @@ static void flash_write_handler(int nb_params, char **params) return; } - value = strtoul(params[1], &c, 0); + mem_addr = strtoul(params[1], &c, 0); if (*c != 0) { - printf("Incorrect value"); + printf("Incorrect mem_addr"); return; } @@ -50,26 +53,92 @@ static void flash_write_handler(int nb_params, char **params) } } - for (i = 0; i < count; i++) - write_to_flash(addr + i * 4, (unsigned char *)&value, 4); + spiflash_write_stream(addr, (unsigned char *)mem_addr, count); } define_command(flash_write, flash_write_handler, "Write to flash", SPIFLASH_CMDS); -#endif -/** - * Command "flash_erase" - * - * Flash erase - * - */ -#if (defined CSR_SPIFLASH_BASE && defined SPIFLASH_PAGE_SIZE) -static void flash_erase_handler(int nb_params, char **params) +static void flash_from_sdcard_handler(int nb_params, char **params) { - erase_flash(); - printf("Flash erased\n"); + FRESULT fr; + FATFS fs; + FIL file; + uint32_t br; + uint32_t offset; + unsigned long length; + uint8_t buf[512]; + + if (nb_params < 1) { + printf("flash_from_sdcard "); + return; + } + + char* filename = params[0]; + + fr = f_mount(&fs, "", 1); + if (fr != FR_OK) + return; + fr = f_open(&file, filename, FA_READ); + if (fr != FR_OK) { + printf("%s file not found.\n", filename); + f_mount(0, "", 0); + return; + } + + length = f_size(&file); + printf("Copying %s to SPI flash (%ld bytes)...\n", filename, length); + init_progression_bar(length); + offset = 0; + for (;;) { + fr = f_read(&file, (void*) buf, 512, (UINT *)&br); + if (fr != FR_OK) { + printf("file read error.\n"); + f_close(&file); + f_mount(0, "", 0); + return; + } + if (br == 0) { + break; + } else { + spiflash_write_stream(offset, buf, br); + } + + offset += br; + show_progress(offset); + } + show_progress(offset); + printf("\n"); + + f_close(&file); + f_mount(0, "", 0); +} +define_command(flash_from_sdcard, flash_from_sdcard_handler, "Write file from SD card to flash", SPIFLASH_CMDS); + +static void flash_erase_range_handler(int nb_params, char **params) +{ + char *c; + uint32_t addr; + uint32_t count; + + if (nb_params < 2) { + printf("flash_erase "); + return; + } + + addr = strtoul(params[0], &c, 0); + if (*c != 0) { + printf("Incorrect offset"); + return; + } + + count = strtoul(params[1], &c, 0); + if (*c != 0) { + printf("Incorrect count"); + return; + } + + spiflash_erase_range(addr, count); } -define_command(flash_erase, flash_erase_handler, "Erase whole flash", SPIFLASH_CMDS); +define_command(flash_erase_range, flash_erase_range_handler, "Erase flash range", SPIFLASH_CMDS); #endif -