|
@@ -8,7 +8,6 @@
|
|
|
|
|
|
|
|
extern CanPort_t *ecu_cap;
|
|
extern CanPort_t *ecu_cap;
|
|
|
|
|
|
|
|
-#ifdef CAN_UPDATE
|
|
|
|
|
#define CAN_UPDADE_DDR_ADDR_SIZE (DDR_CAN_UPDATE_SIZE / 2)
|
|
#define CAN_UPDADE_DDR_ADDR_SIZE (DDR_CAN_UPDATE_SIZE / 2)
|
|
|
#define CAN_UPDADE_DDR_ADDR DDR_CAN_USE_ADDR
|
|
#define CAN_UPDADE_DDR_ADDR DDR_CAN_USE_ADDR
|
|
|
#define CAN_UPDADE_DDR_ADDRB (DDR_CAN_USE_ADDR + CAN_UPDADE_DDR_ADDR_SIZE)
|
|
#define CAN_UPDADE_DDR_ADDRB (DDR_CAN_USE_ADDR + CAN_UPDADE_DDR_ADDR_SIZE)
|
|
@@ -21,7 +20,6 @@ static u32 file_size, left_size = 0;
|
|
|
static u8 file_type = 0;
|
|
static u8 file_type = 0;
|
|
|
static u8 new_file = 0;
|
|
static u8 new_file = 0;
|
|
|
static u8 tx_status = 0; //1:tfr err,0:tfr nor
|
|
static u8 tx_status = 0; //1:tfr err,0:tfr nor
|
|
|
-#endif
|
|
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @brief 发送CAN消息
|
|
* @brief 发送CAN消息
|
|
@@ -252,13 +250,12 @@ uint8_t CAN_UDS_ServiceRespond(uint8_t RSID, uint8_t *pData, uint32_t DataLen)
|
|
|
*/
|
|
*/
|
|
|
uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
{
|
|
{
|
|
|
-#ifndef CAN_UPDATE
|
|
|
|
|
static uint32_t MemoryAddress;
|
|
static uint32_t MemoryAddress;
|
|
|
- static uint32_t MemorySize;
|
|
|
|
|
-#endif
|
|
|
|
|
static uint32_t AppCRC32 = 0xFFFFFFFF;
|
|
static uint32_t AppCRC32 = 0xFFFFFFFF;
|
|
|
const uint32_t BlockSize = UDS_PACK_SIZE + 2; //Max Number Of Block Length,需要加上SID和BSC
|
|
const uint32_t BlockSize = UDS_PACK_SIZE + 2; //Max Number Of Block Length,需要加上SID和BSC
|
|
|
static uint8_t BSC =1 ; //Block Sequence Counter
|
|
static uint8_t BSC =1 ; //Block Sequence Counter
|
|
|
|
|
+ static header_offset_t *hoff;
|
|
|
|
|
+ static u32 file_crc;
|
|
|
|
|
|
|
|
switch (SID) {
|
|
switch (SID) {
|
|
|
case 0x10:
|
|
case 0x10:
|
|
@@ -269,9 +266,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
AppCRC32 = 0xFFFFFFFF;
|
|
AppCRC32 = 0xFFFFFFFF;
|
|
|
printf("Programming Mode\r\n");
|
|
printf("Programming Mode\r\n");
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
- //CAN_BOOT_SetProgRequest();
|
|
|
|
|
- //printf("ECU Reset\r\n");
|
|
|
|
|
- //CAN_BOOT_Reset();
|
|
|
|
|
} else if (DataLen >= 1 && pData[0] == 0x01) {
|
|
} else if (DataLen >= 1 && pData[0] == 0x01) {
|
|
|
printf("Default Session\r\n");
|
|
printf("Default Session\r\n");
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
@@ -281,8 +275,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
if (DataLen >= 1 && pData[0] == 0x01) { //ECU Reset
|
|
if (DataLen >= 1 && pData[0] == 0x01) { //ECU Reset
|
|
|
printf("ECU Reset\r\n");
|
|
printf("ECU Reset\r\n");
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
- //CAN_BOOT_ResetProgRequest(); //清除进入编程模式标志
|
|
|
|
|
- //CAN_BOOT_Reset();
|
|
|
|
|
}
|
|
}
|
|
|
break;
|
|
break;
|
|
|
case 0x31:
|
|
case 0x31:
|
|
@@ -290,19 +282,31 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
printf("Erase Flash Memory...\r\n");
|
|
printf("Erase Flash Memory...\r\n");
|
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
|
-#ifndef CAN_UPDATE
|
|
|
|
|
- pData[3] = UPDATE_EraseUpfile(UPFILE_TYPE_MCU_IMAGE);
|
|
|
|
|
-#endif
|
|
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
|
|
|
} else if (DataLen >= 3 && pData[0] == 0x01 && pData[1] == 0xFF && pData[2]==0x01) { //Check Programming Dependencies,验证APP的合法性
|
|
} else if (DataLen >= 3 && pData[0] == 0x01 && pData[1] == 0xFF && pData[2]==0x01) { //Check Programming Dependencies,验证APP的合法性
|
|
|
printf("Check Programming Dependencies...\r\n");
|
|
printf("Check Programming Dependencies...\r\n");
|
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
|
-#ifndef CAN_UPDATE
|
|
|
|
|
- pData[3] = UPDATE_CheckApp(1, 0);
|
|
|
|
|
- if (pData[3])
|
|
|
|
|
- UPDATE_SetAppValid();
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_IMAGE) {
|
|
|
|
|
+ pData[3] = UPDATE_CheckApp(1, 0);
|
|
|
|
|
+ if (pData[3])
|
|
|
|
|
+ UPDATE_SetAppValid();
|
|
|
|
|
+ } else if (file_type == UPFILE_TYPE_MCU_FB) {
|
|
|
|
|
+ u8 *code = pvPortMalloc(file_size);
|
|
|
|
|
+ UPDATE_ReadData(MemoryAddress, code, file_size);
|
|
|
|
|
+ *(u32 *)(code + 0x20) = 0;
|
|
|
|
|
+ if (xcrc32(code, file_size, AppCRC32, HARD_CALC_CRC) == file_crc) {
|
|
|
|
|
+ hoff = GetHeaderOff();
|
|
|
|
|
+ hoff->fboffset = MemoryAddress;
|
|
|
|
|
+ SaveHeaderOff();
|
|
|
|
|
+ pData[3] = 1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ AppCRC32 = 0xFFFFFFFF;
|
|
|
|
|
+ if (code)
|
|
|
|
|
+ vPortFree(code);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 4);
|
|
|
printf("Check Programming Dependencies res=%d\r\n",pData[3]);
|
|
printf("Check Programming Dependencies res=%d\r\n",pData[3]);
|
|
|
} else if (DataLen >= 7 && pData[0] == 0x01 && pData[1] == 0x02 && pData[2] == 0x02) { //Check Programming Integrity,通过CRC32验证
|
|
} else if (DataLen >= 7 && pData[0] == 0x01 && pData[1] == 0x02 && pData[2] == 0x02) { //Check Programming Integrity,通过CRC32验证
|
|
@@ -327,17 +331,18 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
case 0x34:
|
|
case 0x34:
|
|
|
if (DataLen >= 10 && pData[0] == 0x00 && pData[1] == 0x44) { //Request Download
|
|
if (DataLen >= 10 && pData[0] == 0x00 && pData[1] == 0x44) { //Request Download
|
|
|
BSC = 1;
|
|
BSC = 1;
|
|
|
-#ifdef CAN_UPDATE
|
|
|
|
|
file_size = left_size = (pData[6] << 24) | (pData[7] << 16) | (pData[8] << 8) | pData[9];
|
|
file_size = left_size = (pData[6] << 24) | (pData[7] << 16) | (pData[8] << 8) | pData[9];
|
|
|
file_type = pData[10];
|
|
file_type = pData[10];
|
|
|
new_file = 1;
|
|
new_file = 1;
|
|
|
tx_status = 0;
|
|
tx_status = 0;
|
|
|
mailbox_frame_size = 0;
|
|
mailbox_frame_size = 0;
|
|
|
- break;
|
|
|
|
|
-#else
|
|
|
|
|
- MemoryAddress = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
|
|
|
|
|
- MemorySize = (pData[6] << 24) | (pData[7] << 16) | (pData[8] << 8) | pData[9];
|
|
|
|
|
- printf("Request Download MemoryAddress = 0x%08X MemorySize = %d Byte\r\n", MemoryAddress, MemorySize);
|
|
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_IMAGE) {
|
|
|
|
|
+ MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
|
|
|
|
|
+ UPDATE_EraseData(MemoryAddress, IMAGE_MAX_SIZE);
|
|
|
|
|
+ } else if (file_type == UPFILE_TYPE_MCU_FB) {
|
|
|
|
|
+ MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_FB);
|
|
|
|
|
+ UPDATE_EraseData(MemoryAddress, FASTBOOT_MAX_SIZE);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
pData[0] = 0x40;
|
|
pData[0] = 0x40;
|
|
|
pData[1] = BlockSize >> 24;
|
|
pData[1] = BlockSize >> 24;
|
|
@@ -345,20 +350,21 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
pData[3] = BlockSize >> 8;
|
|
pData[3] = BlockSize >> 8;
|
|
|
pData[4] = BlockSize;
|
|
pData[4] = BlockSize;
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 5);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 5);
|
|
|
-#endif
|
|
|
|
|
} else if (DataLen >= 6 && pData[0] == 0x00 && pData[1] == 0x04) { //Request Download
|
|
} else if (DataLen >= 6 && pData[0] == 0x00 && pData[1] == 0x04) { //Request Download
|
|
|
BSC = 1;
|
|
BSC = 1;
|
|
|
-#ifdef CAN_UPDATE
|
|
|
|
|
file_size = left_size = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
|
|
file_size = left_size = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
|
|
|
file_type = pData[6];
|
|
file_type = pData[6];
|
|
|
new_file = 1;
|
|
new_file = 1;
|
|
|
tx_status = 0;
|
|
tx_status = 0;
|
|
|
mailbox_frame_size = 0;
|
|
mailbox_frame_size = 0;
|
|
|
-#else
|
|
|
|
|
- MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
|
|
|
|
|
- MemorySize = (pData[2] << 24) | (pData[3] << 16) | (pData[4] << 8) | pData[5];
|
|
|
|
|
- printf("Request Download MemorySize = %d Byte\r\n", MemorySize);
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_IMAGE) {
|
|
|
|
|
+ MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_IMAGE);
|
|
|
|
|
+ UPDATE_EraseData(MemoryAddress, IMAGE_MAX_SIZE);
|
|
|
|
|
+ } else if (file_type == UPFILE_TYPE_MCU_FB) {
|
|
|
|
|
+ MemoryAddress = UPDATE_GetUpfileAddr(UPFILE_TYPE_MCU_FB);
|
|
|
|
|
+ UPDATE_EraseData(MemoryAddress, FASTBOOT_MAX_SIZE);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
pData[0] = 0x20;
|
|
pData[0] = 0x20;
|
|
|
pData[1] = BlockSize >> 8;
|
|
pData[1] = BlockSize >> 8;
|
|
|
pData[2] = BlockSize;
|
|
pData[2] = BlockSize;
|
|
@@ -376,10 +382,24 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
if (pData[0] == BSC) {
|
|
if (pData[0] == BSC) {
|
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
uint8_t res[2] = {SID, 0x78}; //Request Correctly Received Response Pending
|
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
CAN_UDS_ServiceRespond(0x7F, res, 2);
|
|
|
-
|
|
|
|
|
-#ifdef CAN_UPDATE
|
|
|
|
|
uint16_t DataNum = DataLen - 1;
|
|
uint16_t DataNum = DataLen - 1;
|
|
|
uint8_t *pGotData = &pData[1];
|
|
uint8_t *pGotData = &pData[1];
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_IMAGE || file_type == UPFILE_TYPE_MCU_FB) {
|
|
|
|
|
+ u32 alignsize = (DataNum + 3) & ~3;
|
|
|
|
|
+ uint32_t AddrOffset = (BSC - 1) * UDS_PACK_SIZE;
|
|
|
|
|
+ UPDATE_WriteData(MemoryAddress + AddrOffset, pGotData, alignsize);
|
|
|
|
|
+ CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_FB && BSC == 1) {
|
|
|
|
|
+ file_crc = *(u32 *)(pGotData + 0x20);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //AppCRC32 = UPDATE_CalcCrc(MemoryAddress + AddrOffset, DataNum, AppCRC32);
|
|
|
|
|
+ AppCRC32 = xcrc32(pGotData, DataNum, AppCRC32, HARD_CALC_CRC);
|
|
|
|
|
+ BSC++;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ AppCRC32 = xcrc32(pGotData, DataNum, AppCRC32, HARD_CALC_CRC);
|
|
|
if (mailbox_frame_addr == 0)
|
|
if (mailbox_frame_addr == 0)
|
|
|
mailbox_frame_addr = CAN_UPDADE_DDR_ADDR;
|
|
mailbox_frame_addr = CAN_UPDADE_DDR_ADDR;
|
|
|
|
|
|
|
@@ -418,6 +438,20 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
|
|
|
|
|
if (!left_size || new_file) { //wait start/last frame status
|
|
if (!left_size || new_file) { //wait start/last frame status
|
|
|
new_file = 0;
|
|
new_file = 0;
|
|
|
|
|
+ if (file_size == DataNum) {
|
|
|
|
|
+ if (!MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &rx_msg, pdMS_TO_TICKS(30000))) {
|
|
|
|
|
+ rx_need = 0;
|
|
|
|
|
+ pData[0] = SID;
|
|
|
|
|
+ pData[1] = 0x13;
|
|
|
|
|
+ CAN_UDS_ServiceRespond(0x7F, pData, 2);
|
|
|
|
|
+ tx_status = 1;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ send_packet.FrameStatus = MUFS_TFR;
|
|
|
|
|
+ MailboxUpdateSendFrame(MB_MSG_T_CAN_UPDATE, &send_packet);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (!MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &rx_msg, pdMS_TO_TICKS(30000))) {
|
|
if (!MailboxUpdateReceiveFrame(MB_MSG_T_CAN_UPDATE, &rx_msg, pdMS_TO_TICKS(30000))) {
|
|
|
rx_need = 0;
|
|
rx_need = 0;
|
|
|
pData[0] = SID;
|
|
pData[0] = SID;
|
|
@@ -431,18 +465,6 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
-#else
|
|
|
|
|
- uint16_t DataNum = DataLen - 1;
|
|
|
|
|
- uint8_t *pGotData = &pData[1];
|
|
|
|
|
- uint32_t AddrOffset = (BSC - 1) * UDS_PACK_SIZE;
|
|
|
|
|
-
|
|
|
|
|
- printf("Write Data To Flash Addr=%08X\r\n", MemoryAddress + AddrOffset);
|
|
|
|
|
- UPDATE_WriteData(MemoryAddress + AddrOffset, pGotData, DataNum);
|
|
|
|
|
- CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
|
|
- //计算实际写入Flash中的数据CRC值
|
|
|
|
|
- AppCRC32 = UPDATE_CalcCrc(MemoryAddress + AddrOffset, DataNum, AppCRC32);
|
|
|
|
|
- printf("Transfer Data BSC=%d AppCRC=%08X\r\n",BSC, AppCRC32);
|
|
|
|
|
-#endif
|
|
|
|
|
BSC++;
|
|
BSC++;
|
|
|
} else {
|
|
} else {
|
|
|
pData[0] = SID;
|
|
pData[0] = SID;
|
|
@@ -494,8 +516,10 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
break;
|
|
break;
|
|
|
case 0x37: //Request Transfer Exit
|
|
case 0x37: //Request Transfer Exit
|
|
|
printf("Request Transfer Exit\r\n");
|
|
printf("Request Transfer Exit\r\n");
|
|
|
-#ifdef CAN_UPDATE
|
|
|
|
|
- if (!tx_status) {
|
|
|
|
|
|
|
+ if (file_type == UPFILE_TYPE_MCU_IMAGE || file_type == UPFILE_TYPE_MCU_FB) {
|
|
|
|
|
+ CAN_UDS_ServiceRespond(SID | 0x40, pData, 0);
|
|
|
|
|
+ break;
|
|
|
|
|
+ } else if (!tx_status) {
|
|
|
send_packet.DataSize = 0;
|
|
send_packet.DataSize = 0;
|
|
|
send_packet.DataAddr = 0;
|
|
send_packet.DataAddr = 0;
|
|
|
send_packet.FrameStatus = MUFS_END;
|
|
send_packet.FrameStatus = MUFS_END;
|
|
@@ -512,8 +536,8 @@ uint8_t CAN_UDS_ServiceProcess(uint8_t SID, uint8_t *pData, uint32_t DataLen)
|
|
|
tx_status = 0;
|
|
tx_status = 0;
|
|
|
}
|
|
}
|
|
|
printf("Transfer Exit success\r\n");
|
|
printf("Transfer Exit success\r\n");
|
|
|
-#endif
|
|
|
|
|
- CAN_UDS_ServiceRespond(SID | 0x40, pData, 0);
|
|
|
|
|
|
|
+ pData[0] = 1;
|
|
|
|
|
+ CAN_UDS_ServiceRespond(SID | 0x40, pData, 1);
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
break;
|
|
break;
|