use std::sync::Arc;
use ddevmem::{register_map, DevMem};
register_map! {
pub unsafe map DmaRegs (u32) {
0x00 =>
rw ctrl: u32 {
enable: 0,
nch: 1..=3
},
0x10 =>
rw fifo: [u32; 8],
0x40 =>
rw chan: [u32; 4] {
enable: 0,
prio: 1..=3
}
}
}
fn main() {
let devmem = unsafe { DevMem::new(0x0, Some(256)).unwrap() };
let mut dma = unsafe { DmaRegs::new(Arc::new(devmem)).unwrap() };
dma.set_ctrl_enable(1);
dma.set_ctrl_nch(4);
assert_eq!(dma.ctrl_nch(), 4);
assert_eq!(dma.fifo_len(), 8);
for i in 0..dma.fifo_len() {
dma.set_fifo(i, 0xA000 + i as u32);
}
for i in 0..dma.fifo_len() {
assert_eq!(dma.fifo(i), 0xA000 + i as u32);
println!(
"fifo[{i}] = 0x{:08X} @ offset 0x{:02X}",
dma.fifo(i),
dma.fifo_offset(i)
);
}
dma.modify_fifo(3, |v| v ^ 0xFF);
assert_eq!(dma.fifo(3), (0xA000 + 3) ^ 0xFF);
for i in 0..4 {
dma.set_chan_enable(i, 1);
dma.set_chan_prio(i, (i as u32) + 1);
}
for i in 0..4 {
assert_eq!(dma.chan_enable(i), 1);
assert_eq!(dma.chan_prio(i), (i as u32) + 1);
println!(
"chan[{i}] raw = 0x{:08X} enable={} prio={}",
dma.chan(i),
dma.chan_enable(i),
dma.chan_prio(i),
);
}
println!("\nAll array assertions passed!");
}