?? 2410romprg.c
字號(hào):
//Shin, On Pil
#include "def.h"
#include "option.h"
#include "..\inc\romdef.h"
#include "..\inc\strata16.h"
INT8U SST39VF160_ProgFlash(INT32U ulRealAddr,INT16U usData);
void SST39VF160_EraseSector(INT32U TargetAddr);
INT32U SST39VF160_CheckId(void);
INT8U BlankCheck(INT32U ulTargetAddr,INT32U ulTargetSize);
INT8U _WAIT(void);
void LedDisp(int LedStatus);
#define _WR(ulADDR,usDATA) *((volatile INT16U *)(ulADDR<<1))=(INT16U)usDATA //the addr should be shifted
#define _RD(ulADDR) (*((volatile INT16U *)(ulADDR<<1)))
#define _RESET() _WR(0x0,0xf0f0)
#define BADDR2WADDR(ulADDR) (ulADDR>>1)
INT8U CheckBlank(INT32U ulRomAddr,INT32U ulRomSize)
{
INT32U i;
for (i=ulRomAddr;i<(ulRomAddr+ulRomSize);i+=4)
{
if(*((volatile INT32U *)i)!=0xffffffff)
return 0;
}
return 1; //every cell is 0xffffffff
}
INT8U Verify(INT32U ulRomAddr,INT32U ulRamAddr,INT32U ulRomSize)
{
INT32U i;
for (i=0x0;i<ulRomSize;i+=4)
{
if(*((volatile INT32U *)(i+ulRomAddr))!=*((volatile INT32U *)(i+ulRamAddr)))
return 0; //the data is ROM and RAM is different!
}
return 1;
}
INT8U _WAIT(void) //Check if the bit6 toggle ends.
{
volatile INT16U flashStatus,old;
old=*((volatile INT16U *)0x0);
while(1)
{
flashStatus=*((volatile INT16U *)0x0);
if( (old&0x1000) == (flashStatus&0x1000) )
break;
old=flashStatus;
}
return 1;
}
INT32U SST39VF160_CheckId(void)
{
INT16U usManId,usDevId;
_RESET();
_WR(SeqAddr1,SeqCom1);
_WR(SeqAddr2,SeqCom2);
_WR(SeqAddr1,SoftIdEntry);
usManId=_RD(ManuIdAddr);
usDevId=_RD(DevIdAddr);
_RESET();
return ((usManId<<16)+usDevId);
}
INT8U SST39VF160_WordProg_Test(INT32U ulAddr,INT16U usData)
{
_WR(SeqAddr1,SeqCom1);
_WR(SeqAddr2,SeqCom2);
_WR(SeqAddr1,WordProg);
_WR(ulAddr,usData);
return _WAIT();
}
INT8U SST39VF160_ChipErase(void)
{
_WR(SeqAddr1,SeqCom1);
_WR(SeqAddr2,SeqCom2);
_WR(SeqAddr1,Erase);
_WR(SeqAddr1,SeqCom1);
_WR(SeqAddr2,SeqCom2);
_WR(SeqAddr1,ChipErase);
return 1;
}
INT8U SST39VF160_ChipProg(INT32U ulRomAddr,INT32U ulRamAddr,INT32U ulRomSize)
{
INT32U i,ulRomAddrOri,ulRamAddrOri,ulRomSizeOri;
static int LedCount=0;
INT16U usData;
ulRomAddrOri =ulRomAddr;
ulRamAddrOri =ulRamAddr;
ulRomSizeOri =ulRomSize;
SST39VF160_ChipErase(); //I think this can be remove
for(i=0;i<65536;i++);
for(i=0;i<(ulRomSize/2);i++)
{
if((i%(50*1024))==0)
LedCount=(LedCount+1)%4;
if(LedCount==0) LedDisp(0x1);
else if(LedCount==1) LedDisp(0x2);
else if(LedCount==2) LedDisp(0x4);
else if(LedCount==3) LedDisp(0x8);
usData=*(INT16U *)ulRamAddr;
SST39VF160_WordProg_Test(ulRomAddr,usData);
ulRomAddr++;
ulRamAddr+=2;
}
return (Verify(ulRomAddrOri,ulRamAddrOri,ulRomSizeOri)); //program done
}
void Delay1(INT32 time)
// time=0: adjust the Delay function by WatchDog timer.
// 100us resolution.
{
INT32 i=0;
INT32 delayLoopCount= 400;
for(;time>0;time--)
for(i=0;i<delayLoopCount;i++);
}//Delay
void PortInit(void)
{
}
void LedDisp(int LedStatus)
{
}
void Flash_Test(void)
{
//rSYSCFG=CACHECFG;
PortInit();
Strata_Prog();
//SST39VF160_ChipProg(0x0,0x30200000,RomSize);
//LedDisp(0x0f);
while(1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -