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

📄 flashop_intel160_.c

📁 ADAM2 sources (modified by Oleg)
💻 C
📖 第 1 页 / 共 2 页
字号:
int FWBLock(bit32u from,bit32 size){  return(TRUE);}void UnLock(bit32u adr){	FWBBaseUnLockAdr=adr;	MEM_WRITE16(adr,FLASH_LOCK_CMD);	MEM_WRITE16(adr,FLASH_UNLOCK);	MEM_WRITE16(adr,FLASH_READ_CMD);}void Lock(void){	MEM_WRITE16(FWBBaseUnLockAdr,FLASH_LOCK_CMD);	MEM_WRITE16(FWBBaseUnLockAdr,FLASH_LOCK);    MEM_WRITE16(FWBBaseUnLockAdr,FLASH_READ_CMD);}int FWBGetBlockSize(bit32u base){	int itmp = 0;    base&=0x1fffffff;    base|=0xa0000000;  	    if ((base>=CS0_BASE)&&(base<(CS0_BASE+CS0_SIZE)))    {    	itmp=(64*1024);   							/* Strata flash 8/16 bit */	    if (base>=((CS0_BASE+CS0_SIZE)-(64*1024)))  /* Top Boot Block */    	  itmp=(8*1024);	    if (EMIF_ASYNC_CS0&0x2)    	  itmp*=2;              /* Dual devices */	    return(itmp);    }	return(0);}/* Start at base and erase at least size bytes */int FWBErase(bit32u base,int size, int verbose){	bit32u i,sts,blocksize,from,to;	FWBopen=FALSE;	if (size==0)     	return(0);	size--;	from=base;	blocksize=FWBGetBlockSize(from);	if (blocksize==0)    {    	sys_printf("Invalid flash address %x\n",from);	    return(0);    }	from&=~(blocksize-1);	to=base+size;	blocksize=FWBGetBlockSize(to);	if (blocksize==0)    {    	sys_printf("invalid flash address %x\n",to);	    return(0);    }	to |= (blocksize-1);	if (verbose) sys_printf("FlashEraseBlock(%08x,%08x);\n",from,to);	for(i=from,sts=0;(i<to)&&(!sts);)    {    	UnLock(i);	    MEM_WRITE16(i,FLASH_ERASE_SECTOR);    	MEM_WRITE16(i,FLASH_COMMIT_CMD);	    sts=_FlashOperationComplete(i,0xffff,FLASH_MAX_WAIT*5000000);    	Lock();	    _FlashErrorOut("Erase Block",sts);    			if (verbose) sys_printf(".");	    		blocksize=FWBGetBlockSize(i);    	i+=blocksize;	    if (blocksize==0)	   	{			if (verbose) sys_printf("invalid flash address %x\n",i);		      return(0);	  	}    }	return(sts==0);}int FWBOpen(bit32u base){	int i;  	FWBopen=FALSE;	if (FWBGetBlockSize(base)==0)     	return(FALSE);  	for(i=0;i<MAXBUF;i++)   	  FWBwdata[i]=(char)0xff;	FWBBaseAdr=0xffffffff;	FWBvalid=0;	FWBopen=TRUE;  	return(TRUE);}int FWBWriteByte(bit32u adr, bit8 cVal){	int sts,i;	bit16u *isp,*idp;   	if (!FWBopen) 		return(FALSE);	sts=TRUE; 	if((adr&(~(MAXBUF-1)))!=FWBBaseAdr)		sts=FWBClose();	if (FWBvalid==0)    {    	for(i=0,isp=(bit16u *)(adr&~(MAXBUF-1)),idp=(bit16u *)FWBwdata;i<(MAXBUF/2);i++)			*idp++=*isp++;    }	/*sys_printf("FWBWriteByte(%x,%x);\n",adr,cVal&0x0ff);                         */	FWBBaseAdr=adr&(~(MAXBUF-1));	i=adr&(MAXBUF-1);	FWBvalid++;	FWBwdata[i]=cVal;	return(sts);}int FWBClose(void){  int sts,i;	if (!FWBopen)     	return(FALSE);	if (FWBvalid==0)     	return(TRUE);		for(i=0,sts=1;(sts)&&(i<5);i++)    {    	sts=_FWBWriteBlock();	    if (sts)		{			MEM_WRITE16(FWBBaseAdr,FLASH_READ_CMD);			MEM_WRITE16(FWBBaseAdr,FLASH_CLEAR_SR_CMD);		}	}	_FlashErrorOut("Program Block",sts);	for(i=0;i<MAXBUF;i++)     	FWBwdata[i]=(char)0xff;	FWBBaseAdr=0xffffffff;	FWBvalid=0;	return(sts==0);}/*Used to decode Flash error values */void _FlashErrorOut(char *str,int sts){	if (sts)		sys_printf ("Flash '%s' operation Failed: sts=%08x\n",str,sts);}/* Returns 0 for success and !=0 for error */int _FWBWriteBlock(void){	bit16u *uip ;	int sts;		UnLock(FWBBaseAdr);	uip = (bit16u *)FWBwdata;		MEM_WRITE16(FWBBaseAdr,FLASH_WRITE_CMD);	MEM_WRITE16(FWBBaseAdr,*uip);	Lock();	sts=_FlashOperationComplete(FWBBaseAdr,*uip,FLASH_MAX_WAIT*650);	return(sts);}/* Returns 0 for success and !=0 for failure */int _FlashOperationComplete(bit32u adr, bit16u dat,int timeoutloops){	bit16u fnd;	bit32u sts;  	int icount = 0;  	int err;  	do 	{    	if (++icount>timeoutloops)      	{      		MEM_WRITE16(adr,FLASH_READ_CMD);    /* Reset to read mode */      		return(0xeeee0001);      	}    	sts=MEM_READ16(adr);    	if ((sts&FLASH_WSMS)==FLASH_WSMS)      	{			/* Check for errors */			err = (sts&FLASH_ERROR_MASK);			MEM_WRITE16(adr,FLASH_READ_CMD);    /* Reset to read mode */			if (!err)        	{				fnd=MEM_READ16(adr);				if (fnd==dat) 	              return(0);	    	    }       		else				MEM_WRITE16(adr,FLASH_CLEAR_SR_CMD);  /* Reset error bits */			        MEM_WRITE16(adr,FLASH_READ_CMD);    /* Reset to read mode */			return(sts);		}    }while(1);}

⌨️ 快捷键说明

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