mirror of
https://github.com/m-labs/artiq.git
synced 2024-12-20 08:56:28 +08:00
riscv: add IRQ control
This commit is contained in:
parent
51c15ac777
commit
13830a27af
49
artiq/firmware/libboard_misoc/riscv32/irq.rs
Normal file
49
artiq/firmware/libboard_misoc/riscv32/irq.rs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
use riscv::register::{mie, mstatus};
|
||||||
|
|
||||||
|
fn vmim_write(val: usize) {
|
||||||
|
unsafe {
|
||||||
|
asm!("csrw {csr}, {rs}", rs = in(reg) val, csr = const 0xBC0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vmim_read() -> usize {
|
||||||
|
let r: usize;
|
||||||
|
unsafe {
|
||||||
|
asm!("csrr {rd}, {csr}", rd = out(reg) r, csr = const 0xBC0);
|
||||||
|
}
|
||||||
|
r
|
||||||
|
}
|
||||||
|
|
||||||
|
fn vmip_read() -> usize {
|
||||||
|
let r: usize;
|
||||||
|
unsafe {
|
||||||
|
asm!("csrr {rd}, {csr}", rd = out(reg) r, csr = const 0xFC0);
|
||||||
|
}
|
||||||
|
r
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn enable_interrupts() {
|
||||||
|
unsafe {
|
||||||
|
mstatus::set_mie();
|
||||||
|
mie::set_mext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn disable_interrupts() {
|
||||||
|
unsafe {
|
||||||
|
mstatus::clear_mie();
|
||||||
|
mie::clear_mext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn enable(id: u32) {
|
||||||
|
vmim_write(vmim_read() | (1 << id));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn disable(id: u32) {
|
||||||
|
vmim_write(vmim_read() & !(1 << id));
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_pending(id: u32) -> bool {
|
||||||
|
(vmip_read() >> id) & 1 == 1
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
pub mod cache;
|
pub mod cache;
|
||||||
pub mod boot;
|
pub mod boot;
|
||||||
|
pub mod irq;
|
||||||
pub mod pmp;
|
pub mod pmp;
|
||||||
|
Loading…
Reference in New Issue
Block a user