CanSerialPortFrame_XCP/Inc/CanSerialPortFrameXCP.h

592 lines
14 KiB
C

//
// Created by cfif on 16.03.2024.
//
#ifndef CAN_MODULE_CAN_FRAME_XCP_H
#define CAN_MODULE_CAN_FRAME_XCP_H
#include "SerialPortFrameIO.h"
#include "CanSerialPortFrame.h"
#include "LoggerToSerialPort.h"
#include "CmsisRtosThreadUtils.h"
#include "SystemMutexCmsis.h"
typedef enum {
XCP_ERR_CMD_SYNCH = 0x00,
XCP_ERR_CMD_BUSY = 0x10,
XCP_ERR_DAQ_ACTIVE = 0x11,
XCP_ERR_PGM_ACTIVE = 0x12,
XCP_ERR_CMD_UNKNOWN = 0x20,
XCP_ERR_CMD_SYNTAX = 0x21,
XCP_ERR_OUT_OF_RANGE = 0x22,
XCP_ERR_WRITE_PROTECTED = 0x23,
XCP_ERR_ACCESS_DENIED = 0x24,
XCP_ERR_ACCESS_LOCKED = 0x25,
XCP_ERR_PAGE_NOT_VALID = 0x26,
XCP_ERR_MODE_NOT_VALID = 0x27,
XCP_ERR_SEGMENT_NOT_VALID = 0x28,
XCP_ERR_SEQUENCE = 0x29,
XCP_ERR_DAQ_CONFIG = 0x2A,
XCP_ERR_MEMORY_OVERFLOW = 0x30,
XCP_ERR_GENERIC = 0x31,
XCP_ERR_VERIFY = 0x32,
XCP_ERR_RESOURCE_TEMPORARY_NOT_ACCESSIBLE = 0x33,
XCP_ERR_SUBCMD_UNKNOWN = 0x34
} eXcpError;
typedef enum {
XCP_COMMAND_CONNECT = 0xFF,
XCP_COMMAND_DISCONNECT = 0xFE,
XCP_COMMAND_GET_STATUS = 0xFD,
XCP_COMMAND_SYNCH = 0xFC,
XCP_GET_COMM_MODE_INFO = 0xFB,
XCP_GET_SEED = 0xF8,
XCP_UNLOCK = 0xF7,
XCP_COMMAND_SET_MTA = 0xF6,
XCP_COMMAND_UPLOAD = 0xF5,
XCP_COMMAND_SHORT_UPLOAD = 0xF4,
XCP_COMMAND_DOWNLOAD = 0xF0,
XCP_COMMAND_DOWNLOAD_NEXT = 0xEF,
XCP_COMMAND_DOWNLOAD_MAX = 0xEE,
XCP_CLEAR_DAQ_LIST = 0xE3,
XCP_GET_DAQ_LIST_INFO = 0xD8,
XCP_FREE_DAQ = 0xD6,
XCP_ALLOC_DAQ = 0xD5,
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_STOP = 0,
XCP_START = 1,
XCP_SELECT = 2
} eXcpDAQ_Mode;
typedef enum {
XCP_SYNC_STOP_ALL = 0,
XCP_SYNC_START_SEL = 1,
XCP_SYNC_STOP_SEL = 2
} eXcpDAQ_Sync_Mode;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t CAL_PAG: 1; // CALibration and PAGing
uint8_t reserve1: 1;
uint8_t DAQ: 1; // DAQ lists supported
uint8_t STIM: 1; // STIMulation
uint8_t PGM: 1; // Flash programming
uint8_t reserve2: 1;
uint8_t reserve3: 1;
uint8_t reserve4: 1;
uint8_t BYTE__ORDER: 1; // 0 - Intel
uint8_t ADDRESS_GRANULARITY_0: 1;
uint8_t ADDRESS_GRANULARITY_1: 1;
uint8_t reserve5: 1;
uint8_t reserve6: 1;
uint8_t reserve7: 1;
uint8_t SLAVE_BLOCK_MODE: 1;
uint8_t OPTIONAL: 1;
uint8_t MAX_CTO_;
uint16_t MAX_DTO_;
uint8_t XCP_PROTOCOL_VER;
uint8_t XCP_TRANSPORT_VER;
} eXcpCommand_CONNECT;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t STORE_CAL_REQ: 1;
uint8_t reserve1: 1;
uint8_t STORE_DAQ_REQ: 1;
uint8_t CLEAR_DAQ_REQ: 1;
uint8_t reserve2: 1;
uint8_t reserve3: 1;
uint8_t DAQ_RUNNING: 1;
uint8_t RESUME: 1;
uint8_t CAL_PAG: 1;
uint8_t reserve5: 1;
uint8_t DAQ: 1;
uint8_t STIM: 1;
uint8_t PGM: 1;
uint8_t reserve6: 1;
uint8_t reserve7: 1;
uint8_t reserve8: 1;
uint8_t STATE_NUMBER;
uint32_t SESSION_CONFIGURATION_ID;
} eXcpCommand_GET_STATUS;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED1;
uint8_t MASTER_BLOCK_MODE: 1;
uint8_t INTERLEAVED_MODE: 1;
uint8_t RESERVED2: 6;
uint8_t RESERVED3;
uint8_t MAX_BS;
uint8_t MIN_ST;
uint8_t QUEUE_SIZE;
uint8_t VERSION;
} eXcpCommand_GET_COMM_MODE_INFO;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t COUNT;
} eXcpCommand_Upload;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t COUNT;
uint8_t RESERVED;
uint8_t ADR_EX;
uint32_t ADR;
} eXcpCommand_SHORT_UPLOAD;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t MODE;
uint8_t RESOURCE;
} eXcpCommand_REQ_GET_SEED;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t LEN;
uint32_t KEY;
} eXcpCommand_GET_SEED;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t LEN;
uint32_t KEY;
} eXcpCommand_REQ_UNLOCK;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint16_t RESERVED;
uint8_t ADR_EX;
uint32_t ADR;
} eXcpCommand_SET_MTA;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
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 PROGRAM_MASTER_BLOCK_MODE 1
#define PROGRAM_MAX_SECTOR 8
#define MAX_CTO 8
#define MAX_DTO 8
#define BODY_MAX_LEN (MAX_DTO - 2)
#define MAX_DAO 20
#define MAX_ODT 10
#define MAX_ODT_ENTRIES_SIZE 7
#define MAX_EVENT_CHANNEL 2
typedef struct {
uint8_t DATA[BODY_MAX_LEN];
} tXCP_DATA_STIM;
typedef struct {
uint8_t ODT_ENTRIES_COUNT;
tXCP_DATA_STIM DATA_STM[MAX_ODT_ENTRIES_SIZE];
uint8_t DATA_STM_COUNTER;
uint8_t BIT_OFFSET[MAX_ODT_ENTRIES_SIZE];
uint8_t ADR_EXT[MAX_ODT_ENTRIES_SIZE];
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 ALTERNATING;
// uint8_t DIRECTION;
// uint8_t DTO_CTR;
// uint8_t TIMESTAMP;
// uint8_t PID_OFF;
// uint8_t TRANSMISSION_RATE_PRESCALER;
// uint8_t DAQ_LIST_PRIORITY;
// uint8_t COUNTER;
//} tXCP_EVENT_CHANNEL;
typedef struct {
uint8_t SELECTED;
uint8_t RUNNING;
uint8_t ODT_COUNT;
uint16_t EVENT_CHANNEL;
uint8_t ALTERNATING;
uint8_t DIRECTION;
uint8_t DTO_CTR;
uint8_t TIMESTAMP;
uint8_t PID_OFF;
uint8_t TRANSMISSION_RATE_PRESCALER;
uint8_t DAQ_LIST_PRIORITY;
uint8_t PRESCALER_COUNTER;
uint8_t IS_STIM_RECEIVED;
tXCP_ODT_ENTRIES ODT_NUMBER[MAX_ODT];
} tXCP_DAQ;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t PREDEFINED: 1;
uint8_t EVENT_FIXED: 1;
uint8_t DAQ: 1;
uint8_t STIM: 1;
uint8_t RESERVER: 4;
uint8_t MAX_ODT_;
uint8_t MAX_ODT_ENTRIES_;
uint16_t FIXED_EVENT;
} eXcpCommand_Get_DAQ_List_Info;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint16_t DAQ_LIST_NUMBER;
uint8_t ODT_NUMBER;
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 __attribute__ ((packed)) {
eXcpTypeCommand COM;
eXcpDAQ_Mode MODE;
uint16_t DAQ_LIST_NUMBER;
} eXcpCommand_START_STOP_DAQ_LIST;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
eXcpDAQ_Sync_Mode MODE;
} eXcpCommand_START_STOP_SYNCH;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint16_t DAQ_COUNT;
} eXcpCommand_ALLOC_DAQ;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint8_t DAQ_LIST_NUMBER;
uint8_t ODT_COUNT;
} eXcpCommand_ALLOC_ODT;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint8_t DAQ_LIST_NUMBER;
uint8_t ODT_NUMBER;
uint8_t ODT_ENTRIES_COUNT;
} eXcpCommand_ALLOC_ODT_ENTRY;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t DAQ_CONFIG_TYPE: 1;
uint8_t PRESCALER_SUPPORTED: 1;
uint8_t RESUME_SUPPORTED: 1;
uint8_t BIT_STIM_SUPPORTED: 1;
uint8_t TIMESTAMP_SUPPORTED: 1;
uint8_t PID_OFF_SUPPORTED: 1;
uint8_t OVERLOAD_MSB: 1;
uint8_t OVERLOAD_EVENT: 1;
uint16_t MAX_DAQ;
uint16_t MAX_EVENT_CHANNEL_;
uint8_t MIN_DAQ;
uint8_t Optimisation_Type_0: 1;
uint8_t Optimisation_Type_1: 1;
uint8_t Optimisation_Type_2: 1;
uint8_t Optimisation_Type_3: 1;
uint8_t Address_Extension_ODT: 1;
uint8_t Address_Extension_DAQ: 1;
uint8_t Identification_Field_Type_0: 1;
uint8_t Identification_Field_Type_1: 1;
} eXcpCommand_GET_DAQ_PROCESSOR_INFO;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t GRANULARITY_ODT_ENTRY_SIZE_DAQ;
uint8_t MAX_ODT_ENTRY_SIZE_DAQ;
uint8_t GRANULARITY_ODT_ENTRY_SIZE_STIM;
uint8_t MAX_ODT_ENTRY_SIZE_STIM;
uint8_t TIMESTAMP_MODE;
uint16_t TIMESTAMP_TICKS;
} eXcpCommand_GET_DAQ_RESOLUTION_INFO;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint16_t DAQ_LIST_NUMBER;
} eXcpCommand_GET_DAQ_LIST_MODE_GET;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t SELECTED: 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 RUNNING: 1;
uint8_t RESUME: 1;
uint16_t RESERVED2;
uint16_t CURRENT_EVENT_CHANNEL_NUMBER;
uint8_t CURRENT_PRESCALER;
uint8_t CURRENT_DAQ_LIST_PRIORITY;
} eXcpCommand_GET_DAQ_LIST_MODE;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED;
uint16_t EVENT_CHANNEL_NUMBER;
} eXcpCommand_GET_DAQ_EVENT_INFO_GET;
typedef struct __attribute__ ((packed)) {
uint8_t ODT;
uint8_t DAQ;
} eXcpCommand_GET_DAQ_STM;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED1: 1;
uint8_t RESERVED2: 1;
uint8_t DAQ: 1;
uint8_t STM: 1;
uint8_t RESERVED3: 1;
uint8_t RESERVED4: 1;
uint8_t CONSISTENCY_DAQ: 1;
uint8_t CONSISTENCY_EVENT: 1;
uint8_t MAX_DAQ_LIST;
uint8_t EVENT_CHANNEL_NAME_LENGTH;
uint8_t EVENT_CHANNEL_TIME_CYCLE;
uint8_t EVENT_CHANNEL_TIME_UNIT;
uint8_t EVENT_CHANNEL_PRIORITY;
} eXcpCommand_GET_DAQ_EVENT_INFO;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t RESERVED1;
uint8_t MASTER_BLOCK_MODE: 1;
uint8_t INTERLEAVED_MODE: 1;
uint8_t RESERVED2: 1;
uint8_t RESERVED3: 1;
uint8_t RESERVED4: 1;
uint8_t RESERVED5: 1;
uint8_t SLAVE_BLOCK_MODE: 1;
uint8_t RESERVED6: 1;
uint8_t MAX_CTO_PGM;
uint8_t MAX_BS_PGM;
uint8_t MIN_ST_PGM;
uint8_t QUEUE_SIZE_PGM;
} eXcpCommand_PROGRAM_START;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t MODE;
uint16_t RESERVED;
uint32_t CLEAR_RANGE;
} eXcpCommand_XCP_PROGRAM_CLEAR_209;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t COUNT;
} eXcpCommand_Program_ProgramNext_208_202;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t ABSOLUTE_MODE: 1;
uint8_t FUNCTIONAL_MODE: 1;
uint8_t COMPRESSION_SUPPORTED: 1;
uint8_t COMPRESSION_REQUIRED: 1;
uint8_t ENCRYPTION_SUPPORTED: 1;
uint8_t ENCRYPTION_REQUIRED: 1;
uint8_t NON_SEQ_PGM_SUPPORTED: 1;
uint8_t NON_SEQ_PGM_REQUIRED: 1;
uint8_t MAX_SECTOR;
} eXcpCommand_PGM_PROCESSOR_INFO_206;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t MODE;
uint8_t SECTOR_NUMBER;
} eXcpCommand_REQ_GET_SECTOR_INFO_205;
typedef struct __attribute__ ((packed)) {
eXcpTypeCommand COM;
uint8_t CLEAR_SEQUENCE_NUMBER;
uint8_t PROGRAM_SEQUENCE_NUMBER;
uint8_t ABSOLUTE_MODE: 1;
uint8_t FUNCTIONAL_MODE: 1;
uint8_t PAGED_MODE: 1;
uint8_t SEQUENTIAL_ONLY: 1;
uint8_t ERASE_BEFORE_WRITE: 1;
uint8_t VERIFY_AFTER_WRITE: 1;
uint8_t RESERVED1: 1;
uint8_t RESERVED2: 1;
uint32_t SECTOR_INFO;
} eXcpCommand_RESP_GET_SECTOR_INFO_205;
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 struct {
tSerialPortFrameIO *ioCanFrame;
tLoggerInterface *logger;
uint8_t RND;
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;
uint8_t downloadRemaining;
uint8_t response[8];
uint8_t DATA[MAX_ODT_ENTRIES_SIZE * BODY_MAX_LEN];
//tXCP_EVENT_CHANNEL EVENT_CHANNEL[MAX_EVENT_CHANNEL];
tXCP_DAQ DAQ[MAX_DAO];
uint16_t DAQ_COUNT;
tRtcIO *rtcIO;
osMutexId_t access;
uint32_t startRamAdr;
uint32_t endRamAdr;
uint32_t startFlashAdr;
uint32_t endFlashAdr;
xcp_clear_flash_func *clear_flash_func;
xcp_write_flash_func *write_flash_func;
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);
void CanSerialPortFrameXcpInit(
tCanSerialPortFrameXCP *env,
tSerialPortFrameIO *ioCanFrame,
tRtcIO *rtcIO,
uint32_t startRamAddr,
uint32_t endRamAdr,
uint32_t startFlashAdr,
uint32_t endFlashAdr,
xcp_clear_flash_func *clear_flash_func,
xcp_write_flash_func *write_flash_func,
tLoggerInterface *logger
);
void CanXcpProcessing_Listener_Start(tCanSerialPortFrameXCP *env);
#endif //CAN_MODULE_CAN_FRAME_XCP_H