use core::mem::offset_of;
use crate::hwcore::addr::MmioAddr;
use crate::hwcore::regs::access::{Ro, Rw};
#[repr(C)]
pub struct UsartRegs {
pub cr1: Rw<u32>,
pub cr2: Rw<u32>,
pub cr3: Rw<u32>,
pub brr: Rw<u32>,
pub gtpr: Rw<u32>,
pub rtor: Rw<u32>,
pub rqr: Rw<u32>,
pub isr: Ro<u32>,
pub icr: Rw<u32>,
pub rdr: Ro<u32>,
pub tdr: Rw<u32>,
pub presc: Rw<u32>,
}
const _: () = assert!(offset_of!(UsartRegs, cr1) == 0x00);
const _: () = assert!(offset_of!(UsartRegs, cr2) == 0x04);
const _: () = assert!(offset_of!(UsartRegs, cr3) == 0x08);
const _: () = assert!(offset_of!(UsartRegs, brr) == 0x0C);
const _: () = assert!(offset_of!(UsartRegs, gtpr) == 0x10);
const _: () = assert!(offset_of!(UsartRegs, rtor) == 0x14);
const _: () = assert!(offset_of!(UsartRegs, rqr) == 0x18);
const _: () = assert!(offset_of!(UsartRegs, isr) == 0x1C);
const _: () = assert!(offset_of!(UsartRegs, icr) == 0x20);
const _: () = assert!(offset_of!(UsartRegs, rdr) == 0x24);
const _: () = assert!(offset_of!(UsartRegs, tdr) == 0x28);
const _: () = assert!(offset_of!(UsartRegs, presc) == 0x2C);
pub const USART1_BASE: usize = 0x4001_1000;
pub const USART2_BASE: usize = 0x4000_4400;
pub const USART3_BASE: usize = 0x4000_4800;
pub const UART4_BASE: usize = 0x4000_4C00;
pub const UART5_BASE: usize = 0x4000_5000;
pub const USART6_BASE: usize = 0x4001_1400;
pub const UART7_BASE: usize = 0x4000_7800;
pub const UART8_BASE: usize = 0x4000_7C00;
pub struct Usart {
base: MmioAddr<UsartRegs>,
}
impl Usart {
pub const unsafe fn new(base: usize) -> Self {
Self {
base: unsafe { MmioAddr::new(base) },
}
}
pub const unsafe fn usart1() -> Self {
unsafe { Self::new(USART1_BASE) }
}
#[inline]
pub fn regs(&self) -> &UsartRegs {
unsafe { &*self.base.as_ptr() }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn usart1_base_matches_legacy_constants() {
assert_eq!(USART1_BASE, 0x4001_1000);
assert_eq!(USART1_BASE + offset_of!(UsartRegs, cr1), 0x4001_1000);
assert_eq!(USART1_BASE + offset_of!(UsartRegs, isr), 0x4001_101C);
assert_eq!(USART1_BASE + offset_of!(UsartRegs, icr), 0x4001_1020);
assert_eq!(USART1_BASE + offset_of!(UsartRegs, rdr), 0x4001_1024);
assert_eq!(USART1_BASE + offset_of!(UsartRegs, tdr), 0x4001_1028);
}
}