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

📄 flash.c

📁 44b0x bios源码 ************************************************ BIOS程序说明 By hugang, hgx2000@mail
💻 C
字号:
#include "../inc/44blib.h"
#include "../inc/flash.h"

void CFIQueryEntry(void)
{
	CMD_ADDR0 = 0x9898;
}

unsigned int GetFlashID(void)
{
	unsigned int i;
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9090;
	
	i  = *(unsigned short *)(0+ROM_BASE);
	
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9090;
	
	i |= (*(unsigned short *)(2+ROM_BASE))<<16;
	
	return i;	
}


void ChipErase(void)
{
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x8080;
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x1010;

	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)
{
	unsigned int	ok, count;
	sector += ROM_BASE;	
	
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x8080;
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	*(volatile unsigned short *)sector = 0x3030;

	ok = 0;
	count = 1000000;
	while(count--)
	{
		unsigned short i;
		
		if(*((volatile unsigned short *)sector)&0x80)
		{
			ok = 1;
			break;								//D7 == 1
		}
				
		i = *((volatile unsigned short *)sector)&0x40;
		if(i!=*((volatile unsigned short *)sector)&0x40)	//D6 == D6
			continue;
		else
			ok = 1;
			break;
	
	}

	Uart_Printf("Erase sector 0x%x	", sector-ROM_BASE);
	if(ok)
		Uart_Printf("ok\n");
	else
		Uart_Printf("failed\n");
}

void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
{
	unsigned short ok, count;
	unsigned short i, j;	
	
	ProgStart += ROM_BASE;
	ok = 1;
	
	for( ; WordCnt && ok; ProgStart+=2, DataPtr++, WordCnt--)
	{	
		j = *DataPtr;
		CMD_ADDR0 = 0xaaaa;
		CMD_ADDR1 = 0x5555;
		CMD_ADDR0 = 0xa0a0;
		*(volatile unsigned short *)ProgStart = j;	

		count = 10000;
		while(count --)
		{
			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(count == 0) ok = 0;
	}

	if(ok)
		Uart_Printf("program ok\n");
	else
		Uart_Printf("program failed\n");
}

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 = 0x8000-(begin&0x7fff);
	
	if(tmp>size)
		tmp = size;
	
	for(; size;)
	{	
		SectorErase(begin&0xffff8000);	//64K Bytes boudary		
		FlashProg(begin, data, tmp/2);
		
		size  -= tmp;
		begin += tmp;
		data  += tmp/2;
		tmp = (size>0x8000)?0x8000:size;				
	}
	return 0;			
}

⌨️ 快捷键说明

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