/****************************************************************************** * * Name: updateCbk.c * * Description: Handle firmware update function * * Copyright: (c) 2005-2050 IC Plus Corp. * All rights reserved. By Chance * *******************************************************************************/ //*******************Include files area************************** #include #include #include "type_def.h" #include "httpd.h" #include "httpd_app.h" #include "eeprom.h" #include "eepdef.h" #include "cgi.h" #include "uip.h" #include "flash.h" #include "EraseFlash_htm.h" #include "UpdateComplete_htm.h" #include "firmwareUpdate_htm.h" #include "TFTPInProgress_htm.h" //*******************Extern data area************************** extern struct httpd_info *hs; extern u32_t Global_flash_count; extern u16_t Global_flash_addr; extern u8_t Global_bank_index; extern u8_t Phase_Flash_Erase; extern u8_t Global_flag_restart; extern u8_t Global_flag_firmwareupdate_inprogress; extern uFW_EE_Info* ptr_EE_Info; extern u8_t flashcheck_error_flag; SFILENAME * fs_open03(char *name); //*******************Function prototype area******************* //extern void CPU_GOTO_FFF7H(void); /****************************************************************************** * * Function: cgi_firmwareUpdate * * Description: Handle firmware update request from client * * Parameters: cnt: number of the cgi data, vp: CGI name and value. * * Returns: If run successfully return OK. Otherwise, return Fail. * *******************************************************************************/ u8_t cgi_firmwareUpdate(u8_t cnt, void *vptr) { req_data *vp = vptr; u8_t i; u16_t tmplen=0,offset=0; u32_t update; u8_t *str_ptr=NULL,*str2=NULL; if(cnt||vp){} hs->state=HTTP_MULTIPACKET; if(Global_flag_firmwareupdate_inprogress==2)//Firmware Update by TFTP in progress, report notice webpage { httpd_init_file(fs_open03("TFTPInProgress.htm")); return OK; } if(hs->multipacket_count==0) { //printf("\n\r 1"); str_ptr=strfind(hs->INpacket.http_Indata,"Content-Type"); if(str_ptr!=NULL) { // printf("\n\r 2"); str2=strfind(str_ptr,"application"); if(str2!=NULL) {//printf("\n\r 3"); vp[0].value=NULL; vp[0].value=strfind(str2,"\r\n\r\n"); if(vp[0].value!=NULL) { //printf("\n\r find start address"); img512k=0; inspect_img512k=0; Global_flag_firmwareupdate_inprogress=1; hs->multipacket_count++; offset=vp[0].value-uip_appdata; tmplen=uip_len-offset; //printf("\n\r tmplen=%d",(u16_t)tmplen); } } } //return OK; } else { if((img512k+uip_len)>0x80000) { tmplen=0x80000-img512k; } else { tmplen=uip_len; /* offset=vp[0].value-uip_appdata; if(offset==0) { tmplen=uip_len; } else { tmplen=uip_len-offset; //tmplen+=1; }*/ } } if(tmplen!=0) { if(FirmwareUpdateWriteData(vp[0].value,tmplen)) { img512k+=tmplen; update=((img512k*100)/0x80000); printf("\rUpdating...%d%%",(u16_t)update); //return OK; } else { uip_len = 0; printf("\r Write Fail! Restart!"); CPU_GOTO_FFFDH(); //#endif } if(img512k==0x80000) { //write back MACID for(i=0;i<6;i++) EEPROM_Write_Byte(loc_EEMACID+i,EEConfigInfo.MACID[i]); httpd_init_file(fs_open03("UpdateComplete.htm")); Global_flag_restart=1; Global_flag_firmwareupdate_inprogress=0; } } return OK; } u8_t ssi_firmwareUpdate(u8_t varid, data_value *vp) { switch(varid) { case CGI_FUF_IP1: case CGI_FUF_IP2: case CGI_FUF_IP3: case CGI_FUF_IP4: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[varid]; break; default: // vp->value.digits_3_int=0xff; break; } vp->type=digits_3_int; return OK; } /****************************************************************************** * * Function: ssi_errormsg * * Description: Httpd will send error message to client, while error occurs. * * Parameters: varid: SSI Tag ID, vp: SSI value and type. * * Returns: If run successfully return OK. Otherwise, return Fail. * *******************************************************************************/ u8_t ssi_errormsg(u8_t varid, data_value *vp) { return OK; } u8_t ssi_eraseflash(u8_t varid, data_value *vp) { switch(varid) { case CGI_FU_IP1: case CGI_FU_IP2: case CGI_FU_IP3: case CGI_FU_IP4: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[varid-CGI_FU_IP1]; break; case CGI_FU_ERASE_PROGRESS: vp->value.digits_3_int=Phase_Flash_Erase; break; default: // vp->value.digits_3_int=0xff; break; } vp->type=digits_3_int; return OK; } /* u8_t ssi_updatecomplete(u8_t varid, data_value *vp) { */ /*switch(varid) { case CGI_FUC_IP1: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[0]; break; case CGI_FUC_IP2: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[1]; break; case CGI_FUC_IP3: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[2]; break; case CGI_FUC_IP4: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[3]; break; default: // vp->value.digits_3_int=0xff; break; }*/ /* vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[varid]; vp->type=digits_3_int; return OK; } */ u8_t ssi_tftpinprogress(u8_t varid, data_value *vp) { vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[varid]; /* switch(varid) { case CGI_FUT_IP1: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[0]; break; case CGI_FUT_IP2: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[1]; break; case CGI_FUT_IP3: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[2]; break; case CGI_FUT_IP4: vp->value.digits_3_int=ptr_EE_Info->netif.IPAddress[3]; break; default: // vp->value.digits_3_int=0xff; break; } */ vp->type=digits_3_int; return OK; } u8_t cgi_callerase(u8_t cnt, void *vptr) { req_data *vp = vptr; flashcheck_error_flag=0; httpd_init_file(fs_open03("EraseFlash.htm")); return OK; }