jianghuai/HARDWARE/CAN/CanDrvCtrl.h
2024-05-07 09:36:09 +08:00

112 lines
5.2 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __CANDRVCTRL_H__
#define __CANDRVCTRL_H__
/*********************************************************************************************************************
//CANDRVCTRL 作为传输协议与can驱动之间的中间层作为一个纽带来将两者进行连接
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
// CAN驱动<------> 驱动管理层
//////////////////////////////////////////////////////////////////////////////////////////////////////
//can通道id和can消息帧id两者之间的同事用canid来表示容易出现混淆
// 故用chan表示can通道
// 用frmid表示can消息帧id
//
//
//can驱动层将需要给传输层控制的接口通过st_cancb * RegisterCanIF(st_canif *if) 接口传给此模块
//st_cancb * RegisterCanIF(st_canif *if) 驱动层将某接口的控制权交给CanDrvCtrl模块
//参数st_canif 是驱动统一交给CanDrvCtrl 的接口列表,其中ConfigCan ,canSend和canid必须提供
//返回回调函数,驱动必须在适当的时候对其进行调用
*********************************************************************************************************************/
#include "porting.h"
typedef struct{
unsigned char chan; //can接口标识
bool (*ConfigCan)(unsigned char chan,unsigned short krate, bool highdomain,bool listen);
unsigned char (*canSend)(unsigned char chan,unsigned int canid,unsigned char *data,unsigned char len);//发送某个can msg返回此信息流水码,0xFFFFFFFF为失败
bool (*canClose)(unsigned char chan);
bool (*canHwPowerDown)(unsigned char chan);
bool (*canHwPowerUp)(unsigned char chan);
bool (*canBusFilterInit) (unsigned char chan ,unsigned int *filterID_array, unsigned short filterID_total);
bool (*canCloseFilter) (unsigned char chan);
}st_canif;
//下面这些接口需要“can驱动管理层”实现。hdlRemoteFrm若为NULL则不接收远程帧.
typedef struct{
void (*SendSuccessCb)(unsigned char chan,unsigned int index); //某个消息发送成功
void (*BusErrorCb)(unsigned char chan,bool sending); //总线错误
void (*BusErrorStsCb)(unsigned char chan,bool sending); //总线错误状态改变
void (*BusOffCb)(unsigned char chan); //总线进入BUS OFF 的回调
bool (*hdlFrmReceve)(unsigned char chan,unsigned int canid, const unsigned char *data,unsigned char len); //len = 0表示远程帧
}st_cancb;
st_cancb * RegisterCanIF(const st_canif *IF);
/*********************************************************************************************************************
//CANDRVCTRL 作为传输协议与can驱动之间的中间层作为一个纽带来将两者进行连接
//
//////////////////////////////////////////////////////////////////////////////////////////////////////
// 驱动管理层<------> 传输协议 **************************
//////////////////////////////////////////////////////////////////////////////////////////////////////
//bool InstallProtocalToIF(unsigned char canid, st_pl* pif, st_cl * pcanif); 将某个接口与协议之间进行连接
// 同一时间,一个接口仅仅可以与一个协议进行连接
//参数st_pl 是协议层需要提供的接口这些信息在需要的时候被CANDRVCTRL调用
//参数st_cl, 是CANDRVCTRL 提供的接口, 协议层可以通过这些接口进行数据发送等
*********************************************************************************************************************/
//控制层提供给协议层的接口
typedef struct{
//void(*cb)(unsigned int result) result :#define _SUCCESS 0 #define _FAILURE 1 #define _OVERTIME 2 #define _ABANDON 3
bool (*SEND)(unsigned char chan,unsigned int frmid,unsigned char *data,unsigned char len,unsigned int msgident,void(*cb)(unsigned int msgident,unsigned int result));//若长度为0则表示是远程帧。
bool (*REC)(unsigned char chan,unsigned int* frmid,unsigned char *data,unsigned char* len);//若长度为0则表示是远程帧。
unsigned int (*GetCurrentLinkSts)(unsigned char chan); //获取当前链状态
bool (*ConfigBus)(unsigned char chan,unsigned short krate, bool highdomain,bool listen);
bool (*canBusFilterInit) (unsigned char chan,unsigned int *filterID_array, unsigned short filterID_total);
bool (*CloseLink)(unsigned char chan);
}st_cl;
#define CAN_SEND_FASET_MODE 1
//协议层需要提供接口
#define CAN_FLG_SYNCRECEIVE 1 //接收后立马通过hdlRecCanMsg接口返回给应用层
//否则协议层通过REC接口来手动读取
typedef enum
{
e_sts_empty=0, //此接口上是空未有接口与其匹配,当调用RegisterCanIF后会变成unused
e_sts_unused,
e_sts_closed,
e_sts_working, //当前正在工作,未发送
e_sts_needsend, //当前正在发送
e_err_receive=0x80,
e_err_sending,
e_err_overfllow,
e_err_bussoff,
}e_link_sts;
typedef struct{
char prompt[32]; //提示
unsigned int flg; //bit0 = can消息接收方式
unsigned char resendTimes; //配置重发次数
unsigned char msgNumber; //接收、发送缓存队列个数
void (*hdlRecCanMsg)(unsigned int id, const unsigned char *data,unsigned char len); //len是0表示是远程帧
void (*hdlBusError)(e_link_sts err);
void (*hdlCommSent)(unsigned int msgident, unsigned int result); //通用发送结果的回调
}st_pl;
//st_pl* ppl, st_cl * pcl 这两个参数地址空间的分配应该在协议层调用的时候
bool InstallProtocalToIF(unsigned char chan, st_pl* ppl, st_cl * pcl);
bool UninstallProtocalToIF(unsigned char chan, st_pl* ppl);
//在处理过程中的一些消息处理机制
void hdlCanCtrlMsg(e_link_sts msg,unsigned char chan);
void InitCanDrvCtrlMode(void);
#endif