Browse Source

rv32: support max80.fw for sdcard updates; guess at boardver if needed

Look for /max80/max80.fw when doing an sdcard update.

If the boardinfo is not programmed, assume it is "MAX80 vX" where X =
FPGA version to make it handle max80.fw better.
H. Peter Anvin 1 year ago
parent
commit
55783db494

BIN
esp32/output/max80.ino.bin


+ 2 - 2
fpga/max80.qpf

@@ -19,12 +19,12 @@
 #
 # Quartus Prime
 # Version 22.1std.2 Build 922 07/20/2023 SC Lite Edition
-# Date created = 18:52:09  October 01, 2023
+# Date created = 19:20:13  October 01, 2023
 #
 # -------------------------------------------------------------------------- #
 
 QUARTUS_VERSION = "22.1"
-DATE = "18:52:09  October 01, 2023"
+DATE = "19:20:13  October 01, 2023"
 
 # Revisions
 

BIN
fpga/output/bypass.jic


BIN
fpga/output/max80.fw


BIN
fpga/output/v1.fw


BIN
fpga/output/v1.jic


BIN
fpga/output/v1.sof


BIN
fpga/output/v2.fw


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.sof


+ 1 - 1
rv32/checksum.h

@@ -1,4 +1,4 @@
 #ifndef CHECKSUM_H
 #define CHECKSUM_H
-#define SDRAM_SUM 0x52bf7103
+#define SDRAM_SUM 0x6b74a2de
 #endif

+ 55 - 26
rv32/romcopy.c

@@ -339,57 +339,55 @@ static int rom_sdcard_read_data(void *cookie, void *buf, unsigned int bufsize)
 /*
  * Flash an image from an SD card, and reload the FPGA if successful
  */
-void rom_flash_from_sdcard(void)
+static int rom_flash_from_sdcard_file(const char *filename)
 {
     struct spiflash max80_flash;
-    char fw_orig_file_name[32];
-    char fw_file_name[32];
-    int l;
-    FRESULT fr;
+    char *fw_file_name = NULL;
+    FRESULT fr = FR_NO_FILE;
     FILINFO fno;
     FIL f;
 
-    rom_spiflash_init(&max80_flash);
-    max80_flash.read_data = rom_sdcard_read_data;
-    max80_flash.cookie    = &f;
-
-    l = snprintf(fw_orig_file_name, sizeof fw_orig_file_name,
-		 "/max80/v%u.fw", SYS_BOARDFPGA);
-
-    fr = f_stat(fw_orig_file_name, &fno);
+    fr = f_stat(filename, &fno);
     if (fr != FR_OK || (fno.fattrib & AM_DIR))
-	return;			/* No firmware file found */
+	return 0;		/* No such firmware file found but no error */
 
-    con_printf("update: firmware update file %s found\n", fw_orig_file_name);
+    con_printf("update: firmware update file %s found\n", filename);
 
     /* Rename the firmware file to avoid repeated updates */
-    memcpy(fw_file_name, fw_orig_file_name, l);
+    size_t l = strlen(filename);
+    fw_file_name = malloc(l+5);
+    if (!fw_file_name)
+	goto err;
+    memcpy(fw_file_name, filename, l);
 
-    for (unsigned int i = 1; i < 100000; i++) {
-	snprintf(fw_file_name+l, sizeof fw_file_name-l, ".%03u", i);
+    for (unsigned int i = 1; i < 1000; i++) {
+	snprintf(fw_file_name+l, 5, ".%03u", i);
 
-	fr = f_rename(fw_orig_file_name, fw_file_name);
+	fr = f_rename(filename, fw_file_name);
 	if (fr != FR_EXIST)
 	    break;
     }
 
     if (fr != FR_OK) {
 	con_puts("update: unable to rename update file, skipping\n");
-	return;
+	goto err;
     }
 
-    con_printf("update: renamed %s -> %s\n", fw_orig_file_name, fw_file_name);
+    con_printf("update: renamed %s -> %s\n", filename, fw_file_name);
+
+    rom_spiflash_init(&max80_flash);
+    max80_flash.read_data = rom_sdcard_read_data;
+    max80_flash.cookie    = &f;
 
     fr = f_open(&f, fw_file_name, FA_READ);
     if (fr != FR_OK) {
 	con_puts("update: cannot open file, terminating\n");
-	return;
+	goto err;
     }
 
     if (spiflash_flash_file(&max80_flash, NULL, 0)) {
 	con_puts("update: flash update data invalid\n");
-	f_close(&f);
-	return;
+	goto err;
     }
 
     /* Now do it for real */
@@ -398,8 +396,7 @@ void rom_flash_from_sdcard(void)
 
     if (spiflash_flash_file(&max80_flash, NULL, 0)) {
 	con_puts("update: flash update failed\n");
-	f_close(&f);
-	return;
+	goto err;
     }
 
     f_close(&f);
@@ -408,6 +405,28 @@ void rom_flash_from_sdcard(void)
     udelay(500000);
 
     shutdown(SYS_RESET_RECONFIG);
+
+err:
+    if (fr == FR_OK)
+	f_close(&f);
+    if (fw_file_name)
+	free(fw_file_name);
+    return -1;
+}
+
+/*
+ * Check for a firmware upgrade file on the sd card
+ */
+void rom_flash_from_sdcard(void)
+{
+    static char versioned_filename[] = "/max80/v?.fw";
+
+    /* Look for version-specific firmware file */
+    versioned_filename[8] = SYS_BOARDFPGA + '0';
+    rom_flash_from_sdcard_file(versioned_filename);
+
+    /* Look for universal firmware file */
+    rom_flash_from_sdcard_file("/max80/max80.fw");
 }
 
 static bool boardinfo_valid(const struct board_info *bi)
@@ -439,6 +458,16 @@ static void boardinfo_init(void)
     if (rlen < len)
 	memset((char *)&board_info + rlen, 0, sizeof board_info - rlen);
 
+    /*
+     * If no board version is specified, use the FPGA version as a
+     * resonable guess.  This might be useful if the FPGA firmware has
+     * been uploaded via JTAG.
+     */
+    if (!board_info.version_str[0]) {
+	snprintf(board_info.version_str, sizeof board_info.version_str,
+		 "MAX80 v%u", SYS_BOARDFPGA);
+    }
+
     /* Convert serial number and export to USB */
     rom_mangle_serial();
 }