sel4_bcm2835_aux_uart_driver/
device.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: BSD-2-Clause
5//
6
7#![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}