#include<stdio.h>
void EraseChip();
void WriteByte(unsigned int Addr,unsigned char Val);
void WriteIsOver();
unsigned char WriteIsOver2( volatile unsigned char *addr );
char ReadByte(unsigned int Addr);
void Reset_FLash( void );
void WriteByte2(unsigned int Addr,unsigned char Val);
#define FlashMap1BaseAddr 0x400000
/*polling bit*/
#define Data_Polling_Bit 0x80 /* d7 = 1 */
#define Toggle_Bit 0x40 /* d6 = 1 */
#define Hangup_Bit 0x20 /* d5 = 1 TimeOut*/
#define Pass_Flag 0
#define Fail_Flag 1
unsigned char ret;
main()
{
FILE *fp;
char *ptr=(char *)0x809800;
unsigned int i;
int codelengthstart,codelengthend,codelength;
char filename[128];
i = Read_ID();
printf("FLASH ID is 0x%x\n",i);
printf("Clearing FLASH...\n");
EraseChip();
printf("Erased.\n");
printf("Please enter the BIN filename:\n");
scanf("%s",filename);
fp = fopen(filename,"rb");
if(fp == NULL)exit(0);
fseek(fp,0,SEEK_END);
codelengthend = (int)ftell(fp);
fseek(fp,0x0,SEEK_SET);
codelengthstart = (int)ftell(fp);
codelength=codelengthend-codelengthstart;
for(i=0;i<codelength;i++)
{
fread(ptr,1,1,fp);
WriteByte(i,*ptr);
}
printf("OK.\n");
printf("read0 %x \n", ReadByte(0));
printf("read1 %x \n", ReadByte(1));
printf("read2 %x \n", ReadByte(2));
printf("read3 %x \n", ReadByte(3));
printf("read4 %x \n", ReadByte(4));
printf("read5 %x \n", ReadByte(5));
printf("read6 %x \n", ReadByte(6));
printf("read7 %x \n", ReadByte(7));
for(;;);
}
void EraseSector(unsigned int SectorAddr)
{
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0x80;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + SectorAddr) = 0x30;
WriteIsOver();
}
int Read_ID(void)
{
int CurrentToggleBit,i;
for(i=0;i<0x10;i++);
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
for(i=0;i<0x10;i++);
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
for(i=0;i<0x10;i++);
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0x90;
for(i=0;i<0x10;i++);
CurrentToggleBit = (*(volatile unsigned char*)FlashMap1BaseAddr);
for(i=0;i<0x10;i++);
return (CurrentToggleBit);
}
void EraseChip()
{
volatile unsigned char* FlashAddr;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0x80;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0x10;
FlashAddr = (volatile unsigned char*)FlashMap1BaseAddr;
WriteIsOver2(FlashAddr);
}
void WriteByte(unsigned int Addr,unsigned char Val)
{
volatile unsigned char* FlashAddr;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xa0;
*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
FlashAddr = (volatile unsigned char*)(FlashMap1BaseAddr + Addr);
WriteIsOver2(FlashAddr);
}
void WriteByte2(unsigned int Addr,unsigned char Val)
{
volatile unsigned char* FlashAddr;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0xaa;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0x555) = 0x55;
*(volatile unsigned char*)(FlashMap1BaseAddr + 0xaaa) = 0x20;
*(volatile unsigned char*)(FlashMap1BaseAddr) = 0xa0;
*(volatile unsigned char*)(FlashMap1BaseAddr + Addr) = Val;
FlashAddr = (volatile unsigned char*)(FlashMap1BaseAddr + Addr);
WriteIsOver2(FlashAddr);
}
void WriteIsOver()
{
unsigned int i;
unsigned char LastToggleBit,CurrentToggleBit;
LastToggleBit = (*(volatile unsigned char*)FlashMap1BaseAddr) & 0x40;
CurrentToggleBit = (*(volatile unsigned char*)FlashMap1BaseAddr) & 0x40;
for(i = 0; ; i++)
{
LastToggleBit = CurrentToggleBit;
CurrentToggleBit = (*(volatile unsigned char*)FlashMap1BaseAddr) & 0x40;
if(LastToggleBit == CurrentToggleBit) break;
}
}
unsigned char WriteIsOver2( volatile unsigned char *addr )
{
unsigned char Toggle_data,Read_data;
Toggle_data = *addr & Toggle_Bit;
do
{
if(((Read_data = *addr) & Toggle_Bit) == Toggle_data)
break;
Toggle_data = Read_data & Toggle_Bit;
}while((Read_data & Hangup_Bit) != Hangup_Bit);
Toggle_data = *addr & Toggle_Bit;
if(((Read_data = *addr) & Toggle_Bit) != Toggle_data)
{
ret = Fail_Flag;
return (Fail_Flag);
}
else
{
ret = Pass_Flag;
return (Pass_Flag);
}
}
char ReadByte(unsigned int Addr)
{
unsigned char Val;
Val = *(volatile unsigned char*)(FlashMap1BaseAddr + Addr);
return Val;
}
void Reset_FLash( void )
{
*(volatile unsigned char*)(FlashMap1BaseAddr) = 0xF0;
}