CanSerialPortFrame_XCP/Inc/CanSerialPortFrameXCP.h

170 lines
3.8 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"
#define MAX_CTO 8
#define MAX_DTO 8
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_COMMAND_UPLOAD = 0xF5,
XCP_COMMAND_SHORT_UPLOAD = 0xF4,
XCP_COMMAND_SET_MTA = 0xF6,
XCP_COMMAND_DOWNLOAD = 0xF0,
XCP_COMMAND_DOWNLOAD_NEXT = 0xEF
} eXcpTypeCommand;
typedef enum {
XCP_STANDBY = 0
} eXcpResult;
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 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;
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 {
tSerialPortFrameIO *ioCanFrame;
tLoggerToSerialPort *slog;
SystemMutexCmsis txAccessQueue;
uint8_t ADR_EXT;
uint32_t ADR_MTA;
can_rx_message_type canFrame;
bool isTransmitResponse;
bool isTransmitResponseError;
uint8_t downloadSize;
uint8_t response[8];
uint8_t responseSize;
tStaticThreadBlock(1024) T_can_Listener_XCP;
} tCanSerialPortFrameXCP;
void CanSerialPortFrameXcpInit(
tCanSerialPortFrameXCP *env,
SystemMutexCmsis txAccessQueue,
tSerialPortFrameIO *ioCanFrame,
tLoggerToSerialPort *slog
);
#endif //CAN_MODULE_CAN_FRAME_XCP_H