use std::sync::Arc;
use ddevmem::{register_map, DevMem};
register_map! {
pub unsafe map SpiRegs (u32) {
0x00 =>
rw cr: u32 {
cs: 0..=2,
cpol: 3,
cpha: 4,
enable: 5
},
0x04 =>
ro sr: u32 {
txe: 0,
rxne: 1,
busy: 7
},
0x08 =>
rw dr: u32,
0x0C =>
rw brr: u32 {
div: 0..=7
}
}
}
fn main() {
let devmem = unsafe { DevMem::new(0x0, Some(256)).unwrap() };
let mut spi = unsafe { SpiRegs::new(Arc::new(devmem)).unwrap() };
spi.set_cr_cs(2);
spi.set_cr_cpol(1);
spi.set_cr_cpha(0);
spi.set_cr_enable(1);
println!("CR = 0x{:08X}", spi.cr());
println!(" cs = {}", spi.cr_cs());
println!(" cpol = {}", spi.cr_cpol());
println!(" cpha = {}", spi.cr_cpha());
println!(" enable = {}", spi.cr_enable());
assert_eq!(spi.cr_cs(), 2);
assert_eq!(spi.cr_cpol(), 1);
assert_eq!(spi.cr_cpha(), 0);
assert_eq!(spi.cr_enable(), 1);
spi.set_dr(0xAB);
println!("\nDR = 0x{:08X}", spi.dr());
assert_eq!(spi.dr(), 0xAB);
spi.set_brr_div(7);
println!("BRR div = {}", spi.brr_div());
assert_eq!(spi.brr_div(), 7);
spi.modify_cr(|v| v ^ (1 << 5));
println!("\nAfter toggle enable: CR = 0x{:08X}", spi.cr());
assert_eq!(spi.cr_enable(), 0);
println!("\nAll assertions passed!");
}