xous-core/examples/shell/src/timer.rs
Sean Cross c09b140306 examples: shell: use 32-bit timer csr
Signed-off-by: Sean Cross <sean@xobs.io>
2020-03-10 16:41:48 +08:00

62 lines
1.5 KiB
Rust

const SYSTEM_CLOCK_FREQUENCY: u32 = 12_000_000;
const TIMER_BASE: usize = 0xF000_3000;
fn timer_tick(_irq_no: usize, _arg: *mut usize) {
println!("Timer tick");
let ptr = TIMER_BASE as *mut usize;
// acknowledge the timer
unsafe { ptr.add(6).write_volatile(1) };
}
pub fn init() {
println!("Allocating timer...");
xous::rsyscall(xous::SysCall::MapPhysical(
TIMER_BASE as *mut usize,
TIMER_BASE as *mut usize,
4096,
xous::MemoryFlags::R | xous::MemoryFlags::W,
))
.expect("timer: couldn't map timer");
xous::rsyscall(xous::SysCall::ClaimInterrupt(
1,
timer_tick as *mut usize,
0 as *mut usize,
))
.expect("timer: couldn't claim interrupt");
let ms = 1000; // tick every 1000 ms
en(false);
load(SYSTEM_CLOCK_FREQUENCY / 1_000 * ms);
reload(SYSTEM_CLOCK_FREQUENCY / 1_000 * ms);
en(true);
// Set EV_ENABLE
let ptr = TIMER_BASE as *mut usize;
unsafe { ptr.add(7).write_volatile(1) };
}
pub fn load(value: u32) {
let ptr = TIMER_BASE as *mut usize;
unsafe {
ptr.add(0).write_volatile(value as usize);
}
}
pub fn reload(value: u32) {
let ptr = TIMER_BASE as *mut usize;
unsafe {
ptr.add(1).write_volatile(value as usize);
}
}
pub fn en(en: bool) {
let ptr = TIMER_BASE as *mut usize;
if en {
unsafe { ptr.add(2).write_volatile(1) };
}
else {
unsafe { ptr.add(2).write_volatile(0) };
}
}