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