#![no_std]
#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
#![doc = document_features::document_features!(feature_label = r#"<span class="stab portability"><code>{feature}</code></span>"#)]
#[doc(hidden)]
pub mod fmt;
#[cfg(any(adc12, adc14, adc16))]
pub mod adc;
pub mod clock;
pub mod crc;
#[cfg(dac12)]
pub mod dac;
#[cfg(dmac)]
pub mod dmac;
pub mod dtc;
pub mod event_link;
pub mod gpio;
#[cfg(iic)]
pub mod i2c;
pub mod mcu_info;
pub mod module_stop;
#[cfg(not(feature = "skip-osm"))]
pub mod osm;
#[cfg(gpt)]
pub mod pwm;
#[cfg(gpt)]
pub mod qdec;
#[cfg(any(agt, agtw))]
pub mod timer_agt;
#[cfg(gpt)]
pub mod timer_gpt;
#[cfg(ulpt)]
pub mod timer_ulpt;
pub mod watchdog;
#[cfg(slcdc)]
pub mod slcdc;
#[cfg(ra4m1)]
pub mod spi;
#[cfg(trust_zone)]
pub mod trust_zone;
cfg_select! {
feature = "time-driver" => {
#[cfg_attr(feature = "time-driver-agt", path = "time_driver_agt.rs")]
#[cfg_attr(any(feature = "time-driver-gpt0", feature = "time-driver-gpt1"), path = "time_driver_gpt.rs")]
#[cfg_attr(feature = "time-driver-ulpt", path = "time_driver_ulpt.rs")]
pub mod time_driver;
}
_ => {}
}
pub mod uart;
pub mod write_protect;
#[cfg(feature = "usb-driver")]
pub mod usb;
#[cfg(feature = "chrono")]
pub use chrono;
pub use embassy_hal_internal::Peri;
cfg_select! {
feature = "unstable-pac" => {
pub use ra_metapac as pac;
}
_ => {
pub(crate) use ra_metapac as pac;
}
}
use crate::mcu_info::McuInfo;
#[cfg_attr(feature = "defmt", derive(defmt::Format))]
#[allow(unused)]
pub enum ResetCause {
PowerOn,
LowVoltage,
Watchdog,
HadwareError,
StackPointer,
SoftwareReset,
Unknown,
}
pub fn init(clocks: clock::ClockConfig) -> Peripherals {
critical_section::with(|cs| {
debug!("Starting board init");
let mcu_info = McuInfo::info();
#[cfg(feature = "defmt")]
mcu_info.print_info();
mcu_info.validate_package();
{
let osm = pac::OSM;
debug!("OFS0: {}", osm.ofs0().read());
debug!("OFS1: {}", osm.ofs1().read());
}
#[cfg(trust_zone)]
trust_zone::init();
if clock::init(clocks).is_err() {
panic!("Clocks were already initialized?");
}
info!("{}", clock::clock_status());
#[cfg(feature = "time-driver")]
time_driver::init();
event_link::init();
dtc::init();
#[cfg(dmac)]
dmac::init();
Peripherals::take_with_cs(cs)
})
}
#[macro_export]
macro_rules! bind_interrupts {
($(#[$outer:meta])* $vis:vis struct $name:ident {
$(
$(#[doc = $doc:literal])*
$(#[cfg($cond_irq:meta)])?
$irq:ident => $(
$(#[cfg($cond_handler:meta)])?
$handler:ty
),*;
)*
}) => {
#[derive(Copy, Clone)]
$(#[$outer])*
$vis struct $name;
$(
#[allow(non_snake_case)]
#[unsafe(no_mangle)]
$(#[cfg($cond_irq)])?
$(#[doc = $doc])*
unsafe extern "C" fn $irq() {
unsafe {
$(
$(#[cfg($cond_handler)])?
<$handler as $crate::interrupt::typelevel::Handler<$crate::interrupt::typelevel::$irq>>::on_interrupt();
)*
}
}
$(#[cfg($cond_irq)])?
$crate::bind_interrupts!(@inner
$(
$(#[cfg($cond_handler)])?
unsafe impl $crate::interrupt::typelevel::Binding<$crate::interrupt::typelevel::$irq, $handler> for $name {}
)*
);
)*
};
(@inner $($t:tt)*) => {
$($t)*
}
}
include!(concat!(env!("OUT_DIR"), "/misc.rs"));
include!(concat!(env!("OUT_DIR"), "/interrupts.rs"));
include!(concat!(env!("OUT_DIR"), "/peripherals.rs"));
include!(concat!(env!("OUT_DIR"), "/module_stops.rs"));
#[allow(missing_docs)]
pub mod constants {
include!(concat!(env!("OUT_DIR"), "/constants.rs"));
}
#[cfg(not(feature = "skip-osm"))]
mod _osm_config {
use crate::osm::{ofs0::Ofs0, ofs1::Ofs1, sec_mpu::SecurityMpu};
#[unsafe(no_mangle)]
#[unsafe(link_section = ".ofs0")]
static OFS0: Ofs0 = Ofs0::default();
#[unsafe(no_mangle)]
#[unsafe(link_section = ".ofs1")]
static OFS1: Ofs1 = Ofs1::default();
#[unsafe(no_mangle)]
#[unsafe(link_section = ".sec_mpu")]
static SEC_MPU: SecurityMpu = SecurityMpu::disabled();
}
#[macro_export]
macro_rules! exit {
() => {
unsafe {
cortex_m::asm::semihosting_syscall(0x18, 0x20026);
};
};
}