aboutsummaryrefslogtreecommitdiff
path: root/sys/boot
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2012-07-07 04:55:42 +0000
committerWarner Losh <imp@FreeBSD.org>2012-07-07 04:55:42 +0000
commit51763c630316d35d095fe1ef7220ddbd51617564 (patch)
tree0561ef88db088bf806d86813a37702b93dce0fb3 /sys/boot
parent1d4fae38250e1329f9f41a6d256eaf218d7314d3 (diff)
downloadsrc-51763c630316d35d095fe1ef7220ddbd51617564.tar.gz
src-51763c630316d35d095fe1ef7220ddbd51617564.zip
Generalize this for loading the loader into the SPI. Plus trim about
100 bytes from the binary with silly tricks. Hope to get this small enough to run on the models that have 4k SRAM. We are close compiled for the at91rm9200, but still need to trim for the target.
Notes
Notes: svn path=/head/; revision=238188
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/arm/at91/boot0spi/main.c16
1 files changed, 5 insertions, 11 deletions
diff --git a/sys/boot/arm/at91/boot0spi/main.c b/sys/boot/arm/at91/boot0spi/main.c
index 9f1a2729beff..4d03b26fe0d2 100644
--- a/sys/boot/arm/at91/boot0spi/main.c
+++ b/sys/boot/arm/at91/boot0spi/main.c
@@ -29,31 +29,26 @@
#include "at91rm9200_lowlevel.h"
#include "spi_flash.h"
-#define LOADER_OFFSET 0
-#define FPGA_OFFSET (15 * FLASH_PAGE_SIZE)
-#define OFFSET FPGA_OFFSET
+#define OFFSET 0
-int
+void
main(void)
{
int len, i, j, off, sec;
char *addr = (char *)SDRAM_BASE + (1 << 20); /* download at + 1MB */
char *addr2 = (char *)SDRAM_BASE + (2 << 20); /* readback to + 2MB */
- char *addr3 = (char *)SDRAM_BASE + (3 << 20); /* extra copy at + 3MB */
SPI_InitFlash();
printf("Waiting for data\n");
while ((len = xmodem_rx(addr)) == -1)
continue;
- // Need extra copy at addr3
- memcpy(addr3, addr, (len + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE * FLASH_PAGE_SIZE);
- printf("Writing %u bytes to flash at %u\n", len, OFFSET);
+ printf("Writing %u bytes at %u\n", len, OFFSET);
for (i = 0; i < len; i+= FLASH_PAGE_SIZE) {
+ off = i + OFFSET;
for (j = 0; j < 10; j++) {
- off = i + 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)
+ if (p_memcmp(addr + i, addr2 + i, FLASH_PAGE_SIZE) == 0)
break;
}
if (j >= 10)
@@ -64,5 +59,4 @@ main(void)
continue;
printf("Done\n");
reset();
- return (1);
}