From 854cb82eea0278827b2459ed22917c334163257a Mon Sep 17 00:00:00 2001 From: cfif Date: Wed, 5 Nov 2025 14:34:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/CanSerialPortFrameXCP.h | 62 ++- Src/CanSerialPortFrameXCP.c | 895 ++++++++++++++++++++++++------------ 2 files changed, 656 insertions(+), 301 deletions(-) diff --git a/Inc/CanSerialPortFrameXCP.h b/Inc/CanSerialPortFrameXCP.h index 39ac4df..b3b6634 100644 --- a/Inc/CanSerialPortFrameXCP.h +++ b/Inc/CanSerialPortFrameXCP.h @@ -64,12 +64,15 @@ typedef enum { XCP_ALLOC_ODT = 0xD4, XCP_ALLOC_ODT_ENTRY = 0xD3, - - - + XCP_SET_DAQ_PTR = 0xE2, + XCP_WRITE_DAQ = 0xE1, + XCP_SET_DAQ_LIST_MODE = 0xE0, + XCP_START_STOP_DAQ_LIST = 0xDE, + XCP_START_STOP_SYNCH = 0xDD, } eXcpTypeCommand; + typedef enum { XCP_STANDBY = 0 @@ -193,17 +196,30 @@ typedef struct __attribute__ ((packed)) { uint8_t COUNT; } eXcpCommand_Download; +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint16_t DAQ_LIST_NUMBER; +} eXcpCommand_Get_DAQ_List_Info_Request; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t RESERVED; + uint16_t DAQ_LIST_NUMBER; + uint8_t ODT_NUMBER; + uint8_t ODT_ENTRY_NUMBER; +} eXcpCommand_SET_DAQ_PTR; #define MAX_DAO 1 #define MAX_ODT 50 -#define MAX_ODT_ENTRIES 14 +#define MAX_ODT_ENTRIES_SIZE 14 typedef struct { - uint8_t ODT_ENTRIES_COUNT; - uint32_t ODT_ENTRIES[MAX_ODT_ENTRIES]; + uint8_t ODT_ENTRIES_SIZE[MAX_ODT_ENTRIES_SIZE]; + uint32_t ODT_ENTRIES_ADR[MAX_ODT_ENTRIES_SIZE]; } tXCP_ODT_ENTRIES; typedef struct { + uint8_t ODT_ENTRIES_COUNT[MAX_ODT]; tXCP_ODT_ENTRIES ODT_NUMBER[MAX_ODT]; } tXCP_DAQ; @@ -231,6 +247,31 @@ typedef struct __attribute__ ((packed)) { uint8_t ODT_ENTRIES_COUNT; } eXcpCommand_DAQ_Alloc_ODR_Entry; +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + uint8_t BIT_OFFSET; + uint16_t ODT_ENTRY_SIZE; + uint8_t ADR_EXT; + uint32_t ADR; +} eXcpCommand_WRITE_DAQ; + +typedef struct __attribute__ ((packed)) { + eXcpTypeCommand COM; + + uint8_t ALTERNATING: 1; + uint8_t DIRECTION: 1; + uint8_t RESERVED1: 1; + uint8_t DTO_CTR: 1; + uint8_t TIMESTAMP: 1; + uint8_t PID_OFF: 1; + uint8_t RESERVED2: 1; + uint8_t RESERVED3: 1; + + uint16_t DAQ_LIST_NUMBER; + uint16_t EVENT_CHANNEL_NUMBER; + uint8_t TRANSMISSION_RATE_PRESCALER; + uint8_t DAQ_LIST_PRIORITY; +} eXcpCommand_SET_DAQ_LIST_MODE; typedef struct { tSerialPortFrameIO *ioCanFrame; @@ -240,12 +281,14 @@ typedef struct { uint8_t ADR_EXT; uint32_t ADR_MTA; + uint16_t DAQ_LIST_NUMBER; + uint8_t ODT_NUMBER; + uint8_t ODT_ENTRY_NUMBER; + can_rx_message_type canFrame; bool isTransmitResponse; - bool isTransmitResponseError; uint8_t downloadRemaining; uint8_t response[8]; - uint8_t responseSize; tXCP_DAQ DAQ[MAX_DAO]; @@ -253,6 +296,9 @@ typedef struct { } tCanSerialPortFrameXCP; +typedef uint8_t (*xcp_func_ptr)(tCanSerialPortFrameXCP *env); + + void CanSerialPortFrameXcpInit( tCanSerialPortFrameXCP *env, tSerialPortFrameIO *ioCanFrame, diff --git a/Src/CanSerialPortFrameXCP.c b/Src/CanSerialPortFrameXCP.c index 8c841d7..0c399ec 100644 --- a/Src/CanSerialPortFrameXCP.c +++ b/Src/CanSerialPortFrameXCP.c @@ -43,6 +43,600 @@ void CanSerialPortFrameXcpInit( InitThreadBlock(env->T_can_Listener_XCP, "CanListenerXCP", osPriorityNormal); } +uint8_t XCP_COMMAND_CONNECT_255(tCanSerialPortFrameXCP *env) { + eXcpCommand_CONNECT *xcpCommand_CONNECT = (eXcpCommand_CONNECT *) env->response; + + xcpCommand_CONNECT->COM = XCP_COMMAND_CONNECT; + + xcpCommand_CONNECT->CAL_PAG = 0; // Калибровка и пагинация + xcpCommand_CONNECT->reserve1 = 0; + xcpCommand_CONNECT->DAQ = 1; // Поддержка DAQ + xcpCommand_CONNECT->STIM = 1; // Стимуляция (формирование инициативных запросов) + xcpCommand_CONNECT->PGM = 1; // Программирование FLASH + xcpCommand_CONNECT->reserve2 = 0; + xcpCommand_CONNECT->reserve3 = 0; + xcpCommand_CONNECT->reserve4 = 0; + + xcpCommand_CONNECT->BYTE__ORDER = 0; // 0 - Intel 1 - Motorola + xcpCommand_CONNECT->ADDRESS_GRANULARITY_0 = 0; + xcpCommand_CONNECT->ADDRESS_GRANULARITY_1 = 0; + xcpCommand_CONNECT->reserve5 = 1; + xcpCommand_CONNECT->reserve6 = 1; + xcpCommand_CONNECT->reserve7 = 1; + xcpCommand_CONNECT->SLAVE_BLOCK_MODE = 0; + xcpCommand_CONNECT->OPTIONAL = 1; // Поддержка команды XCP_COMMAND_GET_STATUS + + xcpCommand_CONNECT->MAX_CTO_ = MAX_CTO; + xcpCommand_CONNECT->MAX_DTO_ = MAX_DTO; + + xcpCommand_CONNECT->XCP_PROTOCOL_VER = 1; + xcpCommand_CONNECT->XCP_TRANSPORT_VER = 1; + + return 8; +} + +uint8_t XCP_COMMAND_DISCONNECT_254(tCanSerialPortFrameXCP *env) { + + return 0; +} + +uint8_t XCP_COMMAND_GET_STATUS_253(tCanSerialPortFrameXCP *env) { + eXcpCommand_GET_STATUS *xcpCommand_GET_STATUS = (eXcpCommand_GET_STATUS *) env->response; + + xcpCommand_GET_STATUS->COM = XCP_COMMAND_CONNECT; + + xcpCommand_GET_STATUS->STORE_CAL_REQ = 0; + xcpCommand_GET_STATUS->reserve1 = 0; + xcpCommand_GET_STATUS->STORE_DAQ_REQ = 0; + xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = 0; + xcpCommand_GET_STATUS->reserve2 = 0; + xcpCommand_GET_STATUS->reserve3 = 0; + xcpCommand_GET_STATUS->DAQ_RUNNING = 0; + xcpCommand_GET_STATUS->RESUME = 0; + + xcpCommand_GET_STATUS->CAL_PAG = 0; + xcpCommand_GET_STATUS->reserve5 = 0; + xcpCommand_GET_STATUS->DAQ = 0; + xcpCommand_GET_STATUS->STIM = 0; + xcpCommand_GET_STATUS->PGM = 0; + xcpCommand_GET_STATUS->reserve6 = 0; + xcpCommand_GET_STATUS->reserve7 = 0; + xcpCommand_GET_STATUS->reserve8 = 0; + + xcpCommand_GET_STATUS->STATE_NUMBER = 0; + + xcpCommand_GET_STATUS->SESSION_CONFIGURATION_ID = 0; + + return 8; +} + +uint8_t XCP_COMMAND_SYNCH_252(tCanSerialPortFrameXCP *env) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_CMD_SYNCH; + + return 2; +} + +uint8_t XCP_GET_COMM_MODE_INFO_251(tCanSerialPortFrameXCP *env) { + + eXcpCommand_GET_COMM_MODE_INFO *xcpCommand_GET_COMM_MODE_INFO = (eXcpCommand_GET_COMM_MODE_INFO *) env->response; + + xcpCommand_GET_COMM_MODE_INFO->RESERVED1 = 0; + + xcpCommand_GET_COMM_MODE_INFO->MASTER_BLOCK_MODE = 1; + xcpCommand_GET_COMM_MODE_INFO->INTERLEAVED_MODE = 0; + xcpCommand_GET_COMM_MODE_INFO->RESERVED2 = 0; + + xcpCommand_GET_COMM_MODE_INFO->RESERVED3 = 0; + xcpCommand_GET_COMM_MODE_INFO->MAX_BS = 255; + xcpCommand_GET_COMM_MODE_INFO->MIN_ST = 0; + xcpCommand_GET_COMM_MODE_INFO->QUEUE_SIZE = 0; + xcpCommand_GET_COMM_MODE_INFO->VERSION = 1; + + return 8; +} + +uint8_t XCP_GET_SEED_248(tCanSerialPortFrameXCP *env) { + eXcpCommand_REQ_GET_SEED *request = (eXcpCommand_REQ_GET_SEED *) env->canFrame.data; + + eXcpCommand_GET_SEED *xcpCommand_GET_SEED = (eXcpCommand_GET_SEED *) env->response; + xcpCommand_GET_SEED->COM = XCP_COMMAND_CONNECT; + xcpCommand_GET_SEED->LEN = 4; + xcpCommand_GET_SEED->KEY = 0x11223344; + + env->RND = request->RESOURCE; + + return 6; +} + +uint8_t XCP_UNLOCK_247(tCanSerialPortFrameXCP *env) { + eXcpCommand_REQ_UNLOCK *request = (eXcpCommand_REQ_UNLOCK *) env->canFrame.data; + + uint32_t securitySeedMy = SeedToKeyHVAC_NAMI(env->RND, 0x11223344); + + if (securitySeedMy != request->KEY) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_ACCESS_LOCKED; + } else { + env->response[0] = XCP_COMMAND_CONNECT; + env->response[1] = 0; + } + + return 2; +} + +uint8_t XCP_COMMAND_SET_MTA_246(tCanSerialPortFrameXCP *env) { + eXcpCommand_SET_MTA *request = (eXcpCommand_SET_MTA *) env->canFrame.data; + + env->ADR_EXT = request->ADR_EX; + env->ADR_MTA = request->ADR; + + env->response[0] = XCP_COMMAND_CONNECT; + + return 1; +} + +uint8_t XCP_COMMAND_UPLOAD_245(tCanSerialPortFrameXCP *env) { + eXcpCommand_Upload *request = (eXcpCommand_Upload *) env->canFrame.data; + + env->response[0] = XCP_COMMAND_CONNECT; + + uint8_t fullBlock = request->COUNT / 7; + uint8_t tailBlock = request->COUNT % 7; + + for (uint8_t i = 0; i < fullBlock; ++i) { + memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), request->COUNT); + env->ADR_MTA += 7; + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 7, 1000); + } + + if (tailBlock > 0) { + memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), tailBlock); + env->ADR_MTA += tailBlock; + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, tailBlock, 1000); + } + + return 0; +} + +uint8_t XCP_COMMAND_SHORT_UPLOAD_244(tCanSerialPortFrameXCP *env) { + eXcpCommand_SHORT_UPLOAD *request = (eXcpCommand_SHORT_UPLOAD *) env->canFrame.data; + + if (request->COUNT > (MAX_CTO - 1)) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + + return 2; + } + + env->response[0] = XCP_COMMAND_CONNECT; + + memcpy(&env->response[1], (uint8_t *) request->ADR, request->COUNT); + + return request->COUNT + 1; +} + +uint8_t XCP_COMMAND_DOWNLOAD_240(tCanSerialPortFrameXCP *env) { + + eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; + + uint8_t COUNT = env->canFrame.dlc - 2; + + memcpy((uint8_t *) (env->ADR_MTA), &env->response[2], COUNT); + env->ADR_MTA += COUNT; + + env->response[0] = XCP_COMMAND_CONNECT; + env->downloadRemaining = request->COUNT - COUNT; + + return 1; +} + +uint8_t XCP_COMMAND_DOWNLOAD_NEXT_239(tCanSerialPortFrameXCP *env) { + + eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; + + uint8_t COUNT = env->canFrame.dlc - 2; + + memcpy((uint8_t *) (env->ADR_MTA), &env->response[2], COUNT); + env->ADR_MTA += COUNT; + + if (request->COUNT != env->downloadRemaining) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_SEQUENCE; + + return 2; + } + + env->downloadRemaining -= COUNT; + + env->isTransmitResponse = false; + + if (env->downloadRemaining == 0) { + env->isTransmitResponse = true; + env->response[0] = XCP_COMMAND_CONNECT; + return 1; + } + + return 0; +} + +uint8_t XCP_COMMAND_DOWNLOAD_MAX_238(tCanSerialPortFrameXCP *env) { + + uint8_t COUNT = env->canFrame.dlc - 1; + + memcpy((uint8_t *) (env->ADR_MTA), &env->response[1], COUNT); + env->ADR_MTA += COUNT; + + env->response[0] = XCP_COMMAND_CONNECT; + + return 1; +} + + +uint8_t XCP_CLEAR_DAQ_LIST_227(tCanSerialPortFrameXCP *env) { + return 0; +} + + +uint8_t XCP_GET_DAQ_LIST_INFO_216(tCanSerialPortFrameXCP *env) { + eXcpCommand_Get_DAQ_List_Info_Request *request = (eXcpCommand_Get_DAQ_List_Info_Request *) env->canFrame.data; + + if (request->DAQ_LIST_NUMBER > MAX_DAO) { + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + + return 2; + } + + eXcpCommand_Get_DAQ_List_Info *xcpCommand_Get_DAQ_List_Info = (eXcpCommand_Get_DAQ_List_Info *) env->response; + + xcpCommand_Get_DAQ_List_Info->COM = XCP_COMMAND_CONNECT; + + xcpCommand_Get_DAQ_List_Info->PREDEFINED = 0; + xcpCommand_Get_DAQ_List_Info->EVENT_FIXED = 0; + xcpCommand_Get_DAQ_List_Info->DAQ = 1; + xcpCommand_Get_DAQ_List_Info->STIM = 1; + xcpCommand_Get_DAQ_List_Info->RESERVER = 0; + + xcpCommand_Get_DAQ_List_Info->MAX_ODT_ = MAX_ODT; + xcpCommand_Get_DAQ_List_Info->MAX_ODT_ENTRIES_ = MAX_ODT_ENTRIES_SIZE; + xcpCommand_Get_DAQ_List_Info->FIXED_EVENT = 0; + + return 6; +} + +uint8_t XCP_FREE_DAQ_214(tCanSerialPortFrameXCP *env) { + + return 0; +} + +uint8_t XCP_ALLOC_DAQ_213(tCanSerialPortFrameXCP *env) { + + return 0; +} + +uint8_t XCP_ALLOC_ODT_212(tCanSerialPortFrameXCP *env) { + + return 0; +} + + +uint8_t XCP_ALLOC_ODT_ENTRY_211(tCanSerialPortFrameXCP *env) { + eXcpCommand_DAQ_Alloc_ODR_Entry *request = (eXcpCommand_DAQ_Alloc_ODR_Entry *) env->canFrame.data; + env->DAQ[request->DAQ_LIST_NUMBER].ODT_ENTRIES_COUNT[request->DAQ_LIST_NUMBER] = request->ODT_ENTRIES_COUNT; + + return 0; +} + + +uint8_t XCP_SET_DAQ_PTR_226(tCanSerialPortFrameXCP *env) { + eXcpCommand_SET_DAQ_PTR *request = (eXcpCommand_SET_DAQ_PTR *) env->canFrame.data; + + if ((request->DAQ_LIST_NUMBER > MAX_DAO) || + (request->ODT_NUMBER > MAX_ODT) || + (request->ODT_ENTRY_NUMBER > MAX_ODT_ENTRIES_SIZE)) { + + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + + return 2; + } + + env->DAQ_LIST_NUMBER = request->DAQ_LIST_NUMBER; + env->ODT_NUMBER = request->ODT_NUMBER; + env->ODT_ENTRY_NUMBER = request->ODT_ENTRY_NUMBER; + + + return 0; +} + +uint8_t XCP_WRITE_DAQ_225(tCanSerialPortFrameXCP *env) { + eXcpCommand_WRITE_DAQ *request = (eXcpCommand_WRITE_DAQ *) env->canFrame.data; + + if (request->ODT_ENTRY_SIZE > MAX_ODT_ENTRIES_SIZE) { + + env->response[0] = XCP_COMMAND_DISCONNECT; + env->response[1] = XCP_ERR_OUT_OF_RANGE; + + return 2; + } + + env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_ADR[env->ODT_ENTRY_NUMBER] = request->ADR; + env->DAQ[env->DAQ_LIST_NUMBER].ODT_NUMBER[env->ODT_NUMBER].ODT_ENTRIES_SIZE[env->ODT_ENTRY_NUMBER] = request->ODT_ENTRY_SIZE; + + return 0; +} + +uint8_t XCP_SET_DAQ_LIST_MODE_224(tCanSerialPortFrameXCP *env) { + eXcpCommand_SET_DAQ_LIST_MODE *request = (eXcpCommand_SET_DAQ_LIST_MODE *) env->canFrame.data; + + + + return 0; +} + + + +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, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + XCP_ALLOC_ODT_ENTRY_211, + XCP_ALLOC_ODT_212, + XCP_ALLOC_DAQ_213, + XCP_FREE_DAQ_214, + NULL, + XCP_GET_DAQ_LIST_INFO_216, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + XCP_SET_DAQ_LIST_MODE_224, + XCP_WRITE_DAQ_225, + XCP_SET_DAQ_PTR_226, + XCP_CLEAR_DAQ_LIST_227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + XCP_COMMAND_DOWNLOAD_MAX_238, + XCP_COMMAND_DOWNLOAD_NEXT_239, + XCP_COMMAND_DOWNLOAD_240, + NULL, + NULL, + NULL, + XCP_COMMAND_SHORT_UPLOAD_244, + XCP_COMMAND_UPLOAD_245, + XCP_COMMAND_SET_MTA_246, + XCP_UNLOCK_247, + XCP_GET_SEED_248, + NULL, + NULL, + XCP_GET_COMM_MODE_INFO_251, + XCP_COMMAND_SYNCH_252, + XCP_COMMAND_GET_STATUS_253, + XCP_COMMAND_DISCONNECT_254, + XCP_COMMAND_CONNECT_255 +}; + + eXcpResult vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeout) { uint16_t recv = env->ioCanFrame->receive(env->ioCanFrame->env, PROTOCOL_XCP, (uint8_t *) &env->canFrame, 1, @@ -52,309 +646,24 @@ eXcpResult vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 tim return XCP_STANDBY; env->isTransmitResponse = true; - env->isTransmitResponseError = false; eXcpTypeCommand com = env->canFrame.data[0]; - switch (com) { - case XCP_COMMAND_CONNECT: { - eXcpCommand_CONNECT *xcpCommand_CONNECT = (eXcpCommand_CONNECT *) env->response; + if (fXcp_func_ptr[com] != NULL) { - xcpCommand_CONNECT->COM = XCP_COMMAND_CONNECT; + uint8_t response_size = fXcp_func_ptr[com](env); - xcpCommand_CONNECT->CAL_PAG = 0; // Калибровка и пагинация - xcpCommand_CONNECT->reserve1 = 0; - xcpCommand_CONNECT->DAQ = 1; // Поддержка DAQ - xcpCommand_CONNECT->STIM = 1; // Стимуляция (формирование инициативных запросов) - xcpCommand_CONNECT->PGM = 1; // Программирование FLASH - xcpCommand_CONNECT->reserve2 = 0; - xcpCommand_CONNECT->reserve3 = 0; - xcpCommand_CONNECT->reserve4 = 0; - - xcpCommand_CONNECT->BYTE__ORDER = 0; // 0 - Intel 1 - Motorola - xcpCommand_CONNECT->ADDRESS_GRANULARITY_0 = 0; - xcpCommand_CONNECT->ADDRESS_GRANULARITY_1 = 0; - xcpCommand_CONNECT->reserve5 = 1; - xcpCommand_CONNECT->reserve6 = 1; - xcpCommand_CONNECT->reserve7 = 1; - xcpCommand_CONNECT->SLAVE_BLOCK_MODE = 0; - xcpCommand_CONNECT->OPTIONAL = 1; // Поддержка команды XCP_COMMAND_GET_STATUS - - xcpCommand_CONNECT->MAX_CTO_ = MAX_CTO; - xcpCommand_CONNECT->MAX_DTO_ = MAX_DTO; - - xcpCommand_CONNECT->XCP_PROTOCOL_VER = 1; - xcpCommand_CONNECT->XCP_TRANSPORT_VER = 1; - - env->responseSize = 8; - - break; + if (response_size) { + env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, response_size, timeout); } - case XCP_COMMAND_DISCONNECT: { - env->isTransmitResponse = false; - break; - }; + } else { - case XCP_COMMAND_GET_STATUS: { - eXcpCommand_GET_STATUS *xcpCommand_GET_STATUS = (eXcpCommand_GET_STATUS *) env->response; - - xcpCommand_GET_STATUS->COM = XCP_COMMAND_CONNECT; - - xcpCommand_GET_STATUS->STORE_CAL_REQ = 0; - xcpCommand_GET_STATUS->reserve1 = 0; - xcpCommand_GET_STATUS->STORE_DAQ_REQ = 0; - xcpCommand_GET_STATUS->CLEAR_DAQ_REQ = 0; - xcpCommand_GET_STATUS->reserve2 = 0; - xcpCommand_GET_STATUS->reserve3 = 0; - xcpCommand_GET_STATUS->DAQ_RUNNING = 0; - xcpCommand_GET_STATUS->RESUME = 0; - - xcpCommand_GET_STATUS->CAL_PAG = 0; - xcpCommand_GET_STATUS->reserve5 = 0; - xcpCommand_GET_STATUS->DAQ = 0; - xcpCommand_GET_STATUS->STIM = 0; - xcpCommand_GET_STATUS->PGM = 0; - xcpCommand_GET_STATUS->reserve6 = 0; - xcpCommand_GET_STATUS->reserve7 = 0; - xcpCommand_GET_STATUS->reserve8 = 0; - - xcpCommand_GET_STATUS->STATE_NUMBER = 0; - - xcpCommand_GET_STATUS->SESSION_CONFIGURATION_ID = 0; - - env->responseSize = 8; - - break; - }; - - case XCP_COMMAND_SYNCH: { - env->response[0] = XCP_COMMAND_DISCONNECT; - env->response[1] = XCP_ERR_CMD_SYNCH; - - env->responseSize = 2; - - break; - }; - - - case XCP_GET_COMM_MODE_INFO: { - eXcpCommand_GET_COMM_MODE_INFO *xcpCommand_GET_COMM_MODE_INFO = (eXcpCommand_GET_COMM_MODE_INFO *) env->response; - - xcpCommand_GET_COMM_MODE_INFO->RESERVED1 = 0; - - xcpCommand_GET_COMM_MODE_INFO->MASTER_BLOCK_MODE = 1; - xcpCommand_GET_COMM_MODE_INFO->INTERLEAVED_MODE = 0; - xcpCommand_GET_COMM_MODE_INFO->RESERVED2 = 0; - - xcpCommand_GET_COMM_MODE_INFO->RESERVED3 = 0; - xcpCommand_GET_COMM_MODE_INFO->MAX_BS = 255; - xcpCommand_GET_COMM_MODE_INFO->MIN_ST = 0; - xcpCommand_GET_COMM_MODE_INFO->QUEUE_SIZE = 0; - xcpCommand_GET_COMM_MODE_INFO->VERSION = 1; - - env->responseSize = 8; - break; - } - - case XCP_GET_SEED: { - eXcpCommand_REQ_GET_SEED *request = (eXcpCommand_REQ_GET_SEED *) env->canFrame.data; - - if (request->MODE == 0) { - - eXcpCommand_GET_SEED *xcpCommand_GET_SEED = (eXcpCommand_GET_SEED *) env->response; - - xcpCommand_GET_SEED->COM = XCP_COMMAND_CONNECT; - xcpCommand_GET_SEED->LEN = 4; - xcpCommand_GET_SEED->KEY = 0x11223344; - - env->RND = request->RESOURCE; - - env->responseSize = 6; - } - - break; - } - - case XCP_UNLOCK: { - - eXcpCommand_REQ_UNLOCK *request = (eXcpCommand_REQ_UNLOCK *) env->canFrame.data; - - uint32_t securitySeedMy = SeedToKeyHVAC_NAMI(env->RND, 0x11223344); - - if (securitySeedMy != request->KEY) { - env->response[0] = XCP_COMMAND_DISCONNECT; - env->response[1] = XCP_ERR_ACCESS_LOCKED; - env->responseSize = 2; - } else { - env->response[0] = XCP_COMMAND_CONNECT; - env->response[1] = 0; - env->responseSize = 2; - } - - break; - } - - case XCP_COMMAND_SET_MTA: { - eXcpCommand_SET_MTA *request = (eXcpCommand_SET_MTA *) env->canFrame.data; - - env->ADR_EXT = request->ADR_EX; - env->ADR_MTA = request->ADR; - - env->response[0] = XCP_COMMAND_CONNECT; - env->responseSize = 1; - - break; - }; - - case XCP_COMMAND_UPLOAD: { - eXcpCommand_Upload *request = (eXcpCommand_Upload *) env->canFrame.data; - - env->isTransmitResponse = false; - - env->response[0] = XCP_COMMAND_CONNECT; - - uint8_t fullBlock = request->COUNT / 7; - uint8_t tailBlock = request->COUNT % 7; - - for (uint8_t i = 0; i < fullBlock; ++i) { - memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), request->COUNT); - env->ADR_MTA += 7; - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 7, timeout); - } - - if (tailBlock > 0) { - memcpy(&env->response[1], (uint8_t *) (env->ADR_MTA), tailBlock); - env->ADR_MTA += tailBlock; - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, tailBlock, timeout); - } - - break; - }; - - case XCP_COMMAND_SHORT_UPLOAD: { - eXcpCommand_SHORT_UPLOAD *request = (eXcpCommand_SHORT_UPLOAD *) env->canFrame.data; - - if (request->COUNT > (MAX_CTO - 1)) { - env->response[0] = XCP_COMMAND_DISCONNECT; - env->response[1] = XCP_ERR_OUT_OF_RANGE; - break; - } - - env->response[0] = XCP_COMMAND_CONNECT; - - memcpy(&env->response[1], (uint8_t *) request->ADR, request->COUNT); - - env->responseSize = request->COUNT + 1; - break; - }; - - - case XCP_COMMAND_DOWNLOAD: { - eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; - - uint8_t COUNT = env->canFrame.dlc - 2; - - memcpy((uint8_t *) (env->ADR_MTA), &env->response[2], COUNT); - env->ADR_MTA += COUNT; - - env->response[0] = XCP_COMMAND_CONNECT; - env->responseSize = 1; - - env->downloadRemaining = request->COUNT - COUNT; - - break; - }; - - case XCP_COMMAND_DOWNLOAD_NEXT: { - eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; - - uint8_t COUNT = env->canFrame.dlc - 2; - - memcpy((uint8_t *) (env->ADR_MTA), &env->response[2], COUNT); - env->ADR_MTA += COUNT; - - if (request->COUNT != env->downloadRemaining) { - env->response[0] = XCP_COMMAND_DISCONNECT; - env->response[1] = XCP_ERR_SEQUENCE; - break; - } - - env->downloadRemaining -= COUNT; - - env->isTransmitResponse = false; - - if (env->downloadRemaining == 0) { - env->isTransmitResponse = true; - env->response[0] = XCP_COMMAND_CONNECT; - env->responseSize = 1; - } - - break; - }; - - case XCP_COMMAND_DOWNLOAD_MAX: { - uint8_t COUNT = env->canFrame.dlc - 1; - - memcpy((uint8_t *) (env->ADR_MTA), &env->response[1], COUNT); - env->ADR_MTA += COUNT; - - env->response[0] = XCP_COMMAND_CONNECT; - env->responseSize = 1; - - break; - }; - - case XCP_CLEAR_DAQ_LIST: { - - break; - } - - case XCP_GET_DAQ_LIST_INFO: { - eXcpCommand_Get_DAQ_List_Info *xcpCommand_Get_DAQ_List_Info = (eXcpCommand_Get_DAQ_List_Info *) env->response; - - xcpCommand_Get_DAQ_List_Info->COM = XCP_COMMAND_CONNECT; - - xcpCommand_Get_DAQ_List_Info-> PREDEFINED = ; - xcpCommand_Get_DAQ_List_Info-> EVENT_FIXED = ; - xcpCommand_Get_DAQ_List_Info-> DAQ = ; - xcpCommand_Get_DAQ_List_Info-> STIM = ; - xcpCommand_Get_DAQ_List_Info-> RESERVER = 0; - - xcpCommand_Get_DAQ_List_Info->MAX_ODT_ = MAX_ODT; - xcpCommand_Get_DAQ_List_Info->MAX_ODT_ENTRIES_ = MAX_ODT_ENTRIES; - xcpCommand_Get_DAQ_List_Info->FIXED_EVENT = 0; - - env->responseSize = 6; - break; - } - - case XCP_FREE_DAQ: { - break; - } - - case XCP_ALLOC_DAQ: { - break; - } - - case XCP_ALLOC_ODT: { - break; - } - - case XCP_ALLOC_ODT_ENTRY: { - eXcpCommand_DAQ_Alloc_ODR_Entry *request = (eXcpCommand_DAQ_Alloc_ODR_Entry *) env->canFrame.data; - env->DAQ[request->DAQ_LIST_NUMBER].ODT_NUMBER[request->DAQ_LIST_NUMBER].ODT_ENTRIES_COUNT = request->ODT_ENTRIES_COUNT; - break; - } - - - default: - break; } - if (env->isTransmitResponse) { - env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, env->responseSize, timeout); - } + + + } _Noreturn void CanXcpProcessing_ListenerTask(tCanSerialPortFrameXCP *env) {