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

📄 at49bv040b.c

📁 该源码为mpc8248处理器的BSP
💻 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 + -