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

📄 flash.c

📁 有线电视系统前端设备复用器原代码。 用语接受卫星信号
💻 C
字号:
/*@# Encoder device dirver:flash.c                                              */
/*------------------------------------------------------------------------------*/
/*                                                                              */
/*   MODULE:  flash.c                                                           */
/*   DATE:    2000/9/10                                                         */
/*   PURPOSE: Microcode flash driver module                                     */
/*   AUTHOR:  Lingyichuan	                                                    */
/*                                                                              */
/*------------------------------------------------------------------------------*/
/*                                                                              */
/*                 Copyright 2000,HighSun Dvision Inc.                          */
/*                      ALL RIGHTS RESERVED                                     */
/*------------------------------------------------------------------------------*/
#include "psos.h"
#include "prepc.h"
#include "bsp.h"
#include "constant.h"
extern void my_Delay(unsigned long int dly_ms);
extern void Feed(void);

unsigned long Check_Complete(void)
{
	unsigned char volatile D1,D2;	
	
	D1=*(unsigned char *)SST39VF512_BASE;
	
	D2=*(unsigned char *)SST39VF512_BASE;
	
	if((D1&0x40)==(D2&0x40))
		return 0;
	else
		return 1;
}

unsigned long SST39VF512_Sector_Erase(unsigned long Sector_Off)
{

	/*-------------------------------------------------------------------*/
	/* step 1                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xAA;
	
	/*-------------------------------------------------------------------*/
	/* step 2                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x2AAA)=0x55;
	
	/*-------------------------------------------------------------------*/
	/* step 3                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0x80;
	
	/*-------------------------------------------------------------------*/
	/* step 4                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xAA;

	/*-------------------------------------------------------------------*/
	/* step 5                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x2AAA)=0x55;
	
	/*-------------------------------------------------------------------*/
	/* step 6                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + Sector_Off)=0x30;
	
	
	/*-------------------------------------------------------------------*/
	/* wait TSE                                                          */
	/*-------------------------------------------------------------------*/
	while(Check_Complete());
	
	return 1;
}

unsigned long SST39VF512_Chip_Erase(void)
{

	/*-------------------------------------------------------------------*/
	/* step 1                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xAA;
	
	/*-------------------------------------------------------------------*/
	/* step 2                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x2AAA)=0x55;
	
	/*-------------------------------------------------------------------*/
	/* step 3                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0x80;
	
	/*-------------------------------------------------------------------*/
	/* step 4                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xAA;

	/*-------------------------------------------------------------------*/
	/* step 5                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x2AAA)=0x55;
	
	/*-------------------------------------------------------------------*/
	/* step 6                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0x10;
		
	
	/*-------------------------------------------------------------------*/
	/* wait TSCE                                                         */
	/*-------------------------------------------------------------------*/

	while(Check_Complete());

	return 1;
}


unsigned long SST39VF512_Byte_Write(unsigned long Off,unsigned char Ch)
{
	/*-------------------------------------------------------------------*/	
	/* step 1                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xAA;
	
	/*-------------------------------------------------------------------*/	
	/* step 2                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x2AAA)=0x55;
	
	/*-------------------------------------------------------------------*/	
	/* step 3                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + 0x5555)=0xA0;
	
	/*-------------------------------------------------------------------*/
	/* step 4                                                            */
	/*-------------------------------------------------------------------*/
	*(unsigned char *)(SST39VF512_BASE + Off)=Ch;
	
	while(Check_Complete());
	
	return 1;
		
}

unsigned long SST39VF512_Write(unsigned long Off,unsigned char *buf,unsigned long len)
{
	unsigned long i;
	for(i=0;i<len;i++)
	{
		SST39VF512_Byte_Write(Off+i,*(buf+i));
		if((i%0x1000)==0)
			Feed();
	}
	
	return 1;
	
}

/*------------------------------------------------------------------------------*/
/*对Databae Flash进行编程,从地址0开始                                          */
/*------------------------------------------------------------------------------*/
unsigned long SST39VF512_Program(unsigned char *Buffer,unsigned long Length)
{
	unsigned long  i;

	if (Length > FLASH_DATABASE_SIZE)
		return(1);

	SST39VF512_Chip_Erase();
	Feed();
	
	for(i=0;i<Length;i++)
	{
		SST39VF512_Byte_Write(i,*(unsigned char *)(Buffer+i));	
		if((i%0x4000)==0)
			Feed();
	}

	return 0;
}


/***********************************************************************/
/*     SST39VF040_Check_Complete: 检测对SST39VF040的操作是否完成.      */
/*                                                                     */
/*     NOTE:                                                           */
/*                                                                     */
/***********************************************************************/
unsigned long SST39VF040_Check_Complete(void)
{
	unsigned char volatile D1,D2;

	D1=*(unsigned char *) SST39VF040_BASE;
	D2=*(unsigned char *)(SST39VF040_BASE + 1);

	if((D1&0x40)==(D2&0x40))
		return 0;
	else
		return 1;

}


/***********************************************************************/
/*     SST39VF040_Chip_Erase: 擦除整片SST39VF040.                      */
/*                                                                     */
/*     NOTE:                                                           */
/*                                                                     */
/***********************************************************************/
unsigned long SST39VF040_Chip_Erase(void)
{
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xAA;
	*(unsigned char *)(SST39VF040_BASE + 0x2AAA)=0x55;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0x80;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xAA;
	*(unsigned char *)(SST39VF040_BASE + 0x2AAA)=0x55;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0x10;

	while(SST39VF040_Check_Complete());
	return 0;
}

/***********************************************************************/
/*     SST39VF040_Sector_Erase: 擦除SST39VF040某一扇区.                */
/*                                                                     */
/*     NOTE:                                                           */
/*                                                                     */
/***********************************************************************/
unsigned long SST39VF040_Sector_Erase(unsigned long Sector_Off)
{

	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xAA;
	*(unsigned char *)(SST39VF040_BASE + 0x2AAA)=0x55;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0x80;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xAA;
	*(unsigned char *)(SST39VF040_BASE + 0x2AAA)=0x55;
	*(unsigned char *)(SST39VF040_BASE + Sector_Off)= 0x30;

	while(SST39VF040_Check_Complete());
	return 0;

}

/***********************************************************************/
/*     SST39VF040_Byte_Write: 向SST39VF040某一地址写入一个字节,并等待 */
/*                            操作完成.                                */
/*                                                                     */
/*     NOTE:                                                           */
/*                                                                     */
/***********************************************************************/
unsigned long SST39VF040_Byte_Write(unsigned long Off,unsigned char Ch)
{

	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xAA;
	*(unsigned char *)(SST39VF040_BASE + 0x2AAA)=0x55;
	*(unsigned char *)(SST39VF040_BASE + 0x5555)=0xA0;
	*(unsigned char *)(SST39VF040_BASE + Off)= Ch;

	while(SST39VF040_Check_Complete());
	return 0;
}

/***********************************************************************/
/*     SST39VF040_Write: 向SST39VF040某一区域写入多个字节,并等待操作  */
/*                       完成.                                         */
/*     NOTE:                                                           */
/*                                                                     */
/***********************************************************************/

#if 0
unsigned long SST39VF040_Write(unsigned long Offset, unsigned char *Buffer,unsigned long Length)
{
	unsigned long  i, ulNum;
	unsigned long  ulSecBase;
	unsigned char  ucBuffer[SST39VF040_SECTOR_SIZE];
	unsigned short *pusTemp;
	unsigned long  ulHead, ulTail, ulLen;
	unsigned long  *pulFlash, *pulBuffer, ulFlashErr;

	/*---------------------------------------------------*/
	/* 	1. 检查地址的合法性                              */
	/*---------------------------------------------------*/
	if ((Offset> SST39VF040_SIZE)||(Offset+Length> SST39VF040_SIZE))
		return(1);

	SST39VF040_Chip_Erase();

	/*---------------------------------------------------*/
	/* 	2. 求出开始的扇区地址                            */
	/*---------------------------------------------------*/
	ulSecBase= (Offset/SST39VF040_SECTOR_SIZE)*SST39VF040_SECTOR_SIZE;

	/*---------------------------------------------------*/
	/*  3. 依次更新对应的扇区                            */
	/*---------------------------------------------------*/
	ulHead = Offset;
	ulLen  = 0;
	ulNum  = 0;

	while(ulSecBase< Offset+ Length)
	{

		/*---------------------------------------------------*/
		/*  4. 备份扇区数据,擦除该扇区                      */
		/*---------------------------------------------------*/
		memcpy(ucBuffer, (unsigned char *)(SST39VF040_BASE+ulSecBase),SST39VF040_SECTOR_SIZE);

		ulHead= (ulHead< Offset)? Offset: ulSecBase;
		ulTail=  ulSecBase+ SST39VF040_SECTOR_SIZE- 1;
		ulTail= (ulTail< Offset+Length-1)? ulTail: (Offset+Length-1);

		memcpy(ucBuffer+ulHead-ulSecBase, (unsigned char *)Buffer+ulLen, ulTail-ulHead+1);
		ulLen += ulTail- ulHead +1;

		/*---------------------------------------------------*/
		/*  5. 更新扇区,写入Flash.                          */
		/*---------------------------------------------------*/
		ulFlashErr= 0;
		while(1) 
		{
			
			for(i=0; i<SST39VF040_SECTOR_SIZE; i++)
			{
				SST39VF040_Byte_Write(ulSecBase+i,ucBuffer[i]);
			}

			my_Delay(1);

			pulBuffer= (unsigned long *)ucBuffer;
			pulFlash = (unsigned long *)(SST39VF040_BASE+ulSecBase);
			for(i=0; i<SST39VF040_SECTOR_SIZE/4; i++)
			{
				if (pulFlash[i]!=pulBuffer[i])
				{
					ulFlashErr= 1;
					break;
				}
			}
			if 	(ulFlashErr==0) break;
		}

		my_Delay(1);

		ulSecBase+= SST39VF040_SECTOR_SIZE;

		ulNum ++;
	}

	return 0;
}
#endif

/*------------------------------------------------------------------------------*/
/*对BOOTROM进行编程,从地址0开始                                                */
/*------------------------------------------------------------------------------*/
unsigned long SST39VF040_Program(unsigned char *Buffer,unsigned long Length)
{
	unsigned long  i;

	if (Length > SST39VF040_SIZE)
		return(1);

	SST39VF040_Chip_Erase();
	Feed();
	
	for(i=0;i<Length;i++)
	{
		SST39VF040_Byte_Write(i,*(unsigned char *)(Buffer+i));	
		if((i%0x4000)==0)
			Feed();
	}

	return 0;
}

⌨️ 快捷键说明

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