XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
CAN总线控制器
CAN总线控制器 的协作图:

结构体

struct  xwds_can_msg
 CAN消息 更多...
 
struct  xwds_canc_bd_cfg
 CAN总线控制器波特率配置 更多...
 
struct  xwds_canc_txobj_cfg
 CAN发送对象(消息)配置 更多...
 
struct  xwds_canc_rxobj_cfg
 CAN接收对象(消息)配置 更多...
 
struct  xwds_canc_cfg
 CAN控制器配置 更多...
 
struct  xwds_canc_driver
 BSP中需要提供的CAN控制器驱动函数表 更多...
 
struct  xwds_canc_cbtbl
 CAN控制器应用层回调函数表 更多...
 
struct  xwds_canc_rxqueue
 CAN控制器接收队列 更多...
 
struct  xwds_canc
 CAN控制器 更多...
 

宏定义

#define __xwds_canc_cbtbl_qualifier
 
#define XWDS_CANC_RXQNUM   (XWCDCFG_ds_CAN_CONTROLLER_RXQNUM)
 
#define XWDS_CANC_SDU_MAXSIZE   (XWCDCFG_ds_CAN_CONTROLLER_SDU_MAXSIZE)
 

枚举

enum  xwds_can_msgflag_em { XWDS_CAN_MSG_F_EXID = (1U) , XWDS_CAN_MSG_F_REMOTE = (2U) }
 CAN消息标志枚举 更多...
 
enum  xwds_canc_hwobj_type_em { XWDS_CANC_HWOBJ_T_ID_STD = ((xwbmp_t)1 << ( 0 )) , XWDS_CANC_HWOBJ_T_ID_EXT = ((xwbmp_t)1 << ( 1 )) , XWDS_CANC_HWOBJ_T_ID_MIXED = ((xwbmp_t)1 << ( 0 )) | ((xwbmp_t)1 << ( 1 )) }
 CAN对象(消息)类型 更多...
 
enum  xwds_canc_mode_em {
  XWDS_CANC_MODE_MIN = 0 , XWDS_CANC_MODE_UNINIT = XWDS_CANC_MODE_MIN , XWDS_CANC_MODE_STOPPED , XWDS_CANC_MODE_STARTED ,
  XWDS_CANC_MODE_SLEEP , XWDS_CANC_MODE_NUM
}
 CAN控制器的模式 更多...
 
enum  xwds_canc_err_em {
  CANC_ERR_NOERR = 0 , CANC_ERR_BUS , CANC_ERR_STUFF , CANC_ERR_FORM ,
  CANC_ERR_ACK , CANC_ERR_CRC , CANC_ERR_B1 , CANC_ERR_B0 ,
  CANC_ERR_ACKDELIMITER , CANC_ERR_PASSIVE , CANC_ERR_WARNING
}
 CAN控制器的错误码 更多...
 

函数

void xwds_canc_construct (struct xwds_canc *canc)
 XWDS API:CAN控制器的构造函数
 
void xwds_canc_destruct (struct xwds_canc *canc)
 XWDS API:CAN控制器对象的析构函数
 
xwer_t xwds_canc_grab (struct xwds_canc *canc)
 XWDS API:增加对象的引用计数
 
xwer_t xwds_canc_put (struct xwds_canc *canc)
 XWDS API:减少对象的引用计数
 
xwer_t xwds_canc_write (struct xwds_canc *canc, xwid_t txobjid, struct xwds_can_msg *msg)
 XWDS API:将一条CAN消息写入发送邮箱
 
xwer_t xwds_canc_enable_irqs (struct xwds_canc *canc)
 XWDS API:开启CAN控制器的中断
 
xwer_t xwds_canc_disable_irqs (struct xwds_canc *canc)
 XWDS API:关闭CAN控制器的中断
 
xwer_t xwds_canc_set_mode (struct xwds_canc *canc, xwsq_t mode)
 XWDS API:设置CAN控制器的模式
 
xwer_t xwds_canc_set_bd (struct xwds_canc *canc, xwid_t bdcfgid)
 XWDS API:设置CAN控制器的波特率
 
void xwds_canc_setcb_tx_indication (struct xwds_canc *canc, void(*cb)(struct xwds_canc *, xwid_t, xwer_t))
 XWDS API:设置 指示发送结果 的回调函数
 
void xwds_canc_setcb_rx_indication (struct xwds_canc *canc, void(*cb)(struct xwds_canc *, xwid_t, struct xwds_can_msg *))
 XWDS API:设置 指示接收结果 的回调函数
 
void xwds_canc_setcb_wakeup_notification (struct xwds_canc *canc, void(*cb)(struct xwds_canc *))
 XWDS API:设置 唤醒通知 回调函数
 
void xwds_canc_setcb_mode_indication (struct xwds_canc *canc, void(*cb)(struct xwds_canc *, xwsq_t))
 XWDS API:设置 模式切换通知 回调函数
 
void xwds_canc_setcb_err_indication (struct xwds_canc *canc, void(*cb)(struct xwds_canc *, xwsq_t, xwsq_t, xwsq_t))
 XWDS API:设置 错误通知 回调函数
 
void xwds_canc_setcb_busoff_indication (struct xwds_canc *canc, void(*cb)(struct xwds_canc *))
 XWDS API:设置 BUSOFF通知 回调函数
 
void xwds_canc_rxq_init (struct xwds_canc_rxqueue *rxq)
 XWDS API:初始化接收缓冲队列
 
void xwds_canc_rxq_publish (struct xwds_canc_rxqueue *rxq, struct xwds_can_msg *msg)
 XWDS API:发布一条消息到接收缓冲队列中
 
xwer_t xwds_canc_rxq_acquire (struct xwds_canc_rxqueue *rxq, struct xwds_can_msg *buf, xwtm_t to)
 XWDS API:从接收缓冲队列中获取一条消息
 
void xwds_canc_drvcb_init_msg (struct xwds_can_msg *msg, xwu32_t canid, xwsq_t flag, xwsz_t dlc, xwu8_t sdu[])
 XWDS Driver Callback:初始化CAN总线消息结构体
 
void xwds_canc_drvcb_tx_indication (struct xwds_canc *canc, xwid_t txobjid, xwer_t rc)
 XWDS Driver Callback:指示发送结果
 
void xwds_canc_drvcb_rx_indication (struct xwds_canc *canc, xwid_t rxobjid, struct xwds_can_msg *rxmsg)
 XWDS Driver Callback:接收到CAN消息后的回调函数
 
void xwds_canc_drvcb_wakeup_notification (struct xwds_canc *canc)
 XWDS Driver Callback:CAN控制器的唤醒通知
 
void xwds_canc_drvcb_mode_indication (struct xwds_canc *canc, xwsq_t mode)
 XWDS Driver Callback:指示CAN控制器的模式已经切换
 
void xwds_canc_drvcb_err_indication (struct xwds_canc *canc, xwsq_t errcode, xwsq_t tec, xwsq_t rec)
 XWDS Driver Callback:指示CAN控制器发生错误
 
void xwds_canc_drvcb_busoff_indication (struct xwds_canc *canc)
 XWDS Driver Callback:指示CAN控制器发生busoff
 

详细描述

宏定义说明

◆ __xwds_canc_cbtbl_qualifier

#define __xwds_canc_cbtbl_qualifier

在文件 controller.h46 行定义.

◆ XWDS_CANC_RXQNUM

#define XWDS_CANC_RXQNUM   (XWCDCFG_ds_CAN_CONTROLLER_RXQNUM)

在文件 controller.h49 行定义.

◆ XWDS_CANC_SDU_MAXSIZE

#define XWDS_CANC_SDU_MAXSIZE   (XWCDCFG_ds_CAN_CONTROLLER_SDU_MAXSIZE)

在文件 controller.h50 行定义.

枚举类型说明

◆ xwds_can_msgflag_em

CAN消息标志枚举

枚举值
XWDS_CAN_MSG_F_EXID 

扩展ID,BIT(0)

XWDS_CAN_MSG_F_REMOTE 

远程帧,BIT(1)

在文件 controller.h55 行定义.

55 {
56 XWDS_CAN_MSG_F_EXID = (1U),
58};
@ XWDS_CAN_MSG_F_REMOTE
Definition controller.h:57
@ XWDS_CAN_MSG_F_EXID
Definition controller.h:56

◆ xwds_canc_err_em

CAN控制器的错误码

枚举值
CANC_ERR_NOERR 
CANC_ERR_BUS 

bus error

CANC_ERR_STUFF 

stuff error

CANC_ERR_FORM 

form error

CANC_ERR_ACK 

ACK error

CANC_ERR_CRC 

CRC Error Flag

CANC_ERR_B1 

Recessive Bit Error Flag

CANC_ERR_B0 

Dominant Bit Error Flag

CANC_ERR_ACKDELIMITER 

ACK Delimiter Error Flag

CANC_ERR_PASSIVE 

TX/RX Error counter > 127

CANC_ERR_WARNING 

TX/RX Error counter > WARNING limit

在文件 controller.h154 行定义.

154 {
155 CANC_ERR_NOERR = 0,
166};
@ CANC_ERR_CRC
Definition controller.h:160
@ CANC_ERR_STUFF
Definition controller.h:157
@ CANC_ERR_FORM
Definition controller.h:158
@ CANC_ERR_NOERR
Definition controller.h:155
@ CANC_ERR_B1
Definition controller.h:161
@ CANC_ERR_B0
Definition controller.h:162
@ CANC_ERR_ACK
Definition controller.h:159
@ CANC_ERR_ACKDELIMITER
Definition controller.h:163
@ CANC_ERR_WARNING
Definition controller.h:165
@ CANC_ERR_PASSIVE
Definition controller.h:164
@ CANC_ERR_BUS
Definition controller.h:156

◆ xwds_canc_hwobj_type_em

CAN对象(消息)类型

枚举值
XWDS_CANC_HWOBJ_T_ID_STD 

标准帧

XWDS_CANC_HWOBJ_T_ID_EXT 

扩展帧

XWDS_CANC_HWOBJ_T_ID_MIXED 

混合帧

在文件 controller.h89 行定义.

89 {
93};
@ XWDS_CANC_HWOBJ_T_ID_EXT
Definition controller.h:91
@ XWDS_CANC_HWOBJ_T_ID_STD
Definition controller.h:90
@ XWDS_CANC_HWOBJ_T_ID_MIXED
Definition controller.h:92
#define XWBOP_BIT(n)
Definition xwbop.h:27

◆ xwds_canc_mode_em

CAN控制器的模式

枚举值
XWDS_CANC_MODE_MIN 
XWDS_CANC_MODE_UNINIT 

UNINIT mode. Default mode of the CAN driver and all CAN controllers connected to one CAN network after power on.

XWDS_CANC_MODE_STOPPED 

STOPPED mode. At least one of all CAN controllers connected to one CAN network are halted and does not operate on the bus.

XWDS_CANC_MODE_STARTED 

STARTED mode. All CAN controllers connected to one CAN network are started by the CAN driver and in full-operational mode.

XWDS_CANC_MODE_SLEEP 

SLEEP mode. At least one of all CAN controllers connected to one CAN network are set into the SLEEP mode and can be woken up by request of the CAN driver or by a network event (must be supported by CAN hardware)

XWDS_CANC_MODE_NUM 

number of CAN controller modes

在文件 controller.h130 行定义.

130 {
149};
@ XWDS_CANC_MODE_STOPPED
Definition controller.h:137
@ XWDS_CANC_MODE_MIN
Definition controller.h:131
@ XWDS_CANC_MODE_UNINIT
Definition controller.h:132
@ XWDS_CANC_MODE_NUM
Definition controller.h:148
@ XWDS_CANC_MODE_STARTED
Definition controller.h:140
@ XWDS_CANC_MODE_SLEEP
Definition controller.h:143

函数说明

◆ xwds_canc_construct()

void xwds_canc_construct ( struct xwds_canc canc)

XWDS API:CAN控制器的构造函数

参数
[in]cancCAN控制器对象指针

在文件 controller.c62 行定义.

63{
65 canc->bc.dev.vop = &xwds_canc_vop;
66}
const struct xwds_virtual_operation xwds_canc_vop
Definition controller.c:49
void xwds_device_construct(struct xwds_device *dev)
XWDS API:设备的构造函数
Definition device.c:48
struct xwds_device dev
Definition controller.h:216
union xwds_canc::@15 bc
const struct xwds_virtual_operation * vop
Definition device.h:138
函数调用图:

◆ xwds_canc_destruct()

void xwds_canc_destruct ( struct xwds_canc canc)

XWDS API:CAN控制器对象的析构函数

参数
[in]cancCAN控制器对象指针

在文件 controller.c69 行定义.

70{
72}
void xwds_device_destruct(struct xwds_device *dev)
XWDS API:设备的析构函数
Definition device.c:56
函数调用图:

◆ xwds_canc_disable_irqs()

xwer_t xwds_canc_disable_irqs ( struct xwds_canc canc)

XWDS API:关闭CAN控制器的中断

参数
[in]cancCAN控制器对象指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c257 行定义.

258{
259 const struct xwds_canc_driver * drv;
260 xwer_t rc;
261
262 XWDS_VALIDATE(canc, "nullptr", -EFAULT);
263
264 rc = xwds_canc_grab(canc);
265 if (rc < 0) {
266 goto err_canc_grab;
267 }
268 drv = xwds_cast(const struct xwds_canc_driver *, canc->bc.dev.drv);
269 if ((drv) && (drv->disable_irqs)) {
270 rc = drv->disable_irqs(canc);
271 } else {
272 rc = -ENOSYS;
273 }
274 if (rc < 0) {
275 goto err_canc_drv_disable_irqs;
276 }
277 xwds_canc_put(canc);
278 return XWOK;
279
280err_canc_drv_disable_irqs:
281 xwds_canc_put(canc);
282err_canc_grab:
283 return rc;
284}
xwer_t xwds_canc_put(struct xwds_canc *canc)
XWDS API:减少对象的引用计数
Definition controller.c:81
xwer_t xwds_canc_grab(struct xwds_canc *canc)
XWDS API:增加对象的引用计数
Definition controller.c:75
#define xwds_cast(type, dev)
Definition standard.h:40
#define XWDS_VALIDATE(exp, errstr,...)
Definition standard.h:51
#define EFAULT
Bad address
Definition errno.h:44
#define ENOSYS
Function not implemented
Definition errno.h:110
#define XWOK
No error
Definition errno.h:182
signed long xwer_t
Definition type.h:554
BSP中需要提供的CAN控制器驱动函数表
Definition controller.h:173
xwer_t(* disable_irqs)(struct xwds_canc *)
Definition controller.h:181
const struct xwds_driver * drv
Definition device.h:133
函数调用图:

◆ xwds_canc_drvcb_busoff_indication()

void xwds_canc_drvcb_busoff_indication ( struct xwds_canc canc)

XWDS Driver Callback:指示CAN控制器发生busoff

参数
[in]cancCAN控制器对象指针

此回调函数在中断上下文中被调用,用于通知BUSOFF。

在文件 controller.c589 行定义.

590{
592
593 cbtbl = canc->cbtbl;
594 if ((cbtbl) && (cbtbl->busoff_indication)) {
595 cbtbl->busoff_indication(canc);
596 }
597}
#define __xwds_canc_cbtbl_qualifier
Definition controller.h:46
CAN控制器应用层回调函数表
Definition controller.h:187
void(* busoff_indication)(struct xwds_canc *)
Definition controller.h:196
struct xwds_canc_cbtbl * cbtbl
Definition controller.h:227

◆ xwds_canc_drvcb_err_indication()

void xwds_canc_drvcb_err_indication ( struct xwds_canc canc,
xwsq_t  errcode,
xwsq_t  tec,
xwsq_t  rec 
)

XWDS Driver Callback:指示CAN控制器发生错误

参数
[in]cancCAN控制器对象指针
[in]errcode错误码
[in]tec发送错误计数
[in]rec接收错误计数

此回调函数在中断上下文中被调用,用于通知错误。

在文件 controller.c577 行定义.

579{
581
582 cbtbl = canc->cbtbl;
583 if ((cbtbl) && (cbtbl->err_indication)) {
584 cbtbl->err_indication(canc, errcode, tec, rec);
585 }
586}
void(* err_indication)(struct xwds_canc *, xwsq_t, xwsq_t, xwsq_t)
Definition controller.h:194

◆ xwds_canc_drvcb_init_msg()

void xwds_canc_drvcb_init_msg ( struct xwds_can_msg msg,
xwu32_t  canid,
xwsq_t  flag,
xwsz_t  dlc,
xwu8_t  sdu[] 
)

XWDS Driver Callback:初始化CAN总线消息结构体

参数
[in]msgCAN总线消息结构体的指针
[in]sdu数据缓冲区的指针

在文件 controller.c517 行定义.

519{
520 msg->id = canid;
521 msg->flag = flag;
522 msg->dlc = dlc;
523 if (sdu) {
524 memcpy(msg->sdu, sdu, dlc);
525 } else {
526 memset(msg->sdu, 0, XWDS_CANC_SDU_MAXSIZE);
527 }
528}
#define XWDS_CANC_SDU_MAXSIZE
Definition controller.h:50
xwsq_t flag
Definition controller.h:65
xwu32_t id
Definition controller.h:64
xwu8_t sdu[(8U)]
Definition controller.h:67

◆ xwds_canc_drvcb_mode_indication()

void xwds_canc_drvcb_mode_indication ( struct xwds_canc canc,
xwsq_t  mode 
)

XWDS Driver Callback:指示CAN控制器的模式已经切换

参数
[in]cancCAN控制器对象指针
[in]mode当前模式

此回调函数在中断上下文中被调用,用于通知模式切换。

在文件 controller.c566 行定义.

567{
569
570 cbtbl = canc->cbtbl;
571 if ((cbtbl) && (cbtbl->mode_indication)) {
572 cbtbl->mode_indication(canc, mode);
573 }
574}
void(* mode_indication)(struct xwds_canc *, xwsq_t)
Definition controller.h:193
这是这个函数的调用关系图:

◆ xwds_canc_drvcb_rx_indication()

void xwds_canc_drvcb_rx_indication ( struct xwds_canc canc,
xwid_t  rxobjid,
struct xwds_can_msg rxmsg 
)

XWDS Driver Callback:接收到CAN消息后的回调函数

参数
[in]cancCAN控制器对象指针
[in]rxobjid接收邮箱的ID
[out]rxmsg指向缓冲区的指针,通过此缓冲区返回接收到的CAN消息

此回调函数在中断上下文中调用,用于通知接收结果。

rxmsg 所指向的缓冲区的生命周期只在这个函数内有效。

在文件 controller.c543 行定义.

545{
547
548 cbtbl = canc->cbtbl;
549 if ((cbtbl) && (cbtbl->rx_indication)) {
550 cbtbl->rx_indication(canc, rxobjid, rxmsg);
551 }
552}
void(* rx_indication)(struct xwds_canc *, xwid_t, struct xwds_can_msg *)
Definition controller.h:190

◆ xwds_canc_drvcb_tx_indication()

void xwds_canc_drvcb_tx_indication ( struct xwds_canc canc,
xwid_t  txobjid,
xwer_t  rc 
)

XWDS Driver Callback:指示发送结果

参数
[in]cancCAN控制器对象指针
[in]txobjid发送邮箱的ID
[in]rc发送结果

此回调函数在中断上下文中被调用,用于通知接收结果。

在文件 controller.c531 行定义.

533{
535
536 cbtbl = canc->cbtbl;
537 if ((cbtbl) && (cbtbl->tx_indication)) {
538 cbtbl->tx_indication(canc, txobjid, rc);
539 }
540}
void(* tx_indication)(struct xwds_canc *, xwid_t, xwer_t)
Definition controller.h:188

◆ xwds_canc_drvcb_wakeup_notification()

void xwds_canc_drvcb_wakeup_notification ( struct xwds_canc canc)

XWDS Driver Callback:CAN控制器的唤醒通知

参数
[in]cancCAN控制器对象指针

此回调函数在中断上下文中被调用,用于通知唤醒。

在文件 controller.c555 行定义.

556{
558
559 cbtbl = canc->cbtbl;
560 if ((cbtbl) && (cbtbl->wakeup_notification)) {
561 cbtbl->wakeup_notification(canc);
562 }
563}
void(* wakeup_notification)(struct xwds_canc *)
Definition controller.h:192

◆ xwds_canc_enable_irqs()

xwer_t xwds_canc_enable_irqs ( struct xwds_canc canc)

XWDS API:开启CAN控制器的中断

参数
[in]cancCAN控制器对象指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c227 行定义.

228{
229 const struct xwds_canc_driver * drv;
230 xwer_t rc;
231
232 XWDS_VALIDATE(canc, "nullptr", -EFAULT);
233
234 rc = xwds_canc_grab(canc);
235 if (rc < 0) {
236 goto err_canc_grab;
237 }
238 drv = xwds_cast(const struct xwds_canc_driver *, canc->bc.dev.drv);
239 if ((drv) && (drv->enable_irqs)) {
240 rc = drv->enable_irqs(canc);
241 } else {
242 rc = -ENOSYS;
243 }
244 if (rc < 0) {
245 goto err_canc_drv_enable_irqs;
246 }
247 xwds_canc_put(canc);
248 return XWOK;
249
250err_canc_drv_enable_irqs:
251 xwds_canc_put(canc);
252err_canc_grab:
253 return rc;
254}
xwer_t(* enable_irqs)(struct xwds_canc *)
Definition controller.h:180
函数调用图:

◆ xwds_canc_grab()

xwer_t xwds_canc_grab ( struct xwds_canc canc)

XWDS API:增加对象的引用计数

参数
[in]cancCAN控制器对象指针

在文件 controller.c75 行定义.

76{
77 return xwds_device_grab(&canc->bc.dev);
78}
static xwer_t xwds_device_grab(struct xwds_device *dev)
XWDS API:增加对象的引用计数
Definition device.h:268
函数调用图:
这是这个函数的调用关系图:

◆ xwds_canc_put()

xwer_t xwds_canc_put ( struct xwds_canc canc)

XWDS API:减少对象的引用计数

参数
[in]cancCAN控制器对象指针

在文件 controller.c81 行定义.

82{
83 return xwds_device_put(&canc->bc.dev);
84}
static xwer_t xwds_device_put(struct xwds_device *dev)
XWDS API:减少对象的引用计数
Definition device.h:281
函数调用图:
这是这个函数的调用关系图:

◆ xwds_canc_rxq_acquire()

xwer_t xwds_canc_rxq_acquire ( struct xwds_canc_rxqueue rxq,
struct xwds_can_msg buf,
xwtm_t  to 
)

XWDS API:从接收缓冲队列中获取一条消息

参数
[in]rxq接收缓冲队列对象指针
[in]buf获取CAN消息结构体的缓存指针
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
注解
  • 上下文:线程

如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 controller.c400 行定义.

403{
404 xwer_t rc;
405 xwreg_t cpuirq;
406
407 XWDS_VALIDATE(rxq, "nullptr", -EFAULT);
408 XWDS_VALIDATE(buf, "nullptr", -EFAULT);
409
410 rc = xwos_sem_wait_to(&rxq->sem, to);
411 if (rc < 0) {
412 goto err_sem_wait_to;
413 }
414 xwos_splk_lock_cpuirqsv(&rxq->lock, &cpuirq);
415 *buf = rxq->q[rxq->pos];
416 rxq->pos++;
417 if (rxq->pos >= (xwssq_t)XWDS_CANC_RXQNUM) {
418 rxq->pos = 0;
419 }
420 xwos_splk_unlock_cpuirqrs(&rxq->lock, cpuirq);
421 return XWOK;
422
423err_sem_wait_to:
424 return rc;
425}
#define XWDS_CANC_RXQNUM
Definition controller.h:49
signed long xwssq_t
Definition type.h:461
xwptr_t xwreg_t
Definition type.h:409
static void xwos_splk_unlock_cpuirqrs(struct xwos_splk *spl, xwreg_t cpuirq)
XWOS API:解锁自旋锁,并恢复本地CPU的中断标志
Definition spinlock.h:224
static void xwos_splk_lock_cpuirqsv(struct xwos_splk *spl, xwreg_t *cpuirq)
XWOS API:上锁自旋锁,保存本地CPU的中断标志并关闭
Definition spinlock.h:192
static xwer_t xwos_sem_wait_to(struct xwos_sem *sem, xwtm_t to)
XWOS API:限时等待并获取信号量
Definition sem.h:418
struct xwos_sem sem
Definition controller.h:204
struct xwds_can_msg q[(8U)]
Definition controller.h:203
struct xwos_splk lock
Definition controller.h:205
函数调用图:

◆ xwds_canc_rxq_init()

void xwds_canc_rxq_init ( struct xwds_canc_rxqueue rxq)

XWDS API:初始化接收缓冲队列

参数
[in]rxq接收缓冲队列对象指针
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c365 行定义.

366{
367 xwos_splk_init(&rxq->lock);
368 memset(rxq->q, 0, sizeof(rxq->q));
369 rxq->pos = 0;
370 rxq->num = 0;
372}
static void xwos_splk_init(struct xwos_splk *spl)
XWOS API:初始化自旋锁
Definition spinlock.h:89
static xwer_t xwos_sem_init(struct xwos_sem *sem, xwssq_t val, xwssq_t max)
XWOS API:静态方式初始化信号量对象
Definition sem.h:125
函数调用图:

◆ xwds_canc_rxq_publish()

void xwds_canc_rxq_publish ( struct xwds_canc_rxqueue rxq,
struct xwds_can_msg msg 
)

XWDS API:发布一条消息到接收缓冲队列中

参数
[in]rxq接收缓冲队列对象指针
[in]msg待发布的CAN消息结构体指针
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c375 行定义.

377{
378 xwreg_t cpuirq;
379
380 xwos_splk_lock_cpuirqsv(&rxq->lock, &cpuirq);
381 memcpy(&rxq->q[rxq->num], msg, sizeof(struct xwds_can_msg));
382 rxq->num++;
383 if (rxq->num >= (xwssz_t)XWDS_CANC_RXQNUM) {
384 rxq->num = 0;
385 }
386 if (rxq->num == rxq->pos) {
387 /* Queue is overflow. Discard the oldest data */
388 rxq->pos++;
389 if (rxq->pos >= (xwssq_t)XWDS_CANC_RXQNUM) {
390 rxq->pos = 0;
391 }
392 xwos_splk_unlock_cpuirqrs(&rxq->lock, cpuirq);
393 } else {
394 xwos_splk_unlock_cpuirqrs(&rxq->lock, cpuirq);
395 xwos_sem_post(&rxq->sem);
396 }
397}
signed long xwssz_t
Definition type.h:355
static xwer_t xwos_sem_post(struct xwos_sem *sem)
XWOS API:发布信号量
Definition sem.h:373
CAN消息
Definition controller.h:63
函数调用图:

◆ xwds_canc_set_bd()

xwer_t xwds_canc_set_bd ( struct xwds_canc canc,
xwid_t  bdcfgid 
)

XWDS API:设置CAN控制器的波特率

参数
[in]cancCAN控制器对象指针
[in]id波特率的ID
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE错误的波特率ID
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c327 行定义.

328{
329 xwer_t rc;
330 const struct xwds_canc_driver * drv;
331 const struct xwds_canc_bd_cfg * bdcfg;
332
333 XWDS_VALIDATE(canc, "nullptr", -EFAULT);
334
335 rc = xwds_canc_grab(canc);
336 if (rc < 0) {
337 goto err_canc_grab;
338 }
339 if (bdcfgid >= canc->cfg->bdcfgs_num) {
340 rc = -ERANGE;
341 goto err_nobd;
342 }
343 bdcfg = &canc->cfg->bdcfgs[bdcfgid];
344 drv = xwds_cast(const struct xwds_canc_driver *, canc->bc.dev.drv);
345 if ((drv) && (drv->set_bd)) {
346 rc = drv->set_bd(canc, bdcfg);
347 } else {
348 rc = -ENOSYS;
349 }
350 if (rc < 0) {
351 goto err_drv_set_bd;
352 }
353 xwds_canc_put(canc);
354 return XWOK;
355
356err_drv_set_bd:
357err_nobd:
358 xwds_canc_put(canc);
359err_canc_grab:
360 return rc;
361}
#define ERANGE
Result too large
Definition errno.h:64
CAN总线控制器波特率配置
Definition controller.h:73
const struct xwds_canc_bd_cfg * bdcfgs
Definition controller.h:117
xwsz_t bdcfgs_num
Definition controller.h:118
xwer_t(* set_bd)(struct xwds_canc *, const struct xwds_canc_bd_cfg *)
Definition controller.h:178
const struct xwds_canc_cfg * cfg
Definition controller.h:226
函数调用图:

◆ xwds_canc_set_mode()

xwer_t xwds_canc_set_mode ( struct xwds_canc canc,
xwsq_t  mode 
)

XWDS API:设置CAN控制器的模式

参数
[in]cancCAN控制器对象指针
[in]mode模式
返回
错误码
返回值
OK模式切换完成
-EFAULT无效指针
-EALREADY控制器已经处于此模式
-ERANGE无效的模式
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c287 行定义.

288{
289 const struct xwds_canc_driver * drv;
290 xwer_t rc;
291
292 XWDS_VALIDATE(canc, "nullptr", -EFAULT);
293 XWDS_VALIDATE((mode < XWDS_CANC_MODE_NUM), "out-of-range", -ERANGE);
294
295 rc = xwds_canc_grab(canc);
296 if (rc < 0) {
297 goto err_canc_grab;
298 }
299
300 if (canc->mode == mode) {
301 rc = -EALREADY;
302 goto err_same_mode;
303 }
304 drv = xwds_cast(const struct xwds_canc_driver *, canc->bc.dev.drv);
305 if ((drv) && (drv->set_mode)) {
306 rc = drv->set_mode(canc, mode);
307 } else {
308 rc = -ENOSYS;
309 }
310 if (rc < 0) {
311 goto err_drv_set_mode;
312 }
313 canc->mode = mode;
314
315 xwds_canc_put(canc);
317 return XWOK;
318
319err_drv_set_mode:
320err_same_mode:
321 xwds_canc_put(canc);
322err_canc_grab:
323 return rc;
324}
void xwds_canc_drvcb_mode_indication(struct xwds_canc *canc, xwsq_t mode)
XWDS Driver Callback:指示CAN控制器的模式已经切换
Definition controller.c:566
#define EALREADY
Socket already connected
Definition errno.h:133
xwer_t(* set_mode)(struct xwds_canc *, xwsq_t)
Definition controller.h:177
xwsq_t mode
Definition controller.h:231
函数调用图:

◆ xwds_canc_setcb_busoff_indication()

void xwds_canc_setcb_busoff_indication ( struct xwds_canc canc,
void(*)(struct xwds_canc *)  cb 
)

XWDS API:设置 BUSOFF通知 回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c503 行定义.

505{
506#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
507 if (canc->cbtbl) {
508 canc->cbtbl->busoff_indication = cb;
509 }
510#else
511 XWOS_UNUSED(canc);
512 XWOS_UNUSED(cb);
513#endif
514}
#define XWOS_UNUSED(x)
Definition standard.h:66

◆ xwds_canc_setcb_err_indication()

void xwds_canc_setcb_err_indication ( struct xwds_canc canc,
void(*)(struct xwds_canc *, xwsq_t, xwsq_t, xwsq_t cb 
)

XWDS API:设置 错误通知 回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c488 行定义.

491{
492#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
493 if (canc->cbtbl) {
494 canc->cbtbl->err_indication = cb;
495 }
496#else
497 XWOS_UNUSED(canc);
498 XWOS_UNUSED(cb);
499#endif
500}

◆ xwds_canc_setcb_mode_indication()

void xwds_canc_setcb_mode_indication ( struct xwds_canc canc,
void(*)(struct xwds_canc *, xwsq_t cb 
)

XWDS API:设置 模式切换通知 回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c474 行定义.

476{
477#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
478 if (canc->cbtbl) {
479 canc->cbtbl->mode_indication = cb;
480 }
481#else
482 XWOS_UNUSED(canc);
483 XWOS_UNUSED(cb);
484#endif
485}

◆ xwds_canc_setcb_rx_indication()

void xwds_canc_setcb_rx_indication ( struct xwds_canc canc,
void(*)(struct xwds_canc *, xwid_t, struct xwds_can_msg *)  cb 
)

XWDS API:设置 指示接收结果 的回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c444 行定义.

448{
449#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
450 if (canc->cbtbl) {
451 canc->cbtbl->rx_indication = cb;
452 }
453#else
454 XWOS_UNUSED(canc);
455 XWOS_UNUSED(cb);
456#endif
457}

◆ xwds_canc_setcb_tx_indication()

void xwds_canc_setcb_tx_indication ( struct xwds_canc canc,
void(*)(struct xwds_canc *, xwid_t, xwer_t cb 
)

XWDS API:设置 指示发送结果 的回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c429 行定义.

432{
433#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
434 if (canc->cbtbl) {
435 canc->cbtbl->tx_indication = cb;
436 }
437#else
438 XWOS_UNUSED(canc);
439 XWOS_UNUSED(cb);
440#endif
441}

◆ xwds_canc_setcb_wakeup_notification()

void xwds_canc_setcb_wakeup_notification ( struct xwds_canc canc,
void(*)(struct xwds_canc *)  cb 
)

XWDS API:设置 唤醒通知 回调函数

参数
[in]cancCAN总线消息结构体的指针
[in]cb回调函数
注解
  • 上下文:中断、中断底半部、线程

在文件 controller.c460 行定义.

462{
463#if !defined(XWCDCFG_ds_CAN_CONTROLLER_ROCBT) || (1 != XWCDCFG_ds_CAN_CONTROLLER_ROCBT)
464 if (canc->cbtbl) {
465 canc->cbtbl->wakeup_notification = cb;
466 }
467#else
468 XWOS_UNUSED(canc);
469 XWOS_UNUSED(cb);
470#endif
471}

◆ xwds_canc_write()

xwer_t xwds_canc_write ( struct xwds_canc canc,
xwid_t  txobjid,
struct xwds_can_msg msg 
)

XWDS API:将一条CAN消息写入发送邮箱

参数
[in]cancCAN控制器对象指针
[in]txobjid发送邮箱的ID
[in]msgCAN消息结构体的指针
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE找不到邮箱
-EBADSLT邮箱配置与消息类型不匹配
-ETIMEDOUT超时
注解
  • 上下文:线程

<No error

在文件 controller.c173 行定义.

175{
176 const struct xwds_canc_txobj_cfg * txobjcfg;
177 const struct xwds_canc_driver * drv;
178 xwer_t rc;
179
180 XWDS_VALIDATE(canc, "nullptr", -EFAULT);
181 XWDS_VALIDATE(msg, "nullptr", -EFAULT);
182
183 rc = xwds_canc_grab(canc);
184 if (rc < 0) {
185 goto err_canc_grab;
186 }
187
188 if (txobjid >= canc->cfg->txobjs_num) {
189 rc = -ERANGE;
190 goto err_txobjid;
191 }
192
193 txobjcfg = &canc->cfg->txobjs[txobjid];
194 if (XWDS_CAN_MSG_F_EXID & msg->flag) {
195 if (!(XWDS_CANC_HWOBJ_T_ID_EXT & txobjcfg->type)) {
196 rc = -EBADSLT;
197 goto err_badtxobj;
198 }
199 } else {
200 if (!(XWDS_CANC_HWOBJ_T_ID_STD & txobjcfg->type)) {
201 rc = -EBADSLT;
202 goto err_badtxobj;
203 }
204 }
205 drv = xwds_cast(const struct xwds_canc_driver *, canc->bc.dev.drv);
206 if ((drv) && (drv->write)) {
207 rc = drv->write(canc, txobjcfg, msg);
208 } else {
209 rc = -ENOSYS;
210 }
211 if (rc < 0) {
212 goto err_drv_write;
213 }
214 xwds_canc_put(canc);
215
216 return XWOK;
217
218err_drv_write:
219err_badtxobj:
220err_txobjid:
221 xwds_canc_put(canc);
222err_canc_grab:
223 return rc;
224}
#define EBADSLT
Invalid slot
Definition errno.h:82
const struct xwds_canc_txobj_cfg * txobjs
Definition controller.h:120
xwsz_t txobjs_num
Definition controller.h:121
xwer_t(* write)(struct xwds_canc *, const struct xwds_canc_txobj_cfg *, struct xwds_can_msg *)
Definition controller.h:175
CAN发送对象(消息)配置
Definition controller.h:98
函数调用图: