/***************************************************************** * * bootloader.c * * Trivial Microblaze/uClinux bootloader * *****************************************************************/ /* Get general hardware memory map */ #include "xparameters.h" #include "xbasic_types.h" #include "xstatus.h" #include "mb_interface.h" #define FLASH_BASEADDR 0xff000000 #define FLASH_COMMAND_ADDR_555 (FLASH_BASEADDR + 0x01554) #define FLASH_COMMAND_ADDR_2AA (FLASH_BASEADDR + 0x00aa8) #define FLASH_COMMAND_AA 0x00AA00AA #define FLASH_COMMAND_55 0x00550055 #define FLASH_COMMAND_READ_RESET 0x00F000F0 #define FLASH_COMMAND_ERASE 0x00800080 #define FLASH_COMMAND_AUTO_CHIP_ERASE 0x00100010 #define FLASH_COMMAND_AUTO_BLOCK_ERASE 0x00300030 #define FLASH_COMMAND_AUTO_PROGRAM 0x00A000A0 #define FLASH_DQ7 0x00800080 #define FLASH_DQ5 0x00200020 unsigned int *flash_start = (unsigned int *)FLASH_BASEADDR; unsigned int *ddr_start = (unsigned int *)XPAR_DDR_CONTROLLER_BASEADDR; unsigned int *ddr_end = (unsigned int *)XPAR_DDR_CONTROLLER_HIGHADDR; unsigned int *ram_start = (unsigned int *)0xffe00000; unsigned int *ram_end = (unsigned int *)0xfff00000; typedef void (*void_fn)(void); void_fn kernel_start; void flash_read_reset(void) { *((unsigned int *)FLASH_COMMAND_ADDR_555) = FLASH_COMMAND_AA; *((unsigned int *)FLASH_COMMAND_ADDR_2AA) = FLASH_COMMAND_55; *((unsigned int *)FLASH_COMMAND_ADDR_555) = FLASH_COMMAND_READ_RESET; } void progress_bar(int start, int finish, int current) { int i, j; i=j=40*(current-start)/(finish-start); while(j--) outbyte('.'); while(i--) outbyte('\b'); } char progress[]={'|','\\','-','/','|','\\','-','/'}; void memory_test(unsigned int *start, unsigned int *end) { unsigned int *dst; print("\n\r\n\rTesting memory..."); for(dst=start; dst