#include "main.h" #include "flash.h" #include "string.h" static uint32_t my_addr = 0; g_MD_Data* get_md_data(Upgrade *upgrade) { return &(upgrade->md_data); } md_msg* get_md_msg(Upgrade *upgrade) { return &(upgrade->md_msg_head); } uint8_t operation_ide(Upgrade *upgrade) { uint8_t ret = FAILD; if(upgrade->get_head_sucess_flag) //get programe head { md_msg* msg = get_md_msg(upgrade); if(msg->patition == ONE) { upgrade->start_app_addr =PROGRAME_APP1; upgrade->erase_size = PROGRAME_APP1_SIZE; my_addr = upgrade->start_app_addr; ret = SUCEESS; }else if(msg->patition == SECOND) { upgrade->start_app_addr =PROGRAME_APP2; upgrade->erase_size = PROGRAME_APP2_SIZE; my_addr = upgrade->start_app_addr; ret = SUCEESS; }else{ upgrade->get_head_sucess_flag = 0; } } return ret; } uint8_t operation_erase_programe(Upgrade *upgrade) { uint8_t ret = FAILD; if(upgrade->app_erase_flag == 0) { uint32_t temp_addr = upgrade -> start_app_addr; uint32_t erase_size = upgrade -> erase_size; flash_erase_programe(temp_addr,erase_size/PAGE_SIZE,PAGE_SIZE); upgrade->app_erase_flag = 1; ret = SUCEESS; }else { upgrade->get_head_sucess_flag = 0; } return ret; } void operation_pro_or_msg(Upgrade *upgrade,Flash_Data *data) { if(data->index == 0) { uint32_t lenth = strlen(MODBUS_HEAD); if(upgrade->md_status == UPGRADE_STATUS_IDE) { if((strncmp((const char *)(data->recive),MODBUS_HEAD,lenth)) == 0) { md_msg* _msg = get_md_msg(upgrade); memcpy(&_msg->magic,data->recive,lenth); _msg->size = (data->recive[lenth]) | (data->recive[lenth+1] << 8); _msg->patition = (data->recive[lenth+2]) | (data->recive[lenth+3] << 8) | (data->recive[lenth+4] << 16) | (data->recive[lenth+5] << 24); _msg->version = (data->recive[lenth+6]) | (data->recive[lenth+6] << 8) | (data->recive[lenth+8] << 16) | (data->recive[lenth+9] << 24); } } }else { if(upgrade->md_status == UPGRADE_STATUS_WRITE_PROGRAME) { //my_addr = upgrade->start_app_addr; my_addr = flash_write_programe(my_addr,data->recive,data->lenth); if(data->index < 0) { upgrade->app_write_sucessful_flag = 1; } } } } uint8_t operation_erase_meta(Upgrade *upgrade) { uint8_t ret = FAILD; md_msg* _msg = get_md_msg(upgrade); if(upgrade->meta_erase_flag == 0) { upgrade->meta.partition = _msg->patition; upgrade->meta.running_app_version = _msg->version; upgrade->meta.errno = 0; upgrade->meta.error_count = 0; if(upgrade->meta.partition == ONE){ upgrade->meta.rom_addr =PROGRAME_APP1; upgrade->meta.app1_partition = _msg->patition; upgrade->meta.app1_rom_addr = PROGRAME_APP1; upgrade->meta.app1_version = _msg->version; }else if(upgrade->meta.partition == SECOND) { upgrade->meta.rom_addr =PROGRAME_APP2; upgrade->meta.app2_partition = _msg->patition; upgrade->meta.app2_rom_addr = PROGRAME_APP2; upgrade->meta.app2_version = _msg->version; }else { // errno upgrade->get_head_sucess_flag = 0; upgrade->app_write_sucessful_flag = 0; upgrade->app_erase_flag = 0; return ret; } upgrade->meta.operation_flag = 0; upgrade->meta.recent_running_time = 0; flash_erase_meta(); upgrade->meta_erase_flag = 1; ret = SUCEESS; } return ret; } uint8_t operation_write_meta(Upgrade *upgrade) { uint8_t ret = FAILD; if(upgrade->meta_write_sucesse_flag == 0) { flash_write_meta(&upgrade->meta); upgrade->meta_write_sucesse_flag = 1; ret = SUCEESS; } return ret; }