📄 server_flash.c.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 + -