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