📄 39vf160.c
字号:
//#include "console.h"
//#include "DataType.h"
#define ROM_BASE 0
#define CMD_ADDR0 *((volatile unsigned short *)(0x555*2+ROM_BASE))
#define CMD_ADDR1 *((volatile unsigned short *)(0x2aa*2+ROM_BASE))
static unsigned char state = 0;
void Check_Toggle_Ready (unsigned short *Dst)
{
unsigned int Loop = 1;
unsigned short PreData;
unsigned short CurrData;
unsigned long TimeOut = 0;
PreData = *Dst;
PreData = PreData & 0x40;
while ((TimeOut< 0x7FFFFFFF) && (Loop))
{
CurrData = *Dst;
CurrData = CurrData & 0x40;
if (PreData == CurrData)
Loop = 0; /* ready to exit the while loop */
PreData = CurrData;
TimeOut++;
}
}
void Check_Data_Polling (unsigned short *Dst, unsigned short TrueData)
{
unsigned int Loop = 1;
unsigned short CurrData;
unsigned long TimeOut = 0;
TrueData = TrueData & 0x80;
while ((TimeOut< 0x7FFFFFFF) && (Loop))
{
CurrData = *Dst;
CurrData = CurrData & 0x80;
if (TrueData == CurrData)
Loop = 0; /* ready to exit the while loop */
TimeOut++;
}
}
static void CFIQueryExit(void)
{
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xf0;
state &= 0xfc;
}
static void SWPIDExit(void)
{
CMD_ADDR0 = 0xf0;
state &= 0xfc;
}
static void CFIQueryEntry(void)
{
if(state&1)
{
if(state&2)
SWPIDExit();
else
return;
}
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
state |= 1;
}
static void SWPIDEntry(void)
{
if(state&1)
{
if(state&2)
return;
else
CFIQueryExit();
}
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
state |= 3;
}
unsigned int GetFlashID(void)
{
unsigned int i;
SWPIDEntry();
i = *(unsigned short *)(0+ROM_BASE);
i |= (*(unsigned short *)(2+ROM_BASE))<<16;
SWPIDExit();
return i;
}
void GetFlashCFI(unsigned short *DataPtr)
{
unsigned short i;
CFIQueryEntry();
for(i = 0x10; i<0x35; DataPtr++, i++)
*DataPtr = *(unsigned short *)(i*2+ROM_BASE);
CFIQueryExit();
}
void ChipErase(void)
{
if(state&1)
{
if(state&2)
SWPIDExit();
else
CFIQueryExit();
}
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x10;
while(1)
{
// unsigned short i;
// i = *((volatile unsigned short *)0x6666)&0x40;
// if(i!=*((volatile unsigned short *)0x6666)&0x40) //D6 == D6
// continue;
if(*((volatile unsigned short *)0x8888)&0x80)
break; //D7 == 1
}
}
void SectorErase(unsigned int sector)
{
if(state&1)
{
if(state&2)
SWPIDExit();
else
CFIQueryExit();
}
SWPIDExit();
sector += ROM_BASE;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
*(volatile unsigned short *)sector = 0x30;
/*
while(1)
{
unsigned short i;
i = *((volatile unsigned short *)sector)&0x40;
if(i!=*((volatile unsigned short *)sector)&0x40) //D6 == D6
continue;
*/
Check_Toggle_Ready((unsigned short *)sector);
Check_Data_Polling((unsigned short *)sector, 0xffff);
/*
if(*((volatile unsigned short *)sector)&0x80)
break; //D7 == 1
}
*/
// printf("Erase sector 0x%x ok\n", sector-ROM_BASE);
// printf("%x\n", *((unsigned short *)sector));
}
void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
{
unsigned short i, j;
ProgStart += ROM_BASE;
for( ; WordCnt; ProgStart+=2, DataPtr++, WordCnt--)
{
j = *DataPtr;
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xa0;
*(volatile unsigned short *)ProgStart = j;
Check_Toggle_Ready((unsigned short *)ProgStart);
Check_Data_Polling((unsigned short *)ProgStart, j);
/*
while(1)
{
i = *(volatile unsigned short *)ProgStart&0x40;
if(i!=*(volatile unsigned short *)ProgStart&0x40) //D6 == D6
continue;
if((*(volatile unsigned short *)ProgStart&0x80)==(j&0x80))
break; //D7 == D7
}
*/
if (*(unsigned short *)ProgStart != *DataPtr)
{
while(1);
}
// printf("Verify error!");
}
}
void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size)
{
int i;
ReadStart += ROM_BASE;
for(i=0; i<Size/2; i++)
*(DataPtr+i) = *((unsigned short *)ReadStart+i);
}
int SectorProg(unsigned int begin, unsigned short *data, unsigned int size)
{
unsigned int tmp = 0x10000-(begin&0xffff);
//printf("size = %x\n", size);
if(tmp>size)
tmp = size;
//printf("tmp = %x\n", tmp);
for(; size;)
{
SectorErase(begin&0xffff0000); //4K Bytes boudary
FlashProg(begin, data, tmp/2);
// puts("Program ok\n");
size -= tmp;
begin += tmp;
data += tmp/2;
tmp = (size>0x10000)?0x10000:size;
// printf("size = %x, begin = %x, tmp = %x\n", size, begin, tmp);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -