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

📄 server_flash.c.bak

📁 移植好的Ibm405ep bsp板极支持包
💻 BAK
字号:
#include <flash/server_flash.h>
#undef DEBUG_WRITE_UPDATE_FIRMWARE_FLAG

S_SERVER_FLASH_DRIVER flash_driver={
	mx29lv640bt_probe,/*检查flash是否正确*/
	mx29lv640bt_Erase_One_Sector,/*擦除一个扇区*/
	mx29lv640bt_Program_One_Byte,/*写入一个字节*/
	mx29lv640bt_Program_One_Sector8,/*编程,一次写入8k*/
	mx29lv640bt_Program_One_Block,/*一次写入一个block*/
};
/**********************************************************
	计算校验码
***********************************************************/
unsigned int f_server_cal_chksum(S_SERVER_FLASH_DATA *flash)
{
	char *ptr=(char *)flash;
	unsigned int chksum;
	int i;
	int len=flash->len;
	chksum=0;
	for(i=0;i<12;i++){
		chksum+=(*(ptr++));
	}
	ptr+=4;
	for(i=0;i<len;i++){
		chksum+=(*(ptr++));
	}
	ptr=(char *)flash;
	chksum=(~chksum)+1;
	return chksum;
}


/**********************************************************
	检查数据是否有效
***********************************************************/
int f_server_check_flash_data(S_SERVER_FLASH_DATA *flash)
{
	unsigned int chksum=0,len;
	
	/*版本号是否正确*/
	if(flash->ver!=SERVER_CONFIG_DATA_VER){
		#ifdef DEBUG_WRITE_UPDATE_FIRMWARE_FLAG
		printf("config ver is error addr:%x ver:%x\n",(unsigned int)flash,(unsigned int)flash->ver);
		#endif
		return ERROR;
	}
	/*检查长度是否正确*/
	len=flash->len;
	if(flash->len>SERVER_CONFIG_DATA_LEN){
		#ifdef DEBUG_WRITE_UPDATE_FIRMWARE_FLAG
		printf("len is error\n");
		#endif
		return ERROR;
	}
	/*检查序列号是否正确*/
	if(flash->sequence==0){
		#ifdef DEBUG_WRITE_UPDATE_FIRMWARE_FLAG
		printf("sequence is error\n");
		#endif
		return ERROR;
	}
	/*检查校验是否正确*/
	chksum=f_server_cal_chksum(flash);
	if(chksum!=flash->chksum){
		#ifdef DEBUG_WRITE_UPDATE_FIRMWARE_FLAG
		printf("chksum is error\n");
		#endif
		return ERROR;
	}
	return flash->sequence;
}



/**********************************************************
	读取配置数据
	如果两块存取中数据都有效,则从最新的数据区读取,
		如果数据区一样新,则从第一块读取
	如果只有一块有效,则从有效的数据区读取,另一块初始化
		为默认方式。
	如果失效,则初始化两块存储区,第一块为1,第二块为2
***********************************************************/
int f_server_check_data(S_SERVER_FLASH_DATA *flash1,
			S_SERVER_FLASH_DATA *flash2,int *data_flag)
{
	int flag1=0,flag2=0,seqence1=0,seqence2=0;
	/*检查第一区*/
	if((seqence1=f_server_check_flash_data(flash1))>0){
		flag1=1;
	}
	/*检查第二区*/
	if((seqence2=f_server_check_flash_data(flash2))>0){
		flag2=1;
	}
	if(flag1 && flag2){/*两块存储区都是正确的*/
		if(seqence1>=seqence2){
			*data_flag=0;
			return seqence1;
		}else{
			*data_flag=1;
			return seqence2;
		}
	}
	if(flag1){/*第一块存储区有效*/
		*data_flag=0;
		return seqence1;
	}
	if(flag2){/*第二块存取区有效*/
		*data_flag=1;
		return seqence2;
	}
	/*两块存储区都无效*/
	return 0;
}

/**********************************************************
	保存数据到flash
	flash_base_addr----标识哪一块存储区的基地址
	src----存储区源地址
	dst----存储区目的地址
	len----数据区长度
***********************************************************/
int f_server_Program_One_Sector(void *flash_base_addr,unsigned char *Src,unsigned char *Dst,int len)
{
	unsigned char *SourceBuf;
	unsigned char *DestBuf;
    int Index;
    SourceBuf=Src;
    DestBuf = Dst;
    flash_driver.erase_one_sector(flash_base_addr,Dst);           /*erase the sector first */
    for (Index = 0; Index < len; Index++){
    	flash_driver.program_one_byte(flash_base_addr,*SourceBuf++,DestBuf++);
    }
    return OK;
}

/**********************************************************
    保存配置数据(5个Sector)到flash
	flash_base_addr----标识哪一块存储区的基地址
	src----存储区源地址
	dst----存储区目的地址
	len----数据区长度
**********************************************************/
int f_server_save_configure_data(void *flash_base_addr,unsigned char *Src,unsigned char *Dst,int len)
{
	unsigned char *SourceBuf;
	unsigned char *DestBuf;
    int Index;
    SourceBuf = Src;
    DestBuf=Dst;
	flash_driver.erase_one_sector(flash_base_addr,Dst);           /*erase the sector first */
    for(Index = 0; Index < len; Index++){
    	flash_driver.program_one_byte(flash_base_addr,*SourceBuf++,DestBuf++);
    }
    return OK;
}

/**********************************************************
	保存数据
	mem_flag----标识哪一块存储区
	sequence----标识要存储的存储区的序列号
***********************************************************/
static S_SERVER_FLASH_DATA v_server_read_firmware;
int f_server_save_firmware(int mem_flag,int sequence)
{
	int rv;
	v_server_read_firmware.ver=SERVER_CONFIG_DATA_VER;
	v_server_read_firmware.len=0;
	v_server_read_firmware.sequence=sequence;
	v_server_read_firmware.chksum=f_server_cal_chksum(&v_server_read_firmware);
	if(mem_flag){
		if((rv=f_server_Program_One_Sector((char *)FLASH_BASE_ADDRESS1,(char *)&v_server_read_firmware,
			(char *)(FLASH_BASE_ADDRESS1+FLASH_FIRMWARE_CHECK),v_server_read_firmware.len+16))<0){
			return rv;	
		}
	}else{
		if((rv=f_server_Program_One_Sector((char *)FLASH_BASE_ADDRESS0,(char *)&v_server_read_firmware,
			(char *)(FLASH_BASE_ADDRESS0+FLASH_FIRMWARE_CHECK),v_server_read_firmware.len+16))<0){
			return rv;	
		}
	}	
	return OK;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -