📄 flashrom.c
字号:
#include "flashrom.h"
#include "def.h"
/*** SST39VF160 检查是否为空 ***
扇区的值若为oxFF则判断为空 ****/
int SST39VF160_CheckBlank(U32 addr,U32 wordsize) //addr=0x081ff000;wordsize=2Kword
{
U32 i,temp;
for (i=addr;i<(addr+wordsize*2);i+=2) //word=16bit
{
temp=*((volatile U16 *)(i));
if(temp!=0xffff)
return 0;
}
return 1;
}
/****** SST39VF160 的检测 ******
Check if the bit6 bit7 toggle ends */
int Waitfor_endofprg(int addr)
{
while(1)
{
U16 i;
i = *((volatile U16 *)addr)&0x40;
if(i!=*((volatile U16 *)addr)&0x40) //D6 == D6
continue;
//if(*((volatile U16 *)addr)&0x80)
break; //D7 == 1
}
return 1;
}
/*** SST39VF160 的写入操作,是一个word(16bit)写入的 ***/
int SST39VF160_WordProg (U32 addr,U16 dat)//addr=0x081ff000;data=0xaa55
{
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0xA0;
*((volatile U16 *)(addr)) = dat;
return(Waitfor_endofprg(addr));
}
/*** SST39VF160 扇区擦除 ***/
void SST39VF160_SectorErase(U32 section_addr)//section_addr=0x081ff000
{
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x80;
CMD_ADDR0 = 0xAA;
CMD_ADDR1 = 0x55;
*((volatile U16 *)(section_addr)) = 0x30;
Waitfor_endofprg(section_addr);
}
/*** SST39VF160读数据 ***/
U16 SST39VF160_WordRead(U32 addr)//addr=0x081ff000
{
U16 data;
data = *((volatile U16 *)(addr));
return data;
}
/*** 读取SST39VF160的ID ***/
void SWPIDExit(void)
{
CMD_ADDR0 = 0xf0;
}
///////////////////////////
void SWPIDEntry(void)
{
CMD_ADDR0 = 0xaa;
CMD_ADDR1 = 0x55;
CMD_ADDR0 = 0x90;
}
///////////////////////////
U32 Get_SST39VF160_ID(void)
{
U32 i=0;
SWPIDEntry();
i = *(U16 *)(0+flash_base);
i |= (*(U16 *)(2+flash_base))<<16;
SWPIDExit();
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -