Обновление

This commit is contained in:
cfif 2025-12-23 15:22:57 +03:00
parent 9ee1cb0f5d
commit 010bb1fc15
2 changed files with 392 additions and 321 deletions

View File

@ -220,6 +220,7 @@ typedef struct __attribute__ ((packed)) {
#define PROGRAM_MASTER_BLOCK_MODE 1 #define PROGRAM_MASTER_BLOCK_MODE 1
#define PROGRAM_MAX_SECTOR 8 #define PROGRAM_MAX_SECTOR 8
#define PROGRAM_MAX_BUF 256
#define MAX_CTO 8 #define MAX_CTO 8
@ -529,6 +530,22 @@ typedef struct __attribute__ ((packed)) {
uint32_t SECTOR_INFO; uint32_t SECTOR_INFO;
} eXcpCommand_RESP_GET_SECTOR_INFO_CD; } 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_clear_flash_func)(uint32_t firstPageAddr, uint32_t totalSize);
typedef bool (xcp_write_flash_func)(uint32_t beginPageAddr, void *sourceRamAddr, uint32_t size); 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; 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_XCP;
tStaticThreadBlock(512) T_can_Listener_Dto_Stim_XCP; tStaticThreadBlock(512) T_can_Listener_Dto_Stim_XCP;
tStaticThreadBlock(512) T_can_Listener_Dto_Daq_XCP; tStaticThreadBlock(512) T_can_Listener_Dto_Daq_XCP;
} tCanSerialPortFrameXCP; } tCanSerialPortFrameXCP;
typedef uint8_t (*xcp_func_ptr)(tCanSerialPortFrameXCP *env); typedef uint8_t (*xcp_func_ptr)(tCanSerialPortFrameXCP *env);
typedef struct {
xcp_func_ptr func;
char *desc;
} eXcp_com;
void CanSerialPortFrameXcpInit( void CanSerialPortFrameXcpInit(
tCanSerialPortFrameXCP *env, tCanSerialPortFrameXCP *env,
tSerialPortFrameIO *ioCanFrame, tSerialPortFrameIO *ioCanFrame,

View File

@ -12,6 +12,50 @@
#define LOG_SIGN "CAN_XCP" #define LOG_SIGN "CAN_XCP"
#define LOGGER env->logger #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) { static unsigned long SeedToKeyHVAC_NAMI(unsigned char rnd, unsigned long dwSeedInfo) {
#define Mask 0x55F388A6UL #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->reserve7 = 0;
xcpCommand_GET_STATUS->reserve8 = 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; 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->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->INTERLEAVED_MODE = 0;
xcpCommand_GET_COMM_MODE_INFO->RESERVED2 = 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[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_DENIED; env->response[1] = XCP_ERR_ACCESS_DENIED;
env->bufWriteFlashCount = 0;
return 2; return 2;
} }
@ -201,6 +248,7 @@ static uint8_t XCP_COMMAND_SET_MTA_F6(tCanSerialPortFrameXCP *env) {
env->ADR_MTA = request->ADR; env->ADR_MTA = request->ADR;
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
env->bufWriteFlashAdr = env->ADR_MTA;
return 1; return 1;
} }
@ -216,6 +264,10 @@ static uint8_t XCP_COMMAND_UPLOAD_F5(tCanSerialPortFrameXCP *env) {
for (uint8_t i = 0; i < fullBlock; ++i) { for (uint8_t i = 0; i < fullBlock; ++i) {
memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), request->COUNT); memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), request->COUNT);
env->ADR_MTA += 7; 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, env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 7 + 1, PROTOCOL_CAN_ADR_XCP,
PROTOCOL_CAN_TYPE_XCP, PROTOCOL_CAN_TYPE_XCP,
1000); 1000);
@ -224,6 +276,11 @@ static uint8_t XCP_COMMAND_UPLOAD_F5(tCanSerialPortFrameXCP *env) {
if (tailBlock > 0) { if (tailBlock > 0) {
memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), tailBlock); memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), tailBlock);
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, env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, tailBlock + 1, PROTOCOL_CAN_ADR_XCP,
PROTOCOL_CAN_TYPE_XCP, 1000); PROTOCOL_CAN_TYPE_XCP, 1000);
} }
@ -719,21 +776,25 @@ static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) {
uint8_t COUNT = env->canFrame.dlc - 2; 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; env->ADR_MTA += request->COUNT;
#ifndef PROGRAM_MASTER_BLOCK_MODE
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
return 1; 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) { 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) { static uint8_t XCP_PROGRAM_RESET_CF(tCanSerialPortFrameXCP *env) {
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
if (env->bufWriteFlashCount > 0) {
bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount);
}
return 1; return 1;
} }
@ -782,7 +848,7 @@ static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) {
return 2; 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->COM = XCP_COMMAND_CONNECT;
response->CLEAR_SEQUENCE_NUMBER = request->SECTOR_NUMBER; response->CLEAR_SEQUENCE_NUMBER = request->SECTOR_NUMBER;
response->PROGRAM_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; return 8;
} }
const xcp_func_ptr fXcp_func_ptr[256] = { static uint8_t XCP_SET_CALIBRATION_PAGE_EB(tCanSerialPortFrameXCP *env) {
NULL, eXcpCommand_SET_CALIBRATION_PAGE_EB *request = (eXcpCommand_SET_CALIBRATION_PAGE_EB *) env->canFrame.data;
NULL,
NULL, env->response[0] = XCP_COMMAND_CONNECT;
NULL, return 1;
NULL, }
NULL,
NULL,
NULL, 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, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
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, {NULL, ""},
NULL, {NULL, ""},
XCP_GET_SECTOR_INFO_CD, {NULL, ""},
XCP_GET_PGM_PROCESSOR_INFO_CE, {NULL, ""},
XCP_PROGRAM_RESET_CF, {NULL, ""},
XCP_PROGRAM_D0, {NULL, ""},
XCP_PROGRAM_CLEAR_D1, {NULL, ""},
XCP_PROGRAM_START_D2, {XCP_PROGRAM_NEXT_CA, "XCP_PROGRAM_NEXT_CA"},
XCP_ALLOC_ODT_ENTRY_D3, {NULL, ""},
XCP_ALLOC_ODT_D4, {NULL, ""},
XCP_ALLOC_DAQ_D5, {XCP_GET_SECTOR_INFO_CD, "XCP_GET_SECTOR_INFO_CD"},
XCP_FREE_DAQ_D6, {XCP_GET_PGM_PROCESSOR_INFO_CE, "XCP_GET_PGM_PROCESSOR_INFO_CE"},
XCP_GET_DAQ_EVENT_INFO_D7, {XCP_PROGRAM_RESET_CF, "XCP_PROGRAM_RESET_CF"},
XCP_GET_DAQ_LIST_INFO_D8, {XCP_PROGRAM_D0, "XCP_PROGRAM_D0"},
XCP_GET_DAQ_RESOLUTION_INFO_D9, {XCP_PROGRAM_CLEAR_D1, "XCP_PROGRAM_CLEAR_D1"},
XCP_GET_DAQ_PROCESSOR_INFO_DA, {XCP_PROGRAM_START_D2, "XCP_PROGRAM_START_D2"},
XCP_READ_DAQ_DB, {XCP_ALLOC_ODT_ENTRY_D3, "XCP_ALLOC_ODT_ENTRY_D3"},
NULL, {XCP_ALLOC_ODT_D4, "XCP_ALLOC_ODT_D4"},
XCP_START_STOP_SYNCH_DD, {XCP_ALLOC_DAQ_D5, "XCP_ALLOC_DAQ_D5"},
XCP_START_STOP_DAQ_LIST_DE, {XCP_FREE_DAQ_D6, "XCP_FREE_DAQ_D6"},
XCP_GET_DAQ_LIST_MODE_DF, {XCP_GET_DAQ_EVENT_INFO_D7, "XCP_GET_DAQ_EVENT_INFO_D7"},
XCP_SET_DAQ_LIST_MODE_E0, {XCP_GET_DAQ_LIST_INFO_D8, "XCP_GET_DAQ_LIST_INFO_D8"},
XCP_WRITE_DAQ_E1, {XCP_GET_DAQ_RESOLUTION_INFO_D9, "XCP_GET_DAQ_RESOLUTION_INFO_D9"},
XCP_SET_DAQ_PTR_E2, {XCP_GET_DAQ_PROCESSOR_INFO_DA, "XCP_GET_DAQ_PROCESSOR_INFO_DA"},
XCP_CLEAR_DAQ_LIST_E3, {XCP_READ_DAQ_DB, "XCP_READ_DAQ_DB"},
NULL, {NULL, ""},
NULL, {XCP_START_STOP_SYNCH_DD, "XCP_START_STOP_SYNCH_DD"},
NULL, {XCP_START_STOP_DAQ_LIST_DE, "XCP_START_STOP_DAQ_LIST_DE"},
NULL, {XCP_GET_DAQ_LIST_MODE_DF, "XCP_GET_DAQ_LIST_MODE_DF"},
NULL, {XCP_SET_DAQ_LIST_MODE_E0, "XCP_SET_DAQ_LIST_MODE_E0"},
NULL, {XCP_WRITE_DAQ_E1, "XCP_WRITE_DAQ_E1"},
NULL, {XCP_SET_DAQ_PTR_E2, "XCP_SET_DAQ_PTR_E2"},
NULL, {XCP_CLEAR_DAQ_LIST_E3, "XCP_CLEAR_DAQ_LIST_E3"},
NULL, {NULL, ""},
NULL, {NULL, ""},
XCP_COMMAND_DOWNLOAD_MAX_EE, {NULL, ""},
XCP_COMMAND_DOWNLOAD_NEXT_EF, {NULL, ""},
XCP_COMMAND_DOWNLOAD_F0, {NULL, ""},
NULL, {NULL, ""},
NULL, {NULL, ""},
NULL, {XCP_SET_CALIBRATION_PAGE_EB, "XCP_SET_CALIBRATION_PAGE_EB"},
XCP_COMMAND_SHORT_UPLOAD_F4, {NULL, ""},
XCP_COMMAND_UPLOAD_F5, {NULL, ""},
XCP_COMMAND_SET_MTA_F6, {XCP_COMMAND_DOWNLOAD_MAX_EE, "XCP_COMMAND_DOWNLOAD_MAX_EE"},
XCP_UNLOCK_F7, {XCP_COMMAND_DOWNLOAD_NEXT_EF, "XCP_COMMAND_DOWNLOAD_NEXT_EF"},
XCP_GET_SEED_F8, {XCP_COMMAND_DOWNLOAD_F0, "XCP_COMMAND_DOWNLOAD_F0"},
NULL, {NULL, ""},
NULL, {NULL, ""},
XCP_GET_COMM_MODE_INFO_FB, {NULL, ""},
XCP_COMMAND_SYNCH_FC, {XCP_COMMAND_SHORT_UPLOAD_F4, "XCP_COMMAND_SHORT_UPLOAD_F4"},
XCP_COMMAND_GET_STATUS_FD, {XCP_COMMAND_UPLOAD_F5, "XCP_COMMAND_UPLOAD_F5"},
XCP_COMMAND_DISCONNECT_FE, {XCP_COMMAND_SET_MTA_F6, "XCP_COMMAND_SET_MTA_F6"},
XCP_COMMAND_CONNECT_FF {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"}
}; };
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, " ");
}
}
uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeout) { uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeout) {
uint8_t response_size = 0; 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); timeout);
if (recv == 0) if (recv == 0)
@ -1125,21 +1160,25 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou
eXcpTypeCommand com = env->canFrame.data[0]; eXcpTypeCommand com = env->canFrame.data[0];
if (com > 0xBF) { // CMD if (com > 0xBF) { // CMD
char str[80];
PrintfDebug(str, env->canFrame.data, env->canFrame.dlc); if (com != 0xD0) {
LoggerFormatInfo(LOGGER, LOG_SIGN, "> [%d] %s", env->canFrame.dlc, str) 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); if (com != 0xD0) {
LoggerFormatInfo(LOGGER, LOG_SIGN, "< [%d] %s", response_size, str) 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); 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) { for (uint8_t k = 0; k < count_size; ++k) {
memcpy(&env->response[2], &env->DATA[size], BODY_MAX_LEN); memcpy(&env->response[2], &env->DATA[size], BODY_MAX_LEN);
env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, MAX_DTO, 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; size += BODY_MAX_LEN;
} }
if (count_size_tail) { if (count_size_tail) {
memcpy(&env->response[2], &env->DATA[size], count_size_tail); memcpy(&env->response[2], &env->DATA[size], count_size_tail);
env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, count_size_tail, env->ioCanFrame->transmit(env->ioCanFrame->env, env->response,
PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_TYPE_XCP, 1000); 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) { 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_Stim_XCP, env, CanXcpProcessing_Service_Dto_Stim_Task);
ThreadBlock_Start(env->T_can_Listener_Dto_Daq_XCP, env, CanXcpProcessing_Service_Dto_Daq_Task); ThreadBlock_Start(env->T_can_Listener_Dto_Daq_XCP, env, CanXcpProcessing_Service_Dto_Daq_Task);
} }