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

📄 sst39vf160.c

📁 YL9200开发板的BIOSBOX源码
💻 C
字号:
#include "../inc/def.h"
#include "../inc/config.h"
#include "../inc/utils.h"
#include "../inc/board.h"

#ifdef	SST39VF160_SUPPORT

#define	CMD_ADDR0	*((volatile U16 *)(0x5555*2+ROM_BASE))
#define	CMD_ADDR1	*((volatile U16 *)(0x2aaa*2+ROM_BASE))

static void SWPIDExit(void) ;

static unsigned char state;
static unsigned char support;

/******************************************************************************
【功能说明】进入通用存储器接口(Common Flash memory Interface)查询
******************************************************************************/
static void CFIQueryEntry(void)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			return;
	}
	
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9898;
	state |= 1;	
}

/******************************************************************************
【功能说明】退出通用存储器接口(Common Flash memory Interface)查询
******************************************************************************/
static void CFIQueryExit(void)
{
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;	
}

/******************************************************************************
【功能说明】通过通用存储器接口(Common Flash memory Interface)来读取Flash数据
******************************************************************************/
void GetFlashCFI(unsigned short *DataPtr)
{
	unsigned short i;
	
	CFIQueryEntry();
	for(i = 0x10; i<0x35; DataPtr++, i++)
		*DataPtr = *(unsigned short *)(i*2+ROM_BASE);	
	CFIQueryExit();
}

/******************************************************************************
【功能说明】进入存储器ID软件获取操作
******************************************************************************/
static void SWPIDEntry(void)
{
	if(state&1)
	{
		if(state&2)
			return;
		else
			CFIQueryExit();
	}

	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9090;
	state |= 3;
}

/******************************************************************************
【功能说明】退出存储器ID软件获取操作
******************************************************************************/
static void SWPIDExit(void)
{
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;
}

/******************************************************************************
【功能说明】获取Falsh的ID号
******************************************************************************/
static unsigned int GetFlashID(void)
{
	unsigned int i;
	
	SWPIDEntry();
	i  = *(unsigned short *)(0+ROM_BASE);
	i |= (*(unsigned short *)(2+ROM_BASE))<<16;
	SWPIDExit();
	
	return i;	
}

/******************************************************************************
【功能说明】从Flash指定地址Readstart开始读取Size个数据到DataPtr
******************************************************************************/
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);	
	
}

/******************************************************************************
【功能说明】芯片整片擦除
******************************************************************************/
void ChipErase(void)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			CFIQueryExit();						
	}
	
	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 short	ok, count;
	
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			CFIQueryExit();						
	}
	
	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 = 60000;
	while(count--)
	{
		unsigned short i;
		i = *((volatile unsigned short *)sector)&0x40;
		if(i!=*((volatile unsigned short *)sector)&0x40)	//D6 == D6
			continue;
		if(*((volatile unsigned short *)sector)&0x80)
		{
			ok = 1;
			break;								//D7 == 1
		}
	}

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

/******************************************************************************
【功能说明】将DataPtr指向的数据烧入Flash指定地址Progstart开始的地方,烧入长度WordCnt
******************************************************************************/
int 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))
			if((*(volatile unsigned short *)ProgStart)==j)
				break;					//D7 == D7
		}
		if(count == 0) ok = 0;
	}
	
	return ok;
	
//	if(ok)
//		Uart_Printf("program ok\n");
//	else
//		Uart_Printf("program failed\n");
}

/******************************************************************************
【功能说明】从指定扇区begin开始,将size个来自指针data的数据编程到Flash
******************************************************************************/
static void SectorProg(unsigned int begin, unsigned int data, unsigned int size)
{
	char buf[0x1000];
	U32 tmp = 0x1000-(begin&0xfff);

	if(support)	{		
	//	CacheDisable();
	
		if(tmp>size)
			tmp = size;
		if(tmp&1)
			tmp++;
	
		for(; size;) {
			if(tmp<0x1000) {
				memcpy(buf, (char *)(begin&~0xfff), 0x1000);
				memcpy(buf+(begin&0xfff), (char *)data, tmp);				
			} else {
				memcpy(buf, (char *)data, 0x1000);
			}			
			SectorErase(begin&~0xfff);	//4K Bytes boudary
			printf("Program 0x%x %s\n", begin&~0xfff, FlashProg(begin&~0xfff, (U16 *)buf, 0x1000>>1)?"Ok":"Fail");
		
			size  -= tmp;
			begin += tmp;
			data  += tmp;
			tmp = (size>0x1000)?0x1000:size;
		}
	//	CacheEnable();
	}
	return;
}

//*****************************************************************************
static void SST39VF160Probe(void)
{
	int i;
	
	i = GetFlashID();
	printf("Nor Flash ID is : %x\n", i);

	
	support = 1;
	if(i==0x278200bf)
		printf("SST39VF160 Found\n");
	else if(i==0x22c400c2)
		printf("MX29LV160 Found");
	else {
		printf("Unknown Flash Type\n");
		support = 0;
	}
}


void (*pNorFlashInit)(void) = SST39VF160Probe;
void (*pNorFlashProg)(U32, U32, U32) = SectorProg;

#endif

⌨️ 快捷键说明

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