#[derive(derive_mmio::Mmio)]
#[repr(C)]
struct Uart {
data: u32,
#[mmio(Read, Write, Modify)]
control: u32,
#[mmio(PureRead)]
status: u32,
#[mmio(Read)]
errors: u32,
_reserved: u32,
}
fn main() {
let mut uart = Uart {
data: 0xA,
control: 0xC,
status: 0xF,
errors: 0x2,
_reserved: 0,
};
let mut mmio_uart = unsafe { Uart::new_mmio(core::ptr::addr_of_mut!(uart)) };
let ptr_raw = core::ptr::addr_of_mut!(uart);
assert_eq!(mmio_uart.read_data(), 0xA);
mmio_uart.write_data(0x0B);
assert_eq!(mmio_uart.read_data(), 0xB);
assert_eq!(mmio_uart.pointer_to_data(), ptr_raw as _);
assert_eq!(mmio_uart.read_errors(), 0x2);
mmio_uart.modify_control(|f| {
assert_eq!(f, 0xC);
32
});
assert!(mmio_uart.read_control() == 32);
assert_eq!(mmio_uart.read_status(), 0xF);
let ptr_to_u32s = ptr_raw as *const u32;
assert_eq!(
mmio_uart.pointer_to_status(),
ptr_to_u32s.wrapping_add(2) as _
);
let mmio_uart_clone = unsafe { mmio_uart.clone() };
assert_eq!(mmio_uart_clone.read_data(), 0xB);
let mmio_uart_clone = unsafe { mmio_uart.clone() };
let status = mmio_uart_clone.read_status();
assert_eq!(status, 0xF);
let data_ptr = mmio_uart_clone.pointer_to_data();
let data = unsafe { core::ptr::read_volatile(data_ptr) };
assert_eq!(data, 0xB);
}