1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#![no_std]
#![feature(naked_functions)]
pub mod uart;
use core::arch::asm;
use critical_section::{RawRestoreState};
critical_section::set_impl!(RiscvCriticalSection);
struct RiscvCriticalSection;
unsafe impl critical_section::Impl for RiscvCriticalSection {
unsafe fn acquire() -> RawRestoreState {
let was_active = riscv::register::mstatus::read().mie();
riscv::interrupt::disable();
was_active
}
unsafe fn release(was_active: RawRestoreState) {
if was_active {
riscv::interrupt::enable()
}
}
}
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo) -> ! {
loop {
unsafe {
riscv::asm::wfi();
}
}
}
#[export_name = "_setup_interrupts"]
pub unsafe extern "Rust" fn ch569_setup_interrupts()
{
riscv::register::mtvec::write(vector_table as usize, riscv::register::mtvec::TrapMode::Vectored);
}
#[export_name = "_nmi_handler"]
pub unsafe extern fn nmi_handler() -> !
{
loop {
}
}
#[export_name = "_hard_fault_handler"]
pub unsafe extern fn fault_handler() -> !
{
loop {
}
}
#[link_section = ".init"]
#[no_mangle]
#[naked]
pub unsafe extern fn vector_table() -> !
{
asm!(
"j _start",
"j _start",
"j _nmi_handler",
"j _hard_fault_handler",
options(noreturn)
)
}