/* Get general hardware memory map */ #include "xparameters.h" #include "xbasic_types.h" #include "xstatus.h" #include "mb_interface.h" unsigned int *flash_addr = (unsigned int *)0xff000000; unsigned int *ram_addr = (unsigned int *)0xffe00000; typedef void (*void_fn)(void); void_fn kernel_start; #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 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[]={'|','\\','-','/','|','\\','-','/'}; int main(void) { unsigned int *src = flash_addr, *dst = ram_addr; int counter=0; int progress_count = 0; unsigned int ram_len = 0x100000; print("\n\r\n\r\n\rClearing RAM...\n\r"); for(dst=ram_addr;dst<(unsigned int *)0xfff00000;dst++) *dst=0; print("\n\r\n\r\n\rCopying Kernel Image from Flash to RAM...\n\r"); flash_read_reset(); dst = ram_addr; src =flash_addr; while(dst<(unsigned int *)0xfff00000) { *dst++=*src++; } print("...Done!\n\r"); print("Jumping to kernel startup in "); for(progress_count=10;progress_count >=0; progress_count--) { for(ram_len=0;ram_len<600000;ram_len++) ; xil_printf("%i...\n\r",progress_count); } print("\n\r\n\r\n\r"); kernel_start = (void_fn)ram_addr; kernel_start(); }