1use bitflags::bitflags;
2
3bitflags! {
4 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
5 pub struct InterruptMask: u32 {
6 const RX_DATA = 1 << 0;
7 const RX_STATUS = 1 << 1;
8 const TX_SPACE = 1 << 2;
9 const MODEM_STATUS = 1 << 3;
10
11 const RX = Self::RX_DATA.bits() | Self::RX_STATUS.bits();
12 const RX_AVAILABLE = Self::RX.bits();
13 const TX_EMPTY = Self::TX_SPACE.bits();
14 }
15}
16
17impl InterruptMask {
18 pub fn rx_available(&self) -> bool {
19 self.intersects(Self::RX)
20 }
21
22 pub fn tx_empty(&self) -> bool {
23 self.contains(Self::TX_SPACE)
24 }
25}
26
27bitflags! {
28 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
29 pub struct IrqSource: u32 {
30 const RX_DATA = 1 << 0;
31 const RX_TIMEOUT = 1 << 1;
32 const RX_STATUS = 1 << 2;
33 const TX_SPACE = 1 << 3;
34 const MODEM_STATUS = 1 << 4;
35 const BUSY_DETECT = 1 << 5;
36 const OTHER_ACK = 1 << 6;
37 }
38}
39
40#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
41pub struct IrqSnapshot {
42 pub claimed: bool,
43 pub sources: IrqSource,
44}
45
46#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
47pub enum RxFlag {
48 #[default]
49 Normal,
50 Break,
51 Parity,
52 Framing,
53}
54
55#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
56pub struct RxSample {
57 pub byte: Option<u8>,
58 pub flag: RxFlag,
59 pub overrun: bool,
60}
61
62#[derive(Clone, Copy, Debug, PartialEq, Eq)]
63pub enum RxItem {
64 Byte { byte: u8, flag: RxFlag },
65 Overrun,
66}
67
68impl Default for RxItem {
69 fn default() -> Self {
70 Self::Byte {
71 byte: 0,
72 flag: RxFlag::Normal,
73 }
74 }
75}
76
77#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
78pub struct SerialCounters {
79 pub irq_total: u64,
80 pub irq_spurious: u64,
81 pub irq_budget_exhausted: u64,
82 pub rx_bytes: u64,
83 pub rx_fifo_overruns: u64,
84 pub rx_queue_dropped: u64,
85 pub rx_breaks: u64,
86 pub rx_parity_errors: u64,
87 pub rx_framing_errors: u64,
88 pub tx_bytes: u64,
89}
90
91#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
92pub struct SerialIrqOutcome {
93 pub claimed: bool,
94 pub rx_pushed: usize,
95 pub tx_sent: usize,
96 pub tx_wakeup: bool,
97 pub budget_exhausted: bool,
98}