494 lines
9.5 KiB
C
494 lines
9.5 KiB
C
|
|
|
|||
|
|
#define _IN_STAPP_C
|
|||
|
|
#include "stapp.h"
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO != APP_SAVE_NONE)
|
|||
|
|
|
|||
|
|
#include "crc32.h"
|
|||
|
|
#include "cpuid.h"
|
|||
|
|
#include "stiap.h"
|
|||
|
|
|
|||
|
|
#include "stflash.h"
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
char xorbuf[8];
|
|||
|
|
u8 xchgbuf[8];
|
|||
|
|
u32 datalen;
|
|||
|
|
u32 bincrc;
|
|||
|
|
u32 rnpucrc;
|
|||
|
|
u32 hddatcrc;
|
|||
|
|
u8 rev[1024-8-8-8-8];
|
|||
|
|
}GNPUHead;
|
|||
|
|
|
|||
|
|
GNPUHead g_gnpuHead =
|
|||
|
|
{
|
|||
|
|
#if (CUR_UPFL == GAUF_PMB1) // <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
'G', 'O', 'A', 'P', 'M', 'B', 'O', 'S',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
4, 6, 7, 2, 3, 5, 8, 1,
|
|||
|
|
},
|
|||
|
|
#elif (CUR_UPFL == GAUF_EMB1) // <20>廨<EFBFBD><E5BBA8>/<2F><><EFBFBD><EFBFBD><DFBB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
'G', 'O', 'A', 'E', 'M', 'B', 'O', 'S',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
1, 3, 5, 2, 4, 8, 6, 7,
|
|||
|
|
},
|
|||
|
|
#elif (CUR_UPFL == GAUF_EHA1) // ƽ<><C6BD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
|
|||
|
|
{
|
|||
|
|
'G', 'O', 'A', 'E', 'H', 'A', 'O', 'S',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
5, 1, 3, 2, 7, 4, 8, 6,
|
|||
|
|
},
|
|||
|
|
#elif (CUR_UPFL == GAUF_EHB1) // <20><><EFBFBD><EFBFBD><DFBB><EFBFBD>ͷ<EFBFBD><CDB7>
|
|||
|
|
{
|
|||
|
|
'G', 'O', 'A', 'E', 'H', 'B', 'O', 'S',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
1, 5, 2, 4, 3, 7, 6, 8,
|
|||
|
|
},
|
|||
|
|
#elif (CUR_UPFL == GAUF_EMCLA1) // ƽ<>廻ɫ<E5BBBB><C9AB>
|
|||
|
|
{
|
|||
|
|
'G', 'O', 'A', 'E', 'C', 'L', 'A', '1',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
6, 1, 7, 4, 2, 5, 3, 8,
|
|||
|
|
},
|
|||
|
|
#elif (CUR_UPFL == GAUF_EXTIO) // <20><>չIO<49>忨
|
|||
|
|
#else
|
|||
|
|
{
|
|||
|
|
'R', 'P', 'U', 'P', 'D', 'A', 'T', 'E',
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
1, 2, 3, 4, 5, 6, 7, 8,
|
|||
|
|
},
|
|||
|
|
#endif
|
|||
|
|
0, 0, 0, 0,
|
|||
|
|
{
|
|||
|
|
0,
|
|||
|
|
},
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>RNPU<50><55><EFBFBD><EFBFBD>
|
|||
|
|
int DecodeData(u8 * pBuf, int len)
|
|||
|
|
{
|
|||
|
|
int i, j, k, num1;
|
|||
|
|
u8 tpbuf[8], opbuf[8];
|
|||
|
|
u8 temp, mod;
|
|||
|
|
|
|||
|
|
if (pBuf == NULL || len == 0)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = 0; i < len && ((len - i) >= 8); i += 8)
|
|||
|
|
{
|
|||
|
|
// ÿ8<C3BF><38><EFBFBD>ֽ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD>ֽڵ<D6BD><DAB5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
memcpy(tpbuf, &(pBuf[i]), 8);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><38><EFBFBD>ֽڵ<D6BD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD>
|
|||
|
|
memcpy(opbuf, tpbuf, 8);
|
|||
|
|
for (j = 0; j < 8; j++)
|
|||
|
|
{
|
|||
|
|
tpbuf[g_gnpuHead.xchgbuf[j]-1] = opbuf[j];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ1<CEBB>ĸ<EFBFBD><C4B8><EFBFBD>
|
|||
|
|
num1 = 0;
|
|||
|
|
for (j = 0; j < 8; j++)
|
|||
|
|
{
|
|||
|
|
mod = 0x01;
|
|||
|
|
for (k = 0; k < 8; k++)
|
|||
|
|
{
|
|||
|
|
if ((tpbuf[j] & mod) != 0)
|
|||
|
|
{
|
|||
|
|
num1++;
|
|||
|
|
}
|
|||
|
|
mod *= 2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>ż<EFBFBD><C5BC><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>
|
|||
|
|
if ((num1 & 0x01) != 0) // <20><><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (j = 0; j < num1; j++)
|
|||
|
|
{
|
|||
|
|
mod = tpbuf[7];
|
|||
|
|
for (k = 0; k < 8; k++)
|
|||
|
|
{
|
|||
|
|
temp = tpbuf[k];
|
|||
|
|
tpbuf[k] >>= 1; // <20><><EFBFBD><EFBFBD>
|
|||
|
|
if ((mod & 0x01) != 0)
|
|||
|
|
{
|
|||
|
|
tpbuf[k] |= 0x80;
|
|||
|
|
}
|
|||
|
|
mod = temp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else // ż<><C5BC>
|
|||
|
|
{
|
|||
|
|
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (j = 0; j < num1; j++)
|
|||
|
|
{
|
|||
|
|
mod = tpbuf[0];
|
|||
|
|
for (k = 7; k >= 0; k--)
|
|||
|
|
{
|
|||
|
|
temp = tpbuf[k];
|
|||
|
|
tpbuf[k] <<= 1; // <20><><EFBFBD><EFBFBD>
|
|||
|
|
if ((mod & 0x80) != 0)
|
|||
|
|
{
|
|||
|
|
tpbuf[k] |= 0x01;
|
|||
|
|
}
|
|||
|
|
mod = temp;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺͼ<DDBA><CDBC><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
for (j = 0; j < 8; j++)
|
|||
|
|
{
|
|||
|
|
tpbuf[j] ^= g_gnpuHead.xorbuf[j];
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>յĽ<D5B5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
memcpy(&(pBuf[i]), tpbuf, 8);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//-------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
int enFlag;
|
|||
|
|
int saveOffset;
|
|||
|
|
int isrnpufile;
|
|||
|
|
u32 bincrc;
|
|||
|
|
u32 rnpucrc;
|
|||
|
|
int rsvCounter;
|
|||
|
|
|
|||
|
|
}SaveAppCtrl;
|
|||
|
|
|
|||
|
|
SaveAppCtrl g_saveAppCtrl;
|
|||
|
|
|
|||
|
|
void InitSaveApp(void)
|
|||
|
|
{
|
|||
|
|
g_gnpuHead.datalen = 0;
|
|||
|
|
g_gnpuHead.bincrc = 0;
|
|||
|
|
g_gnpuHead.rnpucrc = 0;
|
|||
|
|
g_gnpuHead.hddatcrc = 0;
|
|||
|
|
|
|||
|
|
g_saveAppCtrl.saveOffset = 0;
|
|||
|
|
g_saveAppCtrl.isrnpufile = 0;
|
|||
|
|
|
|||
|
|
g_saveAppCtrl.bincrc = CRC32_INIT;
|
|||
|
|
g_saveAppCtrl.rnpucrc = CRC32_INIT;
|
|||
|
|
g_saveAppCtrl.rsvCounter = 0;
|
|||
|
|
|
|||
|
|
IAPCleanUpdateArea(); // <20><><EFBFBD><EFBFBD>NORflash<73>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>app<70><70><EFBFBD><EFBFBD>
|
|||
|
|
int SaveAppData(int idx, u8 * pBuf, int len, u32 ofst)
|
|||
|
|
{
|
|||
|
|
u32 addr, wtlen;
|
|||
|
|
int i, thislen;
|
|||
|
|
//printf("SaveAppData idx=%d, len=%d, ofst=0x%x\r\n", idx, len, ofst);
|
|||
|
|
|
|||
|
|
if (idx < 0 ||
|
|||
|
|
pBuf == NULL ||
|
|||
|
|
(len != SUPPORT_LEN_1 && len != SUPPORT_LEN_2) ||
|
|||
|
|
0 )
|
|||
|
|
{
|
|||
|
|
printf("SaveAppData para err\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>ļ<EFBFBD>ͷ
|
|||
|
|
if (ofst == 0 && idx == 0 && g_saveAppCtrl.saveOffset < sizeof(g_gnpuHead))
|
|||
|
|
{
|
|||
|
|
if (ofst == 0 && idx == 0)
|
|||
|
|
{
|
|||
|
|
printf("process file head\r\n");
|
|||
|
|
|
|||
|
|
if (memcmp(pBuf, g_gnpuHead.xorbuf, 8) == 0 &&
|
|||
|
|
memcmp(&(pBuf[8]), g_gnpuHead.xchgbuf, 8) == 0 &&
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
u32 hdcrc, hddatsize;
|
|||
|
|
g_saveAppCtrl.isrnpufile = 1;
|
|||
|
|
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3>
|
|||
|
|
g_saveAppCtrl.bincrc = CRC32_INIT;
|
|||
|
|
g_saveAppCtrl.rnpucrc = CRC32_INIT;
|
|||
|
|
|
|||
|
|
g_gnpuHead.datalen = *((u32*)&(pBuf[16]));
|
|||
|
|
g_gnpuHead.bincrc = *((u32*)&(pBuf[20]));
|
|||
|
|
g_gnpuHead.rnpucrc = *((u32*)&(pBuf[24]));
|
|||
|
|
g_gnpuHead.hddatcrc = *((u32*)&(pBuf[28]));
|
|||
|
|
|
|||
|
|
hddatsize = sizeof(g_gnpuHead) - sizeof(g_gnpuHead.rev) - 4;
|
|||
|
|
hdcrc = CalcCrc32((u8*)(&g_gnpuHead), hddatsize);
|
|||
|
|
|
|||
|
|
if (hdcrc == g_gnpuHead.hddatcrc)
|
|||
|
|
{
|
|||
|
|
g_saveAppCtrl.rsvCounter = g_gnpuHead.datalen;
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("file head crc error\r\n");
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("bin file not support\r\n"); // <20><>Ϊbin<69>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("file not correct\r\n");
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
addr = NOR_APP_ADDR;
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
addr = EXRAM_APP_ADDR;
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
addr = APP_ADDR_BEG;
|
|||
|
|
#else
|
|||
|
|
addr = 0;
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
addr += ofst;
|
|||
|
|
addr += ((idx-1)*len); // д<><D0B4><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>idx*len; <09><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD>,<2C><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>ʱ<EFBFBD><CAB1>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
|
|||
|
|
wtlen = len;
|
|||
|
|
|
|||
|
|
g_saveAppCtrl.saveOffset += len;
|
|||
|
|
|
|||
|
|
if (g_saveAppCtrl.isrnpufile != 0)
|
|||
|
|
{
|
|||
|
|
if (g_saveAppCtrl.rsvCounter > len)
|
|||
|
|
{
|
|||
|
|
thislen = len;
|
|||
|
|
g_saveAppCtrl.rsvCounter -= len;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
thislen = g_saveAppCtrl.rsvCounter;
|
|||
|
|
g_saveAppCtrl.rsvCounter = 0;
|
|||
|
|
}
|
|||
|
|
for (i = 0; i < thislen; i++)
|
|||
|
|
{
|
|||
|
|
g_saveAppCtrl.rnpucrc = AddCrc32(g_saveAppCtrl.rnpucrc, pBuf[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DecodeData(pBuf, thislen); // <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
for (i = 0; i < thislen; i++)
|
|||
|
|
{
|
|||
|
|
g_saveAppCtrl.bincrc = AddCrc32(g_saveAppCtrl.bincrc, pBuf[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (i = thislen; i < len; i++)
|
|||
|
|
{
|
|||
|
|
pBuf[i] = 0xff;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
thislen = len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
printf("save to norflash, addr=0x%lx, wtlen=%d\r\n", addr, wtlen);
|
|||
|
|
DatFlashWrData(addr, pBuf, wtlen);
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
printf("save to exram, addr=0x%lx, wtlen=%d\r\n", addr, wtlen);
|
|||
|
|
memcpy((void*)addr, (void*)pBuf, wtlen);
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
printf("save to in flash addr=0x%lx, wtlen=%d\r\n", addr, wtlen);
|
|||
|
|
STMFlashWrite(addr, (u16*)pBuf, wtlen/2, 1);
|
|||
|
|
#else
|
|||
|
|
printf("not support addr=0x%lx, wtlen=%d\r\n", addr, wtlen);
|
|||
|
|
#endif
|
|||
|
|
return thislen;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20>жϽ<D0B6><CFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>ؽ<EFBFBD><D8BD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int IsAppReceiveDone(void)
|
|||
|
|
{
|
|||
|
|
return (int)g_gnpuHead.datalen - (int)g_saveAppCtrl.rsvCounter;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
u32 GetAppSaveDataCrc(u32 addr, u32 size)
|
|||
|
|
{
|
|||
|
|
#define RD_DAT_BUF_LEN (1024) // <20>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
|
|||
|
|
// <20><>flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD>֤
|
|||
|
|
u32 crc;
|
|||
|
|
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
u8 rdata[RD_DAT_BUF_LEN];
|
|||
|
|
#else
|
|||
|
|
u8 volatile rdata[RD_DAT_BUF_LEN];
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
int i, thislen, rsvlen;
|
|||
|
|
rsvlen = size;
|
|||
|
|
crc = CRC32_INIT;
|
|||
|
|
|
|||
|
|
while(addr < APP_ADDR_BEG+size)
|
|||
|
|
{
|
|||
|
|
if (rsvlen > RD_DAT_BUF_LEN)
|
|||
|
|
{
|
|||
|
|
thislen = RD_DAT_BUF_LEN;
|
|||
|
|
rsvlen -= RD_DAT_BUF_LEN;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
thislen = rsvlen;
|
|||
|
|
rsvlen = 0;
|
|||
|
|
}
|
|||
|
|
#if (APP_SAVE_TO == APP_SAVE_NORFLASH)
|
|||
|
|
DatFlashRdData(addr, rdata, RD_DAT_BUF_LEN); // <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_EXRAM)
|
|||
|
|
memcpy(rdata, (void*)addr, RD_DAT_BUF_LEN);
|
|||
|
|
#elif (APP_SAVE_TO == APP_SAVE_INFLASH)
|
|||
|
|
STMFlashRead(addr, (u16*)rdata, RD_DAT_BUF_LEN/2);
|
|||
|
|
#else
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
for (i = 0; i < thislen; i++)
|
|||
|
|
{
|
|||
|
|
crc = AddCrc32(crc, rdata[i]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
addr += RD_DAT_BUF_LEN; // <20><>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
return crc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
int IsSaveDataCorrect(void)
|
|||
|
|
{
|
|||
|
|
u32 crc, hddatsize;
|
|||
|
|
int rslt;
|
|||
|
|
|
|||
|
|
if (g_saveAppCtrl.isrnpufile == 0)
|
|||
|
|
{
|
|||
|
|
printf("g_isrnpufile == 0\r\n");
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
hddatsize = sizeof(g_gnpuHead) - sizeof(g_gnpuHead.rev) - 4; //
|
|||
|
|
crc = CalcCrc32((u8*)(&g_gnpuHead), hddatsize);
|
|||
|
|
|
|||
|
|
rslt = -1;
|
|||
|
|
|
|||
|
|
printf("check g_gnpuHead crc = 0x%lx \r\n",crc);
|
|||
|
|
printf("g_gnpuHead.hddatcrc = 0x%lx \r\n",g_gnpuHead.hddatcrc);
|
|||
|
|
printf("g_gnpuHead.bincrc = 0x%lx \r\n",g_gnpuHead.bincrc);
|
|||
|
|
printf("g_saveAppCtrl.bincrc = 0x%lx \r\n",g_saveAppCtrl.bincrc);
|
|||
|
|
printf("g_gnpuHead.rnpucrc = 0x%lx \r\n",g_gnpuHead.rnpucrc);
|
|||
|
|
printf("g_saveAppCtrl.rnpucrc = 0x%lx \r\n",g_saveAppCtrl.rnpucrc);
|
|||
|
|
printf("g_gnpuHead.datalen = 0x%lx \r\n",g_gnpuHead.datalen);
|
|||
|
|
printf("g_saveAppCtrl.rsvCounter = 0x%lx \r\n",g_saveAppCtrl.rsvCounter);
|
|||
|
|
|
|||
|
|
if (g_gnpuHead.hddatcrc == crc &&
|
|||
|
|
g_gnpuHead.bincrc == g_saveAppCtrl.bincrc &&
|
|||
|
|
g_gnpuHead.rnpucrc == g_saveAppCtrl.rnpucrc &&
|
|||
|
|
1 )
|
|||
|
|
{
|
|||
|
|
crc = GetAppSaveDataCrc(APP_ADDR_BEG, g_gnpuHead.datalen);
|
|||
|
|
|
|||
|
|
printf("calc crc = 0x%x, g_gnpuHead.bincrc = 0x%x\r\n", crc, g_gnpuHead.bincrc);
|
|||
|
|
|
|||
|
|
if (g_gnpuHead.bincrc == crc)
|
|||
|
|
{
|
|||
|
|
rslt = 0;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("re calc file data crc error\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("receive file crc error\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>APP<50><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void StartAppUpdate(int reboot)
|
|||
|
|
{
|
|||
|
|
if (IsSaveDataCorrect() == 0)
|
|||
|
|
{
|
|||
|
|
u32 rdstart, wrstart, len, wtlen, check;
|
|||
|
|
|
|||
|
|
rdstart = (APP_ADDR_BEG - APP_SAVE_BASE);
|
|||
|
|
wrstart = (STM32_APP_ADDR - STM32_FLASH_BASE); // <20>ļ<EFBFBD><C4BC><EFBFBD>ʼ<EFBFBD><CABC>ַ
|
|||
|
|
len = g_gnpuHead.datalen;
|
|||
|
|
wtlen = (g_gnpuHead.datalen + STM32_FLASH_RW_SIZE - 1) / STM32_FLASH_RW_SIZE;
|
|||
|
|
wtlen *= STM32_FLASH_RW_SIZE;
|
|||
|
|
check = g_gnpuHead.bincrc;
|
|||
|
|
|
|||
|
|
printf("StartAppUpdate rdstart = 0x%x, wrstart = 0x%x, len = %d, wtlen = %d, wcrc=0x%x\r\n", rdstart, wrstart, len, wtlen, check);
|
|||
|
|
|
|||
|
|
IapWritePara(rdstart, wrstart, len, wtlen, check);
|
|||
|
|
|
|||
|
|
#if (1) // <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
RestartMcu(); // <20><><EFBFBD><EFBFBD>MCU
|
|||
|
|
#else
|
|||
|
|
if (reboot != 0)
|
|||
|
|
{
|
|||
|
|
RestartMcu(); // <20><><EFBFBD><EFBFBD>MCU
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
UpdateApp(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
|
JumpToApp(); // <20><><EFBFBD><EFBFBD>APP
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("IsSaveDataCorrect failed\r\n");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|