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

📄 flash.c

📁 44b0的uClinux的启动bios 有非常详细的注释 很难得的
💻 C
字号:
/*
;************************************************************************************************************
;*				        				北京精仪达盛科技有限公司
;*                                     	     研    发    部
;*
;*                                 	     http://www.techshine.com
;*
;*--------------------------------------------- 文件信息 ----------------------------------------------------                                      
;* 文件名称 : flash.c
;* 文件功能 : 该文件用于烧写SST39VF160所用的源函数
;* 补充说明 : 
;*-------------------------------------------- 最新版本信息 -------------------------------------------------
;* 修改作者 : ARM开发小组
;* 修改日期 : 2004/04/25
;* 版本声明 : V1.0.1
;**------------------------------------------- 历史版本信息 -------------------------------------------------
;* 文件作者 : XXXX
;* 创建日期 : XXXX 
;* 版本声明 : XXXX
;*-----------------------------------------------------------------------------------------------------------
;*-----------------------------------------------------------------------------------------------------------
;************************************************************************************************************
;*/
#include "../inc/44blib.h"
#include "../inc/flash.h"

static unsigned char state = 0;
/*
*************************************************************************************************************
- 函数名称 : static void CFIQueryExit(void)
- 函数说明 : CFI查询退出函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void CFIQueryExit(void)
{
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;	
}
/*
*************************************************************************************************************
- 函数名称 : static void SWPIDExit(void)
- 函数说明 : 退出函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void SWPIDExit(void)
{
	CMD_ADDR0 = 0xf0f0;
	state &= 0xfc;
}
/*
*************************************************************************************************************
- 函数名称 : static void CFIQueryEntry(void)
- 函数说明 : 请求访问函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
static void CFIQueryEntry(void)
{
	if(state&1)
	{
		if(state&2)
			SWPIDExit();
		else
			return;
	}
	
	CMD_ADDR0 = 0xaaaa;
	CMD_ADDR1 = 0x5555;
	CMD_ADDR0 = 0x9898;
	state |= 1;	
}
/*
*************************************************************************************************************
- 函数名称 : static void SWPIDEntry(void)
- 函数说明 : 请求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;
}
/*
*************************************************************************************************************
- 函数名称 : unsigned int GetFlashID(void)
- 函数说明 : 读取ID号函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
unsigned int GetFlashID(void)
{
	unsigned int i;
	
	SWPIDEntry();
	i  = *(unsigned short *)(0+ROM_BASE);
	i |= (*(unsigned short *)(2+ROM_BASE))<<16;
	SWPIDExit();
	return i;	
}
/*
*************************************************************************************************************
- 函数名称 : void GetFlashCFI(unsigned short *DataPtr)
- 函数说明 : 得到CFI
- 输入参数 : unsigned short *DataPtr
- 输出参数 : 无
*************************************************************************************************************
*/
void GetFlashCFI(unsigned short *DataPtr)
{
	unsigned short i;
	
	CFIQueryEntry();
	for(i = 0x10; i<0x35; DataPtr++, i++)
		*DataPtr = *(unsigned short *)(i*2+ROM_BASE);	
	CFIQueryExit();
}
/*
*************************************************************************************************************
- 函数名称 : void ChipErase(void)
- 函数说明 : 整片擦除函数
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
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 int sector
- 输出参数 : 无
*************************************************************************************************************
*/
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");
}
/*
*************************************************************************************************************
- 函数名称 : void FlashProg(unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt)
- 函数说明 : flash烧写函数
- 输入参数 : unsigned int ProgStart, unsigned short *DataPtr, unsigned int WordCnt
- 输出参数 : 无
*************************************************************************************************************
*/
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)
- 函数说明 : 读flash内容
- 输入参数 : unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size
- 输出参数 : 无
*************************************************************************************************************
*/
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 begin, unsigned short *data, unsigned int size
- 输出参数 : 无
*************************************************************************************************************
*/
int SectorProg(unsigned int begin, unsigned short *data, unsigned int size)
{		
	unsigned int tmp = 0x1000-(begin&0xfff);
	
	if(tmp>size)
		tmp = size;
	
	for(; size;)
	{	
		SectorErase(begin&0xfffff000);	//4K Bytes boudary		
		FlashProg(begin, data, tmp/2);
		
		size  -= tmp;
		begin += tmp;
		data  += tmp/2;
		tmp = (size>0x1000)?0x1000:size;				
	}
	return 0;			
}
/*
*************************************************************************************************************
*-                            				结束文件													   -*
*************************************************************************************************************
*/

⌨️ 快捷键说明

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