1#![no_std]
2
3pub mod ns16550;
53pub mod pl011;
54
55use enum_dispatch::enum_dispatch;
56pub use rdif_serial::*;
58
59#[enum_dispatch]
60pub enum Sender {
61 #[cfg(target_arch = "x86_64")]
62 Ns16550Sender(ns16550::Ns16550Sender<ns16550::Port>),
63 Ns16550MmioSender(ns16550::Ns16550Sender<ns16550::Mmio>),
64 Ns16550DwApbSender(ns16550::Ns16550Sender<ns16550::DwApb>),
65 Ns16550RockchipFiqSender(ns16550::rockchip_fiq::RockchipFiqSender),
66 Pl011Sender(pl011::Pl011Sender),
67}
68
69#[enum_dispatch(Sender)]
70trait RawSender {
71 fn write_byte(&mut self, byte: u8) -> bool;
72 fn write_bytes(&mut self, buffer: &[u8]) -> usize {
73 let mut written = 0;
74 for &byte in buffer.iter() {
75 if !self.write_byte(byte) {
76 break;
77 }
78 written += 1;
79 }
80 written
81 }
82}
83
84impl TSender for Sender {
85 fn write_byte(&mut self, byte: u8) -> bool {
86 RawSender::write_byte(self, byte)
87 }
88
89 fn write_bytes(&mut self, buffer: &[u8]) -> usize {
90 RawSender::write_bytes(self, buffer)
91 }
92}
93
94#[enum_dispatch]
95pub enum Reciever {
96 #[cfg(target_arch = "x86_64")]
97 Ns16550Reciever(ns16550::Ns16550Reciever<ns16550::Port>),
98 Ns16550MmioReciever(ns16550::Ns16550Reciever<ns16550::Mmio>),
99 Ns16550DwApbReciever(ns16550::Ns16550Reciever<ns16550::DwApb>),
100 Ns16550RockchipFiqReciever(ns16550::rockchip_fiq::RockchipFiqReceiver),
101 Pl011Reciever(pl011::Pl011Reciever),
102}
103
104impl TReciever for Reciever {
105 fn read_byte(&mut self) -> Option<Result<u8, TransferError>> {
106 RawReciever::read_byte(self)
107 }
108
109 fn read_bytes(&mut self, bytes: &mut [u8]) -> Result<usize, TransBytesError> {
110 RawReciever::read_bytes(self, bytes)
111 }
112}
113
114#[enum_dispatch(Reciever)]
115trait RawReciever {
116 fn read_byte(&mut self) -> Option<Result<u8, TransferError>>;
117
118 fn read_bytes(&mut self, bytes: &mut [u8]) -> Result<usize, TransBytesError> {
119 let mut read_count = 0;
120 for byte in bytes.iter_mut() {
121 match self.read_byte() {
122 Some(Ok(b)) => {
123 *byte = b;
124 }
125 Some(Err(e)) => {
126 return Err(TransBytesError {
127 bytes_transferred: read_count,
128 kind: e,
129 });
130 }
131 None => break,
132 }
133
134 read_count += 1;
135 }
136 Ok(read_count)
137 }
138}