|
@@ -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();
|
|
|
}
|