diff --git a/lib/CPUs/MIPS/bsp/examples/bootloader/bootloader.c b/lib/CPUs/MIPS/bsp/examples/bootloader/bootloader.c index 07c36ed..e9f5d92 100644 --- a/lib/CPUs/MIPS/bsp/examples/bootloader/bootloader.c +++ b/lib/CPUs/MIPS/bsp/examples/bootloader/bootloader.c @@ -1,5 +1,4 @@ #include "libsys_boot.h" -#include "cfiflash.h" typedef struct _ssrec_t { @@ -10,18 +9,6 @@ typedef struct _ssrec_t } srec_t; -typedef struct _sflash_img_hdr_t -{ - UINT8 magic[4]; - UINT32 target_addr; - UINT32 img_offset; - UINT32 img_size; - UINT32 hdr_next; - UINT8 img_name[128]; - UINT8 res[108]; - -} flash_img_hdr_t; - enum srec_type { srec_err, srec_sob, srec_data, srec_rec, srec_eob @@ -206,8 +193,6 @@ void PrintCPUinfo(void) } #define MAX_IMG_SIZE (1024*1024) // bytes -#define SDRAM_BASE 0x40000000 -#define FLASH_OFFSET 0x00000000 int main(int argc, char *argv[]) { @@ -215,145 +200,52 @@ int main(int argc, char *argv[]) srec_t srec; int result, srec_state, i; UINT32 haddr; - flash_t flash; - flash_img_hdr_t img_hdr = {0}; - flash_img_hdr_t *pImg_hdr; - UINT32 img_size; - - volatile UINT32 *pReg = (UINT32*)sys_led_port; - volatile UINT32 *pBtn = (UINT32*)sys_gpio0; volatile UINT8 *pMem; - volatile UINT32 *pROM32; - volatile UINT32 *pMem32; - volatile UINT32 *pFlash = (UINT32*)sys_flash_io; - volatile UINT32 *pUSB = (UINT32*)sys_usb_data; - - volatile UINT8 *ram8 = (UINT8*)SDRAM_BASE; - volatile UINT16 *ram16 = (UINT16*)SDRAM_BASE; - volatile UINT32 *ram32 = (UINT32*)SDRAM_BASE; - - *pReg = 0; haddr = 0; // ---------------------------------------------------------- - ram32 = (UINT32*)(SDRAM_BASE); - pFlash = (UINT32*)(sys_flash_io + FLASH_OFFSET); + sputs("\n\n"); + PrintCPUinfo(); + sputs("Booting from UART.."); - if (!*pBtn) + while(1) { - sputs("\n\n"); - sputs("Booting from flash..."); - - pImg_hdr = (flash_img_hdr_t*)pFlash; - ram32 = (UINT32*)pImg_hdr->target_addr; - pFlash = (UINT32*)(sys_flash_io + pImg_hdr->img_offset); - img_size = pImg_hdr->img_size; - - for (i=0; i < img_size/4; i++) - ram32[i] = pFlash[i]; - - sputs("done\n\n"); - - Exec_at((void*)ram32); - } - else - { - - if (flash_find(&flash, sys_flash_io) < 0) - { - sputs("Cannot find flash device. Exit now!\n\n"); - return 1; - } - - // Erase SDRAM - for (i=0; i < MAX_IMG_SIZE/4; i++) - ram32[i] = 0; - - sputs("\n\n"); - sputs("Booting from UART.."); - + sputs("."); while(1) { - sputs("."); - while(1) + result = srec_getline(buf); + srec_state = decode_srec(&srec, buf, result); + switch (srec_state) { - result = srec_getline(buf); - srec_state = decode_srec(&srec, buf, result); - *pReg = 0; - switch (srec_state) - { - case srec_data: - if ((srec.addr + srec.size) > haddr) - haddr = srec.addr + srec.size; + case srec_data: + if ((srec.addr + srec.size) > haddr) + haddr = srec.addr + srec.size; - pMem = (UINT8*)srec.addr; - for (i=0; i < srec.size; i++) - *pMem++ = srec.data[i]; + pMem = (UINT8*)srec.addr; + for (i=0; i < srec.size; i++) + *pMem++ = srec.data[i]; - break; - - case srec_eob: - sputs("done\n\n"); - - img_hdr.magic[0] = 'J'; - img_hdr.magic[1] = 'F'; - img_hdr.magic[2] = 'I'; - img_hdr.magic[3] = '1'; - img_hdr.target_addr = srec.addr; - img_hdr.img_size = haddr - srec.addr; - img_hdr.img_offset = FLASH_OFFSET + sizeof(flash_img_hdr_t); - img_hdr.hdr_next = FLASH_OFFSET; - - sputs("Flash erase..."); - result = flash_erase(&flash, FLASH_OFFSET, img_hdr.img_size + sizeof(flash_img_hdr_t)); - if (result < 0) - { - sputs("failed!\n"); - break; - } - sputs("done\n"); - - sputs("Flash write..."); - result = flash_program(&flash, FLASH_OFFSET, (UINT8*)&img_hdr, sizeof(flash_img_hdr_t)); - if (result < 0) - { - sputs("failed!\n"); - break; - } - result = flash_program(&flash, img_hdr.img_offset, (UINT8*)ram32, img_hdr.img_size); - if (result < 0) - { - sputs("failed!\n"); - break; - } - sputs("done\n"); - - sputs("Flash verify..."); - result = flash_verify(&flash, img_hdr.img_offset, (UINT8*)ram32, img_hdr.img_size); - if (result < 0) - { - sputs("failed!\n"); - break; - } - sputs("passed\n"); - Jump_to((void*)0xBFC00000); -// sputs("\nPush reset button to boot!\n"); -// *pReg = 1; - - break; - - default: - result = -1; - break; - } - if (result < 0) - { - *pReg = 0x40000000; break; - } - }; - } + case srec_eob: + sputs("done\n\n"); + sputs("Execute program at "); + print_word(srec.addr); + sputs("\n\n"); + + Exec_at((void*)srec.addr); + break; + + default: + result = -1; + break; + } + if (result < 0) + { + break; + } + + }; } return 0; }