#include "iap.h"
#include "crc.h"
#include "delay.h"
#include "stm32l1xx_flash.h"
#include "main.h"
#if NBenable
#include "Nbiot.h"
#endif
uint8_t const HGM1135APP[50]={"HGM1135APP UPDATA BIN CHECH"};
extern uint64_t timestamp;
uint8_t iap_buff[IAP_DATA_BUFF_SIZE]={0};
static uint8_t search_xmodem_list(IAP_Config_T *pIAP_Config,Xmodem_t *pXmodem_t)
{
uint8_t i=0;
uint8_t xmode_type=0;
xmode_type=sizeof(Xmodem)/sizeof(Xmodem_t);
for(i=0;i<(xmode_type-1);i++)
{
if(pIAP_Config->pIap_data_buff[0]==pXmodem_t[i].xmodem_soh)
break;
}
pXmodem_t[i].xmodem_f(pIAP_Config);
return i;
}
static FlagStatus cache_iap_data_packet(IAP_Config_T *pIAP_Config_Struction)
{
static uint32_t oldsize=0;
FlagStatus status=RESET;
uint16_t size=pIAP_Config_Struction->rec_nop;
uint8_t packetnum=pIAP_Config_Struction->pIap_data_buff[1];
pIAP_Config_Struction->copyram2flash(IAP_FLASH_START_ADDR+pIAP_Config_Struction->app_bin_size, &(pIAP_Config_Struction->pIap_data_buff[3]),size-5);
pIAP_Config_Struction->app_bin_size+=(pIAP_Config_Struction->rec_nop-5);
oldsize=size;
return status;
}
void xmodem_f1(IAP_Config_T *pIAP_Config){
uint8_t status=0; uint8_t tempchar=0x06;
if(pIAP_Config->pIap_data_buff[1]==1)//第一包数据
{ static uint32_t sp_init=0;
sp_init=*(uint32_t *)(&pIAP_Config->pIap_data_buff[3]);
if((sp_init<0x20004000)||(sp_init>0x20008000)) // 0x2000 0000 - 0x2000 BFFF
{
//BIN文件不对
pIAP_Config->bits.wrong_bin_flag=1;
tempchar=0x18;
}
}
if(pIAP_Config->pIap_data_buff[1]==2)//第二包数据
{
uint8_t *app_bin_check=&pIAP_Config->pIap_data_buff[256+3];
static uint8_t arr[50];
memcpy(arr,app_bin_check,50);
if(memcmp(app_bin_check,HGM1135APP,strlen((const char *)HGM1135APP))!=0)
{
pIAP_Config->bits.wrong_bin_flag=1;
tempchar=0x18;
}
}
cache_iap_data_packet(pIAP_Config);
pIAP_Config->send_data(&tempchar,1);
}
void xmodem_f2(IAP_Config_T *pIAP_Config)
{
uint8_t status=0; uint8_t tempchar=0x06;
if(pIAP_Config->pIap_data_buff[1]==1)//第一包数据
{
static uint32_t sp_init=0;
sp_init=*(uint32_t *)(&pIAP_Config->pIap_data_buff[3]);
if((sp_init<0x20004000)||(sp_init>0x20008000)) // 0x2000 0000 - 0x2000 BFFF
{
//BIN文件不对
pIAP_Config->bits.wrong_bin_flag=1;
tempchar=0x18;
}
}
if(pIAP_Config->pIap_data_buff[1]==2)//第二包数据
{
uint8_t *app_bin_check=&pIAP_Config->pIap_data_buff[256+3];
static uint8_t arr[50];
memcpy(arr,app_bin_check,50);
if(memcmp(app_bin_check,HGM1135APP,strlen((const char *)HGM1135APP))!=0)
{
pIAP_Config->bits.wrong_bin_flag=1;
tempchar=0x18;
}
}
cache_iap_data_packet(pIAP_Config);
pIAP_Config->send_data(&tempchar,1);
}
void xmodem_f4(IAP_Config_T *pIAP_Config){
uint8_t tempchar=0x06;
if(pIAP_Config->app_bin_size<1024)
{
tempchar=0x18;
pIAP_Config->bits.wrong_bin_flag=1;
}
else if(pIAP_Config->bits.wrong_bin_flag==0)
{
pIAP_Config->EEPROM_WRITE(IAP_BIN_PACKET_FLAG_ADDR,0xA55AA55A);
pIAP_Config->bits.exit_iap_loop_flag=1;
}
else
{
tempchar=0x18;
}
pIAP_Config->send_data(&tempchar,1);
}
void xmodem_f6(IAP_Config_T *pIAP_Config){}
void xmodem_f15(IAP_Config_T *pIAP_Config){}
void xmodem_f18(IAP_Config_T *pIAP_Config){
uint8_t tempchar=0x06;
pIAP_Config->send_data(&tempchar,1);
}
void xmodem_err(IAP_Config_T *pIAP_Config){
uint8_t tempchar=0x15;
pIAP_Config->bits.wrong_bin_flag=1;
pIAP_Config->send_data(&tempchar,1);
}
void xmodem_f43(IAP_Config_T *pIAP_Config){}
Xmodem_t Xmodem[8]={{0x01,xmodem_f1},{0x02,xmodem_f2},{0x04,xmodem_f4},{0x06,xmodem_f6},{0x15,xmodem_f15},{0x18,xmodem_f18},{0x43,xmodem_f43},{0x15,xmodem_err},};
extern IAP_Config_T IAP_Config_Struction;
static void iap_loop(IAP_Config_T *pIAP_Config_Struction)
{
static uint64_t current_timestamp=0;
static uint8_t first_packet=0xFF;
static uint64_t old_timestamp=0;
uint8_t tempchar=0;
static uint8_t resendtime=0;uint8_t net_req_times=0;
current_timestamp=pIAP_Config_Struction->pget_timestamp(pIAP_Config_Struction)*10;//当前时间戳
while(1)
{
#if NBenable
NBiot_WCB.pNBiot_loop(&NBiot_WCB);
if((NBiot_WCB.bits.NB_COMM_CONTER>pIAP_Config_Struction->data_packet_unit_timeout)&&(NBiot_WCB.bits.NB_COMM_CONTER_ENABLE))
{//接收到了一包数据
NBiot_WCB.bits.NB_COMM_CONTER_ENABLE=0;
NBiot_WCB.bits.NB_COMM_CONTER=0;
if((pIAP_Config_Struction->pIap_data_buff[0]==0x0D)&&\
(pIAP_Config_Struction->pIap_data_buff[1]==0x0A))
{ //NB模块发来的数据
NBiotFunDealRes NBiotres=NBFunNone;
NBiotres=NBiot_WCB.pNBrevHandle(NBiotCommandList,pIAP_Config_Struction->pIap_data_buff);
memset(pIAP_Config_Struction->pIap_data_buff,0,pIAP_Config_Struction->rec_nop);
if(NBiotres==NBFunAckOK)//如果的到正确的回复
{
NBiot_WCB.bits.NBretry_times=0;//
NBiot_WCB.bits.NBacktimeout=0;
NBiot_WCB.bits.waitforackflag=0;
NBiot_WCB.bits.NBresend_req=0;
NBiot_WCB.bits.waitforackendflag=1;//本轮发送结束
}
else if(NBiotres==NBFunAckERR)//如果得到错误的回复,需要重新
{
NBiot_WCB.bits.NBacktimeout=0;
NBiot_WCB.bits.waitforackflag=0;
NBiot_WCB.bits.waitforackendflag=0;
}
if(NBiot_WCB.bits.NBacktimeout>AckTimeOutThre)
{
NBiot_WCB.bits.waitforackflag=0;//超时的话无需在等待应答
NBiot_WCB.bits.NBacktimeout=0;
}
}
if(!NBiot_WCB.bits.IAP_Data_Recd)
pIAP_Config_Struction->rec_nop=0;
}
#endif
if((pIAP_Config_Struction->bits.exit_iap_loop_flag==1)||(pIAP_Config_Struction->bits.wrong_bin_flag==1))
{
pIAP_Config_Struction->bits.enable_unit_pack_counter=0;
pIAP_Config_Struction->bits.exit_iap_loop_flag=0;
pIAP_Config_Struction->bits.fisrt_packetrec_flag=0;
pIAP_Config_Struction->data_packet_bin_timeout_counter=0;
pIAP_Config_Struction->data_packet_unit_timeout_counter=0;
pIAP_Config_Struction->rec_nop=0;
break;
}
current_timestamp=pIAP_Config_Struction->pget_timestamp(pIAP_Config_Struction)*10;//单位us
if(pIAP_Config_Struction->bits.fisrt_packetrec_flag==0)
{
if(((current_timestamp-old_timestamp)>3000000))//
{
tempchar='C';
#if NBenable
if(NBiot_WCB.pNBidle_judge(&NBiot_WCB))
onecircul(&NBiot_WCB,NBiotCommandList,"NSOST=0,61.165.31.230,1111,1,43",SET_COM);//发C
#else
pIAP_Config_Struction->send_data(&tempchar,1);//准备接收数据
#endif
old_timestamp=current_timestamp;
}
first_packet=0xFF;
}
else if((pIAP_Config_Struction->data_packet_unit_timeout_counter>pIAP_Config_Struction->data_packet_unit_timeout)
#if NBenable
||(NBiot_WCB.bits.IAP_Data_Recd)//通过NB模块接收到了1K的升级包
#endif
)
{//当接收到一包数据后运行至此处
uint16_t crctemp=0;
uint16_t crcrev=0;
uint16_t recvsize=0;
tempchar=0x06;
pIAP_Config_Struction->bits.enable_unit_pack_counter=RESET;
pIAP_Config_Struction->data_packet_unit_timeout_counter=RESET;
recvsize=pIAP_Config_Struction->rec_nop;
#if NBenable
NBiot_WCB.bits.IAP_Data_Recd=0;
#endif
if(recvsize>5)
{
CRC_Checkout_Para.CRC_In_Out_Buff.pIn_Buff=&pIAP_C