#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