112 lines
5.2 KiB
C
112 lines
5.2 KiB
C
#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
|
||
|
||
|