Обновление

This commit is contained in:
cfif 2026-01-16 13:30:52 +03:00
parent 3d1f127b6c
commit d44d247b7f
2 changed files with 99 additions and 7 deletions

View File

@ -17,6 +17,11 @@
#define PROTOCOL_CAN_ADR_XCP 0x250 #define PROTOCOL_CAN_ADR_XCP 0x250
#define PROTOCOL_CAN_TYPE_XCP 0x0 #define PROTOCOL_CAN_TYPE_XCP 0x0
#define PROTECT_CAL_PAG 1
#define PROTECT_DAQ 1
#define PROTECT_STIM 1
#define PROTECT_PGM 1
typedef enum { typedef enum {
XCP_ERR_CMD_SYNCH = 0x00, XCP_ERR_CMD_SYNCH = 0x00,
XCP_ERR_CMD_BUSY = 0x10, XCP_ERR_CMD_BUSY = 0x10,
@ -250,7 +255,7 @@ typedef struct {
uint8_t DATA[BODY_MAX_LEN]; uint8_t DATA[BODY_MAX_LEN];
} tXCP_DATA_STIM; } tXCP_DATA_STIM;
typedef struct { typedef struct {
uint8_t ODT_ENTRIES_COUNT; uint8_t ODT_ENTRIES_COUNT;
uint8_t DATA_STM_COUNTER; uint8_t DATA_STM_COUNTER;
@ -587,8 +592,8 @@ typedef struct __attribute__ ((packed)) {
} eXcpCommand_XCP_GET_CAL_PAGE_EA; } eXcpCommand_XCP_GET_CAL_PAGE_EA;
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);
@ -630,7 +635,6 @@ typedef struct {
tXCP_DAQ *DAQ; tXCP_DAQ *DAQ;
tRtcIO *rtcIO; tRtcIO *rtcIO;
osMutexId_t access; osMutexId_t access;

View File

@ -220,11 +220,11 @@ static uint8_t XCP_COMMAND_GET_STATUS_FD(tCanSerialPortFrameXCP *env) {
xcpCommand_GET_STATUS->RESUME = env->STATE.RESUME; // устройство не в режиме RESUME xcpCommand_GET_STATUS->RESUME = env->STATE.RESUME; // устройство не в режиме RESUME
// Статус защиты ресурсов // Статус защиты ресурсов
xcpCommand_GET_STATUS->CAL_PAG = 1; // защита команд калибровки/пагинации xcpCommand_GET_STATUS->CAL_PAG = PROTECT_CAL_PAG; // защита команд калибровки/пагинации
xcpCommand_GET_STATUS->reserve5 = 0; xcpCommand_GET_STATUS->reserve5 = 0;
xcpCommand_GET_STATUS->DAQ = 1; // защита DAQ-команд xcpCommand_GET_STATUS->DAQ = PROTECT_DAQ; // защита DAQ-команд
xcpCommand_GET_STATUS->STIM = 1; // защита STIM-команд xcpCommand_GET_STATUS->STIM = PROTECT_STIM; // защита STIM-команд
xcpCommand_GET_STATUS->PGM = 1; // защита команд программирования xcpCommand_GET_STATUS->PGM = PROTECT_PGM; // защита команд программирования
xcpCommand_GET_STATUS->reserve6 = 0; xcpCommand_GET_STATUS->reserve6 = 0;
xcpCommand_GET_STATUS->reserve7 = 0; xcpCommand_GET_STATUS->reserve7 = 0;
xcpCommand_GET_STATUS->reserve8 = 0; xcpCommand_GET_STATUS->reserve8 = 0;
@ -428,12 +428,14 @@ static uint8_t XCP_COMMAND_DOWNLOAD_F0(tCanSerialPortFrameXCP *env) {
eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data;
#if (PROTECT_CAL_PAG == 1)
if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) { if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
uint8_t COUNT = env->canFrame.dlc - 2; uint8_t COUNT = env->canFrame.dlc - 2;
@ -450,12 +452,14 @@ static uint8_t XCP_COMMAND_DOWNLOAD_NEXT_EF(tCanSerialPortFrameXCP *env) {
eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data; eXcpCommand_Download *request = (eXcpCommand_Download *) env->canFrame.data;
#if (PROTECT_CAL_PAG == 1)
if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) { if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
uint8_t COUNT = env->canFrame.dlc - 2; uint8_t COUNT = env->canFrame.dlc - 2;
@ -482,12 +486,14 @@ static uint8_t XCP_COMMAND_DOWNLOAD_NEXT_EF(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_COMMAND_DOWNLOAD_MAX_EE(tCanSerialPortFrameXCP *env) { static uint8_t XCP_COMMAND_DOWNLOAD_MAX_EE(tCanSerialPortFrameXCP *env) {
#if (PROTECT_CAL_PAG == 1)
if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) { if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
uint8_t COUNT = env->canFrame.dlc - 1; uint8_t COUNT = env->canFrame.dlc - 1;
@ -502,12 +508,14 @@ static uint8_t XCP_COMMAND_DOWNLOAD_MAX_EE(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_CLEAR_DAQ_LIST_E3(tCanSerialPortFrameXCP *env) { static uint8_t XCP_CLEAR_DAQ_LIST_E3(tCanSerialPortFrameXCP *env) {
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
@ -518,12 +526,15 @@ static uint8_t XCP_CLEAR_DAQ_LIST_E3(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_GET_DAQ_LIST_INFO_D8(tCanSerialPortFrameXCP *env) { static uint8_t XCP_GET_DAQ_LIST_INFO_D8(tCanSerialPortFrameXCP *env) {
eXcpCommand_Get_DAQ_List_Info_Request *request = (eXcpCommand_Get_DAQ_List_Info_Request *) env->canFrame.data; eXcpCommand_Get_DAQ_List_Info_Request *request = (eXcpCommand_Get_DAQ_List_Info_Request *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->DAQ_LIST_NUMBER > MAX_DAO) { if (request->DAQ_LIST_NUMBER > MAX_DAO) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -552,12 +563,15 @@ static uint8_t XCP_GET_DAQ_LIST_INFO_D8(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) { static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) {
eXcpCommand_ALLOC_DAQ *request = (eXcpCommand_ALLOC_DAQ *) env->canFrame.data; eXcpCommand_ALLOC_DAQ *request = (eXcpCommand_ALLOC_DAQ *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->SETUP.DAQ_COUNT = request->DAQ_COUNT; env->SETUP.DAQ_COUNT = request->DAQ_COUNT;
@ -567,12 +581,15 @@ static uint8_t XCP_ALLOC_DAQ_D5(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_FREE_DAQ_D6(tCanSerialPortFrameXCP *env) { static uint8_t XCP_FREE_DAQ_D6(tCanSerialPortFrameXCP *env) {
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
FREE_DAQ(env); FREE_DAQ(env);
@ -583,12 +600,15 @@ static uint8_t XCP_FREE_DAQ_D6(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_ALLOC_ODT_D4(tCanSerialPortFrameXCP *env) { static uint8_t XCP_ALLOC_ODT_D4(tCanSerialPortFrameXCP *env) {
eXcpCommand_ALLOC_ODT *request = (eXcpCommand_ALLOC_ODT *) env->canFrame.data; eXcpCommand_ALLOC_ODT *request = (eXcpCommand_ALLOC_ODT *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->DAQ[request->DAQ_LIST_NUMBER].ODT_COUNT = request->ODT_COUNT; env->DAQ[request->DAQ_LIST_NUMBER].ODT_COUNT = request->ODT_COUNT;
@ -600,12 +620,15 @@ static uint8_t XCP_ALLOC_ODT_D4(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_ALLOC_ODT_ENTRY_D3(tCanSerialPortFrameXCP *env) { static uint8_t XCP_ALLOC_ODT_ENTRY_D3(tCanSerialPortFrameXCP *env) {
eXcpCommand_ALLOC_ODT_ENTRY *request = (eXcpCommand_ALLOC_ODT_ENTRY *) env->canFrame.data; eXcpCommand_ALLOC_ODT_ENTRY *request = (eXcpCommand_ALLOC_ODT_ENTRY *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->DAQ[request->DAQ_LIST_NUMBER].ODT_NUMBER[request->ODT_NUMBER].ODT_ENTRIES_COUNT = request->ODT_ENTRIES_COUNT; env->DAQ[request->DAQ_LIST_NUMBER].ODT_NUMBER[request->ODT_NUMBER].ODT_ENTRIES_COUNT = request->ODT_ENTRIES_COUNT;
@ -617,12 +640,15 @@ static uint8_t XCP_ALLOC_ODT_ENTRY_D3(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) { static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) {
eXcpCommand_SET_DAQ_PTR *request = (eXcpCommand_SET_DAQ_PTR *) env->canFrame.data; eXcpCommand_SET_DAQ_PTR *request = (eXcpCommand_SET_DAQ_PTR *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if ((request->DAQ_LIST_NUMBER > MAX_DAO) || if ((request->DAQ_LIST_NUMBER > MAX_DAO) ||
(request->ODT_NUMBER > MAX_ODT) || (request->ODT_NUMBER > MAX_ODT) ||
@ -646,12 +672,15 @@ static uint8_t XCP_SET_DAQ_PTR_E2(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) { static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) {
eXcpCommand_WRITE_DAQ *request = (eXcpCommand_WRITE_DAQ *) env->canFrame.data; eXcpCommand_WRITE_DAQ *request = (eXcpCommand_WRITE_DAQ *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (env->SETUP.ODT_ENTRY_NUMBER > MAX_ODT_ENTRIES_SIZE_DAQ) { if (env->SETUP.ODT_ENTRY_NUMBER > MAX_ODT_ENTRIES_SIZE_DAQ) {
@ -675,12 +704,15 @@ static uint8_t XCP_WRITE_DAQ_E1(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_SET_DAQ_LIST_MODE_E0(tCanSerialPortFrameXCP *env) { static uint8_t XCP_SET_DAQ_LIST_MODE_E0(tCanSerialPortFrameXCP *env) {
eXcpCommand_SET_DAQ_LIST_MODE *request = (eXcpCommand_SET_DAQ_LIST_MODE *) env->canFrame.data; eXcpCommand_SET_DAQ_LIST_MODE *request = (eXcpCommand_SET_DAQ_LIST_MODE *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if ((request->DAQ_LIST_NUMBER > MAX_DAO) || (request->EVENT_CHANNEL_NUMBER > MAX_EVENT_CHANNEL)) { if ((request->DAQ_LIST_NUMBER > MAX_DAO) || (request->EVENT_CHANNEL_NUMBER > MAX_EVENT_CHANNEL)) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -709,12 +741,15 @@ static uint8_t XCP_SET_DAQ_LIST_MODE_E0(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_START_STOP_DAQ_LIST_DE(tCanSerialPortFrameXCP *env) { static uint8_t XCP_START_STOP_DAQ_LIST_DE(tCanSerialPortFrameXCP *env) {
eXcpCommand_START_STOP_DAQ_LIST *request = (eXcpCommand_START_STOP_DAQ_LIST *) env->canFrame.data; eXcpCommand_START_STOP_DAQ_LIST *request = (eXcpCommand_START_STOP_DAQ_LIST *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->DAQ_LIST_NUMBER > MAX_DAO) { if (request->DAQ_LIST_NUMBER > MAX_DAO) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -742,12 +777,15 @@ static uint8_t XCP_START_STOP_DAQ_LIST_DE(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_START_STOP_SYNCH_DD(tCanSerialPortFrameXCP *env) { static uint8_t XCP_START_STOP_SYNCH_DD(tCanSerialPortFrameXCP *env) {
eXcpCommand_START_STOP_SYNCH *request = (eXcpCommand_START_STOP_SYNCH *) env->canFrame.data; eXcpCommand_START_STOP_SYNCH *request = (eXcpCommand_START_STOP_SYNCH *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->MODE == XCP_SYNC_START_SEL) { if (request->MODE == XCP_SYNC_START_SEL) {
for (uint16 i = 0; i < MAX_DAO; ++i) { for (uint16 i = 0; i < MAX_DAO; ++i) {
@ -781,12 +819,15 @@ static uint8_t XCP_START_STOP_SYNCH_DD(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_READ_DAQ_DB(tCanSerialPortFrameXCP *env) { static uint8_t XCP_READ_DAQ_DB(tCanSerialPortFrameXCP *env) {
eXcpCommand_WRITE_DAQ *response = (eXcpCommand_WRITE_DAQ *) env->response; eXcpCommand_WRITE_DAQ *response = (eXcpCommand_WRITE_DAQ *) env->response;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
response->BIT_OFFSET = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].BIT_OFFSET[env->SETUP.ODT_ENTRY_NUMBER]; response->BIT_OFFSET = env->DAQ[env->SETUP.DAQ_LIST_NUMBER].ODT_NUMBER[env->SETUP.ODT_NUMBER].BIT_OFFSET[env->SETUP.ODT_ENTRY_NUMBER];
@ -803,12 +844,15 @@ static uint8_t XCP_GET_DAQ_PROCESSOR_INFO_DA(tCanSerialPortFrameXCP *env) {
eXcpCommand_GET_DAQ_PROCESSOR_INFO *response = (eXcpCommand_GET_DAQ_PROCESSOR_INFO *) env->response; eXcpCommand_GET_DAQ_PROCESSOR_INFO *response = (eXcpCommand_GET_DAQ_PROCESSOR_INFO *) env->response;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
@ -841,12 +885,15 @@ static uint8_t XCP_GET_DAQ_PROCESSOR_INFO_DA(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_GET_DAQ_RESOLUTION_INFO_D9(tCanSerialPortFrameXCP *env) { static uint8_t XCP_GET_DAQ_RESOLUTION_INFO_D9(tCanSerialPortFrameXCP *env) {
eXcpCommand_GET_DAQ_RESOLUTION_INFO *response = (eXcpCommand_GET_DAQ_RESOLUTION_INFO *) env->response; eXcpCommand_GET_DAQ_RESOLUTION_INFO *response = (eXcpCommand_GET_DAQ_RESOLUTION_INFO *) env->response;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
@ -865,12 +912,15 @@ static uint8_t XCP_GET_DAQ_LIST_MODE_DF(tCanSerialPortFrameXCP *env) {
eXcpCommand_GET_DAQ_LIST_MODE_GET *request = (eXcpCommand_GET_DAQ_LIST_MODE_GET *) env->canFrame.data; eXcpCommand_GET_DAQ_LIST_MODE_GET *request = (eXcpCommand_GET_DAQ_LIST_MODE_GET *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->DAQ_LIST_NUMBER > MAX_DAO) { if (request->DAQ_LIST_NUMBER > MAX_DAO) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -905,12 +955,15 @@ static uint8_t XCP_GET_DAQ_EVENT_INFO_D7(tCanSerialPortFrameXCP *env) {
eXcpCommand_GET_DAQ_EVENT_INFO_GET *request = (eXcpCommand_GET_DAQ_EVENT_INFO_GET *) env->canFrame.data; eXcpCommand_GET_DAQ_EVENT_INFO_GET *request = (eXcpCommand_GET_DAQ_EVENT_INFO_GET *) env->canFrame.data;
#if (PROTECT_DAQ == 1)
if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) { if (isUNLOCK(env, XCP_PROTECT_DAQ) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->EVENT_CHANNEL_NUMBER > MAX_EVENT_CHANNEL) { if (request->EVENT_CHANNEL_NUMBER > MAX_EVENT_CHANNEL) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -969,12 +1022,14 @@ static uint8_t XCP_GET_DAQ_STM(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_START_D2(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_START_D2(tCanSerialPortFrameXCP *env) {
eXcpCommand_PROGRAM_START *response = (eXcpCommand_PROGRAM_START *) env->response; eXcpCommand_PROGRAM_START *response = (eXcpCommand_PROGRAM_START *) env->response;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
response->RESERVED1 = 0; response->RESERVED1 = 0;
@ -999,12 +1054,15 @@ static uint8_t XCP_PROGRAM_START_D2(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_CLEAR_D1(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_CLEAR_D1(tCanSerialPortFrameXCP *env) {
eXcpCommand_XCP_PROGRAM_CLEAR_D1 *request = (eXcpCommand_XCP_PROGRAM_CLEAR_D1 *) env->canFrame.data; eXcpCommand_XCP_PROGRAM_CLEAR_D1 *request = (eXcpCommand_XCP_PROGRAM_CLEAR_D1 *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->MODE == 0) { if (request->MODE == 0) {
@ -1032,12 +1090,15 @@ static uint8_t XCP_PROGRAM_CLEAR_D1(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) {
eXcpCommand_Program_ProgramNext_D0_CA *request = (eXcpCommand_Program_ProgramNext_D0_CA *) env->canFrame.data; eXcpCommand_Program_ProgramNext_D0_CA *request = (eXcpCommand_Program_ProgramNext_D0_CA *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
uint8_t COUNT = env->canFrame.dlc - 2; uint8_t COUNT = env->canFrame.dlc - 2;
@ -1066,12 +1127,15 @@ static uint8_t XCP_PROGRAM_D0(tCanSerialPortFrameXCP *env) {
static uint8_t PROGRAM_VERIFY_C8(tCanSerialPortFrameXCP *env) { static uint8_t PROGRAM_VERIFY_C8(tCanSerialPortFrameXCP *env) {
eXcpCommand_Program_Verify_C8 *request = (eXcpCommand_Program_Verify_C8 *) env->canFrame.data; eXcpCommand_Program_Verify_C8 *request = (eXcpCommand_Program_Verify_C8 *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (env->bufWriteFlashCount > 0) { if (env->bufWriteFlashCount > 0) {
bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount); bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount);
@ -1087,12 +1151,15 @@ static uint8_t PROGRAM_VERIFY_C8(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) {
eXcpCommand_Program_ProgramNext_D0_CA *request = (eXcpCommand_Program_ProgramNext_D0_CA *) env->canFrame.data; eXcpCommand_Program_ProgramNext_D0_CA *request = (eXcpCommand_Program_ProgramNext_D0_CA *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
uint8_t COUNT = env->canFrame.dlc - 2; uint8_t COUNT = env->canFrame.dlc - 2;
@ -1107,12 +1174,15 @@ static uint8_t XCP_PROGRAM_NEXT_CA(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_PREPARE_CC(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_PREPARE_CC(tCanSerialPortFrameXCP *env) {
eXcpCommand_Program_Prepare_CC *request = (eXcpCommand_Program_Prepare_CC *) env->canFrame.data; eXcpCommand_Program_Prepare_CC *request = (eXcpCommand_Program_Prepare_CC *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if ((env->ADR_MTA < env->startFlashAdr) || ((env->ADR_MTA + request->CODESIZE) > env->endFlashAdr)) { if ((env->ADR_MTA < env->startFlashAdr) || ((env->ADR_MTA + request->CODESIZE) > env->endFlashAdr)) {
@ -1131,12 +1201,15 @@ static uint8_t XCP_PROGRAM_PREPARE_CC(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_PROGRAM_FORMAT_CB(tCanSerialPortFrameXCP *env) { static uint8_t XCP_PROGRAM_FORMAT_CB(tCanSerialPortFrameXCP *env) {
eXcpCommand_Program_Format_CB *request = (eXcpCommand_Program_Format_CB *) env->canFrame.data; eXcpCommand_Program_Format_CB *request = (eXcpCommand_Program_Format_CB *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
return 1; return 1;
@ -1146,12 +1219,15 @@ static uint8_t XCP_PROGRAM_FORMAT_CB(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 (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (env->bufWriteFlashCount > 0) { if (env->bufWriteFlashCount > 0) {
bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount); bool result = env->write_flash_func(env->bufWriteFlashAdr, env->bufWriteFlash, env->bufWriteFlashCount);
@ -1164,12 +1240,15 @@ static uint8_t XCP_PROGRAM_RESET_CF(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_GET_PGM_PROCESSOR_INFO_CE(tCanSerialPortFrameXCP *env) { static uint8_t XCP_GET_PGM_PROCESSOR_INFO_CE(tCanSerialPortFrameXCP *env) {
eXcpCommand_PGM_PROCESSOR_INFO_CE *response = (eXcpCommand_PGM_PROCESSOR_INFO_CE *) env->response; eXcpCommand_PGM_PROCESSOR_INFO_CE *response = (eXcpCommand_PGM_PROCESSOR_INFO_CE *) env->response;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
response->COM = XCP_COMMAND_CONNECT; response->COM = XCP_COMMAND_CONNECT;
@ -1190,12 +1269,15 @@ static uint8_t XCP_GET_PGM_PROCESSOR_INFO_CE(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) { static uint8_t XCP_GET_SECTOR_INFO_CD(tCanSerialPortFrameXCP *env) {
eXcpCommand_REQ_GET_SECTOR_INFO_CD *request = (eXcpCommand_REQ_GET_SECTOR_INFO_CD *) env->canFrame.data; eXcpCommand_REQ_GET_SECTOR_INFO_CD *request = (eXcpCommand_REQ_GET_SECTOR_INFO_CD *) env->canFrame.data;
#if (PROTECT_PGM == 1)
if (isUNLOCK(env, XCP_PROTECT_PGM) == false) { if (isUNLOCK(env, XCP_PROTECT_PGM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
if (request->SECTOR_NUMBER > PROGRAM_MAX_SECTOR) { if (request->SECTOR_NUMBER > PROGRAM_MAX_SECTOR) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
@ -1246,12 +1328,14 @@ static uint8_t XCP_SET_CALIBRATION_PAGE_EB(tCanSerialPortFrameXCP *env) {
static uint8_t XCP_GET_CAL_PAGE_EA(tCanSerialPortFrameXCP *env) { 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; eXcpCommand_XCP_GET_CAL_PAGE_EA *request = (eXcpCommand_XCP_GET_CAL_PAGE_EA *) env->canFrame.data;
#if (PROTECT_CAL_PAG == 1)
if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) { if (isUNLOCK(env, XCP_PROTECT_CAL_PAG) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
return 2; return 2;
} }
#endif
env->response[0] = XCP_COMMAND_CONNECT; env->response[0] = XCP_COMMAND_CONNECT;
env->response[1] = env->PAGE_ID; env->response[1] = env->PAGE_ID;
@ -1564,6 +1648,7 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou
} else { // ODT } else { // ODT
#if (PROTECT_STIM == 1)
if (isUNLOCK(env, XCP_PROTECT_STM) == false) { if (isUNLOCK(env, XCP_PROTECT_STM) == false) {
env->response[0] = XCP_COMMAND_DISCONNECT; env->response[0] = XCP_COMMAND_DISCONNECT;
env->response[1] = XCP_ERR_ACCESS_LOCKED; env->response[1] = XCP_ERR_ACCESS_LOCKED;
@ -1571,6 +1656,9 @@ uint8_t vCanSerialPortFrameXcpReceive(tCanSerialPortFrameXCP *env, uint32 timeou
env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 2, env->ioCanFrame->transmit(env->ioCanFrame->env, env->response, 2,
PROTOCOL_CAN_ADR_XCP, PROTOCOL_CAN_ADR_XCP,
PROTOCOL_CAN_TYPE_XCP, timeout); PROTOCOL_CAN_TYPE_XCP, timeout);
#endif
} else { } else {
XCP_GET_DAQ_STM(env); XCP_GET_DAQ_STM(env);
} }