#[derive(derive_mmio::Mmio)]
#[repr(C)]
pub struct Uart {
control: u32,
array_0: [u32; 4],
array_1: [u32; 2],
#[mmio(PureRead)]
array_read_only: [u32; 4],
#[mmio(Write)]
array_write_only: [u32; 2],
}
fn main() {
let mut uart = Uart {
control: 0xC,
array_0: [0x1, 0x2, 0x3, 0x4],
array_1: [0x44, 0x22],
array_read_only: [0x4, 0x3, 0x2, 0x1],
array_write_only: [0, 0],
};
let mut mmio_uart = unsafe { Uart::new_mmio(core::ptr::addr_of_mut!(uart)) };
let val = mmio_uart.read_array_0(0).unwrap();
assert_eq!(val, 0x1);
println!("MMIO array 0 [0]: 0x{:X}", val);
mmio_uart.write_array_0(0, 0x4).unwrap();
let val = mmio_uart.read_array_0(0).unwrap();
assert_eq!(val, 0x4);
println!("MMIO array 0 [0]: 0x{:X}", val);
mmio_uart.write_array_write_only(0, 0xFF).unwrap();
mmio_uart.write_array_write_only(1, 0xFF).unwrap();
let mmio_uart = unsafe { Uart::new_mmio(core::ptr::addr_of_mut!(uart)) };
let ro_array_0 = mmio_uart.read_array_read_only(0).unwrap();
let ro_array_1 = mmio_uart.read_array_read_only(1).unwrap();
assert_eq!(ro_array_0, 0x4);
assert_eq!(ro_array_1, 0x3);
println!("MMIO read-only array[0]: 0x{:X}", ro_array_0);
println!("MMIO read-only array[1]: 0x{:X}", ro_array_1);
assert_eq!(mmio_uart.len_array_0(), 4);
assert_eq!(mmio_uart.len_array_1(), 2);
assert_eq!(mmio_uart.len_array_read_only(), 4);
assert_eq!(mmio_uart.len_array_write_only(), 2);
}
#[test]
fn test_main() {
main()
}