Skip to main content

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}