📄 flashrom.c.bak
字号:
/*
;*************************************************************************************************************
;* 江西师范大学物理通讯电子学院
;*
;* 创 新 中 心
;*
;*--------------------------------------------- 文件信息 -----------------------------------------------------
;* 文件名称 : flashrom.c
;* 文件功能 : 对flashrom SST39VF160的相关操作函数的实现
;* 补充说明 : SST39VF160存储空间组织为1M*16.
;* 块 统一 32K Word大小为块. 因此块的范围为:00-31(共32个块)
;* 扇区擦除能力 统一2K Word大小为扇区. 因此扇区的范围为:000-511(共512个扇区).
;*-------------------------------------------- 最新版本信息 --------------------------------------------------
;* 修改作者 : zhouhong
;* 修改日期 : 2007-1-22
;* 版本声明 : V1.0.0
;*-------------------------------------------- 历史版本信息 --------------------------------------------------
;* 文件作者 :
;* 创建日期 :
;* 版本声明 :
;*-----------------------------------------------------------------------------------------------------------
;*************************************************************************************************************
;*/
#ifndef _FLASHROM_C_
#define _FLASHROM_C_
#include "..\INC\flashrom.h"
/*
*************************************************************************************************************
- 函数名称 : SST39VF160_CheckBlank(unsigned int sectorNum)
- 函数说明 : SST39VF160的扇区空检测函数
- 输入参数 : sectorNum:表示要擦除的扇区
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int SST39VF160_CheckBlank(unsigned int sectorNum)
{
unsigned int i,temp;
if(sectorNum<0 || sectorNum>SECTORNUM)
return 0;
for(i=(sectorNum<<PERSECORLENSHIFT);i<((sectorNum<<PERSECORLENSHIFT)+(0x01<<PERSECORLENSHIFT));i++)
{
temp=*((volatile unsigned short *)(i<<1));
if(temp!=0xffff)
return 0;
}
return 1;
}
/*
*************************************************************************************************************
- 函数名称 : Waitfor_endofprg(void)
- 函数说明 : SST39VF160的内部状态检测函数. Check if the bit6 toggle ends.
- 输入参数 : 无
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int Waitfor_endofprg(void)
{
volatile unsigned short flashStatus,old;
old=*((volatile unsigned short *)0x0);
while(1)
{
flashStatus=*((volatile unsigned short *)0x0);
if( (old&0x40) == (flashStatus&0x40) )
break;
else
old=flashStatus;
}
return 1;
}
/*
*************************************************************************************************************
- 函数名称 : SST39VF160_WordProg(unsigned int addr,unsigned short dat)
- 函数说明 : SST39VF160的写入函数
- 输入参数 : addr: 写入SST39VF160的地址. dat:写入SST39VF160的数据.
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int SST39VF160_WordProg (unsigned int addr,unsigned short dat)
{
Writeflash (0x5555,0xAA);
Writeflash (0x2AAA,0x55);
Writeflash (0x5555,0xA0);
Writeflash (addr,dat);
return(Waitfor_endofprg());
}
/*
*************************************************************************************************************
- 函数名称 : SST39VF160_SectorErase(unsigned int sectorNum)
- 函数说明 : SST39VF160的扇区擦除函数
- 输入参数 : sectorNum:表示要擦除的扇区
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int SST39VF160_SectorErase(unsigned int sectorNum)
{
if(sectorNum>=0 && sectorNum<SECTORNUM)
{
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash(0x5555,0x80);
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash((sectorNum<<PERSECORLENSHIFT),0x30);
return(Waitfor_endofprg());
}
return 0;
}
/*
*************************************************************************************************************
- 函数名称 : SST39VF160_BlockErase(unsigned int blockNum)
- 函数说明 : SST39VF160的块擦除函数
- 输入参数 : blockNum:表示要擦除的块
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int SST39VF160_BlockErase(unsigned int blockNum)
{
if(sectorNum>=0 && blockNumNum<BLOCKNUM)
{
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash(0x5555,0x80);
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash((blockNum<<PERBLOCKLENSHIFT),0x50);
return(Waitfor_endofprg());
}
return 0;
}
/*
*************************************************************************************************************
- 函数名称 : SST39VF160_ChipErase(void)
- 函数说明 : SST39VF160的整片擦除函数
- 输入参数 : 无
- 输出参数 : 成功操作返回:1 否则:0
*************************************************************************************************************
*/
int SST39VF160_ChipErase(void)
{
if(sectorNum>=0 && sectorNum<SECTORNUM)
{
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash(0x5555,0x80);
Writeflash(0x5555,0xAA);
Writeflash(0x2AAA,0x55);
Writeflash(0x5555,0x10);
return(Waitfor_endofprg());
}
return 0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -