📄 at49bv040b.c
字号:
#define BIOS_DEBUG 1
#define BIG_END 1
#if BIG_END
/*芯片ID*/
#define AT49BV040B 0x1F13
#define SST39VF040 0xBFD7
#else
#define AT49BV040B 0x131F
#define SST39VF040 0xD7BF
#endif
/*AT49BV040B为0x555和0xAAA SST 39VF040 为0x5555和0x2AAA*/
unsigned long Ctrl0=0x555;
unsigned long Ctrl1=0xAAA;
/*sector 大小*/
#define SECTORSIZE 4096
/*BIOS 芯片大小*/
#define BIOSSIZE 512*1204
#define OK 0
#define FAIL -1
/*芯片起始地址*/
unsigned char *BiosStart=0;
/*CPU是100M的多少倍,最小为1*/
#define DELAY 5
/*****************************************************************/
/* */
/* Function: DelayTime */
/* */
/* Description: helper function for time delay */
/* */
/* Arguments: None */
/* */
/* Return: None */
/* */
/*****************************************************************/
#define BIOS_DELAY_TIME 100*DELAY
void AT49BV040BDelayTime( int j )
{
unsigned long i;
for (i=0;i<j*BIOS_DELAY_TIME;i++);
}
void AT49BV040BChipErase(void)
{
*(BiosStart+Ctrl0)=0xAA;
*(BiosStart+Ctrl1)=0x55;
*(BiosStart+Ctrl0)=0x80;
*(BiosStart+Ctrl0)=0xAA;
*(BiosStart+Ctrl1)=0x55;
*(BiosStart+Ctrl0)=0x10;
AT49BV040BDelayTime(100000);
}
void AT49BV040BSectorErase(unsigned char *Addr)
{
*(BiosStart+Ctrl0)=0xAA;
*(BiosStart+Ctrl1)=0x55;
*(BiosStart+Ctrl0)=0x80;
*(BiosStart+Ctrl0)=0xAA;
*(BiosStart+Ctrl1)=0x55;
*(Addr)=0x30;
AT49BV040BDelayTime(2000);
}
int AT49BV040BWriteByte(unsigned char *Addr,unsigned char data)
{
*(BiosStart+Ctrl0)=0xAA;
*(BiosStart+Ctrl1)=0x55;
*(BiosStart+Ctrl0)=0xA0;
*Addr=data;
AT49BV040BDelayTime(4);
return OK;
}
/*****************************************************************/
/* */
/* Function: AT49BV040BErase */
/* */
/* Description: 擦除一段BIOS数据 */
/* */
/* */
/* Arguments: Addr 需要写的BIOS地址 */
/* len 需要写的长度 */
/* */
/* Return: OK program succes */
/* FAIL program fail */
/* */
/*****************************************************************/
int AT49BV040BErase(unsigned char *Addr,int len)
{
if(0==BiosStart )
return FAIL;
}
/*****************************************************************/
/* */
/* Function: AT49BV040BProgram */
/* */
/* Description: 写入一段数据 */
/* */
/* */
/* Arguments: Addr 需要写的BIOS地址 */
/* src 需要写的数据 */
/* len 需要写的长度 */
/* */
/* Return: OK program succes */
/* FAIL program fail */
/* */
/*****************************************************************/
int AT49BV040BProgram(unsigned char *Addr,unsigned char *src,int len)
{
int Eraselen=len,i;
unsigned char *EraseDst=Addr;
unsigned char *DataSrc=src;
if(0==BiosStart )
return FAIL;
if(((unsigned long)(Addr-BiosStart)+len)>BIOSSIZE)
return FAIL;
#if 1
/*如果是AT49BV040*/
if(Ctrl0==0x555)
{
#if BIOS_DEBUG
printf("擦除bios\n\r");
#endif
AT49BV040BChipErase();
}
else
#endif
{
if((Addr<=BiosStart+SECTORSIZE)&&(len>509*1024))
{
#if BIOS_DEBUG
printf("擦除bios\n\r");
#endif
AT49BV040BChipErase();
}
else
{
while(Eraselen>0)
{
#if BIOS_DEBUG
printf("擦除0x%x \n\r",EraseDst);
#endif
AT49BV040BSectorErase(EraseDst);
Eraselen-=SECTORSIZE;
EraseDst+=SECTORSIZE;
#if BIOS_DEBUG
printf("dst =0x%x ,len =%d\n\r",EraseDst,Eraselen);
#endif
}
}
}
#if 1
EraseDst=Addr;
for(i=0;i<len;i++,EraseDst++)
{
if(*EraseDst!=0xff)
{
printf("NOFREE 0x%x=0x%x \n\r",EraseDst,*EraseDst);
return FAIL;
}
}
#endif
Eraselen=len;
EraseDst=Addr;
DataSrc=src;
#if BIOS_DEBUG
printf("要写入dst =0x%x ,len =%d\n\r",EraseDst,Eraselen);
i=0;
#endif
while(Eraselen-->0)
{
#if BIOS_DEBUG
if(0==(i++&0x3fff))
printf("往0x%x 写入0x%x\n\r",EraseDst,*DataSrc);
#endif
if(OK!=AT49BV040BWriteByte(EraseDst++,*DataSrc++))
return FAIL;
}
Eraselen=len;
EraseDst=Addr;
DataSrc=src;
while(Eraselen-->0)
{
if(*EraseDst++!=*DataSrc++)
{
EraseDst--;
DataSrc--;
printf("Error:Dst=0x%x =0x%x!0x%x\n\r",EraseDst,*EraseDst,*DataSrc);
return FAIL;
}
}
#if BIOS_DEBUG
printf("校验通过\n\r");
#endif
return OK;
}
/*****************************************************************/
/* */
/* Function: CheckBiosType */
/* */
/* Description: 检查BIOS类型 */
/* */
/* Arguments: Addr BIOS的首地址 */
/* */
/* Return: NULL */
/* */
/*****************************************************************/
int CheckBiosType(unsigned char *Addr)
{
*(Addr+Ctrl0)=0xAA;
*(Addr+Ctrl1)=0x55;
*(Addr+Ctrl0)=0x90;
AT49BV040BDelayTime(10);
if(AT49BV040B==*(unsigned short *)Addr)
{
#if BIOS_DEBUG
printf("检测到BIOS为 AT49BV040B\n\r");
#endif
*Addr=0xF0;
BiosStart=Addr;
return OK;
}
else
{
#if BIOS_DEBUG
printf("Check0: BiosStart= 0x%x =0x%x\n\r",*(unsigned short *)Addr,Addr);
#endif
*Addr=0xF0;
AT49BV040BDelayTime(10);
Ctrl0=0x5555;
Ctrl1=0x2AAA;
*(Addr+Ctrl0)=0xAA;
*(Addr+Ctrl1)=0x55;
*(Addr+Ctrl0)=0x90;
AT49BV040BDelayTime(10);
if(SST39VF040==*(unsigned short *)Addr)
{
#if BIOS_DEBUG
printf("检测到BIOS为 SST39VF040\n\r");
#endif
*Addr=0xF0;
BiosStart=Addr;
return OK;
}
#if BIOS_DEBUG
printf("Check1: BiosStart= 0x%x =0x%x\n\r",*(unsigned short *)Addr,Addr);
#endif
*Addr=0xF0;
return FAIL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -