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