#if 0 cd [file dirname [info script]] source makefile.tcl return #endif #define FLASH_AMD 0 #define FLASH_INTEL 1 #define FLASH_TYPE FLASH_INTEL #include "type.h" #include "uart.h" #include "nb.h" #include "zf.h" #if (FLASH_TYPE==FLASH_AMD) #include "flashAmd.h" #elif (FLASH_TYPE==FLASH_INTEL) #include "flashIntel.h" #endif U8 flashImage[32*1024]; void cmdFlash(U32 addr,U32 data); void cmdDiff(U32 *src,U32 *dst,U32 data); void flashMap(U32 address) { #if (FLASH_TYPE==FLASH_AMD) #define flash (*(FlashAmd *)0x000e0000) #elif (FLASH_TYPE==FLASH_INTEL) #define flash (*(FlashIntel *)0x000e0000) #endif zfRegs->memoryWindows[0].base=(U32)flash.base; zfRegs->memoryWindows[0].size=0x00010000-1; zfRegs->memoryWindows[0].page=(0x01000000-(U32)flash.base)+address; /* com1 << "mem base 0 : " << zfRegs->memoryWindows[0].base << "\n\r"; com1 << "mem size 0 : " << zfRegs->memoryWindows[0].size << "\n\r"; com1 << "mem page 0 : " << zfRegs->memoryWindows[0].page << "\n\r"; */ nbRegs->shadowRamReadEnable=0; nbRegs->shadowRamWriteEnable=0; /* com1 << "shadowRamReadEnable : " << nbRegs->shadowRamReadEnable << "\n\r"; com1 << "shadowRamWriteEnable : " << nbRegs->shadowRamWriteEnable << "\n\r"; */ } void gotStack(U32 end,U32 begin) { U32 got; com1.init(); com1 << "waiting flash image, " << (U32)sizeof(flashImage) << " bytes\n\r"; #if (FLASH_TYPE==FLASH_AMD) flashMap(0x00070000); // flashMap(0x001f0000); #elif (FLASH_TYPE==FLASH_INTEL) flashMap(0x001f0000); #endif got=com1.yload(flashImage); //while(com1.getChar()!='z'); com1.dump(flashImage,256,0,1); com1.dump(flashImage+sizeof(flashImage)-256,256,0,1); if(got==sizeof(flashImage) && ((U32*)(flashImage+sizeof(flashImage)))[-1]==0x90909090) { /* com1 << (U32)flashImage << "\r\n"; com1 << (U32)sizeof(flashImage) << "\r\n"; com1 << *(U32*)flashImage << "\r\n"; */ com1 << "erase : " << flash.erase() << "\r\n"; cmdFlash((U32)flashImage,sizeof(flashImage)); cmdDiff((U32*)flashImage,(U32*)(0x0f0000-sizeof(flashImage)),sizeof(flashImage)); } com1 << "reboot please\n\r"; while(1) ; } void cmdFlash(U32 addr,U32 data) { U32 dcnt=10; com1 << "writing " << data << " bytes ...\r\n"; #if (FLASH_TYPE==FLASH_AMD) U8 *pt= (U8*)addr,v=0; flash.reset(); addr=0x10000-data; while(data--) { dcnt=10; while(dcnt && *pt!=(v=flash.write(addr,*pt))) dcnt--; if(v!=*pt) com1 << "pb " << *pt << "!=" << v << "\r\n"; addr++; pt++; } flash.reset(); #elif (FLASH_TYPE==FLASH_INTEL) U8 *pt= (U8*)addr,v=0; addr=0x10000-data; while(data--) { dcnt=10; while(dcnt && *pt!=(v=flash.write(addr,*pt))) dcnt--; if(v!=*pt) com1 << "pb " << *pt << "!=" << v << "\r\n"; addr++; pt++; } #endif com1 << "write done\r\n"; } void cmdDiff(U32 *src,U32 *dst,U32 data) { data/=sizeof(U32); while(data--) { if(*src!=*dst) { com1 << '@' << U32(src) << ':' << *src << "!=" << *dst << "\r\n"; break; } src++; dst++; } }