sel4_bcm2835_aux_uart_driver/
device.rs
1#![allow(dead_code)]
8
9use core::ops::Deref;
10
11use tock_registers::{
12 interfaces::{Readable, Writeable},
13 register_structs,
14 registers::ReadWrite,
15};
16
17const MU_LSR_TXIDLE: u32 = 1 << 6;
18const MU_LSR_DATAREADY: u32 = 1 << 0;
19
20register_structs! {
21 #[allow(non_snake_case)]
22 pub(crate) RegisterBlock {
23 (0x000 => _reserved0),
24 (0x040 => IO: ReadWrite<u8>),
25 (0x041 => _reserved1),
26 (0x044 => IER: ReadWrite<u32>),
27 (0x048 => _reserved2),
28 (0x054 => LSR: ReadWrite<u32>),
29 (0x058 => @END),
30 }
31}
32
33pub(crate) struct Device {
34 ptr: *mut RegisterBlock,
35}
36
37impl Device {
38 pub(crate) const unsafe fn new(ptr: *mut RegisterBlock) -> Self {
39 Self { ptr }
40 }
41
42 fn ptr(&self) -> *const RegisterBlock {
43 self.ptr
44 }
45
46 pub(crate) fn init(&self) {}
47}
48
49impl Deref for Device {
50 type Target = RegisterBlock;
51
52 fn deref(&self) -> &Self::Target {
53 unsafe { &*self.ptr() }
54 }
55}
56
57impl Device {
58 pub(crate) fn put_char(&self, c: u8) {
59 loop {
60 if self.LSR.get() & MU_LSR_TXIDLE != 0 {
61 break;
62 }
63 }
64 self.IO.set(c);
65 }
66}