Обновление

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_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,

View File

@ -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
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"}
};
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 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);
}