⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2410romprg.c

📁 2410 烧写flash
💻 C
字号:
//Shin, On Pil
#include <stdio.h>
#include <stdlib.h>
#include "def.h"
#include "option.h"
#include "romdef.h"
#include "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 Delay(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)
{
}
int a[100];
void Main(void)
{
	FILE *fp;
	int i = 0;
	
	//rSYSCFG=CACHECFG;
	PortInit();
	
	fp = fopen("e:\\ini\\dvkboot.ini","rb");
	while (!feof(fp))
	{
		a[i++] =(int)fgetc(fp);
	}
	
	Strata_Prog();
	//SST39VF160_ChipProg(0x0,0x30200000,RomSize);
	//LedDisp(0x0f);
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -