Commit 149144a7 authored by 李延凯's avatar 李延凯

fix: 修改检测Flash中的MCU程序时, Flash偏移量不正确的问题

周期检测已关闭, 如果开启, 将不能使用CAN升级!
parent f958e54b
...@@ -37,6 +37,9 @@ s_AMT630H_FlashCheck_t AMT630H_FlashCheck; ...@@ -37,6 +37,9 @@ s_AMT630H_FlashCheck_t AMT630H_FlashCheck;
unsigned long Delay_Time = 0; unsigned long Delay_Time = 0;
unsigned long Delay_Time_Set = 0; unsigned long Delay_Time_Set = 0;
extern uint32_t Check_Upgrade;
extern uint32_t Check_Upgrade_Cnt;
/* Refresh Time */ /* Refresh Time */
unsigned long AMT630H_RefreshTime = 0; unsigned long AMT630H_RefreshTime = 0;
static uint8_t AMT630H_Animation_Start = 0; static uint8_t AMT630H_Animation_Start = 0;
...@@ -306,6 +309,8 @@ void Amt630hInit(void) ...@@ -306,6 +309,8 @@ void Amt630hInit(void)
AMT630H_FlashCheck.InquireTime = 0; AMT630H_FlashCheck.InquireTime = 0;
AMT630H_FlashCheck.CheckStateTime = 0; AMT630H_FlashCheck.CheckStateTime = 0;
AMT630H_FlashCheck.Result = 0; AMT630H_FlashCheck.Result = 0;
Check_Upgrade = 0;
Check_Upgrade_Cnt = 0;
} }
void AMT630H_Sleep(void) void AMT630H_Sleep(void)
{ {
......
#include <string.h>
#include "UartProtocol.h" #include "UartProtocol.h"
#include "PicBin.h" #include "PicBin.h"
#include <stdint.h> #include <stdint.h>
#include "UDS_ISO14229_Services.h" #include "UDS_ISO14229_Services.h"
#include "flash.h"
#define NULL 0 #define NULL 0
#define READ_MCU_DATA_MAX 0x400
extern uint8_t UartRevBuff[0x1000]; extern uint8_t UartRevBuff[0x1000];
extern uint32_t UartRevCnts; extern uint32_t UartRevCnts;
uint8_t ReadDataBuf[READ_MCU_DATA_MAX]; /* 读取缓存 */
uint32_t NeedWriteSize; /* 需要写入文件的长度 */
uint32_t FactOffset; /* 绝对地址 */
uint32_t ReadOffset; /* 630中读取偏移量 */
uint32_t AppOffset;
uint32_t Check_Upgrade_Cnt;
uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos) uint8_t *GetUartRecvData(uint32_t *UartRecvBufLen, uint32_t *UartRecvPos)
{ {
...@@ -82,7 +77,7 @@ void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal) ...@@ -82,7 +77,7 @@ void DisplayNum(uint8_t page, DISPLAY_NUM_ST *pNumData, int32_t NumVal)
} }
/***************** Read 630 ************************/ /***************** Read 630 ************************/
#define READ_MCU_DATA_MAX 0x800 #define READ_MCU_DATA_MAX 0x40
enum { enum {
READ630_IDLE, READ630_IDLE,
READ630_WAITING_RESP, READ630_WAITING_RESP,
...@@ -92,6 +87,13 @@ enum { ...@@ -92,6 +87,13 @@ enum {
READ630_RECV_BACKUP_DATA_CRC, READ630_RECV_BACKUP_DATA_CRC,
}; };
uint8_t ReadDataBuf[READ_MCU_DATA_MAX]; /* 读取缓存 */
uint32_t NeedWriteSize; /* 需要写入文件的长度 */
uint32_t FactOffset; /* 绝对地址 */
uint32_t AppOffset;
uint32_t Check_Upgrade;
uint32_t Check_Upgrade_Cnt;
static uint8_t Read630State = READ630_IDLE; static uint8_t Read630State = READ630_IDLE;
static uint32_t ReqDataBufAddr = 0; static uint32_t ReqDataBufAddr = 0;
static uint32_t ReqDataLen = 0; static uint32_t ReqDataLen = 0;
...@@ -181,181 +183,6 @@ void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_ ...@@ -181,181 +183,6 @@ void SetRecvDataSt(RECV_MCU_DATA_TYPE type, uint32_t addr, uint32_t len, uint32_
} }
/***************** Read 630 end ************************/ /***************** Read 630 end ************************/
/* Test */
static uint8_t TestReadBuf[READ_MCU_DATA_MAX];
static uint32_t TestDataLen = 0;
static uint32_t TestDataCrC = 0;
static uint32_t ReadOffset = 0;
static uint32_t CalcCrcVal = 0xffffffff;
static uint32_t TestCycleNum = 0;
static uint32_t CalcCrc32(uint8_t *buf, int Len, uint32_t InitVal)
{
int i;
int n = 0;
uint32_t crc = InitVal; // Initial value
for (n = 0; n < Len; n++) {
crc ^= (uint32_t)buf[n] << 24; // crc ^= *data; data++;
for (i = 0; i < 8; ++i) {
if (crc & 0x80000000) {
crc = (crc << 1) ^ 0x04C11DB7; // 0xEDB88320= reverse 0x04C11DB7
} else {
crc = (crc << 1);
}
}
}
return crc;
}
void TestRead630Update(void)
{
uint32_t tmpLen;
static uint8_t readSt = 0;
static uint16_t getStRetryCnts = 0;
if (TestDataLen == 0) {
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(GET_APP_DATA_OFFSET, 0, 0, 0);
getStRetryCnts = 500;
} else {
TestDataLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
if ((TestDataLen != 0) || (--getStRetryCnts == 0)) {
if (TestDataLen != 0) {
TestDataLen = RespDataLen;
TestDataCrC = RespDataCrc;
ReadOffset = 0;
CalcCrcVal = 0xffffffff;
}
readSt = 0;
}
}
} else {
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(REQ_DATA, ReadOffset, READ_MCU_DATA_MAX, TestReadBuf);
getStRetryCnts = 500;
ReadOffset += READ_MCU_DATA_MAX;
} else {
tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
if (ReadOffset == tmpLen) {
if (ReadOffset < TestDataLen) {
CalcCrcVal = CalcCrc32(TestReadBuf, READ_MCU_DATA_MAX, CalcCrcVal);
readSt = 0;
} else {
CalcCrcVal = CalcCrc32(TestReadBuf, TestDataLen - (ReadOffset - READ_MCU_DATA_MAX), CalcCrcVal);
if (CalcCrcVal != TestDataCrC) {
while (1) {
RTE_WDT_Clear();
}
} else {
TestCycleNum++;
}
getStRetryCnts = 500;
TestDataLen = 0;
TestDataCrC = 0;
readSt = 0;
}
}
if (--getStRetryCnts == 0) {
ReadOffset -= READ_MCU_DATA_MAX;
readSt = 0;
}
}
}
}
/* Test end */
/* Test */
static uint32_t TestBackupDataLen = 0;
static uint32_t TestBackupDataOffset = 0;
static uint32_t TestBackupDataOffsetEnd = 0;
static uint32_t TestBackupDataCrc = 0;
static uint8_t *pData = (uint8_t*)0x40400;
void TestWrite630Backup(void)
{
static int readstep = 0;
uint32_t tmpRet;
static uint8_t readSt = 0;
static uint16_t getStRetryCnts = 0;
TestBackupDataLen = 0x100000;
if (TestBackupDataOffset == 0) {
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(GET_BACKUP_DATA_OFFSET, 0, 0, NULL);
getStRetryCnts = 500;
} else {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, NULL);
if ((tmpRet != 2) || (--getStRetryCnts == 0)) {
if (tmpRet != 2) {
TestBackupDataOffset = tmpRet;
TestBackupDataOffsetEnd = TestBackupDataOffset + TestBackupDataLen;
}
readSt = 0;
}
}
} else if (TestBackupDataCrc == 0) {
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(GET_BACKUP_DATA_CRC, TestBackupDataOffset, TestBackupDataLen, NULL);
getStRetryCnts = 500;
} else {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, NULL);
if ((tmpRet != 2) || (--getStRetryCnts == 0)) {
if (tmpRet != 2) {
TestBackupDataCrc = tmpRet;
}
readSt = 0;
}
}
} else {
#if 1
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(REQ_DATA, TestBackupDataOffset, READ_MCU_DATA_MAX, TestReadBuf);
getStRetryCnts = 500;
TestBackupDataOffset += READ_MCU_DATA_MAX;
} else {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
if (TestBackupDataOffset == tmpRet) {
if (TestBackupDataOffset < TestBackupDataOffsetEnd) {
readSt = 0;
} else {
readSt = 0;
}
}
if (--getStRetryCnts == 0) {
TestBackupDataOffset -= READ_MCU_DATA_MAX;
readSt = 0;
}
}
#else
if (readSt == 0) {
readSt = 1;
ProcMcuOrBackupData(WRITE_BACKUP_DATA, TestBackupDataOffset, READ_MCU_DATA_MAX, pData);
getStRetryCnts = 1500;
TestBackupDataOffset += READ_MCU_DATA_MAX;
pData += READ_MCU_DATA_MAX;
} else {
tmpRet = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0);
if (TestBackupDataOffset == tmpRet) {
if (TestBackupDataOffset < TestBackupDataOffsetEnd) {
readSt = 0;
} else {
readSt = 0;
}
}
if (--getStRetryCnts == 0) {
TestBackupDataOffset -= READ_MCU_DATA_MAX;
pData -= READ_MCU_DATA_MAX;
readSt = 0;
}
}
#endif
}
}
/* Test end */
void GetReadInfo(READ_ARK630_CMD type) void GetReadInfo(READ_ARK630_CMD type)
{ {
static uint8_t readSt = 0; static uint8_t readSt = 0;
...@@ -382,10 +209,6 @@ void GetReadInfo(READ_ARK630_CMD type) ...@@ -382,10 +209,6 @@ void GetReadInfo(READ_ARK630_CMD type)
{ {
FactOffset = 0; /* USB按相对地址获取数据 */ FactOffset = 0; /* USB按相对地址获取数据 */
} }
else
{
FactOffset = tmpRet; /* 备份程序按绝对地址获取数据 */
}
AppOffset = 0x00; AppOffset = 0x00;
} }
readSt = 0; readSt = 0;
...@@ -403,7 +226,6 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -403,7 +226,6 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
static uint16_t getStRetryCnts = 0; static uint16_t getStRetryCnts = 0;
uint32_t tmpLen; uint32_t tmpLen;
uint32_t writeLen;
uint8_t saveVersion[16]; uint8_t saveVersion[16];
uint8_t readVersion[16]; uint8_t readVersion[16];
...@@ -413,14 +235,13 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -413,14 +235,13 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
{ {
readSt = 1; readSt = 1;
(void)memset(ReadDataBuf, 0xFFU, sizeof(ReadDataBuf)); /* 初始化buffer */ (void)memset(ReadDataBuf, 0xFFU, sizeof(ReadDataBuf)); /* 初始化buffer */
ProcMcuOrBackupData(REQ_DATA, FactOffset + ReadOffset, READ_MCU_DATA_MAX, ReadDataBuf); // 按地址获取程序数据 ProcMcuOrBackupData(REQ_DATA, FactOffset, READ_MCU_DATA_MAX, ReadDataBuf); // 按地址获取程序数据
getStRetryCnts = 500; getStRetryCnts = 500;
ReadOffset += READ_MCU_DATA_MAX;
} }
else else
{ {
tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); /* 获取读取状态 */ tmpLen = ProcMcuOrBackupData(GET_STATUS, 0, 0, 0); /* 获取读取状态 */
if (FactOffset + ReadOffset == tmpLen) /* 当返回值为目标位置时为数据获取成功 */ if (FactOffset + READ_MCU_DATA_MAX == tmpLen) /* 当返回值为目标位置时为数据获取成功 */
{ {
if (AppOffset == 0) /* 首个数据块内解析文件信息 */ if (AppOffset == 0) /* 首个数据块内解析文件信息 */
{ {
...@@ -429,7 +250,7 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -429,7 +250,7 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
flash_read(FLASH_630H_UPDATE_INFO, sizeof(saveVersion), saveVersion); /* 读取630H升级记录 */ flash_read(FLASH_630H_UPDATE_INFO, sizeof(saveVersion), saveVersion); /* 读取630H升级记录 */
memcpy(readVersion, &ReadDataBuf[16], 16); /* 630中读出的版本信息 */ memcpy(readVersion, &ReadDataBuf[16], 16); /* 630中读出的版本信息 */
if (memcmp(&ReadDataBuf[16], saveVersion, 16) != 0) /* 对比版本不同才更新 */ if (memcmp(readVersion, saveVersion, 16) != 0) /* 对比版本不同才更新 */
{ {
Get_Into_630H_Update_MCU_Mode(); Get_Into_630H_Update_MCU_Mode();
} }
...@@ -437,6 +258,7 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -437,6 +258,7 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
{ {
/* 信息相同, 重置状态 */ /* 信息相同, 重置状态 */
NeedWriteSize = 0; NeedWriteSize = 0;
Check_Upgrade = 0;
readSt = 0; readSt = 0;
} }
} }
...@@ -445,7 +267,6 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -445,7 +267,6 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
if (--getStRetryCnts == 0) if (--getStRetryCnts == 0)
{ {
/* 读信息超时, 重置状态 */ /* 读信息超时, 重置状态 */
ReadOffset -= READ_MCU_DATA_MAX;
readSt = 0; readSt = 0;
} }
} }
...@@ -454,11 +275,19 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type) ...@@ -454,11 +275,19 @@ void Check_MCU_in_Flash(READ_ARK630_CMD type)
void Check_MCU_Info_in_630H(void) void Check_MCU_Info_in_630H(void)
{ {
Check_Upgrade_Cnt += 100U;
if(Check_Upgrade_Cnt >= 5000U) /* 每5秒检查一次Flash中的MCU程序信息 */ if(Check_Upgrade == 1U)
{ {
Check_Upgrade_Cnt = 0U;
GetReadInfo(GET_APP_DATA_OFFSET); GetReadInfo(GET_APP_DATA_OFFSET);
Check_MCU_in_Flash(GET_APP_DATA_OFFSET); Check_MCU_in_Flash(GET_APP_DATA_OFFSET);
} }
else
{
Check_Upgrade_Cnt++;
if(Check_Upgrade_Cnt >= 2500U) /* 放在2ms任务中, 2500 = 5000ms */
{
Check_Upgrade_Cnt = 0;
Check_Upgrade = 1U;
}
}
} }
...@@ -20,6 +20,7 @@ void Sys_2ms_Tasks(void) ...@@ -20,6 +20,7 @@ void Sys_2ms_Tasks(void)
Sys_Status_Update_Service(); Sys_Status_Update_Service();
Analog_Signal_Conv_Service(); Analog_Signal_Conv_Service();
AMT630H_Main(); AMT630H_Main();
/* Check_MCU_Info_in_630H(); */
DoCAN_Timer_Update(2000u); DoCAN_Timer_Update(2000u);
//Can_Write_Fun(&CAN_CH0_CanMsgTxOp, 2000u);无外发 //Can_Write_Fun(&CAN_CH0_CanMsgTxOp, 2000u);无外发
CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 2u); CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp, 2u);
...@@ -77,7 +78,6 @@ void Sys_100ms_Tasks(void) ...@@ -77,7 +78,6 @@ void Sys_100ms_Tasks(void)
ODOtest = Data_ODO_Read(); ODOtest = Data_ODO_Read();
Triptest = Data_Read_Trip(0); Triptest = Data_Read_Trip(0);
S3_ServerCNTT(); S3_ServerCNTT();
Check_MCU_Info_in_630H();
Get_DisTime_Service(); Get_DisTime_Service();
Fuel_Cal_Sevice(100u); Fuel_Cal_Sevice(100u);
Coolant_Cal_Sevice(100u); Coolant_Cal_Sevice(100u);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment