#![no_std]
#[cfg(feature = "alloc")]
mod alloc;
#[cfg(feature = "alloc")]
use alloc::init_heap;
mod critical_section_impl;
critical_section::set_impl!(critical_section_impl::MPFSCriticalSection);
pub use mpfs_hal_procmacros::{hart1_main, hart2_main, hart3_main, hart4_main, init_once};
mod mutex;
pub use mutex::Mutex;
pub use mpfs_pac as pac;
pub use pac::hart_id;
mod peripheral;
pub use peripheral::*;
#[cfg(feature = "print")]
mod print;
#[cfg(feature = "print")]
pub use print::*;
#[cfg(feature = "log")]
mod logger;
#[cfg(feature = "log")]
pub use logger::init_logger;
pub mod ethernet;
pub mod gpio;
pub mod qspi;
pub mod uart;
pub mod usb;
extern "C" {
fn __init_once();
fn __init_once_embassy();
fn __hart1_entry();
fn __hart2_entry();
fn __hart3_entry();
fn __hart4_entry();
}
fn init_once() {
unsafe {
pac::mss_config_clk_rst(
pac::mss_peripherals__MSS_PERIPH_CFM,
pac::MPFS_HAL_FIRST_HART as u8,
pac::PERIPH_RESET_STATE__PERIPHERAL_ON,
);
#[cfg(feature = "alloc")]
init_heap();
#[cfg(feature = "print")]
init_print();
__init_once_embassy();
__init_once();
}
}
#[no_mangle]
extern "C" fn u54_1() {
unsafe {
pac::clear_soft_interrupt();
core::arch::asm!("csrs mie, {}", const pac::MIP_MSIP, options(nomem, nostack));
pac::PLIC_init();
pac::__enable_irq();
init_once();
pac::raise_soft_interrupt(2);
pac::raise_soft_interrupt(3);
pac::raise_soft_interrupt(4);
__hart1_entry();
}
}
#[no_mangle]
extern "C" fn u54_2() {
unsafe {
pac::clear_soft_interrupt();
core::arch::asm!("csrs mie, {}", const pac::MIP_MSIP, options(nomem, nostack));
pac::PLIC_init();
pac::__enable_irq();
core::arch::asm!("wfi", options(nomem, nostack));
__hart2_entry();
}
}
#[no_mangle]
extern "C" fn u54_3() {
unsafe {
pac::clear_soft_interrupt();
core::arch::asm!("csrs mie, {}", const pac::MIP_MSIP, options(nomem, nostack));
pac::PLIC_init();
pac::__enable_irq();
core::arch::asm!("wfi", options(nomem, nostack));
__hart3_entry();
}
}
#[no_mangle]
extern "C" fn u54_4() {
unsafe {
pac::clear_soft_interrupt();
core::arch::asm!("csrs mie, {}", const pac::MIP_MSIP, options(nomem, nostack));
pac::PLIC_init();
pac::__enable_irq();
core::arch::asm!("wfi", options(nomem, nostack));
__hart4_entry();
}
}