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

结构体

struct  xwds_uart_cfg
 UART配置 更多...
 
struct  xwds_uartc_driver
 BSP中需要提供的UART控制器驱动函数表 更多...
 
struct  xwds_uartc
 UART控制器 更多...
 

宏定义

#define XWDS_UART_RXQ_SIZE   XWCDCFG_ds_UART_RXQ_SIZE
 

类型定义

typedef void(* xwds_uartc_eqcb_f) (struct xwds_uartc *, xwer_t)
 异步发送的回调函数类型
 

枚举

enum  xwds_uart_bits_em {
  XWDS_UART_BITS_5 = 0U , XWDS_UART_BITS_6 , XWDS_UART_BITS_7 , XWDS_UART_BITS_8 ,
  XWDS_UART_BITS_9
}
 UART字长枚举 更多...
 
enum  xwds_uart_stopbits_em { XWDS_UART_STOPBITS_0_5 = 0U , XWDS_UART_STOPBITS_1_0 , XWDS_UART_STOPBITS_1_5 , XWDS_UART_STOPBITS_2_0 }
 UART停止位枚举 更多...
 
enum  xwds_uart_parity_em { XWDS_UART_PARITY_NONE = 0U , XWDS_UART_PARITY_EVEN , XWDS_UART_PARITY_ODD }
 UART奇偶校验枚举 更多...
 
enum  xwds_uart_hardwareflowcontrol_em { XWDS_UART_HFC_NONE = 0U , XWDS_UART_HFC_RTS = ((xwbmp_t)1 << ( 0 )) , XWDS_UART_HFC_CTS = ((xwbmp_t)1 << ( 1 )) }
 UART硬件流控枚举 更多...
 
enum  xwds_uart_mode_em { XWDS_UART_MODE_CLOSE = 0U , XWDS_UART_MODE_TX = ((xwbmp_t)1 << ( 0 )) , XWDS_UART_MODE_RX = ((xwbmp_t)1 << ( 1 )) }
 UART模式枚举 更多...
 

函数

void xwds_uartc_construct (struct xwds_uartc *uartc)
 XWDS API:UART控制器的构造函数
 
void xwds_uartc_destruct (struct xwds_uartc *uartc)
 XWDS API:UART控制器对象的析构函数
 
xwer_t xwds_uartc_grab (struct xwds_uartc *uartc)
 增加对象的引用计数
 
xwer_t xwds_uartc_put (struct xwds_uartc *uartc)
 减少对象的引用计数
 
xwer_t xwds_uartc_rx (struct xwds_uartc *uartc, xwu8_t *buf, xwsz_t *size, xwtm_t to)
 XWDS API:从接收队列中获取数据
 
xwer_t xwds_uartc_try_rx (struct xwds_uartc *uartc, xwu8_t *buf, xwsz_t *size)
 XWDS API:尝试从接收队列中获取数据
 
xwer_t xwds_uartc_tx (struct xwds_uartc *uartc, const xwu8_t *data, xwsz_t *size, xwtm_t to)
 XWDS API:同步发送
 
xwer_t xwds_uartc_eq (struct xwds_uartc *uartc, const xwu8_t *data, xwsz_t *size, xwds_uartc_eqcb_f cb)
 XWDS API:异步发送
 
xwer_t xwds_uartc_putc (struct xwds_uartc *uartc, const xwu8_t byte, xwtm_t to)
 XWDS API:直接发送一个字节(非DMA模式)
 
xwer_t xwds_uartc_cfg (struct xwds_uartc *uartc, const struct xwds_uart_cfg *cfg)
 XWDS API:配置UART
 
static bool xwds_uart_tst_baudrate (xwu32_t baudrate)
 测试UART波特率是否合法
 
void xwds_uartc_drvcb_rxq_flush (struct xwds_uartc *uartc)
 XWDS Driver Callback:清空接收队列
 
xwsq_t xwds_uartc_drvcb_rxq_fill (struct xwds_uartc *uartc, xwu8_t bytes[], xwsz_t size)
 XWDS Driver Callback:从UART硬件接收数据到缓冲区
 
void xwds_uartc_drvcb_rxq_pub (struct xwds_uartc *uartc, xwsq_t tail)
 XWDS Driver Callback:发布数据到接收队列
 

详细描述

接收

XWDS串口控制器框架内定义了大小为 XWCDCFG_ds_UART_RXQ_SIZE接收缓冲区 , CAPI xwds_uartc_rx()xwds_uartc_try_rx() 用于从 接收缓冲区 获取数据。

异步发送

异步发送 xwds_uartc_eq() 只会将数据拷贝到发送缓冲区, 不会等待发送结果,可在中断中使用。

同步发送

同步发送 xwds_uartc_tx() 会阻塞调用者,等待发送结果,因此只能在线程中使用。

<strong>BSP驱动层</strong> 的适配工作

适配接收缓冲区

接收缓冲区 是一个循环队列,当 overflow 时,最新的数据会将最旧的数据覆盖掉。

rxq.idx 用于向 接收缓冲区 内填充数据, rxq.posrxq.tail 用于向 接收缓冲区 获取数据。

<strong>中断模式</strong> 中使用接收缓冲区

当使用 中断模式 的UART硬件控制器时,需在中断函数内 调用 xwds_uartc_drvcb_rxq_fill() 填充 接收缓冲区 , 然后调用 xwds_uartc_drvcb_rxq_pub() 发布数据。

如果UART硬件控制器支持FIFO,需要使用一个 接收超时定时器 定期将FIFO内数据填充至 接收缓冲区 并发布数据。

出现错误时,需要使用 xwds_uartc_drvcb_rxq_flush() 重置 接收缓冲区

<strong>DMA模式</strong> 中使用接收缓冲区

当使用 DMA模式 的UART硬件控制器时,需将DMA的接收地址 设置为 接收缓冲区 的首地址,DMA引擎会自动填充 接收缓冲区 , DMA完成中断触发时,需要调用 xwds_uartc_drvcb_rxq_pub() 发布数据。

此外需要使用一个 接收超时定时器 定期发布数据。

出现错误时,需要使用 xwds_uartc_drvcb_rxq_flush() 重置 接收缓冲区

适配 <tt>xwds_uartc_tx()</tt>

同步发送 xwds_uartc_tx() 需要 BSP驱动层 实现 xwds_uartc_driver.tx 函数。

适配 <tt>xwds_uartc_eq()</tt>

异步发送 xwds_uartc_eq() 需要 BSP驱动层 实现 xwds_uartc_driver.eq 函数。 BSP驱动层 可根据需要实现 发送缓冲区 ,有些SOC提供很大的 TX FIFO , 可替代发送缓冲区。

DMA模式的发送则必须提供 发送缓冲区 作为DMA的内存。

BSP驱动层 还需要实现一个 BUSY 标志,此CAPI不阻塞,当检测到BUSY标志时 需要立即返回 -EBUSY

宏定义说明

◆ XWDS_UART_RXQ_SIZE

#define XWDS_UART_RXQ_SIZE   XWCDCFG_ds_UART_RXQ_SIZE

在文件 controller.h101 行定义.

类型定义说明

◆ xwds_uartc_eqcb_f

typedef void(* xwds_uartc_eqcb_f) (struct xwds_uartc *, xwer_t)

异步发送的回调函数类型

在文件 controller.h171 行定义.

枚举类型说明

◆ xwds_uart_bits_em

UART字长枚举

枚举值
XWDS_UART_BITS_5 
XWDS_UART_BITS_6 
XWDS_UART_BITS_7 
XWDS_UART_BITS_8 
XWDS_UART_BITS_9 

在文件 controller.h106 行定义.

106 {
107 XWDS_UART_BITS_5 = 0U,
112};
@ XWDS_UART_BITS_8
Definition controller.h:110
@ XWDS_UART_BITS_5
Definition controller.h:107
@ XWDS_UART_BITS_6
Definition controller.h:108
@ XWDS_UART_BITS_9
Definition controller.h:111
@ XWDS_UART_BITS_7
Definition controller.h:109

◆ xwds_uart_hardwareflowcontrol_em

UART硬件流控枚举

枚举值
XWDS_UART_HFC_NONE 
XWDS_UART_HFC_RTS 
XWDS_UART_HFC_CTS 

在文件 controller.h136 行定义.

136 {
140};
@ XWDS_UART_HFC_CTS
Definition controller.h:139
@ XWDS_UART_HFC_RTS
Definition controller.h:138
@ XWDS_UART_HFC_NONE
Definition controller.h:137
#define XWBOP_BIT(n)
Definition xwbop.h:27

◆ xwds_uart_mode_em

UART模式枚举

枚举值
XWDS_UART_MODE_CLOSE 
XWDS_UART_MODE_TX 
XWDS_UART_MODE_RX 

在文件 controller.h145 行定义.

145 {
149};
@ XWDS_UART_MODE_TX
Definition controller.h:147
@ XWDS_UART_MODE_RX
Definition controller.h:148
@ XWDS_UART_MODE_CLOSE
Definition controller.h:146

◆ xwds_uart_parity_em

UART奇偶校验枚举

枚举值
XWDS_UART_PARITY_NONE 
XWDS_UART_PARITY_EVEN 
XWDS_UART_PARITY_ODD 

在文件 controller.h127 行定义.

127 {
131};
@ XWDS_UART_PARITY_EVEN
Definition controller.h:129
@ XWDS_UART_PARITY_NONE
Definition controller.h:128
@ XWDS_UART_PARITY_ODD
Definition controller.h:130

◆ xwds_uart_stopbits_em

UART停止位枚举

枚举值
XWDS_UART_STOPBITS_0_5 
XWDS_UART_STOPBITS_1_0 
XWDS_UART_STOPBITS_1_5 
XWDS_UART_STOPBITS_2_0 

在文件 controller.h117 行定义.

117 {
122};
@ XWDS_UART_STOPBITS_1_0
Definition controller.h:119
@ XWDS_UART_STOPBITS_0_5
Definition controller.h:118
@ XWDS_UART_STOPBITS_1_5
Definition controller.h:120
@ XWDS_UART_STOPBITS_2_0
Definition controller.h:121

函数说明

◆ xwds_uart_tst_baudrate()

static bool xwds_uart_tst_baudrate ( xwu32_t  baudrate)
inlinestatic

测试UART波特率是否合法

参数
[in]baudrate波特率

在文件 controller.h353 行定义.

354{
355 return ((50U == baudrate) || (75U == baudrate) || (110U == baudrate) ||
356 (134U == baudrate) || (150U == baudrate) || (200U == baudrate) ||
357 (300U == baudrate) || (600U == baudrate) || (1200U == baudrate) ||
358 (1800U == baudrate) || (2400U == baudrate) || (4800U == baudrate) ||
359 (9600U == baudrate) || (19200U == baudrate) || (38400U == baudrate) ||
360 (57600U == baudrate) || (115200U == baudrate) ||
361 (230400U == baudrate) || (460800U == baudrate) ||
362 (576000U == baudrate) || (921600U == baudrate) ||
363 (1000000U == baudrate) || (1152000U == baudrate) ||
364 (1500000U == baudrate) || (2000000U == baudrate) ||
365 (2500000U == baudrate) || (3000000U == baudrate) ||
366 (3500000U == baudrate) || (4000000U == baudrate));
367}

◆ xwds_uartc_cfg()

xwer_t xwds_uartc_cfg ( struct xwds_uartc uartc,
const struct xwds_uart_cfg cfg 
)

XWDS API:配置UART

参数
[in]uartcUART控制器对象指针
[in]cfg新的配置
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ENOSYS不支持此操作
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c462 行定义.

464{
465 const struct xwds_uartc_driver * drv;
466 xwer_t rc;
467
468 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
469 XWDS_VALIDATE(cfg, "nullptr", -EFAULT);
470
471 rc = xwds_uartc_grab(uartc);
472 if (rc < 0) {
473 goto err_uartc_grab;
474 }
475 drv = xwds_cast(const struct xwds_uartc_driver *, uartc->dev.drv);
476 if ((drv) && (drv->cfg)) {
477 rc = drv->cfg(uartc, cfg);
478 } else {
479 rc = -ENOSYS;
480 }
481 if (rc < 0) {
482 goto err_drv_cfg;
483 }
484 xwds_uartc_put(uartc);
485 return XWOK;
486
487err_drv_cfg:
488 xwds_uartc_put(uartc);
489err_uartc_grab:
490 return rc;
491}
xwer_t xwds_uartc_grab(struct xwds_uartc *uartc)
增加对象的引用计数
Definition controller.c:94
xwer_t xwds_uartc_put(struct xwds_uartc *uartc)
减少对象的引用计数
Definition controller.c:104
#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
const struct xwds_driver * drv
Definition device.h:133
BSP中需要提供的UART控制器驱动函数表
Definition controller.h:176
xwer_t(* cfg)(struct xwds_uartc *, const struct xwds_uart_cfg *)
Definition controller.h:178
struct xwds_device dev
Definition controller.h:194
函数调用图:

◆ xwds_uartc_construct()

void xwds_uartc_construct ( struct xwds_uartc uartc)

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

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

在文件 controller.c73 行定义.

74{
76 uartc->dev.vop = &xwds_uartc_vop;
77}
void xwds_device_construct(struct xwds_device *dev)
XWDS API:设备的构造函数
Definition device.c:48
const struct xwds_virtual_operation * vop
Definition device.h:138
const struct xwds_virtual_operation xwds_uartc_vop
Definition controller.c:56
函数调用图:

◆ xwds_uartc_destruct()

void xwds_uartc_destruct ( struct xwds_uartc uartc)

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

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

在文件 controller.c84 行定义.

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

◆ xwds_uartc_drvcb_rxq_fill()

xwsq_t xwds_uartc_drvcb_rxq_fill ( struct xwds_uartc uartc,
xwu8_t  bytes[],
xwsz_t  size 
)

XWDS Driver Callback:从UART硬件接收数据到缓冲区

参数
[in]uartcUART控制器对象指针
返回
下一次接收数据的位置

如果使用 uartc->rxq.mem 作为DMA内存,缓冲区将自动被填充,不需要使用此函数。 此函数仅当DMA内存与缓冲区不一致时,或使用中断模式时使用。

在文件 controller.c508 行定义.

510{
511 for (xwsz_t i = 0; i < size; i++) {
512 uartc->rxq.mem[uartc->rxq.idx] = bytes[i];
513 uartc->rxq.idx++;
514 if (sizeof(uartc->rxq.mem) == uartc->rxq.idx) {
515 uartc->rxq.idx = 0;
516 }
517 }
518 return uartc->rxq.idx;
519}
unsigned long xwsz_t
Definition type.h:339
xwu8_t mem[(128U)]
Definition controller.h:211
struct xwds_uartc::@27 rxq
xwsq_t idx
Definition controller.h:210

◆ xwds_uartc_drvcb_rxq_flush()

void xwds_uartc_drvcb_rxq_flush ( struct xwds_uartc uartc)

XWDS Driver Callback:清空接收队列

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

在文件 controller.c495 行定义.

496{
497 xwreg_t cpuirq;
498
499 xwos_sem_trywait(&uartc->rxq.sem);
500 xwos_splk_lock_cpuirqsv(&uartc->rxq.lock, &cpuirq);
501 uartc->rxq.pos = 0;
502 uartc->rxq.tail = 0;
503 uartc->rxq.idx = 0;
504 xwos_splk_unlock_cpuirqrs(&uartc->rxq.lock, cpuirq);
505}
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_trywait(struct xwos_sem *sem)
XWOS API:尝试获取信号量
Definition sem.h:454
struct xwos_splk lock
Definition controller.h:207
struct xwos_sem sem
Definition controller.h:206
xwsq_t pos
Definition controller.h:208
xwsz_t tail
Definition controller.h:209
函数调用图:

◆ xwds_uartc_drvcb_rxq_pub()

void xwds_uartc_drvcb_rxq_pub ( struct xwds_uartc uartc,
xwsq_t  tail 
)

XWDS Driver Callback:发布数据到接收队列

参数
[in]uartcUART控制器对象指针
[in]pub新的数据接收位置(有效数据结尾 + 1)

在文件 controller.c522 行定义.

523{
524 xwsz_t pubsz;
525 xwreg_t cpuirq;
526
527 if (sizeof(uartc->rxq.mem) == pub) {
528 pub = 0;
529 }
530 xwos_splk_lock_cpuirqsv(&uartc->rxq.lock, &cpuirq);
531 if (pub == uartc->rxq.tail) {
532 pubsz = 0;
533 } else if (pub > uartc->rxq.tail) {
534 pubsz = pub - uartc->rxq.tail;
535 if (uartc->rxq.pos <= uartc->rxq.tail) {
536 } else if (uartc->rxq.pos <= pub) {
537 /* Overflow! Discard the oldest data. */
538 uartc->rxq.pos = pub + 1;
539 if (sizeof(uartc->rxq.mem) == uartc->rxq.pos) {
540 uartc->rxq.pos = 0;
541 }
542 } else {
543 }
544 uartc->rxq.tail = pub;
545 } else {
546 pubsz = sizeof(uartc->rxq.mem) - uartc->rxq.tail + pub;
547 if (uartc->rxq.pos <= pub) {
548 /* Overflow! Discard the oldest data. */
549 uartc->rxq.pos = pub + 1;
550 /* `uartc->rxq.pos < sizeof(uartc->rxq.mem)` is always true. */
551 } else if (uartc->rxq.pos <= uartc->rxq.tail) {
552 } else {
553 /* Overflow! Discard the oldest data. */
554 uartc->rxq.pos = pub + 1;
555 /* `uartc->rxq.pos < sizeof(uartc->rxq.mem)` is always true. */
556 }
557 uartc->rxq.tail = pub;
558 }
559 xwos_splk_unlock_cpuirqrs(&uartc->rxq.lock, cpuirq);
560 if (pubsz > 0) {
561 xwos_sem_post(&uartc->rxq.sem);
562 }
563}
static xwer_t xwos_sem_post(struct xwos_sem *sem)
XWOS API:发布信号量
Definition sem.h:373
函数调用图:

◆ xwds_uartc_eq()

xwer_t xwds_uartc_eq ( struct xwds_uartc uartc,
const xwu8_t data,
xwsz_t size,
xwds_uartc_eqcb_f  cb 
)

XWDS API:异步发送

参数
[in]uartcUART控制器对象指针
[in]data待发送的数据的缓冲区
[in,out]size指向缓冲区的指针,此缓冲区:
  • (I) 作为输入时,表示期望发送的数据的大小(单位:字节)
  • (O) 作为输出时,返回实际拷贝到缓冲区的数据大小
[in]cb发送结束后的回调函数,可为 NULL
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ENOSYS不支持此操作
-EBUSY端口繁忙
注解
  • 上下文:任意
  • 此CAPI仅将待发送的数据拷贝到发送缓冲区就返回,不会等待发送结果。 如果设备正在发送其他数据,就以 -EBUSY 返回。 此CAPI可在中断中使用。
  • 如果发送数据超过缓冲区大小,返回时, *size 会返回实际拷贝到缓冲区的数据大小。

<No error

在文件 controller.c389 行定义.

392{
393 const struct xwds_uartc_driver * drv;
394 xwer_t rc;
395
396 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
397 XWDS_VALIDATE(data, "nullptr", -EFAULT);
398 XWDS_VALIDATE(size, "nullptr", -EFAULT);
399
400 rc = xwds_uartc_grab(uartc);
401 if (rc < 0) {
402 goto err_uartc_grab;
403 }
404 drv = xwds_cast(const struct xwds_uartc_driver *, uartc->dev.drv);
405 if ((drv) && (drv->eq)) {
406 rc = drv->eq(uartc, data, size, cb);
407 } else {
408 rc = -ENOSYS;
409 }
410 if (rc < 0) {
411 goto err_eq;
412 }
413 xwds_uartc_put(uartc);
414 return XWOK;
415
416err_eq:
417 xwds_uartc_put(uartc);
418err_uartc_grab:
419 return rc;
420}
xwer_t(* eq)(struct xwds_uartc *, const xwu8_t *, xwsz_t *, xwds_uartc_eqcb_f)
Definition controller.h:183
函数调用图:

◆ xwds_uartc_grab()

xwer_t xwds_uartc_grab ( struct xwds_uartc uartc)

增加对象的引用计数

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

在文件 controller.c94 行定义.

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

◆ xwds_uartc_put()

xwer_t xwds_uartc_put ( struct xwds_uartc uartc)

减少对象的引用计数

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

在文件 controller.c104 行定义.

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

◆ xwds_uartc_putc()

xwer_t xwds_uartc_putc ( struct xwds_uartc uartc,
const xwu8_t  byte,
xwtm_t  to 
)

XWDS API:直接发送一个字节(非DMA模式)

参数
[in]uartcUART控制器对象指针
[in]byte待发送的字节
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ENOSYS不支持此操作
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 controller.c423 行定义.

426{
427 xwer_t rc;
428 const struct xwds_uartc_driver * drv;
429
430 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
431
432 rc = xwds_uartc_grab(uartc);
433 if (rc < 0) {
434 goto err_uartc_grab;
435 }
436 rc = xwos_mtx_lock_to(&uartc->txmtx, to);
437 if (rc < 0) {
438 goto err_uartc_lock;
439 }
440 drv = xwds_cast(const struct xwds_uartc_driver *, uartc->dev.drv);
441 if ((drv) && (drv->putc)) {
442 rc = drv->putc(uartc, byte);
443 } else {
444 rc = -ENOSYS;
445 }
446 if (rc < 0) {
447 goto err_putc;
448 }
449 xwos_mtx_unlock(&uartc->txmtx);
450 xwds_uartc_put(uartc);
451 return XWOK;
452
453err_putc:
454 xwos_mtx_unlock(&uartc->txmtx);
455err_uartc_lock:
456 xwds_uartc_put(uartc);
457err_uartc_grab:
458 return rc;
459}
static xwer_t xwos_mtx_lock_to(struct xwos_mtx *mtx, xwtm_t to)
XWOS API:限时等待上锁互斥锁
Definition mtx.h:329
static xwer_t xwos_mtx_unlock(struct xwos_mtx *mtx)
XWOS API:解锁互斥锁
Definition mtx.h:279
xwer_t(* putc)(struct xwds_uartc *, const xwu8_t)
Definition controller.h:186
struct xwos_mtx txmtx
Definition controller.h:202
函数调用图:

◆ xwds_uartc_rx()

xwer_t xwds_uartc_rx ( struct xwds_uartc uartc,
xwu8_t buf,
xwsz_t size,
xwtm_t  to 
)

XWDS API:从接收队列中获取数据

参数
[in]uartcUART控制器对象指针
[out]buf指向缓冲区的指针,通过此缓冲区返回数据
[in,out]size指向缓冲区的指针,此缓冲区:
  • (I) 作为输入时,表示缓冲区大小(单位:字节)
  • (O) 作为输出时,返回实际读取的数据大小
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ETIMEDOUT超时
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 controller.c229 行定义.

232{
233 xwsz_t available, real, cp, rest_buffer_size;
234 xwsq_t pos;
235 xwreg_t cpuirq;
236 xwer_t rc;
237
238 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
239 XWDS_VALIDATE(buf, "nullptr", -EFAULT);
240 XWDS_VALIDATE(size, "nullptr", -EFAULT);
241
242 pos = 0;
243 rc = xwds_uartc_grab(uartc);
244 if (rc < 0) {
245 goto err_uartc_grab;
246 }
247 rest_buffer_size = *size;
248 while (rest_buffer_size) {
249 rc = xwos_sem_wait_to(&uartc->rxq.sem, to);
250 if (rc < 0) {
251 goto err_sem_wait_to;
252 }
253 xwos_splk_lock_cpuirqsv(&uartc->rxq.lock, &cpuirq);
254 if (uartc->rxq.tail >= uartc->rxq.pos) {
255 available = uartc->rxq.tail - uartc->rxq.pos;
256 } else {
257 available = sizeof(uartc->rxq.mem) - uartc->rxq.pos;
258 available += uartc->rxq.tail;
259 }
260 real = available > rest_buffer_size ? rest_buffer_size : available;
261 if ((real + uartc->rxq.pos) >= sizeof(uartc->rxq.mem)) {
262 cp = sizeof(uartc->rxq.mem) - uartc->rxq.pos;
263 memcpy(&buf[pos], &uartc->rxq.mem[uartc->rxq.pos], cp);
264 memcpy(&buf[cp + pos], &uartc->rxq.mem[0], real - cp);
265 uartc->rxq.pos = real - cp;
266 } else {
267 memcpy(&buf[pos], &uartc->rxq.mem[uartc->rxq.pos], real);
268 uartc->rxq.pos += real;
269 }
270 xwos_splk_unlock_cpuirqrs(&uartc->rxq.lock, cpuirq);
271 pos += real;
272 rest_buffer_size -= real;
273 if (available > real) {
274 xwos_sem_post(&uartc->rxq.sem);
275 }
276 }
277 xwds_uartc_put(uartc);
278 *size = pos;
279 return XWOK;
280
281err_sem_wait_to:
282 xwds_uartc_put(uartc);
283err_uartc_grab:
284 *size = pos;
285 return rc;
286}
unsigned long xwsq_t
Definition type.h:445
static xwer_t xwos_sem_wait_to(struct xwos_sem *sem, xwtm_t to)
XWOS API:限时等待并获取信号量
Definition sem.h:418
函数调用图:

◆ xwds_uartc_try_rx()

xwer_t xwds_uartc_try_rx ( struct xwds_uartc uartc,
xwu8_t buf,
xwsz_t size 
)

XWDS API:尝试从接收队列中获取数据

参数
[in]uartcUART控制器对象指针
[out]buf指向缓冲区的指针,通过此缓冲区返回数据
[in,out]size指向缓冲区的指针,此缓冲区:
  • (I) 作为输入时,表示缓冲区大小(单位:字节)
  • (O) 作为输出时,返回实际读取的数据大小
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ENODATA没有数据
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 controller.c289 行定义.

291{
292 xwsz_t available, real, cp, rest_buffer_size;
293 xwsq_t pos;
294 xwreg_t cpuirq;
295 xwer_t rc;
296
297 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
298 XWDS_VALIDATE(buf, "nullptr", -EFAULT);
299 XWDS_VALIDATE(size, "nullptr", -EFAULT);
300
301 pos = 0;
302 rc = xwds_uartc_grab(uartc);
303 if (rc < 0) {
304 goto err_uartc_grab;
305 }
306 rest_buffer_size = *size;
307 while (rest_buffer_size) {
308 rc = xwos_sem_trywait(&uartc->rxq.sem);
309 if (rc < 0) {
310 goto err_sem_trywait;
311 }
312 xwos_splk_lock_cpuirqsv(&uartc->rxq.lock, &cpuirq);
313 if (uartc->rxq.tail >= uartc->rxq.pos) {
314 available = uartc->rxq.tail - uartc->rxq.pos;
315 } else {
316 available = sizeof(uartc->rxq.mem) - uartc->rxq.pos;
317 available += uartc->rxq.tail;
318 }
319 real = available > rest_buffer_size ? rest_buffer_size : available;
320 if ((real + uartc->rxq.pos) >= sizeof(uartc->rxq.mem)) {
321 cp = sizeof(uartc->rxq.mem) - uartc->rxq.pos;
322 memcpy(&buf[pos], &uartc->rxq.mem[uartc->rxq.pos], cp);
323 memcpy(&buf[cp + pos], &uartc->rxq.mem[0], real - cp);
324 uartc->rxq.pos = real - cp;
325 } else {
326 memcpy(&buf[pos], &uartc->rxq.mem[uartc->rxq.pos], real);
327 uartc->rxq.pos += real;
328 }
329 xwos_splk_unlock_cpuirqrs(&uartc->rxq.lock, cpuirq);
330 pos += real;
331 rest_buffer_size -= real;
332 if (available > real) {
333 xwos_sem_post(&uartc->rxq.sem);
334 }
335 }
336 xwds_uartc_put(uartc);
337 *size = pos;
338 return XWOK;
339
340err_sem_trywait:
341 xwds_uartc_put(uartc);
342err_uartc_grab:
343 *size = pos;
344 return rc;
345}
函数调用图:

◆ xwds_uartc_tx()

xwer_t xwds_uartc_tx ( struct xwds_uartc uartc,
const xwu8_t data,
xwsz_t size,
xwtm_t  to 
)

XWDS API:同步发送

参数
[in]uartcUART控制器对象指针
[in]data待发送的数据的缓冲区
[in,out]size指向缓冲区的指针,此缓冲区:
  • (I) 作为输入时,表示期望发送的数据的大小(单位:字节)
  • (O) 作为输出时,返回实际发送的数据大小
[in]to期望唤醒的时间点
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ENOSYS不支持此操作
-ECANCELED发送被取消
-ETIMEDOUT超时
注解
  • 上下文:线程

to 表示等待超时的时间点:

  • to 通常是未来的时间,即 当前系统时间 + delta , 可以使用 xwtm_ft(delta) 表示;
  • 如果 to 是过去的时间点,将直接返回 -ETIMEDOUT

<No error

在文件 controller.c348 行定义.

351{
352 const struct xwds_uartc_driver * drv;
353 xwer_t rc;
354
355 XWDS_VALIDATE(uartc, "nullptr", -EFAULT);
356 XWDS_VALIDATE(data, "nullptr", -EFAULT);
357 XWDS_VALIDATE(size, "nullptr", -EFAULT);
358
359 rc = xwds_uartc_grab(uartc);
360 if (rc < 0) {
361 goto err_uartc_grab;
362 }
363 rc = xwos_mtx_lock_to(&uartc->txmtx, to);
364 if (rc < 0) {
365 goto err_uartc_lock;
366 }
367 drv = xwds_cast(const struct xwds_uartc_driver *, uartc->dev.drv);
368 if ((drv) && (drv->tx)) {
369 rc = drv->tx(uartc, data, size, to);
370 } else {
371 rc = -ENOSYS;
372 }
373 if (rc < 0) {
374 goto err_tx;
375 }
376 xwos_mtx_unlock(&uartc->txmtx);
377 xwds_uartc_put(uartc);
378 return XWOK;
379
380err_tx:
381 xwos_mtx_unlock(&uartc->txmtx);
382err_uartc_lock:
383 xwds_uartc_put(uartc);
384err_uartc_grab:
385 return rc;
386}
xwer_t(* tx)(struct xwds_uartc *, const xwu8_t *, xwsz_t *, xwtm_t)
Definition controller.h:180
函数调用图: