PERFORCE change 96620 for review
Warner Losh
imp at FreeBSD.org
Wed May 3 21:51:59 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=96620
Change 96620 by imp at imp_hammer on 2006/05/03 21:51:23
Add support for updating the boot flash (I), the FPGA (F) and
Reset (R) commands. This should remove the need for jumpers
most of the time...
Affected files ...
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/env_vars.c#2 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#3 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.h#3 edit
Differences ...
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/env_vars.c#2 (text+ko) ====
@@ -204,5 +204,6 @@
currentOffset = 0;
DumpBootCommands();
+ printf("Autoboot...\r\n");
Bootloader(ReadCharFromEnvironment);
}
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#3 (text+ko) ====
@@ -32,7 +32,7 @@
#include "loader_prompt.h"
#include "env_vars.h"
#include "lib.h"
-
+#include "spi_flash.h"
/******************************* GLOBALS *************************************/
@@ -62,6 +62,9 @@
{COMMAND_TFTP, "tftp"},
{COMMAND_WRITE, "w"},
{COMMAND_XMODEM, "x"},
+ {COMMAND_RESET, "R"},
+ {COMMAND_REPLACE_FLASH_VIA_XMODEM, "I"},
+ {COMMAND_REPLACE_FPGA_VIA_XMODEM, "F"},
{COMMAND_FINAL_FLAG, 0}
};
@@ -164,6 +167,34 @@
}
+static void
+UpdateFlash(int offset)
+{
+ char *addr = (char *)SDRAM_BASE + (1 << 20); /* Load to base + 1MB */
+ char *addr2 = (char *)SDRAM_BASE + (2 << 20); /* Load to base + 2MB */
+ char *addr3 = (char *)SDRAM_BASE + (3 << 20); /* Load to base + 2MB */
+ int len, i, j, off;
+
+ while ((len = xmodem_rx(addr)) == -1)
+ continue;
+ printf("\r\nDownloaded %u bytes.\r\n", len);
+ p_memcpy(addr3, addr, (len + FLASH_PAGE_SIZE - 1) /
+ FLASH_PAGE_SIZE * FLASH_PAGE_SIZE);
+ printf("Writing %u bytes to flash at %u\r\n", len, offset);
+ for (i = 0; i < len; i+= FLASH_PAGE_SIZE) {
+ for (j = 0; j < 10; j++) {
+ off = i + offset * FLASH_PAGE_SIZE;
+ printf("%u/%u\r", off, len + offset);
+ SPI_WriteFlash(off, addr + i, FLASH_PAGE_SIZE);
+ SPI_ReadFlash(off, addr2 + i, FLASH_PAGE_SIZE);
+ if (p_memcmp(addr3 + i, addr2 + i, FLASH_PAGE_SIZE) == 0)
+ break;
+ }
+ if (j >= 10)
+ printf("Bad Readback at %u\r\n", i);
+ }
+}
+
/*
* .KB_C_FN_DEFINITION_START
* void ParseCommand(char *)
@@ -237,19 +268,22 @@
case COMMAND_HELP:
// dump command info
printf("Commands:\r\n"
- "\tc\r\n"
- "\td\r\n"
- "\te\r\n"
- "\tip\r\n"
- "\tserver_ip\r\n"
- "\tm\r\n"
- "\ttftp\r\n"
- "\ts\r\n"
+ "\tc\r\n"
+ "\td\r\n"
+ "\te\r\n"
+ "\tip\r\n"
+ "\tserver_ip\r\n"
+ "\tm\r\n"
+ "\ttftp\r\n"
+ "\ts\r\n"
#ifdef SUPPORT_TAG_LIST
- "\tt\r\n"
+ "\tt\r\n"
#endif
- "\tw\r\n"
- "\tx\r\n");
+ "\tw\r\n"
+ "\tx\r\n"
+ "\tI\r\n"
+ "\tR\r\n"
+ "\tF\r\n");
break;
case COMMAND_LOCAL_IP:
@@ -310,14 +344,26 @@
break;
case COMMAND_XMODEM:
- {
// "x <address>"
// download X-modem record at address
if (argc > 1)
xmodem_rx((char *)p_ASCIIToHex(argv[1]));
break;
- }
+
+ case COMMAND_RESET:
+ printf("Reset\r\n");
+ reset();
+ while (1) continue;
+ break;
+ case COMMAND_REPLACE_FPGA_VIA_XMODEM:
+ printf("Updating FPGA image\r\n");
+ UpdateFlash(15);
+ break;
+ case COMMAND_REPLACE_FLASH_VIA_XMODEM:
+ printf("Updating FLASH image\r\n");
+ UpdateFlash(0);
+ break;
default:
break;
}
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.h#3 (text+ko) ====
@@ -40,6 +40,9 @@
COMMAND_TFTP,
COMMAND_WRITE,
COMMAND_XMODEM,
+ COMMAND_RESET,
+ COMMAND_REPLACE_FLASH_VIA_XMODEM,
+ COMMAND_REPLACE_FPGA_VIA_XMODEM,
COMMAND_FINAL_FLAG
} e_cmd_t;
More information about the p4-projects
mailing list