From 62338938a07123841f9622d69f0f07e4ab9cfcdb Mon Sep 17 00:00:00 2001 From: Nick Foster Date: Wed, 15 Dec 2010 11:58:02 -0800 Subject: ZPU: bootloader for 210 mods --- firmware/microblaze/usrp2p/bootloader/init_bootloader.c | 8 ++++---- firmware/microblaze/usrp2p/bootloader_utils.c | 11 ++++++----- firmware/microblaze/usrp2p/bootloader_utils.h | 6 +++--- firmware/microblaze/usrp2p/memory_map.h | 2 ++ 4 files changed, 15 insertions(+), 12 deletions(-) (limited to 'firmware') diff --git a/firmware/microblaze/usrp2p/bootloader/init_bootloader.c b/firmware/microblaze/usrp2p/bootloader/init_bootloader.c index ab6c70a6b..53b50e34e 100644 --- a/firmware/microblaze/usrp2p/bootloader/init_bootloader.c +++ b/firmware/microblaze/usrp2p/bootloader/init_bootloader.c @@ -42,7 +42,7 @@ void load_ihex(void) { //simple IHEX parser to load proper records into RAM. loa } else if(ihex_record.type == 1) { //end of record puts("OK"); //load main firmware - start_program(RAM_BASE); + start_program(); puts("ERROR: main image returned! Back in IHEX load mode."); } else puts("NOK"); //RAM loads do not support extended segment address records (04) -- upper 16 bits are always "0". } else puts("NOK"); @@ -71,7 +71,7 @@ int main(int argc, char *argv[]) { if(is_valid_fw_image(SAFE_FW_IMAGE_LOCATION_ADDR)) { set_safe_booted_flag(1); //let the firmware know it's the safe image spi_flash_read(SAFE_FW_IMAGE_LOCATION_ADDR, FW_IMAGE_SIZE_BYTES, (void *)RAM_BASE); - start_program(RAM_BASE); + start_program(); puts("ERROR: return from main program! This should never happen!"); icap_reload_fpga(SAFE_FPGA_IMAGE_LOCATION_ADDR); } else { @@ -93,7 +93,7 @@ int main(int argc, char *argv[]) { if(is_valid_fw_image(PROD_FW_IMAGE_LOCATION_ADDR)) { puts("Valid production firmware found. Loading..."); spi_flash_read(PROD_FW_IMAGE_LOCATION_ADDR, FW_IMAGE_SIZE_BYTES, (void *)RAM_BASE); - start_program(RAM_BASE); + start_program(); puts("ERROR: Return from main program! This should never happen!"); //if this happens, though, the safest thing to do is reboot the whole FPGA and start over. icap_reload_fpga(SAFE_FPGA_IMAGE_LOCATION_ADDR); @@ -102,7 +102,7 @@ int main(int argc, char *argv[]) { puts("No valid production firmware found. Trying safe firmware..."); if(is_valid_fw_image(SAFE_FW_IMAGE_LOCATION_ADDR)) { spi_flash_read(SAFE_FW_IMAGE_LOCATION_ADDR, FW_IMAGE_SIZE_BYTES, (void *)RAM_BASE); - start_program(RAM_BASE); + start_program(); puts("ERROR: return from main program! This should never happen!"); icap_reload_fpga(SAFE_FPGA_IMAGE_LOCATION_ADDR); return 1; diff --git a/firmware/microblaze/usrp2p/bootloader_utils.c b/firmware/microblaze/usrp2p/bootloader_utils.c index d68fafcb3..d04cffcf6 100644 --- a/firmware/microblaze/usrp2p/bootloader_utils.c +++ b/firmware/microblaze/usrp2p/bootloader_utils.c @@ -10,6 +10,7 @@ #include #include #include +#include int is_valid_fpga_image(uint32_t addr) { uint8_t imgbuf[64]; @@ -25,15 +26,15 @@ int is_valid_fpga_image(uint32_t addr) { } int is_valid_fw_image(uint32_t addr) { - static const uint8_t fwheader[] = {0x0b 0x0b 0x0b 0x0b 0x80 0x70}; //just lookin for a jump to anywhere located at the reset vector + static const uint8_t fwheader[] = {0x0b, 0x0b, 0x0b, 0x0b, 0x80, 0x70}; //just lookin for a jump to anywhere located at the reset vector uint8_t buf[12]; spi_flash_read(addr, 6, buf); return memcmp(buf, fwheader, 6) == 0; } -void start_program(uint32_t addr) +void start_program(void) { - memcpy(0x00000000, addr+0x00000000, 0x3f); //copy the reset vector and interrupt vector - typedef void (*fptr_t)(void); - (*(fptr_t) 0x00000000)(); // most likely no return + //ignoring the addr now + //all this does is tap that register + *((volatile uint32_t *) SR_ADDR_BLDRDONE) = 1; } diff --git a/firmware/microblaze/usrp2p/bootloader_utils.h b/firmware/microblaze/usrp2p/bootloader_utils.h index f597c0113..9fdeebf17 100644 --- a/firmware/microblaze/usrp2p/bootloader_utils.h +++ b/firmware/microblaze/usrp2p/bootloader_utils.h @@ -9,8 +9,8 @@ //we're working in bytes and byte addresses so we can run the same code with Flash chips of different sector sizes. //it's really 1463736, but rounded up to 1.5MB #define FPGA_IMAGE_SIZE_BYTES 1572864 -//instead of 32K, we write 31K because we're using the top 1K for stack space! -#define FW_IMAGE_SIZE_BYTES 31744 +//16K +#define FW_IMAGE_SIZE_BYTES 16384 #define SAFE_FPGA_IMAGE_LOCATION_ADDR 0x00000000 #define SAFE_FW_IMAGE_LOCATION_ADDR 0x003F0000 @@ -19,4 +19,4 @@ int is_valid_fpga_image(uint32_t addr); int is_valid_fw_image(uint32_t addr); -void start_program(uint32_t addr); +void start_program(void); diff --git a/firmware/microblaze/usrp2p/memory_map.h b/firmware/microblaze/usrp2p/memory_map.h index 51e4b9413..659ded0b5 100644 --- a/firmware/microblaze/usrp2p/memory_map.h +++ b/firmware/microblaze/usrp2p/memory_map.h @@ -238,6 +238,8 @@ hwconfig_wishbone_divisor(void) #define _SR_ADDR(sr) (MISC_OUTPUT_BASE + (sr) * sizeof(uint32_t)) +#define SR_ADDR_BLDRDONE _SR_ADDR(5) + // --- buffer pool control regs --- typedef struct { -- cgit v1.2.3