From 0ff91e66071237834a1501c78648729c8c32f67a Mon Sep 17 00:00:00 2001 From: tao_z <tzj0429@163.com> Date: Wed, 01 Jun 2022 03:18:48 +0800 Subject: [PATCH] 保存bootloader调试到下载flash,以前步骤均ok。 --- Application/source/CANTP/cantp_user.h | 1 xl6600_flash.ld | 6 Application/include/nvm.h | 4 Application/source/CANTP/cantp_user.c | 2 Hal/source/Hal_crc.c | 4 Application/include/fbl_ap.h | 2 Application/source/main.c | 2 Application/source/uds_modules/uds.c | 357 ++++++++++++++++++++++++-------------------- Application/source/nvm.c | 45 ++++ 9 files changed, 242 insertions(+), 181 deletions(-) diff --git a/Application/include/fbl_ap.h b/Application/include/fbl_ap.h index d218ae9..cb14ad0 100644 --- a/Application/include/fbl_ap.h +++ b/Application/include/fbl_ap.h @@ -13,7 +13,7 @@ #define APPLSTART_OFFSET (0x0000C100) #define APPCODE_START ((uint32_t)0xC000) #define APPLICATION_END_ADDR (APPCODE_START + 199U * 1024U) -#define FLASH_DRIVER_START_ADDR (0x20000200) +#define FLASH_DRIVER_START_ADDR (0x20004600) #define APP_PRESENT_ADDR ((uint32_t)0x3DC00) #define APP_PRESENT_MASK_ADDR ((uint32_t)0x3DD00) #define APPPresencePatternSize ((uint8_t)8) diff --git a/Application/include/nvm.h b/Application/include/nvm.h index 31a64f3..8015021 100644 --- a/Application/include/nvm.h +++ b/Application/include/nvm.h @@ -57,7 +57,7 @@ NVM_OPERATION_COMPLETE_CALLBACK pfn_complete_cbk; /**< pointer to callback function which executes after the operation completes (success or fail) */ } MEM_OPERATION_Ts; -#define RAM_FALSH_DRIVE_LENGHT (96u) +#define RAM_FALSH_DRIVE_LENGHT (10u) extern uint8_t flashCode[RAM_FALSH_DRIVE_LENGHT + 4]; extern NVM_FLAGS_Ts Nvm_Flags; extern uint8_t Mem_PartionTempBuff[MEM_MAX_TEMP_BUFF_NUM][FBL_MEM_SEGMENT_SIZE]; @@ -67,6 +67,6 @@ extern int8_t NVM_ReInitFlashDriveRam(void); extern void NVM_Init(void); extern bool NVM_Is_Busy(void); -extern uint8_t MEM_PartitionCRCOK(uint8_t partionid); +extern uint8_t MEM_PartitionCRCOK(uint8_t partionid, uint32_t targetcrc); extern uint8_t ApplFblIsValidApp(); #endif diff --git a/Application/source/CANTP/cantp_user.c b/Application/source/CANTP/cantp_user.c index 6c72ddd..4e22c9b 100644 --- a/Application/source/CANTP/cantp_user.c +++ b/Application/source/CANTP/cantp_user.c @@ -1,7 +1,7 @@ #include "cantp.h" #include "cantp_user.h" -#include "Hal_can.h" #include <string.h> + extern void CANTP_drive_Tx(TP_PDU_t *msg, TP_uint32_t channel) { CAN_PDU_t msg_tx = {0}; diff --git a/Application/source/CANTP/cantp_user.h b/Application/source/CANTP/cantp_user.h index 9113b7f..0ef0736 100644 --- a/Application/source/CANTP/cantp_user.h +++ b/Application/source/CANTP/cantp_user.h @@ -2,6 +2,7 @@ #define CANTP_USER_H__ #include "cantp.h" /* user implemented, send can message */ +#include "Hal_can.h" extern TP_uint8_t CANTP_ReadPhyDiagMsg(TP_PDU_t *pdu); extern TP_uint8_t CANTP_ReadFunDiagMsg(TP_PDU_t *pdu); #endif // CANTP_USER_H__ diff --git a/Application/source/main.c b/Application/source/main.c index 8932ce5..22d30e3 100644 --- a/Application/source/main.c +++ b/Application/source/main.c @@ -28,6 +28,7 @@ #include "fbl_ap.h" #include "NVM.h" #include "flash_interface.h" +#include "xl_crc.h" // define bootloader mode uint8_t fblMode; @@ -42,7 +43,6 @@ light_init(); did_init(); } - /** * @brief main */ diff --git a/Application/source/nvm.c b/Application/source/nvm.c index 9be73eb..79e4256 100644 --- a/Application/source/nvm.c +++ b/Application/source/nvm.c @@ -119,19 +119,33 @@ return OP_STATUS_OK; } -extern int8_t NVM_FlashCRCCheck(uint8_t *ptrdata) +extern int8_t NVM_FlashCRCCheck(uint8_t *ptrdata, uint32_t targetcrc, uint32_t len) { int8_t ret = OP_STATUS_FAIL; uint32_t crc = 0; uint32_t init_crc = 0xFFFFFFFF; - crc = CRC_Cal32(init_crc, ptrdata + 4, RAM_FALSH_DRIVE_LENGHT); + crc = CRC_Cal32(init_crc, ptrdata, len); crc = crc ^ init_crc; - if (crc == *((uint32_t *)ptrdata)) + if (crc == targetcrc) { ret = OP_STATUS_OK; } return ret; } + +// extern int8_t NVM_FlashDriverCRCCheck(uint8_t *ptrdata, uint32_t targetcrc, uint32_t len) +// { +// int8_t ret = OP_STATUS_FAIL; +// uint32_t crc = 0; +// uint32_t init_crc = 0xFFFFFFFF; +// crc = CRC_Cal32(init_crc, ptrdata, len); +// crc = crc ^ init_crc; +// if (crc == targetcrc) +// { +// ret = OP_STATUS_OK; +// } +// return ret; +// } extern int8_t NVM_ReInitFlashDriveRam(void) { memset((void *)flashCode, 0x0, RAM_FALSH_DRIVE_LENGHT + 4); @@ -168,13 +182,31 @@ } } -extern uint8_t MEM_PartitionCRCOK(uint8_t partionid) +static void NVM_FlipEndian(void *address, uint16_t size) +{ + + uint8_t temp = 0; + uint8_t i = 0; + for (i = size; i > size / 2; i--) + { + temp = ((uint8_t *)address)[size - i]; + ((uint8_t *)address)[size - i] = ((uint8_t *)address)[i - 1]; + ((uint8_t *)address)[i - 1] = temp; + } +} + +extern uint8_t MEM_PartitionCRCOK(uint8_t partionid, uint32_t targetcrc) { uint8_t ret = 0; + uint32_t length = 0; + targetcrc = targetcrc ^ 0xFFFFFFFF; switch (partionid) { case MEM_PARTITION_CODEFLASH: - ret = (OP_STATUS_OK == NVM_FlashCRCCheck((uint8_t *)APPCODE_START)); + length = *((uint32_t *)(APPCODE_START + 12)); + NVM_FlipEndian((void *)&length, 4); + length -= 4; + ret = (OP_STATUS_OK == NVM_FlashCRCCheck((uint8_t *)(APPCODE_START + 4), targetcrc, length)); if (ret == 1) { // write present flag @@ -186,7 +218,8 @@ /* code */ break; case MEM_PARTITION_RAM: - ret = (OP_STATUS_OK == NVM_FlashCRCCheck(flashCode)); + length = RAM_FALSH_DRIVE_LENGHT; + ret = (OP_STATUS_OK == NVM_FlashCRCCheck(flashCode, targetcrc, length)); if (ret == 1) { Nvm_Flags.flash_driver_loaded = 1; diff --git a/Application/source/uds_modules/uds.c b/Application/source/uds_modules/uds.c index f65d787..153ebff 100644 --- a/Application/source/uds_modules/uds.c +++ b/Application/source/uds_modules/uds.c @@ -223,7 +223,7 @@ static UDS_CONTOL_TYPE_e UDS_L_CommunicationControlType_e = EnableRxAndTx; static uint8_t UDS_L_SecurityFault_cnt; -static uint8_t UDS_L_SecurityStartDelay = 1; +static uint8_t UDS_L_SecurityStartDelay = 0; static uint8_t UDS_L_SecurityAccessStep_e = SECURITY_ACCESS_STEP_MAX; /*****************************************************************************/ /* Local Variables Definition */ @@ -260,6 +260,7 @@ static uint16_t ResponsePendingTimer_u16; static bool UDS_L_TransferDataInProgressing_b = false; static bool UDS_L_CRCCheckFail_b = false; +static uint32_t UDS_L_CRCReceived = 0; static UDS_TRANFER_DATA_STATE_Te UDS_L_TransferDataState_e; static uint8_t expectedSequenceCnt; /* Block sequence counter */ @@ -356,6 +357,9 @@ #define ROUTINE_CONTROL_MIN_LEN (0x04u) #define TESTER_PRESENT_MIN_LEN (0x02u) #define CONTROL_DTC_SETTING_MIN_LEN (0x02u) +#define REQUEST_DOWNLOAD_MIN_LEN (0xB) +#define TRANSFER_DATA_MIN_LEN (0XC) +#define REQUEST_TRANSFER_EXIT_MIN_LEN (0X01) typedef struct { @@ -423,153 +427,170 @@ uint8_t sid; sid = msg_buf[0]; - if (msg_dlc < 2) - { - result = false; - } - else - { - subfunction = UDS_GET_SUB_FUNCTION(msg_buf[1]); + subfunction = UDS_GET_SUB_FUNCTION(msg_buf[1]); - switch (sid) + switch (sid) + { + case SESSION_CONTROL: + { + if (msg_dlc == SESSION_CONTROL_MIN_LEN) { - case SESSION_CONTROL: - { - if (msg_dlc == SESSION_CONTROL_MIN_LEN) - { - result = true; - } - else - { - result = false; - } + result = true; } - break; - case ECU_RESET: + else { - if (msg_dlc == ECU_RESET_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case CLEAR_DIAGNOSTIC_INFORMATION: - { - if (msg_dlc == CLEAR_DIAGNOSTIC_INFORMATION_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case READ_DTC_INFORMATION: - { - if ((subfunction == REPORT_DTC_NUMBER_BY_STATUS_MASK && msg_dlc != (READ_DTC_INFORMATION_MIN_LEN + 1)) || - (subfunction == REPORT_DTC_BY_STATUS_MASK && msg_dlc != (READ_DTC_INFORMATION_MIN_LEN + 1)) || - (subfunction == REPORT_SUPPORTED_DTC && msg_dlc != READ_DTC_INFORMATION_MIN_LEN)) - { - result = false; - } - else - { - result = true; - } - } - break; - case READ_DATA_BY_IDENTIFIER: - { - if (msg_dlc == READ_DATA_BY_IDENTIFIER_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case SECURITY_ACCESS: - { - if ((subfunction == UDS_REQUEST_SEED && msg_dlc != SECURITY_ACCESS_MIN_LEN) || - (subfunction == UDS_SEND_KEY && msg_dlc != (SECURITY_ACCESS_MIN_LEN + KEY_SIZE))) - { - result = false; - } - else - { - result = true; - } - } - break; - case COMMUNICATION_CONTROL: - { - if (msg_dlc == COMMUNICATION_CONTROL_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case WRITE_DATA_BY_IDENTIFIER: - { - if (msg_dlc >= WRITE_DATA_BY_IDENTIFIER_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case ROUTINE_CONTROL: - if (msg_dlc >= ROUTINE_CONTROL_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - break; - case TESTER_PRESENT: - { - if (msg_dlc == TESTER_PRESENT_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - case CONTROL_DTC_SETTING: - { - if (msg_dlc == CONTROL_DTC_SETTING_MIN_LEN) - { - result = true; - } - else - { - result = false; - } - } - break; - default: result = false; - break; } + } + break; + case ECU_RESET: + { + if (msg_dlc == ECU_RESET_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case CLEAR_DIAGNOSTIC_INFORMATION: + { + if (msg_dlc == CLEAR_DIAGNOSTIC_INFORMATION_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case READ_DTC_INFORMATION: + { + if ((subfunction == REPORT_DTC_NUMBER_BY_STATUS_MASK && msg_dlc != (READ_DTC_INFORMATION_MIN_LEN + 1)) || + (subfunction == REPORT_DTC_BY_STATUS_MASK && msg_dlc != (READ_DTC_INFORMATION_MIN_LEN + 1)) || + (subfunction == REPORT_SUPPORTED_DTC && msg_dlc != READ_DTC_INFORMATION_MIN_LEN)) + { + result = false; + } + else + { + result = true; + } + } + break; + case READ_DATA_BY_IDENTIFIER: + { + if (msg_dlc == READ_DATA_BY_IDENTIFIER_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case SECURITY_ACCESS: + { + if ((subfunction == UDS_REQUEST_SEED && msg_dlc != SECURITY_ACCESS_MIN_LEN) || + (subfunction == UDS_SEND_KEY && msg_dlc != (SECURITY_ACCESS_MIN_LEN + KEY_SIZE))) + { + result = false; + } + else + { + result = true; + } + } + break; + case COMMUNICATION_CONTROL: + { + if (msg_dlc == COMMUNICATION_CONTROL_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case WRITE_DATA_BY_IDENTIFIER: + { + if (msg_dlc >= WRITE_DATA_BY_IDENTIFIER_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case ROUTINE_CONTROL: + if (msg_dlc >= ROUTINE_CONTROL_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + break; + case TESTER_PRESENT: + { + if (msg_dlc == TESTER_PRESENT_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case CONTROL_DTC_SETTING: + { + if (msg_dlc == CONTROL_DTC_SETTING_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + } + break; + case REQUEST_DOWNLOAD: + if (msg_dlc == REQUEST_DOWNLOAD_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + break; + case TRANSFER_DATA: + if (msg_dlc >= TRANSFER_DATA_MIN_LEN) + { + result = true; + } + else + { + result = false; + } + break; + case REQUEST_TRANSFER_EXIT: + result = true; + + break; + default: + result = false; + break; } return result; } @@ -700,7 +721,7 @@ TesterPresentTimer_u16 = 0; UDS_NS_SessionTimeout_u16 = 5000; UDS_L_SecurityFault_cnt = 0; - UDS_L_SecurityStartDelay = 1; + UDS_L_SecurityStartDelay = 0; UDS_L_Diag_session_e = DEFAULT; UDS_O_SecurityAccessState_e = SECURITY_ACCESS_LOCKED; UDS_L_Current_SID = 0; @@ -759,11 +780,20 @@ static void UDS_RxTask_1ms(void) { static TP_PDU_t msg_rx_temp = {0}; - + CAN_PDU_t msg_can_temp = {0}; uint8_t msg_num = MCAN_GetReceiveMessageCounter(MCAN); while (msg_num--) { - MCAN_ReceiveData(MCAN, (MCAN_MsgTypeDef *)(&msg_rx_temp)); + MCAN_ReceiveData(MCAN, (MCAN_MsgTypeDef *)(&msg_can_temp)); + + msg_rx_temp.arbId = msg_can_temp.MCAN_ID; + msg_rx_temp.dlc = msg_can_temp.MCAN_DLC; + + for (TP_uint8_t i = 0; i < msg_can_temp.MCAN_DLC; i++) + { + msg_rx_temp.frame[i] = msg_can_temp.MCAN_Data[i]; + } + if (msg_rx_temp.arbId == UDS_PHY_REQ_RID) { UDS_RxMessage(&msg_rx_temp); @@ -1031,12 +1061,12 @@ if (CDT_HASEXPIRED(TesterPresentTimer_u16) != false) { - UDS_SwitchtoDefaultSession(true); + UDS_SwitchtoDefaultSession(false); } } else { - UDS_SwitchtoDefaultSession(true); + UDS_SwitchtoDefaultSession(false); } } else @@ -1772,7 +1802,7 @@ { if (transferType == DOWNLOAD_FLASH) { - UDS_L_CRCCheckFail_b = !MEM_PartitionCRCOK((uint8_t)MEM_PARTITION_CODEFLASH); + UDS_L_CRCCheckFail_b = !MEM_PartitionCRCOK((uint8_t)MEM_PARTITION_CODEFLASH, UDS_L_CRCReceived); if (UDS_L_CRCCheckFail_b == false) { NVM_ReInitFlashDriveRam(); // CLEAR FLASH DRIVE IN RAM @@ -1780,29 +1810,26 @@ } else { - UDS_L_CRCCheckFail_b = !MEM_PartitionCRCOK((uint8_t)MEM_PARTITION_RAM); + UDS_L_CRCCheckFail_b = !MEM_PartitionCRCOK((uint8_t)MEM_PARTITION_RAM, UDS_L_CRCReceived); if (UDS_L_CRCCheckFail_b == true) { NVM_ReInitFlashDriveRam(); // CLEAR FLASH DRIVE IN RAM } } - if (UDS_L_CRCCheckFail_b == false) - { - UDS_L_tx_msg_buffer[0] = GET_RESPONSE_SERVICE_ID(ROUTINE_CONTROL); - UDS_L_tx_msg_buffer[1] = 0x01; - UDS_L_tx_msg_buffer[2] = 0xf0; - UDS_L_tx_msg_buffer[3] = 0x01; - UDS_L_tx_msg_buffer[4] = (uint8_t)UDS_L_CRCCheckFail_b; - /* Specify the send payload size */ - UDS_L_tx_msg_size = 0x05; + UDS_L_tx_msg_buffer[0] = GET_RESPONSE_SERVICE_ID(ROUTINE_CONTROL); + UDS_L_tx_msg_buffer[1] = 0x01; + UDS_L_tx_msg_buffer[2] = 0xf0; + UDS_L_tx_msg_buffer[3] = 0x01; + UDS_L_tx_msg_buffer[4] = (uint8_t)UDS_L_CRCCheckFail_b; + /* Specify the send payload size */ + UDS_L_tx_msg_size = 0x05; - /* Compose a response message and send a positive */ - /* response with the request data */ - UDS_RespTxMessage(); + /* Compose a response message and send a positive */ + /* response with the request data */ + UDS_RespTxMessage(); - UDS_L_ResponsePendingRequest_e &= (~CHECK_PROGRAMMING_INTERGRITY_PENDING); - UDS_L_ResponsePendingRelease_e &= (~CHECK_PROGRAMMING_INTERGRITY_PENDING); - } + UDS_L_ResponsePendingRequest_e &= (~CHECK_PROGRAMMING_INTERGRITY_PENDING); + UDS_L_ResponsePendingRelease_e &= (~CHECK_PROGRAMMING_INTERGRITY_PENDING); } } } @@ -1973,7 +2000,7 @@ FBL_UDS_L_ResponsePendingRelease_e &=(~CHECK_PROGRAMMING_INTERGRITY_PENDING); } #endif - + UDS_L_CRCReceived = (uint32_t)payload[4] << 24 | (uint32_t)payload[5] << 16 | (uint32_t)payload[6] << 8 | (uint32_t)payload[7]; UDS_L_ResponsePendingRequest_e |= CHECK_PROGRAMMING_INTERGRITY_PENDING; CDT_RESET(ResponsePendingTimer_u16, P2SERVER_PENDING_TIMEROUT); } diff --git a/Hal/source/Hal_crc.c b/Hal/source/Hal_crc.c index 162a0d0..a6ef3dc 100644 --- a/Hal/source/Hal_crc.c +++ b/Hal/source/Hal_crc.c @@ -17,11 +17,11 @@ CRC_Init(&CRC_InitStructure); #else CRC_InitTypeDef CRC_InitStructure; - CRC_InitStructure.CRC_DataOutInvert = CRC_DATAOUT_NoInvert; // no invert + CRC_InitStructure.CRC_DataOutInvert = CRC_DATAOUT_Invert; // no invert CRC_InitStructure.CRC_DataWidth = CRC_Width32Bits; CRC_InitStructure.CRC_PolyData = 0x04c11db7; CRC_InitStructure.CRC_Transpose16Only = CRC16_TRANSPOSE_IN32; - CRC_InitStructure.CRC_WriteTranspose = CRC_NoTranspose; + CRC_InitStructure.CRC_WriteTranspose = CRC_TransposeBoth; CRC_Init(&CRC_InitStructure); #endif } \ No newline at end of file diff --git a/xl6600_flash.ld b/xl6600_flash.ld index 3e75d5f..5a289cc 100644 --- a/xl6600_flash.ld +++ b/xl6600_flash.ld @@ -42,9 +42,9 @@ { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K CRAM (xrw) : ORIGIN = 0x1FFFE800, LENGTH = 6K - DRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 18K - FALSH_DRIVER_RAM (xrw):ORIGIN = 0x20000000, LENGTH = 0x100 - BOOTFLAG (xrw) : ORIGIN = 0x20000300, LENGTH = 0x100 + DRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 18K-0x200 + FALSH_DRIVER_RAM (xrw):ORIGIN = 0x20004600, LENGTH = 0x100 + BOOTFLAG (xrw) : ORIGIN = 0x20004700, LENGTH = 0x100 FLASH_BOOT (rx) : ORIGIN = 0x0000000, LENGTH = 48K FLASH_APP (rx) : ORIGIN = 0x000C100, LENGTH = 256K -48K -8K-0x100 -- Gitblit v1.8.0