xwrust/xwds/dmauartc.rs
1//! XWOS RUST:DMA模式的串口控制器
2//! ========
3//!
4
5extern crate core;
6use core::cell::UnsafeCell;
7
8use crate::types::*;
9
10extern "C" {
11 fn xwds_dmauartc_tx(dmauartc: *mut XwdsDmaUartC,
12 txd: *const u8, size: *mut XwSz,
13 to: XwTm) -> XwEr;
14 fn xwds_dmauartc_putc(dmauartc: *mut XwdsDmaUartC, byte: u8, to: XwTm) -> XwEr;
15 fn xwds_dmauartc_rx(dmauartc: *mut XwdsDmaUartC,
16 rxd: *mut u8, size: *mut XwSz,
17 to: XwTm) -> XwEr;
18 fn xwds_dmauartc_try_rx(dmauartc: *mut XwdsDmaUartC,
19 rxd: *mut u8, size: *mut XwSz) -> XwEr;
20}
21
22/// XWOS自旋锁占用的内存大小
23#[cfg(target_pointer_width = "32")]
24pub const SIZEOF_XWDS_DMAUARTC: usize = 768;
25
26/// XWOS自旋锁占用的内存大小
27#[cfg(target_pointer_width = "64")]
28pub const SIZEOF_XWDS_DMAUARTC: usize = 1024;
29
30/// SPI主机模式控制器
31#[repr(C)]
32#[cfg_attr(target_pointer_width = "32", repr(align(8)))]
33#[cfg_attr(target_pointer_width = "64", repr(align(16)))]
34pub struct XwdsDmaUartC {
35 pub(crate) obj: [u8; SIZEOF_XWDS_DMAUARTC],
36}
37
38/// SPI主机模式控制器
39#[repr(C)]
40pub struct DmaUartC {
41 pub(crate) dmauartc: UnsafeCell<XwdsDmaUartC>,
42}
43
44impl DmaUartC {
45 /// 配置DMA通道发送数据
46 ///
47 /// # 参数说明
48 ///
49 /// + txd: 待发送的数据的缓冲区
50 /// + size: 传输的大小
51 /// + (I) 作为输入时,表示期望发送的数据的大小(单位:字节)
52 /// + (O) 作为输出时,返回实际发送的数据大小
53 /// + to: 期望唤醒的时间点
54 ///
55 /// # 错误码
56 ///
57 /// + [`-ENOSYS`] 不支持此操作
58 /// + [`-ECANCELED`] 发送被取消
59 /// + [`-ETIMEDOUT`] 超时
60 ///
61 /// [`-ENOSYS`]: crate::errno::ENOSYS
62 /// [`-ECANCELED`]: crate::errno::ECANCELED
63 /// [`-ETIMEDOUT`]: crate::errno::ETIMEDOUT
64 pub fn tx(&self, txd: &[u8], size: &mut XwSz, to: XwTm) -> XwEr {
65 unsafe {
66 xwds_dmauartc_tx(self.dmauartc.get(),
67 txd.as_ptr(), size as *mut XwSz,
68 to)
69 }
70 }
71
72 /// 发送一字节数据数据(非DMA模式)
73 ///
74 /// # 参数说明
75 ///
76 /// + byte: 待发送的字节
77 /// + to: 期望唤醒的时间点
78 ///
79 /// # 错误码
80 ///
81 /// + [`-ENOSYS`] 不支持此操作
82 /// + [`-ETIMEDOUT`] 超时
83 ///
84 /// [`-ENOSYS`]: crate::errno::ENOSYS
85 /// [`-ETIMEDOUT`]: crate::errno::ETIMEDOUT
86 pub fn putc(&self, byte: u8, to: XwTm) -> XwEr {
87 unsafe {
88 xwds_dmauartc_putc(self.dmauartc.get(), byte, to)
89 }
90 }
91
92 /// 从接收队列中获取数据
93 ///
94 /// # 参数说明
95 ///
96 /// + rxd: 接收数据的缓冲区
97 /// + size: 传输的大小
98 /// + (I) 作为输入时,表示缓冲区大小(单位:字节)
99 /// + (O) 作为输出时,返回实际读取的数据大小
100 /// + to: 期望唤醒的时间点
101 ///
102 /// # 错误码
103 ///
104 /// + [`-ETIMEDOUT`] 传输超时
105 ///
106 /// [`-ETIMEDOUT`]: crate::errno::ETIMEDOUT
107 pub fn rx(&self, rxd: &mut [u8], size: &mut XwSz, to: XwTm) -> XwEr {
108 unsafe {
109 xwds_dmauartc_rx(self.dmauartc.get(),
110 rxd.as_mut_ptr(), size as *mut XwSz,
111 to)
112 }
113 }
114
115 /// 尝试从接收队列中获取数据
116 ///
117 /// # 参数说明
118 ///
119 /// + rxd: 接收数据的缓冲区
120 /// + size: 传输的大小
121 /// + (I) 作为输入时,表示缓冲区大小(单位:字节)
122 /// + (O) 作为输出时,返回实际读取的数据大小
123 ///
124 /// # 错误码
125 ///
126 /// + [`-ENODATA`] 没有数据
127 ///
128 /// [`-ENODATA`]: crate::errno::ENODATA
129 pub fn try_rx(&self, rxd: &mut [u8], size: &mut XwSz) -> XwEr {
130 unsafe {
131 xwds_dmauartc_try_rx(self.dmauartc.get(),
132 rxd.as_mut_ptr(), size as *mut XwSz)
133 }
134 }
135}