Files
root ca13734bf0 Add full automotive RTOS project
Add kernel (Cortex-M0/M3/M4, Tricore, S32K, RISC-V ports), drivers,
middleware (CAN stack, diagnostics, safety), applications, board
support, build/test tooling, and documentation.
2026-08-23 03:35:29 -04:00

116 lines
3.5 KiB
C

/**
* @file can_tp.h
* @brief CAN Transport Protocol (ISO 15765-2) implementation
*/
#ifndef CAN_TP_H
#define CAN_TP_H
#include <stdint.h>
#include <stdbool.h>
#include "kernel.h"
#include "can_driver.h"
/* CAN TP Configuration */
#define CAN_TP_MAX_CONNECTIONS 8
#define CAN_TP_MAX_PAYLOAD_SIZE 4096
#define CAN_TP_DEFAULT_TIMEOUT_MS 1000
#define CAN_TP_STMIN_DEFAULT 10 /* Minimum separation time in ms */
#define CAN_TP_BS_DEFAULT 8 /* Block size */
/* CAN TP Addressing Formats */
typedef enum {
CAN_TP_ADDRESSING_NORMAL = 0, /* Standard 11-bit or 29-bit */
CAN_TP_ADDRESSING_NORMAL_FIXED = 1, /* Fixed addressing */
CAN_TP_ADDRESSING_EXTENDED = 2, /* Extended addressing */
CAN_TP_ADDRESSING_MIXED = 3 /* Mixed addressing */
} CanTpAddressingFormat_t;
/* CAN TP Frame Types */
typedef enum {
CAN_TP_FRAME_SINGLE = 0, /* Single Frame */
CAN_TP_FRAME_FIRST = 1, /* First Frame */
CAN_TP_FRAME_CONSECUTIVE = 2, /* Consecutive Frame */
CAN_TP_FRAME_FLOW_CONTROL = 3 /* Flow Control */
} CanTpFrameType_t;
/* CAN TP Flow Control Status */
typedef enum {
CAN_TP_FC_CONTINUE = 0, /* Continue to send */
CAN_TP_FC_WAIT = 1, /* Wait */
CAN_TP_FC_OVERFLOW = 2 /* Overflow/Abort */
} CanTpFlowControlStatus_t;
/* CAN TP States */
typedef enum {
CAN_TP_IDLE = 0,
CAN_TP_SEND_IN_PROGRESS = 1,
CAN_TP_RECEIVE_IN_PROGRESS = 2,
CAN_TP_WAIT_FLOW_CONTROL = 3,
CAN_TP_WAIT_CONSECUTIVE = 4,
CAN_TP_TIMEOUT = 5,
CAN_TP_ERROR = 6
} CanTpState_t;
/* CAN TP Message Structure */
typedef struct {
uint32_t message_id;
uint8_t* data;
uint16_t length;
uint8_t addressing_format;
uint32_t source_address;
uint32_t target_address;
} CanTpMessage_t;
/* CAN TP Connection */
typedef struct {
uint8_t connection_id;
CanTpState_t state;
CanTpMessage_t current_message;
uint16_t current_index;
uint8_t sequence_number;
uint8_t block_counter;
uint32_t timeout_timer;
uint8_t stmin;
uint8_t block_size;
bool is_sender;
Semaphore_t flow_control_semaphore;
Semaphore_t complete_semaphore;
Mutex_t connection_mutex;
} CanTpConnection_t;
/* CAN TP Configuration */
typedef struct {
CanTpAddressingFormat_t addressing_format;
uint32_t source_address;
uint32_t target_address;
uint32_t timeout_ms;
uint8_t stmin;
uint8_t block_size;
bool padding_enabled;
uint8_t padding_byte;
} CanTpConfig_t;
/* CAN TP Callbacks */
typedef void (*CanTpMessageReceivedCallback_t)(const CanTpMessage_t* message);
typedef void (*CanTpMessageSentCallback_t)(uint8_t connection_id, bool success);
typedef void (*CanTpErrorCallback_t)(uint8_t connection_id, uint32_t error_code);
/* CAN TP Functions */
KernelStatus_t can_tp_init(const CanTpConfig_t* config);
KernelStatus_t can_tp_deinit(void);
KernelStatus_t can_tp_send_message(const CanTpMessage_t* message,
uint32_t timeout_ms);
KernelStatus_t can_tp_receive_message(CanTpMessage_t* message,
uint32_t timeout_ms);
KernelStatus_t can_tp_register_callbacks(
CanTpMessageReceivedCallback_t rx_callback,
CanTpMessageSentCallback_t tx_callback,
CanTpErrorCallback_t error_callback);
void can_tp_process_rx_indication(const CanMessage_t* can_message);
void can_tp_process_tx_confirmation(uint8_t mailbox);
void can_tp_main_function(void); /* Periodic processing */
CanTpState_t can_tp_get_state(uint8_t connection_id);
#endif /* CAN_TP_H */