f29lv160.c

来自「xscale pxa255 bootloader 程序」· C语言 代码 · 共 132 行

C
132
字号
#include "mylib.h"


int  Flash_SectorErase(U32 Sector)
{
	U32 i;
	U16 tmp;
	gFlash16[0x555]=0xAA;  gFlash16[0x2AA]=0x55;
	gFlash16[0x555]=0x80;  gFlash16[0x555]=0xAA;
	gFlash16[0x2AA]=0x55;  gFlash16[Sector]=0x30;
	
	i = 10000;
	while(i--);

	for(i=0; i<0x1000000; i++)
	{
		tmp=gFlash16[Sector];
		
		if(tmp&0x80)
			return 0;
			
		if(tmp&0x20)
		{
			tmp = gFlash16[Sector];
			if(tmp&0x80)
				return 0;
			else
				return -1;
		}
	}
	
	return -1;
}

int SectorErase(U32 secadd)
{
	int ret;
	if(secadd < 0x8000)
	{
		ret = Flash_SectorErase(0);
		ret += Flash_SectorErase(0x2000);
	    ret +=Flash_SectorErase(0x3000);
		ret +=Flash_SectorErase(0x4000);	
	} 
	else
	{
		ret = Flash_SectorErase(secadd);
	}
	return ret;
}
int Flash_WriteWord(U32 Addr, U16 Data)
{
	U32 i;
	U16 tmp;
	
	gFlash16[0x555]=0xAA;  gFlash16[0x2AA]=0x55;
	gFlash16[0x555]=0xA0;  gFlash16[Addr]=Data;

	for(i = 0; i < 0x100000; i++)
	{
		tmp = gFlash16[Addr];
		if( tmp  == Data )
			return 0;
	}
	
	return -1;
}


int Erase_Flash(U32 startaddr, U32 len)
{
	U32 addr;

	
	startaddr &= 0x7fff;
	
	for(addr = startaddr; addr < len + startaddr; addr += 0x8000)
	{
		if( SectorErase(addr) )
		{
			printf("SectorErase fail add=0x%x\r\n", addr);
			return -1;
		} 
		else 
		{
			printf("SectorErase success add=0x%x\r\n", addr);
		}	
	}
	return 0;

}

int Write_Flash64K(U32 addr, void *buf, U32 len)
{
	U32 i, wlen = 0;
	U16 *pbuf = (U16*)buf;

			
	addr &= 0x7fff;
	printf("\r\n");
	
	while(len) 
	{
		
		wlen = len < 0x8000? len: 0x8000;
		len -= wlen;
		if(SectorErase(addr))
		{
			printf("SectorErase fail add=0x%x\r\n", addr);
			return -1;
		}
		
		for (i = 0; i < wlen; i++)
		{
			if(Flash_WriteWord(addr+i, *pbuf++) )
			{
				printf("write word fail add=0x%x\r\n", addr+i);
				return -1;			
			}
			
		}
		
		addr +=wlen;
		printf(".");	
	}
	printf(".\r\n");
	return 0;

}


⌨️ 快捷键说明

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