2024-12-08 01:14:22 +00:00
|
|
|
|
#ifndef _ERPC_CORE_H_
|
|
|
|
|
#define _ERPC_CORE_H_
|
2024-11-21 08:59:31 +00:00
|
|
|
|
#include "config.h"
|
2024-11-20 15:03:26 +00:00
|
|
|
|
|
2024-12-08 01:14:22 +00:00
|
|
|
|
#define ERPC_VERSION_MAJOR 0
|
|
|
|
|
#define ERPC_VERSION_MINOR 0
|
|
|
|
|
#define ERPC_VERSION_PATCH 1
|
|
|
|
|
|
|
|
|
|
#define ERPC_HW_CACHE_SIZE 10 // erpc 硬件缓存大小,单位为包
|
|
|
|
|
#define ERPC_SEND_ONCE_TIMEOUT 30 // ERPC_数据包发送超时时间,单位为tick
|
|
|
|
|
#define ERPC_SEND_RETRY_COUNT 3 // ERPC_数据包重发次数
|
|
|
|
|
#define ERPC_ACK_TIMEOUT ERPC_SEND_ONCE_TIMEOUT // ERPC_ack超时时间,单位为tick
|
|
|
|
|
typedef struct erpc_package_head_t
|
|
|
|
|
{
|
|
|
|
|
u8 dest_id;
|
|
|
|
|
u8 src_id;
|
|
|
|
|
u16 port;
|
|
|
|
|
u8 type;
|
|
|
|
|
u16 len;
|
|
|
|
|
} erpc_package_head_t;
|
|
|
|
|
// crc16 只能保护256字节的有效数据,所以这里限制最大数据长度为256-sizeof(erpc_package_head_t)
|
|
|
|
|
#define ERPC_DATA_MAX_LEN (256 - sizeof(erpc_package_head_t))
|
|
|
|
|
typedef struct erpc_package_t
|
|
|
|
|
{
|
|
|
|
|
erpc_package_head_t head;
|
|
|
|
|
u16 crc;
|
|
|
|
|
u8 data[ERPC_DATA_MAX_LEN];
|
|
|
|
|
} erpc_package_t;
|
|
|
|
|
|
|
|
|
|
typedef struct erpc_packet_cache_t
|
|
|
|
|
{
|
|
|
|
|
u8 state;
|
|
|
|
|
u8 retry_count;
|
|
|
|
|
u8 timeout;
|
|
|
|
|
erpc_package_t package;
|
|
|
|
|
} erpc_packet_cache_t;
|
|
|
|
|
|
|
|
|
|
typedef enum cache_state
|
|
|
|
|
{
|
|
|
|
|
ERPC_CACHE_STA_FREE = 0, // 空闲状态
|
|
|
|
|
ERPC_CACHE_WAIT_SEND, // data包等待发送
|
|
|
|
|
ERPC_CACHE_SEND_ONCE, // 已经发送过一次,等待ack
|
|
|
|
|
ERPC_CACHE_SEND_REPEAT, // data包多次发送
|
|
|
|
|
ERPC_CACHE_SEND_GET_ACK, // data包发送完成,得到ack
|
|
|
|
|
ERPC_CACHE_HW_SEND_ERR, // 硬件发送失败
|
|
|
|
|
ERPC_CACHE_ERR_NO_RESP, // dest 无响应
|
|
|
|
|
ERPC_CACHE_RESP_DATA, // 收到响应包
|
|
|
|
|
|
|
|
|
|
ERPC_CACHE_REV_PACKAGE, // 收到数据包,但是还没有进行处理
|
|
|
|
|
ERPC_CACHE_RESP_ACK, // 接收到数据包,正在回复ack
|
|
|
|
|
ERPC_CACHE_WAIT_DEAL, // 等待处理线程处理数据,处理线程已经获取到处理权限
|
|
|
|
|
} cache_state;
|
|
|
|
|
|
|
|
|
|
typedef enum erpc_package_type
|
|
|
|
|
{
|
|
|
|
|
ERPC_PKG_TYPE_REQUEST = 0,
|
|
|
|
|
ERPC_PKG_TYPE_RESPONSE,
|
|
|
|
|
ERPC_PKG_TYPE_ACK,
|
|
|
|
|
} erpc_package_type;
|
|
|
|
|
typedef enum erpc_transport_error
|
|
|
|
|
{
|
|
|
|
|
ERPC_ERR_SEND_CACHE_FULL = 1,
|
|
|
|
|
ERPC_ERR_SEND_TIMEOUT,
|
|
|
|
|
ERPC_ERR_DATA_LEN_OVERFLOW,
|
|
|
|
|
ERPC_ERR_HW_SEND_FAIL,
|
|
|
|
|
ERPC_ERR_DEST_NO_RESP,
|
|
|
|
|
} erpc_transport_state;
|
|
|
|
|
|
|
|
|
|
typedef struct erpc_handle_list_t
|
|
|
|
|
{
|
|
|
|
|
u16 port;
|
|
|
|
|
void (*handle)(void *hw, u8 src_id, u16 port);
|
|
|
|
|
} erpc_handle_list_t;
|
2024-11-21 08:59:31 +00:00
|
|
|
|
/**
|
2024-12-08 01:14:22 +00:00
|
|
|
|
* 硬件层实现
|
2024-11-21 08:59:31 +00:00
|
|
|
|
*/
|
2024-12-08 01:14:22 +00:00
|
|
|
|
typedef struct erpc_hardware_t
|
|
|
|
|
{
|
|
|
|
|
erpc_packet_cache_t send_cache[ERPC_HW_CACHE_SIZE];
|
|
|
|
|
erpc_packet_cache_t recv_cache[ERPC_HW_CACHE_SIZE];
|
|
|
|
|
u8 local_id; // hardware 节点ID
|
|
|
|
|
u32 (*send)(u8 *data, u32 len); // 需要在内部实现lock功能,确保send函数是原子操作
|
|
|
|
|
u32 (*sleep)(u32 ms); // 睡眠函数
|
|
|
|
|
void (*lock)(void); // 锁函数
|
|
|
|
|
void (*unlock)(void); // 解锁函数
|
|
|
|
|
erpc_handle_list_t *handle_list; // 处理函数列表
|
|
|
|
|
} erpc_hardware_t;
|
|
|
|
|
|
|
|
|
|
#define CHECK_RETURN(condition, ret) \
|
|
|
|
|
if (condition) \
|
|
|
|
|
{ \
|
|
|
|
|
return ret; \
|
|
|
|
|
}
|
|
|
|
|
#define CHECK_RETURN_DO(condition, ret, handle) \
|
|
|
|
|
if (condition) \
|
|
|
|
|
{ \
|
|
|
|
|
handle; \
|
|
|
|
|
return ret; \
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
u32 erpc_send_and_wait_resp(erpc_hardware_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u8 *resp_data, u16 *resp_len, u32 timeout);
|
|
|
|
|
u32 erpc_resp(erpc_hardware_t *hw, u8 dest_id, u16 port, u8 *data, u16 len, u32 timeout);
|
|
|
|
|
|
|
|
|
|
u32 erpc_data_out_core(erpc_hardware_t *hw);
|
|
|
|
|
void erpc_write_recv_cache(erpc_hardware_t *hw, u8 *data, u16 len);
|
|
|
|
|
u32 erpc_data_in_core(erpc_hardware_t *hw);
|
|
|
|
|
u32 erpc_deal_core(erpc_hardware_t *hw);
|
|
|
|
|
#endif // _ERPC_CORE_H_
|