X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=src%2Fbootloader%2Fmain.rs;h=a5fe9832d30a7cf6d18ed9ca3e130e5477818163;hb=684d0bbaff4c9fc2935eb5281c897ac40b86b73f;hp=1a0a7cc3d53ebdf1194ec88bd11a3eec541837c7;hpb=c37308066d9b558af6878984612007f695776780;p=gps-watch.git diff --git a/src/bootloader/main.rs b/src/bootloader/main.rs index 1a0a7cc..a5fe983 100644 --- a/src/bootloader/main.rs +++ b/src/bootloader/main.rs @@ -35,11 +35,15 @@ use common::clock; use common::systick; use common::port; use common::gpio; +use common::watchdog; use common::usb_serial; type Reg32 = register::Register; extern { + fn enable_interrupts(); + fn disable_interrupts(); + fn jump_to_application(address: u32); } @@ -49,12 +53,24 @@ const APPLICATION_ADDR: u32 = 0x0; #[cfg(bootloader_type = "final")] const APPLICATION_ADDR: u32 = 0x8000; +#[cfg(bootloader_type = "intermediate")] +const USB_PID: u16 = 0x635b; + +#[cfg(bootloader_type = "final")] +const USB_PID: u16 = 0x635c; + unsafe fn application_missing() -> bool { let first_app_word = Reg32::new(APPLICATION_ADDR); first_app_word.read() == 0xffffffff } +#[cfg(bootloader_type = "intermediate")] +fn bootloader_requested() -> bool { + true +} + +#[cfg(bootloader_type = "final")] fn bootloader_requested() -> bool { let start_ticks = systick::now(); @@ -69,16 +85,20 @@ fn bootloader_requested() -> bool { #[no_mangle] pub unsafe extern fn main() { + watchdog::disable(); clock::configure(); systick::init(); + port::init(); // Configure lower left push button. gpio::set_direction(gpio::GPIOE, 1 << 24, gpio::Direction::Input); port::set_af(port::PORTE, 24, 1); port::set_pull(port::PORTE, 24, port::Pull::Up); + enable_interrupts(); + if application_missing() || bootloader_requested() { - usb_serial::init(0xf055, 0x635c); + usb_serial::init(0xf055, USB_PID); let mut b = bootloader::Bootloader::new(); @@ -88,5 +108,9 @@ pub unsafe extern fn main() { usb_serial::shutdown(); } + disable_interrupts(); + + clock::reset(); + jump_to_application(APPLICATION_ADDR); }