diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index b3df6a9..cb7f85e 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -496,6 +496,20 @@ typedef struct __attribute__ ((packed)) { uint8_t COUNT; } eXcpCommand_Program_ProgramNext_D0_CA; +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t RESERVED; + uint16_t CODESIZE; +} eXcpCommand_Program_Prepare_CC; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t COMPRESSION_METHOD; + uint8_t ENCRYPTION_METHOD; + uint8_t PROGRAM_METHOD; + uint8_t ACCESS_METHOD; +} eXcpCommand_Program_Format_CB; + typedef struct __attribute__ ((packed)) { eXcpTypeCommand COM; @@ -559,6 +573,13 @@ typedef struct __attribute__ ((packed)) { uint32_t VERIFICATION_VALUE; } eXcpCommand_Program_Verify_C8; +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t ACCESS_MODE; + uint8_t LOGICAL_DATA_SEGMENT_NUMBER; +} eXcpCommand_XCP_GET_CAL_PAGE_EA; + + 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); @@ -572,6 +593,7 @@ typedef struct { uint8_t RESOURCE; uint8_t ADR_EXT; uint32_t ADR_MTA; + uint8_t PAGE_ID; diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 867bccc..737cfef 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -852,7 +852,6 @@ static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) { } - static uint8_t PROGRAM_VERIFY_C8(tCanSerialPortFrameXCP *env) { eXcpCommand_Program_Verify_C8 *request = (eXcpCommand_Program_Verify_C8 *) env->canFrame.data; @@ -879,6 +878,34 @@ static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) { return 0; } + +static uint8_t XCP_PROGRAM_PREPARE_CC(tCanSerialPortFrameXCP *env) { + eXcpCommand_Program_Prepare_CC *request = (eXcpCommand_Program_Prepare_CC *) env->canFrame.data; + + if ((env->ADR_MTA < env->startFlashAdr) || ((env->ADR_MTA + request->CODESIZE) > env->endFlashAdr)) { + + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_GENERIC; + + return 2; + } + + env->response[0] = XCP_COMMAND_CONNECT; + return 1; + + return 0; +} + + +static uint8_t XCP_PROGRAM_FORMAT_CB(tCanSerialPortFrameXCP *env) { + eXcpCommand_Program_Format_CB *request = (eXcpCommand_Program_Format_CB *) env->canFrame.data; + + env->response[0] = XCP_COMMAND_CONNECT; + return 1; + + return 0; +} + static uint8_t XCP_PROGRAM_RESET_CF(tCanSerialPortFrameXCP *env) { env->response[0] = XCP_COMMAND_CONNECT; @@ -952,10 +979,20 @@ static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) { 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->PAGE_ID = request->PAGE; + env->response[0] = XCP_COMMAND_CONNECT; return 1; } +static uint8_t XCP_GET_CAL_PAGE_EA(tCanSerialPortFrameXCP *env) { + eXcpCommand_XCP_GET_CAL_PAGE_EA *request = (eXcpCommand_XCP_GET_CAL_PAGE_EA *) env->canFrame.data; + + env->response[0] = XCP_COMMAND_CONNECT; + env->response[1] = env->PAGE_ID; + + return 2; +} const eXcp_com xcp_com[256] = { {NULL, ""}, @@ -1155,18 +1192,18 @@ const eXcp_com xcp_com[256] = { {NULL, ""}, {NULL, ""}, {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {NULL, ""}, - {PROGRAM_VERIFY_C8, "PROGRAM_VERIFY_C8"}, - {NULL, ""}, + {NULL, ""}, // 0xC5 DTO_CTR_PROPERTIES + {NULL, ""}, // 0xC6 TIME_CORRELATION_PROPERTIES + {NULL, ""}, // 0xC7 WRITE_DAQ_MULTIPLE + {PROGRAM_VERIFY_C8, "PROGRAM_VERIFY_C8"}, + {NULL, ""}, // 0xC9 PROGRAM_MAX (This command does not support block transfer) {XCP_PROGRAM_NEXT_CA, "XCP_PROGRAM_NEXT_CA"}, - {NULL, ""}, - {NULL, ""}, + {XCP_PROGRAM_FORMAT_CB, "XCP_PROGRAM_FORMAT_CB"}, // 0xCB PROGRAM_FORMAT + {XCP_PROGRAM_PREPARE_CC, "XCP_PROGRAM_PREPARE_CC"}, // 0xCC PROGRAM_PREPARE {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_D0, "XCP_PROGRAM_D0"}, // This command does not support block transfer {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"}, @@ -1178,7 +1215,7 @@ const eXcp_com xcp_com[256] = { {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, ""}, + {NULL, ""}, //0xDC GET_DAQ_CLOCK {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"}, @@ -1186,29 +1223,29 @@ const eXcp_com xcp_com[256] = { {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, ""}, + {NULL, ""}, // 0xE4 COPY_CAL_PAGE + {NULL, ""}, // 0xE5 GET_SEGMENT_MODE + {NULL, ""}, // 0xE6 SET_SEGMENT_MODE + {NULL, ""}, // 0xE7 GET_PAGE_INFO + {NULL, ""}, // 0xE8 GET_SEGMENT_INFO + {NULL, ""}, // 0xE9 GET_PAG_PROCESSOR_INFO + {XCP_GET_CAL_PAGE_EA, "XCP_GET_CAL_PAGE_EA"}, // 0xEA GET_CAL_PAGE {XCP_SET_CALIBRATION_PAGE_EB, "XCP_SET_CALIBRATION_PAGE_EB"}, - {NULL, ""}, - {NULL, ""}, - {XCP_COMMAND_DOWNLOAD_MAX_EE, "XCP_COMMAND_DOWNLOAD_MAX_EE"}, + {NULL, ""}, // 0xEC MODIFY_BITS + {NULL, ""}, // 0xEB SHORT_DOWNLOAD (This command does not support block transfer) + {XCP_COMMAND_DOWNLOAD_MAX_EE, "XCP_COMMAND_DOWNLOAD_MAX_EE"}, // This command does not support block transfer {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"}, + {NULL, ""}, // 0XF1 USER_CMD + {NULL, ""}, // 0xF2 DOWNLOAD + {NULL, ""}, // 0xF3 DOWNLOAD_NEXT + {XCP_COMMAND_SHORT_UPLOAD_F4, "XCP_COMMAND_SHORT_UPLOAD_F4"}, // This command does not support block transfer {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, ""}, + {NULL, ""}, // 0xF9 SET_REQUEST + {NULL, ""}, // 0xFA GET_ID {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"},