From: Tilman Sauerbeck Date: Tue, 9 Jul 2019 04:43:39 +0000 (+0200) Subject: bootloader: Only attempt to jump to application if there is any. X-Git-Url: http://git.code-monkey.de/?p=gps-watch.git;a=commitdiff_plain;h=b1226e2bd4adc31d81d02faf507f3d9c5dfe850e bootloader: Only attempt to jump to application if there is any. We now read the first word from flash where the application is installed and compare against 0xffffffff to see if programming succeeded. --- diff --git a/src/bootloader/main.rs b/src/bootloader/main.rs index 0d29549..8c6f149 100644 --- a/src/bootloader/main.rs +++ b/src/bootloader/main.rs @@ -30,12 +30,15 @@ extern crate common; mod flash; mod bootloader; +use common::register; use common::clock; use common::systick; use common::port; use common::gpio; use common::usb_serial; +type Reg32 = register::Register; + extern { fn jump_to_application(address: u32); } @@ -46,6 +49,12 @@ const APPLICATION_ADDR: u32 = 0x0; #[cfg(bootloader_type = "final")] const APPLICATION_ADDR: u32 = 0x8000; +unsafe fn application_missing() -> bool { + let first_app_word = Reg32::new(APPLICATION_ADDR); + + first_app_word.read() == 0xffffffff +} + fn bootloader_requested() -> bool { let start_ticks = systick::now(); @@ -68,12 +77,12 @@ pub unsafe extern fn main() { port::set_af(port::PORTE, 24, 1); port::set_pull(port::PORTE, 24, port::Pull::Up); - if bootloader_requested() { + if application_missing() || bootloader_requested() { usb_serial::init(0xf055, 0x635c); let mut b = bootloader::Bootloader::new(); - while b.run() { + while b.run() || application_missing() { } }