diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index d76c838..84bdace 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -220,6 +220,7 @@ typedef struct __attribute__ ((packed)) { #define PROGRAM_MASTER_BLOCK_MODE 1 #define PROGRAM_MAX_SECTOR 8 +#define PROGRAM_MAX_BUF 256 #define MAX_CTO 8 @@ -529,6 +530,22 @@ typedef struct __attribute__ ((packed)) { uint32_t SECTOR_INFO; } eXcpCommand_RESP_GET_SECTOR_INFO_CD; +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + + uint8_t ECU: 1; + uint8_t XCP: 1; + uint8_t RESERVED1: 1; + uint8_t RESERVED2: 1; + uint8_t RESERVED3: 1; + uint8_t RESERVED4: 1; + uint8_t RESERVED5: 1; + uint8_t ALL: 1; + + uint8_t SEGMENT; + uint8_t PAGE; + +} eXcpCommand_SET_CALIBRATION_PAGE_EB; typedef bool (xcp_clear_flash_func)(uint32_t firstPageAddr, uint32_t totalSize); typedef bool (xcp_write_flash_func)(uint32_t beginPageAddr, void *sourceRamAddr, uint32_t size); @@ -568,14 +585,24 @@ typedef struct { xcp_write_flash_func *write_flash_func; + uint8_t bufWriteFlash[PROGRAM_MAX_BUF]; + uint16_t bufWriteFlashCount; + uint32_t bufWriteFlashAdr; + tStaticThreadBlock(512) T_can_Listener_XCP; tStaticThreadBlock(512) T_can_Listener_Dto_Stim_XCP; tStaticThreadBlock(512) T_can_Listener_Dto_Daq_XCP; } tCanSerialPortFrameXCP; + typedef uint8_t (*xcp_func_ptr)(tCanSerialPortFrameXCP *env); +typedef struct { + xcp_func_ptr func; + char *desc; +} eXcp_com; + void CanSerialPortFrameXcpInit( tCanSerialPortFrameXCP *env, tSerialPortFrameIO *ioCanFrame, diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 74f57c3..de51c83 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -12,6 +12,50 @@ #define LOG_SIGN "CAN_XCP" #define LOGGER env->logger +char strPrintfDebug[80]; + +void PrintfDebug(uint8_t *data, uint8_t dlc) { + + switch (dlc) { + + case 0: + sprintf(strPrintfDebug, " "); + break; + case 1: + sprintf(strPrintfDebug, "0x%02X", data[0]); + break; + case 2: + sprintf(strPrintfDebug, "0x%02X:0x%02X", data[0], data[1]); + break; + case 3: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X", data[0], data[1], data[2]); + break; + case 4: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3]); + break; + case 5: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], data[4]); + break; + case 6: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], + data[4], data[5]); + break; + case 7: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], + data[3], data[4], + data[5], data[6]); + break; + case 8: + sprintf(strPrintfDebug, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], + data[2], data[3], data[4], + data[5], data[6], data[7]); + break; + default: + sprintf(strPrintfDebug, " "); + } + +} + static unsigned long SeedToKeyHVAC_NAMI(unsigned char rnd, unsigned long dwSeedInfo) { #define Mask 0x55F388A6UL @@ -123,7 +167,7 @@ static uint8_t XCP_COMMAND_GET_STATUS_FD(tCanSerialPortFrameXCP *env) { xcpCommand_GET_STATUS->reserve7 = 0; xcpCommand_GET_STATUS->reserve8 = 0; - xcpCommand_GET_STATUS->STATE_NUMBER = 2; + xcpCommand_GET_STATUS->STATE_NUMBER = 0; xcpCommand_GET_STATUS->SESSION_CONFIGURATION_ID = 0; @@ -143,7 +187,7 @@ static uint8_t XCP_GET_COMM_MODE_INFO_FB(tCanSerialPortFrameXCP *env) { xcpCommand_GET_COMM_MODE_INFO->RESERVED1 = 0; - xcpCommand_GET_COMM_MODE_INFO->MASTER_BLOCK_MODE = 1; + xcpCommand_GET_COMM_MODE_INFO->MASTER_BLOCK_MODE = 0; xcpCommand_GET_COMM_MODE_INFO->INTERLEAVED_MODE = 0; xcpCommand_GET_COMM_MODE_INFO->RESERVED2 = 0; @@ -194,6 +238,9 @@ static uint8_t XCP_COMMAND_SET_MTA_F6(tCanSerialPortFrameXCP *env) { env->response[0] = XCP_COMMAND_DISCONNECT; env->response[1] = XCP_ERR_ACCESS_DENIED; + + env->bufWriteFlashCount = 0; + return 2; } @@ -201,6 +248,7 @@ static uint8_t XCP_COMMAND_SET_MTA_F6(tCanSerialPortFrameXCP *env) { env->ADR_MTA = request->ADR; env->response[0] = XCP_COMMAND_CONNECT; + env->bufWriteFlashAdr = env->ADR_MTA; return 1; } @@ -216,6 +264,10 @@ static uint8_t XCP_COMMAND_UPLOAD_F5(tCanSerialPortFrameXCP *env) { for (uint8_t i = 0; i < fullBlock; ++i) { memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), request->COUNT); env->ADR_MTA += 7; + + PrintfDebug(env->response, 7 + 1); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< [%d] %s", 7 + 1, strPrintfDebug) + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 7 + 1, PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, 1000); @@ -224,6 +276,11 @@ static uint8_t XCP_COMMAND_UPLOAD_F5(tCanSerialPortFrameXCP *env) { if (tailBlock > 0) { memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), tailBlock); env->ADR_MTA += tailBlock; + + + PrintfDebug(env->response, tailBlock + 1); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< [%d] %s", tailBlock + 1, strPrintfDebug) + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, tailBlock + 1, PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, 1000); } @@ -719,21 +776,25 @@ static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) { uint8_t COUNT = env->canFrame.dlc - 2; - env->write_flash_func(env->ADR_MTA, &env->canFrame.data[2], request->COUNT); + for (uint8_t i = 0; i < COUNT; ++i) { + + env->bufWriteFlash[env->bufWriteFlashCount] = env->canFrame.data[2 + i]; + + ++env->bufWriteFlashCount; + + if (env->bufWriteFlashCount >= PROGRAM_MAX_BUF) { + bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, PROGRAM_MAX_BUF); + env->bufWriteFlashAdr += PROGRAM_MAX_BUF; + env->bufWriteFlashCount = 0; + } + + + } env->ADR_MTA += request->COUNT; -#ifndef PROGRAM_MASTER_BLOCK_MODE env->response[0] = XCP_COMMAND_CONNECT; return 1; -#else - if (request->COUNT == 0) { - env->response[0] = XCP_COMMAND_CONNECT; - return 1; - } - - return 0; -#endif } static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) { @@ -750,6 +811,11 @@ static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_RESET_CF(tCanSerialPortFrameXCP *env) { env->response[0] = XCP_COMMAND_CONNECT; + + if (env->bufWriteFlashCount > 0) { + bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount); + } + return 1; } @@ -782,7 +848,7 @@ static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) { return 2; } - eXcpCommand_RESP_GET_SECTOR_INFO_CD *response = (eXcpCommand_RESP_GET_SECTOR_INFO_CD *) env->response;\ + eXcpCommand_RESP_GET_SECTOR_INFO_CD *response = (eXcpCommand_RESP_GET_SECTOR_INFO_CD *) env->response; response->COM = XCP_COMMAND_CONNECT; response->CLEAR_SEQUENCE_NUMBER = request->SECTOR_NUMBER; response->PROGRAM_SEQUENCE_NUMBER = request->SECTOR_NUMBER; @@ -812,309 +878,278 @@ static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) { return 8; } -const xcp_func_ptr fXcp_func_ptr[256] = { - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - XCP_PROGRAM_NEXT_CA, - NULL, - NULL, - XCP_GET_SECTOR_INFO_CD, - XCP_GET_PGM_PROCESSOR_INFO_CE, - XCP_PROGRAM_RESET_CF, - XCP_PROGRAM_D0, - XCP_PROGRAM_CLEAR_D1, - XCP_PROGRAM_START_D2, - XCP_ALLOC_ODT_ENTRY_D3, - XCP_ALLOC_ODT_D4, - XCP_ALLOC_DAQ_D5, - XCP_FREE_DAQ_D6, - XCP_GET_DAQ_EVENT_INFO_D7, - XCP_GET_DAQ_LIST_INFO_D8, - XCP_GET_DAQ_RESOLUTION_INFO_D9, - XCP_GET_DAQ_PROCESSOR_INFO_DA, - XCP_READ_DAQ_DB, - NULL, - XCP_START_STOP_SYNCH_DD, - XCP_START_STOP_DAQ_LIST_DE, - XCP_GET_DAQ_LIST_MODE_DF, - XCP_SET_DAQ_LIST_MODE_E0, - XCP_WRITE_DAQ_E1, - XCP_SET_DAQ_PTR_E2, - XCP_CLEAR_DAQ_LIST_E3, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - NULL, - XCP_COMMAND_DOWNLOAD_MAX_EE, - XCP_COMMAND_DOWNLOAD_NEXT_EF, - XCP_COMMAND_DOWNLOAD_F0, - NULL, - NULL, - NULL, - XCP_COMMAND_SHORT_UPLOAD_F4, - XCP_COMMAND_UPLOAD_F5, - XCP_COMMAND_SET_MTA_F6, - XCP_UNLOCK_F7, - XCP_GET_SEED_F8, - NULL, - NULL, - XCP_GET_COMM_MODE_INFO_FB, - XCP_COMMAND_SYNCH_FC, - XCP_COMMAND_GET_STATUS_FD, - XCP_COMMAND_DISCONNECT_FE, - XCP_COMMAND_CONNECT_FF -}; - -void PrintfDebug(char *str, uint8_t *data, uint8_t dlc) { - - switch (dlc) { - - case 0: - sprintf(str, " "); - break; - case 1: - sprintf(str, "0x%02X", data[0]); - break; - case 2: - sprintf(str, "0x%02X:0x%02X", data[0], data[1]); - break; - case 3: - sprintf(str, "0x%02X:0x%02X:0x%02X", data[0], data[1], data[2]); - break; - case 4: - sprintf(str, "0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3]); - break; - case 5: - sprintf(str, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], data[4]); - break; - case 6: - sprintf(str, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], data[4], data[5]); - break; - case 7: - sprintf(str, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], data[4], - data[5], data[6]); - break; - case 8: - sprintf(str, "0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X:0x%02X", data[0], data[1], data[2], data[3], data[4], - data[5], data[6], data[7]); - break; - default: - sprintf(str, " "); - } +static uint8_t XCP_SET_CALIBRATION_PAGE_EB(tCanSerialPortFrameXCP *env) { + eXcpCommand_SET_CALIBRATION_PAGE_EB *request = (eXcpCommand_SET_CALIBRATION_PAGE_EB *) env->canFrame.data; + env->response[0] = XCP_COMMAND_CONNECT; + return 1; } +const eXcp_com xcp_com[256] = { + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {XCP_PROGRAM_NEXT_CA, "XCP_PROGRAM_NEXT_CA"}, + {NULL, ""}, + {NULL, ""}, + {XCP_GET_SECTOR_INFO_CD, "XCP_GET_SECTOR_INFO_CD"}, + {XCP_GET_PGM_PROCESSOR_INFO_CE, "XCP_GET_PGM_PROCESSOR_INFO_CE"}, + {XCP_PROGRAM_RESET_CF, "XCP_PROGRAM_RESET_CF"}, + {XCP_PROGRAM_D0, "XCP_PROGRAM_D0"}, + {XCP_PROGRAM_CLEAR_D1, "XCP_PROGRAM_CLEAR_D1"}, + {XCP_PROGRAM_START_D2, "XCP_PROGRAM_START_D2"}, + {XCP_ALLOC_ODT_ENTRY_D3, "XCP_ALLOC_ODT_ENTRY_D3"}, + {XCP_ALLOC_ODT_D4, "XCP_ALLOC_ODT_D4"}, + {XCP_ALLOC_DAQ_D5, "XCP_ALLOC_DAQ_D5"}, + {XCP_FREE_DAQ_D6, "XCP_FREE_DAQ_D6"}, + {XCP_GET_DAQ_EVENT_INFO_D7, "XCP_GET_DAQ_EVENT_INFO_D7"}, + {XCP_GET_DAQ_LIST_INFO_D8, "XCP_GET_DAQ_LIST_INFO_D8"}, + {XCP_GET_DAQ_RESOLUTION_INFO_D9, "XCP_GET_DAQ_RESOLUTION_INFO_D9"}, + {XCP_GET_DAQ_PROCESSOR_INFO_DA, "XCP_GET_DAQ_PROCESSOR_INFO_DA"}, + {XCP_READ_DAQ_DB, "XCP_READ_DAQ_DB"}, + {NULL, ""}, + {XCP_START_STOP_SYNCH_DD, "XCP_START_STOP_SYNCH_DD"}, + {XCP_START_STOP_DAQ_LIST_DE, "XCP_START_STOP_DAQ_LIST_DE"}, + {XCP_GET_DAQ_LIST_MODE_DF, "XCP_GET_DAQ_LIST_MODE_DF"}, + {XCP_SET_DAQ_LIST_MODE_E0, "XCP_SET_DAQ_LIST_MODE_E0"}, + {XCP_WRITE_DAQ_E1, "XCP_WRITE_DAQ_E1"}, + {XCP_SET_DAQ_PTR_E2, "XCP_SET_DAQ_PTR_E2"}, + {XCP_CLEAR_DAQ_LIST_E3, "XCP_CLEAR_DAQ_LIST_E3"}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {XCP_SET_CALIBRATION_PAGE_EB, "XCP_SET_CALIBRATION_PAGE_EB"}, + {NULL, ""}, + {NULL, ""}, + {XCP_COMMAND_DOWNLOAD_MAX_EE, "XCP_COMMAND_DOWNLOAD_MAX_EE"}, + {XCP_COMMAND_DOWNLOAD_NEXT_EF, "XCP_COMMAND_DOWNLOAD_NEXT_EF"}, + {XCP_COMMAND_DOWNLOAD_F0, "XCP_COMMAND_DOWNLOAD_F0"}, + {NULL, ""}, + {NULL, ""}, + {NULL, ""}, + {XCP_COMMAND_SHORT_UPLOAD_F4, "XCP_COMMAND_SHORT_UPLOAD_F4"}, + {XCP_COMMAND_UPLOAD_F5, "XCP_COMMAND_UPLOAD_F5"}, + {XCP_COMMAND_SET_MTA_F6, "XCP_COMMAND_SET_MTA_F6"}, + {XCP_UNLOCK_F7, "XCP_UNLOCK_F7"}, + {XCP_GET_SEED_F8, "XCP_GET_SEED_F8"}, + {NULL, ""}, + {NULL, ""}, + {XCP_GET_COMM_MODE_INFO_FB, "XCP_GET_COMM_MODE_INFO_FB"}, + {XCP_COMMAND_SYNCH_FC, "XCP_COMMAND_SYNCH_FC"}, + {XCP_COMMAND_GET_STATUS_FD, "XCP_COMMAND_GET_STATUS_FD"}, + {XCP_COMMAND_DISCONNECT_FE, "XCP_COMMAND_DISCONNECT_FE"}, + {XCP_COMMAND_CONNECT_FF, "XCP_COMMAND_CONNECT_FF"} +}; + uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeout) { uint8_t response_size = 0; - uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_CAN_XCP, (uint8_t *) &env->canFrame, 1, + uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_CAN_XCP, (uint8_t *) &env->canFrame, + 1, timeout); if (recv == 0) @@ -1125,21 +1160,25 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou eXcpTypeCommand com = env->canFrame.data[0]; if (com > 0xBF) { // CMD - char str[80]; - PrintfDebug(str, env->canFrame.data, env->canFrame.dlc); - LoggerFormatInfo(LOGGER, LOG_SIGN, "> [%d] %s", env->canFrame.dlc, str) + if (com != 0xD0) { + PrintfDebug(env->canFrame.data, env->canFrame.dlc); + LoggerFormatInfo(LOGGER, LOG_SIGN, "> %s [%d] %s", xcp_com[com].desc, env->canFrame.dlc, strPrintfDebug) + } - if (fXcp_func_ptr[com] != NULL) { + if (xcp_com[com].func != NULL) { - response_size = fXcp_func_ptr[com](env); + response_size = xcp_com[com].func(env); - if (response_size) { + if ((response_size) && (env->response[0] != 0xF5)) { - PrintfDebug(str, env->response, response_size); - LoggerFormatInfo(LOGGER, LOG_SIGN, "< [%d] %s", response_size, str) + if (com != 0xD0) { + PrintfDebug(env->response, response_size); + LoggerFormatInfo(LOGGER, LOG_SIGN, "< [%d] %s", response_size, strPrintfDebug) + } - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, response_size, PROTOCOL_CAN_ADR_XCP, + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, response_size, + PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, timeout); } @@ -1298,14 +1337,17 @@ _Noreturn void CanXcpProcessing_Service_Dto_Daq_Task(tCanSerialPortFrameXCP *env for (uint8_t k = 0; k < count_size; ++k) { memcpy(&env->response[2], &env->DATA[size], BODY_MAX_LEN); env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, MAX_DTO, - PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, 1000); + PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, + 1000); size += BODY_MAX_LEN; } if (count_size_tail) { memcpy(&env->response[2], &env->DATA[size], count_size_tail); - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, count_size_tail, - PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, 1000); + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, + count_size_tail, + PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, + 1000); } @@ -1334,6 +1376,8 @@ _Noreturn void CanXcpProcessing_Service_Dto_Daq_Task(tCanSerialPortFrameXCP *env } void CanXcpProcessing_Service_Start(tCanSerialPortFrameXCP *env) { + InitThreadBlock(env->T_can_Listener_Dto_Stim_XCP, "Dto_Stim_XCPP", osPriorityNormal); + InitThreadBlock(env->T_can_Listener_Dto_Daq_XCP, "Dto_Daq_XCP", osPriorityNormal); ThreadBlock_Start(env->T_can_Listener_Dto_Stim_XCP, env, CanXcpProcessing_Service_Dto_Stim_Task); ThreadBlock_Start(env->T_can_Listener_Dto_Daq_XCP, env, CanXcpProcessing_Service_Dto_Daq_Task); }