Обновление
This commit is contained in:
parent
9ee1cb0f5d
commit
010bb1fc15
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue