d0fe654c82
Compiler will infer a different lifetime for BootFlash than for the borrowed flash, which makes it require more type annotations than if it was just owning the type. Since it doesn't really matter if it owns or borrows in practical use, change it to own so that it simplifies usage.
47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
#![no_std]
|
|
#![no_main]
|
|
|
|
use cortex_m_rt::{entry, exception};
|
|
#[cfg(feature = "defmt")]
|
|
use defmt_rtt as _;
|
|
use embassy_boot_nrf::*;
|
|
use embassy_nrf::nvmc::Nvmc;
|
|
|
|
#[entry]
|
|
fn main() -> ! {
|
|
let p = embassy_nrf::init(Default::default());
|
|
|
|
// Uncomment this if you are debugging the bootloader with debugger/RTT attached,
|
|
// as it prevents a hard fault when accessing flash 'too early' after boot.
|
|
/*
|
|
for i in 0..10000000 {
|
|
cortex_m::asm::nop();
|
|
}
|
|
*/
|
|
|
|
let mut bl = BootLoader::default();
|
|
let start = bl.prepare(&mut SingleFlashConfig::new(&mut BootFlash::<_, 4096>::new(
|
|
WatchdogFlash::start(Nvmc::new(p.NVMC), p.WDT, 5),
|
|
)));
|
|
unsafe { bl.load(start) }
|
|
}
|
|
|
|
#[no_mangle]
|
|
#[cfg_attr(target_os = "none", link_section = ".HardFault.user")]
|
|
unsafe extern "C" fn HardFault() {
|
|
cortex_m::peripheral::SCB::sys_reset();
|
|
}
|
|
|
|
#[exception]
|
|
unsafe fn DefaultHandler(_: i16) -> ! {
|
|
const SCB_ICSR: *const u32 = 0xE000_ED04 as *const u32;
|
|
let irqn = core::ptr::read_volatile(SCB_ICSR) as u8 as i16 - 16;
|
|
|
|
panic!("DefaultHandler #{:?}", irqn);
|
|
}
|
|
|
|
#[panic_handler]
|
|
fn panic(_info: &core::panic::PanicInfo) -> ! {
|
|
cortex_m::asm::udf();
|
|
}
|