📄 flash.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 + -