1mod registers;
9
10use bitflags::Flags;
11use rdif_serial::{
12 Config, ConfigError, DataBits, InterfaceRaw, InterruptMask, Parity, SetBackError, StopBits,
13 TIrqHandler, TSender, TransferError,
14};
15use registers::*;
16
17#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
18mod pio;
19mod mmio;
21
22pub use mmio::*;
23#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
24pub use pio::*;
25
26use crate::{RawReciever, RawSender};
27
28pub trait Kind: Clone + Send + Sync + 'static {
29 fn read_reg(&self, reg: u8) -> u8;
30 fn write_reg(&self, reg: u8, val: u8);
31 fn get_base(&self) -> usize;
32
33 fn read_flags<F: Flags<Bits = u8>>(&self, reg: u8) -> F {
35 F::from_bits_retain(self.read_reg(reg))
36 }
37
38 fn write_flags<F: Flags<Bits = u8>>(&self, reg: u8, val: F) {
39 self.write_reg(reg, val.bits());
40 }
41}
42
43pub struct Ns16550<T: Kind> {
44 pub(crate) base: T,
45 pub(crate) clock_freq: u32,
46 pub(crate) irq: Option<Ns16550IrqHandler<T>>,
47 pub(crate) tx: Option<crate::Sender>,
48 pub(crate) rx: Option<crate::Reciever>,
49}
50
51impl<T: Kind> InterfaceRaw for Ns16550<T> {
52 type Sender = crate::Sender;
53 type Reciever = crate::Reciever;
54 type IrqHandler = Ns16550IrqHandler<T>;
55
56 fn base_addr(&self) -> usize {
57 self.base.get_base()
58 }
59
60 fn set_config(&mut self, config: &Config) -> Result<(), ConfigError> {
61 if let Some(baudrate) = config.baudrate {
63 self.set_baudrate_internal(baudrate)?;
64 }
65
66 if let Some(data_bits) = config.data_bits {
68 self.set_data_bits_internal(data_bits)?;
69 }
70
71 if let Some(stop_bits) = config.stop_bits {
73 self.set_stop_bits_internal(stop_bits)?;
74 }
75
76 if let Some(parity) = config.parity {
78 self.set_parity_internal(parity)?;
79 }
80 Ok(())
81 }
82
83 fn baudrate(&self) -> u32 {
84 let dll = self.read_reg_u8(UART_DLL) as u16;
87 let dlh = self.read_reg_u8(UART_DLH) as u16;
88 let divisor = dll | (dlh << 8);
89
90 if divisor == 0 {
91 return 0;
92 }
93
94 self.clock_freq / (16 * divisor as u32)
95 }
96
97 fn data_bits(&self) -> DataBits {
98 let lcr: LineControlFlags = self.read_flags(UART_LCR);
99 let wlen = lcr & LineControlFlags::WORD_LENGTH_MASK;
100 if wlen == LineControlFlags::WORD_LENGTH_5 {
101 DataBits::Five
102 } else if wlen == LineControlFlags::WORD_LENGTH_6 {
103 DataBits::Six
104 } else if wlen == LineControlFlags::WORD_LENGTH_7 {
105 DataBits::Seven
106 } else {
107 DataBits::Eight }
109 }
110
111 fn stop_bits(&self) -> StopBits {
112 let lcr: LineControlFlags = self.read_flags(UART_LCR);
113 if lcr.contains(LineControlFlags::STOP_BITS) {
114 StopBits::Two
115 } else {
116 StopBits::One
117 }
118 }
119
120 fn parity(&self) -> Parity {
121 let lcr: LineControlFlags = self.read_flags(UART_LCR);
122
123 if !lcr.contains(LineControlFlags::PARITY_ENABLE) {
124 Parity::None
125 } else if lcr.contains(LineControlFlags::STICK_PARITY) {
126 if lcr.contains(LineControlFlags::EVEN_PARITY) {
128 Parity::Space
129 } else {
130 Parity::Mark
131 }
132 } else {
133 if lcr.contains(LineControlFlags::EVEN_PARITY) {
135 Parity::Even
136 } else {
137 Parity::Odd
138 }
139 }
140 }
141
142 fn clock_freq(&self) -> Option<core::num::NonZeroU32> {
143 self.clock_freq.try_into().ok()
144 }
145
146 fn open(&mut self) {
147 self.init();
148 }
149
150 fn close(&mut self) {
151 self.write_flags(UART_IER, InterruptEnableFlags::empty());
153
154 let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
156 mcr.remove(ModemControlFlags::DATA_TERMINAL_READY | ModemControlFlags::REQUEST_TO_SEND);
157 self.write_flags(UART_MCR, mcr);
158 }
159
160 fn enable_loopback(&mut self) {
161 let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
162 mcr.insert(ModemControlFlags::LOOPBACK_ENABLE);
163 self.write_flags(UART_MCR, mcr);
164 }
165
166 fn disable_loopback(&mut self) {
167 let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
168 mcr.remove(ModemControlFlags::LOOPBACK_ENABLE);
169 self.write_flags(UART_MCR, mcr);
170 }
171
172 fn is_loopback_enabled(&self) -> bool {
173 let mcr: ModemControlFlags = self.read_flags(UART_MCR);
174 mcr.contains(ModemControlFlags::LOOPBACK_ENABLE)
175 }
176
177 fn set_irq_mask(&mut self, mask: InterruptMask) {
178 let mut ier = InterruptEnableFlags::empty();
179
180 if mask.contains(InterruptMask::RX_AVAILABLE) {
181 ier.insert(InterruptEnableFlags::RECEIVED_DATA_AVAILABLE);
182 ier.insert(InterruptEnableFlags::RECEIVER_LINE_STATUS);
183 }
184 if mask.contains(InterruptMask::TX_EMPTY) {
185 ier.insert(InterruptEnableFlags::TRANSMITTER_HOLDING_EMPTY);
186 }
187
188 self.write_flags(UART_IER, ier);
189 }
190
191 fn get_irq_mask(&self) -> InterruptMask {
192 let ier: InterruptEnableFlags = self.read_flags(UART_IER);
193 let mut mask = InterruptMask::empty();
194
195 if ier.contains(InterruptEnableFlags::RECEIVED_DATA_AVAILABLE) {
196 mask |= InterruptMask::RX_AVAILABLE;
197 }
198 if ier.contains(InterruptEnableFlags::TRANSMITTER_HOLDING_EMPTY) {
199 mask |= InterruptMask::TX_EMPTY;
200 }
201 mask
205 }
206
207 fn irq_handler(&mut self) -> Option<Self::IrqHandler> {
208 self.irq.take()
209 }
210
211 fn take_tx(&mut self) -> Option<Self::Sender> {
212 self.tx.take()
213 }
214
215 fn take_rx(&mut self) -> Option<Self::Reciever> {
216 self.rx.take()
217 }
218
219 fn set_tx(&mut self, tx: Self::Sender) -> Result<(), SetBackError> {
220 let want = self.base.get_base();
221 match tx {
222 #[cfg(target_arch = "x86_64")]
223 crate::Sender::Ns16550Sender(ref sender) => {
224 let actual = sender.base.get_base();
225 if actual != want {
226 return Err(SetBackError::new(want, actual));
227 }
228 }
229 crate::Sender::Ns16550MmioSender(ref sender) => {
230 let actual = sender.base.get_base();
231 if actual != want {
232 return Err(SetBackError::new(want, actual));
233 }
234 }
235 _ => {
236 return Err(SetBackError::new(want, 0)); }
238 }
239 self.tx = Some(tx);
240 Ok(())
241 }
242
243 fn set_rx(&mut self, rx: Self::Reciever) -> Result<(), SetBackError> {
244 let want = self.base.get_base();
245 match rx {
246 #[cfg(target_arch = "x86_64")]
247 crate::Reciever::Ns16550Reciever(ref reciever) => {
248 let actual = reciever.base.get_base();
249 if actual != want {
250 return Err(SetBackError::new(want, actual));
251 }
252 }
253 crate::Reciever::Ns16550MmioReciever(ref reciever) => {
254 let actual = reciever.base.get_base();
255 if actual != want {
256 return Err(SetBackError::new(want, actual));
257 }
258 }
259 _ => {
260 return Err(SetBackError::new(want, 0)); }
262 }
263 self.rx = Some(rx);
264 Ok(())
265 }
266}
267
268impl<T: Kind> Ns16550<T> {
269 fn read_reg_u8(&self, reg: u8) -> u8 {
271 self.base.read_reg(reg)
272 }
273
274 fn write_reg_u8(&mut self, reg: u8, val: u8) {
275 self.base.write_reg(reg, val);
276 }
277
278 fn read_flags<F: Flags<Bits = u8>>(&self, reg: u8) -> F {
280 F::from_bits_retain(self.base.read_reg(reg))
281 }
282
283 fn write_flags<F: Flags<Bits = u8>>(&mut self, reg: u8, val: F) {
284 self.base.write_reg(reg, val.bits());
285 }
286
287 pub fn is_16550_plus(&self) -> bool {
289 let fifo: InterruptIdentificationFlags = self.read_flags(UART_IIR);
292 fifo.contains(InterruptIdentificationFlags::FIFO_ENABLE_MASK)
293 }
294
295 fn set_baudrate_internal(&mut self, baudrate: u32) -> Result<(), ConfigError> {
297 if baudrate == 0 || self.clock_freq == 0 {
298 return Err(ConfigError::InvalidBaudrate);
299 }
300
301 let divisor = self.clock_freq / (16 * baudrate);
302 if divisor == 0 || divisor > 0xFFFF {
303 return Err(ConfigError::InvalidBaudrate);
304 }
305
306 let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
308
309 lcr.insert(LineControlFlags::DIVISOR_LATCH_ACCESS);
311 self.write_flags(UART_LCR, lcr);
312
313 self.write_reg_u8(UART_DLL, (divisor & 0xFF) as u8);
315 self.write_reg_u8(UART_DLH, ((divisor >> 8) & 0xFF) as u8);
316
317 lcr.remove(LineControlFlags::DIVISOR_LATCH_ACCESS);
319 self.write_flags(UART_LCR, lcr);
320
321 Ok(())
322 }
323
324 fn set_data_bits_internal(&mut self, bits: DataBits) -> Result<(), ConfigError> {
326 let wlen = match bits {
327 DataBits::Five => LineControlFlags::WORD_LENGTH_5,
328 DataBits::Six => LineControlFlags::WORD_LENGTH_6,
329 DataBits::Seven => LineControlFlags::WORD_LENGTH_7,
330 DataBits::Eight => LineControlFlags::WORD_LENGTH_8,
331 };
332
333 let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
334 lcr.remove(LineControlFlags::WORD_LENGTH_MASK);
336 lcr.insert(wlen);
337 self.write_flags(UART_LCR, lcr);
338
339 Ok(())
340 }
341
342 fn set_stop_bits_internal(&mut self, bits: StopBits) -> Result<(), ConfigError> {
344 let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
345 match bits {
346 StopBits::One => lcr.remove(LineControlFlags::STOP_BITS),
347 StopBits::Two => lcr.insert(LineControlFlags::STOP_BITS),
348 }
349 self.write_flags(UART_LCR, lcr);
350 Ok(())
351 }
352
353 fn set_parity_internal(&mut self, parity: Parity) -> Result<(), ConfigError> {
355 let mut lcr: LineControlFlags = self.read_flags(UART_LCR);
356
357 lcr.remove(
359 LineControlFlags::PARITY_ENABLE
360 | LineControlFlags::EVEN_PARITY
361 | LineControlFlags::STICK_PARITY,
362 );
363
364 match parity {
366 Parity::None => {
367 }
369 Parity::Odd => {
370 lcr.insert(LineControlFlags::PARITY_ENABLE);
371 }
372 Parity::Even => {
373 lcr.insert(LineControlFlags::PARITY_ENABLE | LineControlFlags::EVEN_PARITY);
374 }
375 Parity::Mark => {
376 lcr.insert(LineControlFlags::PARITY_ENABLE | LineControlFlags::STICK_PARITY);
377 }
378 Parity::Space => {
379 lcr.insert(
380 LineControlFlags::PARITY_ENABLE
381 | LineControlFlags::EVEN_PARITY
382 | LineControlFlags::STICK_PARITY,
383 );
384 }
385 }
386
387 self.write_flags(UART_LCR, lcr);
388 Ok(())
389 }
390
391 pub fn enable_fifo(&mut self, enable: bool) {
393 if enable && self.is_16550_plus() {
394 let mut fcr = FifoControlFlags::ENABLE_FIFO;
395 fcr.insert(FifoControlFlags::CLEAR_RECEIVER_FIFO);
396 fcr.insert(FifoControlFlags::CLEAR_TRANSMITTER_FIFO);
397 fcr.insert(FifoControlFlags::TRIGGER_1_BYTE);
398 self.write_flags(UART_FCR, fcr);
399 } else {
400 self.write_flags(UART_FCR, FifoControlFlags::empty());
401 }
402 }
403
404 pub fn set_fifo_trigger_level(&mut self, level: u8) {
406 if !self.is_16550_plus() {
407 return;
408 }
409
410 let trigger_value = match level {
411 0..=3 => FifoControlFlags::TRIGGER_1_BYTE,
412 4..=7 => FifoControlFlags::TRIGGER_4_BYTES,
413 8..=11 => FifoControlFlags::TRIGGER_8_BYTES,
414 _ => FifoControlFlags::TRIGGER_14_BYTES,
415 };
416
417 let mut fcr: FifoControlFlags = self.read_flags(UART_FCR);
419 fcr.remove(FifoControlFlags::TRIGGER_LEVEL_MASK);
420 fcr.insert(trigger_value);
421 self.write_flags(UART_FCR, fcr);
422 }
423
424 fn init(&mut self) {
426 self.write_flags(UART_IER, InterruptEnableFlags::empty());
428
429 let mut mcr: ModemControlFlags = self.read_flags(UART_MCR);
431 mcr.insert(ModemControlFlags::DATA_TERMINAL_READY | ModemControlFlags::REQUEST_TO_SEND);
432 self.write_flags(UART_MCR, mcr);
433 }
434
435 pub fn is_fifo_enabled(&self) -> bool {
437 if !self.is_16550_plus() {
438 return false;
439 }
440 let iir: InterruptIdentificationFlags = self.read_flags(UART_IIR);
442 iir.contains(InterruptIdentificationFlags::FIFO_ENABLE_MASK)
443 }
444}
445
446pub struct Ns16550Sender<T: Kind> {
447 pub(crate) base: T,
448}
449
450impl<T: Kind> TSender for Ns16550Sender<T> {
451 fn write_byte(&mut self, byte: u8) -> bool {
452 RawSender::write_byte(self, byte)
453 }
454}
455
456pub struct Ns16550Reciever<T: Kind> {
457 pub(crate) base: T,
458}
459
460impl<T: Kind> RawReciever for Ns16550Reciever<T> {
461 fn read_byte(&mut self) -> Option<Result<u8, TransferError>> {
462 let lsr: LineStatusFlags = self.base.read_flags(UART_LSR);
463
464 if lsr.contains(LineStatusFlags::OVERRUN_ERROR) {
466 let b = self.base.read_reg(UART_RBR);
467 return Some(Err(TransferError::Overrun(b)));
468 }
469
470 if lsr.contains(LineStatusFlags::PARITY_ERROR) {
471 let _b = self.base.read_reg(UART_RBR);
472 return Some(Err(TransferError::Parity));
473 }
474
475 if lsr.contains(LineStatusFlags::FRAMING_ERROR) {
476 let _b = self.base.read_reg(UART_RBR);
477 return Some(Err(TransferError::Framing));
478 }
479
480 if lsr.contains(LineStatusFlags::BREAK_INTERRUPT) {
481 let _b = self.base.read_reg(UART_RBR);
482 return Some(Err(TransferError::Break));
483 }
484
485 if lsr.contains(LineStatusFlags::DATA_READY) {
486 let b = self.base.read_reg(UART_RBR);
487 return Some(Ok(b));
488 }
489 None
490 }
491}
492
493pub struct Ns16550IrqHandler<T: Kind> {
494 pub(crate) base: T,
495}
496
497impl<T: Kind> TIrqHandler for Ns16550IrqHandler<T> {
498 fn clean_interrupt_status(&self) -> InterruptMask {
499 let iir: InterruptIdentificationFlags = self.base.read_flags(UART_IIR);
500 let mut mask = InterruptMask::empty();
501
502 if iir.contains(InterruptIdentificationFlags::NO_INTERRUPT_PENDING) {
504 return mask;
505 }
506
507 let interrupt_id = iir & InterruptIdentificationFlags::INTERRUPT_ID_MASK;
509
510 if interrupt_id == InterruptIdentificationFlags::RECEIVER_LINE_STATUS
512 || interrupt_id == InterruptIdentificationFlags::RECEIVED_DATA_AVAILABLE
513 || interrupt_id == InterruptIdentificationFlags::CHARACTER_TIMEOUT
514 {
515 mask |= InterruptMask::RX_AVAILABLE;
517 } else if interrupt_id == InterruptIdentificationFlags::TRANSMITTER_HOLDING_EMPTY {
518 mask |= InterruptMask::TX_EMPTY;
520 } else if interrupt_id == InterruptIdentificationFlags::MODEM_STATUS {
521 }
523
524 mask
525 }
526}
527
528impl<T: Kind> RawSender for Ns16550Sender<T> {
529 fn write_byte(&mut self, byte: u8) -> bool {
530 let lsr: LineStatusFlags = self.base.read_flags(UART_LSR);
531 if lsr.contains(LineStatusFlags::TRANSMITTER_HOLDING_EMPTY) {
532 self.base.write_reg(UART_THR, byte);
533 true
534 } else {
535 false
536 }
537 }
538}