#![no_std]
#![no_main]
extern crate panic_halt;
use riscv_rt::{core_interrupt, entry, exception, external_interrupt};
use riscv::{
interrupt::{Exception, Interrupt},
result::*,
};
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum ExternalInterrupt {
GPIO,
UART,
}
unsafe impl riscv::InterruptNumber for ExternalInterrupt {
const MAX_INTERRUPT_NUMBER: usize = 1;
#[inline]
fn number(self) -> usize {
self as usize
}
#[inline]
fn from_number(value: usize) -> Result<Self> {
match value {
0 => Ok(Self::GPIO),
1 => Ok(Self::UART),
_ => Err(Error::InvalidVariant(value)),
}
}
}
unsafe impl riscv::ExternalInterruptNumber for ExternalInterrupt {}
#[entry]
fn main() -> ! {
loop {}
}
#[core_interrupt(Interrupt::SupervisorSoft)]
fn supervisor_soft() {
loop {}
}
#[core_interrupt(Interrupt::SupervisorTimer)]
unsafe fn supervisor_timer() -> ! {
loop {}
}
#[external_interrupt(ExternalInterrupt::GPIO)]
fn external_gpio() {
loop {}
}
#[external_interrupt(ExternalInterrupt::UART)]
unsafe fn external_uart() -> ! {
loop {}
}
#[exception(Exception::InstructionMisaligned)]
fn instruction_misaligned() {
loop {}
}
#[exception(Exception::IllegalInstruction)]
unsafe fn illegal_instruction(_trap: &riscv_rt::TrapFrame) -> ! {
loop {}
}
#[exception(Exception::Breakpoint)]
unsafe fn breakpoint(_trap: &mut riscv_rt::TrapFrame) -> ! {
loop {}
}