artiq/artiq/firmware/libboard_artiq/mailbox.rs

36 lines
716 B
Rust
Raw Normal View History

2016-09-30 08:15:20 +08:00
use core::ptr::{read_volatile, write_volatile};
use board_misoc::{mem, cache};
2016-09-30 08:15:20 +08:00
const MAILBOX: *mut usize = mem::MAILBOX_BASE as *mut usize;
2016-12-27 01:18:18 +08:00
static mut LAST: usize = 0;
2016-09-30 08:15:20 +08:00
pub unsafe fn send(data: usize) {
2016-12-27 01:18:18 +08:00
LAST = data;
write_volatile(MAILBOX, data)
2016-09-30 08:15:20 +08:00
}
pub fn acknowledged() -> bool {
unsafe {
let data = read_volatile(MAILBOX);
2016-12-27 01:18:18 +08:00
data == 0 || data != LAST
2016-09-30 08:15:20 +08:00
}
}
pub fn receive() -> usize {
2016-09-30 08:15:20 +08:00
unsafe {
let data = read_volatile(MAILBOX);
2016-12-27 01:18:18 +08:00
if data == LAST {
2016-09-30 08:15:20 +08:00
0
} else {
if data != 0 {
cache::flush_cpu_dcache()
2016-09-30 08:15:20 +08:00
}
data
}
}
}
pub fn acknowledge() {
unsafe { write_volatile(MAILBOX, 0) }
}