Skip to main content

rp235x_hal/uart/
utils.rs

1use crate::pac::dma::ch::ch_ctrl_trig::TREQ_SEL_A;
2use crate::pac::{uart0::RegisterBlock, UART0, UART1};
3use crate::resets::SubsystemReset;
4use crate::typelevel::Sealed;
5use core::ops::Deref;
6
7#[doc(inline)]
8pub use rp_hal_common::uart::{DataBits, Parity, StopBits, UartConfig};
9
10/// Error type for UART operations.
11#[derive(Debug)]
12#[cfg_attr(feature = "defmt", derive(defmt::Format))]
13pub enum Error {
14    /// Bad argument : when things overflow, ...
15    BadArgument,
16}
17
18/// State of the UART Peripheral.
19pub trait State: Sealed {}
20
21/// Trait to handle both underlying devices (UART0 & UART1)
22pub trait UartDevice: Deref<Target = RegisterBlock> + SubsystemReset + Sealed + 'static {
23    /// Index of the Uart.
24    const ID: usize;
25
26    /// The DREQ number for which TX DMA requests are triggered.
27    fn tx_dreq() -> u8
28    where
29        Self: Sized;
30    /// The DREQ number for which RX DMA requests are triggered.
31    fn rx_dreq() -> u8
32    where
33        Self: Sized;
34}
35
36impl UartDevice for UART0 {
37    const ID: usize = 0;
38
39    /// The DREQ number for which TX DMA requests are triggered.
40    fn tx_dreq() -> u8 {
41        TREQ_SEL_A::UART0_TX.into()
42    }
43    /// The DREQ number for which RX DMA requests are triggered.
44    fn rx_dreq() -> u8 {
45        TREQ_SEL_A::UART0_RX.into()
46    }
47}
48impl Sealed for UART0 {}
49impl UartDevice for UART1 {
50    const ID: usize = 1;
51
52    /// The DREQ number for which TX DMA requests are triggered.
53    fn tx_dreq() -> u8 {
54        TREQ_SEL_A::UART1_TX.into()
55    }
56    /// The DREQ number for which RX DMA requests are triggered.
57    fn rx_dreq() -> u8 {
58        TREQ_SEL_A::UART1_RX.into()
59    }
60}
61impl Sealed for UART1 {}
62
63/// UART is enabled.
64pub struct Enabled;
65
66/// UART is disabled.
67pub struct Disabled;
68
69impl State for Enabled {}
70impl Sealed for Enabled {}
71impl State for Disabled {}
72impl Sealed for Disabled {}
73
74/// Rx/Tx FIFO Watermark
75///
76/// Determine the FIFO level that trigger DMA/Interrupt
77/// Default is Bytes16, see DS Table 423 and UARTIFLS Register
78/// Example of use:
79///     uart0.set_fifos(true); // Default is false
80///     uart0.set_rx_watermark(hal::uart::FifoWatermark::Bytes8);
81///     uart0.enable_rx_interrupt();
82pub enum FifoWatermark {
83    /// Trigger when 4 bytes are (Rx: filled / Tx: available)
84    Bytes4,
85    /// Trigger when 8 bytes are (Rx: filled / Tx: available)
86    Bytes8,
87    /// Trigger when 16 bytes are (Rx: filled / Tx: available)
88    Bytes16,
89    /// Trigger when 24 bytes are (Rx: filled / Tx: available)
90    Bytes24,
91    /// Trigger when 28 bytes are (Rx: filled / Tx: available)
92    Bytes28,
93}