From 2b7b499c634820c9882494adba03a048fc0725d0 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Wed, 27 Jun 2018 18:46:34 +1000 Subject: [PATCH] HAL_ChibiOS: added support for RTC sig for fast boot --- libraries/AP_HAL_ChibiOS/Scheduler.cpp | 5 ++- .../AP_HAL_ChibiOS/hwdef/common/stm32_util.c | 33 +++++++++++++++++++ .../AP_HAL_ChibiOS/hwdef/common/stm32_util.h | 12 +++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/libraries/AP_HAL_ChibiOS/Scheduler.cpp b/libraries/AP_HAL_ChibiOS/Scheduler.cpp index 36e65333ff..a0d67e7f1d 100644 --- a/libraries/AP_HAL_ChibiOS/Scheduler.cpp +++ b/libraries/AP_HAL_ChibiOS/Scheduler.cpp @@ -32,6 +32,7 @@ #include #include #include +#include "hwdef/common/stm32_util.h" #include "shared_dma.h" #include "sdcard.h" @@ -232,7 +233,6 @@ void Scheduler::register_timer_failsafe(AP_HAL::Proc failsafe, uint32_t period_u _failsafe = failsafe; } -extern void Reset_Handler(); void Scheduler::reboot(bool hold_in_bootloader) { // disarm motors to ensure they are off during a bootloader upload @@ -245,6 +245,9 @@ void Scheduler::reboot(bool hold_in_bootloader) // stop sdcard driver, if active sdcard_stop(); + // setup RTC for fast reboot + set_fast_reboot(hold_in_bootloader?RTC_BOOT_HOLD:RTC_BOOT_FAST); + // disable all interrupt sources port_disable(); diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c index bf64dcde54..1ba5c1ef07 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.c @@ -218,3 +218,36 @@ uint32_t get_fattime() return fattime; } + +// get RTC backup register 0 +static uint32_t get_rtc_backup0(void) +{ + return RTC->BKP0R; +} + +// set RTC backup register 0 +static void set_rtc_backup0(uint32_t v) +{ + if ((RCC->BDCR & RCC_BDCR_RTCEN) == 0) { + RCC->BDCR |= STM32_RTCSEL; + RCC->BDCR |= RCC_BDCR_RTCEN; + } +#ifdef PWR_CR_DBP + PWR->CR |= PWR_CR_DBP; +#else + PWR->CR1 |= PWR_CR1_DBP; +#endif + RTC->BKP0R = v; +} + +// see if RTC registers is setup for a fast reboot +enum rtc_boot_magic check_fast_reboot(void) +{ + return (enum rtc_boot_magic)get_rtc_backup0(); +} + +// set RTC register for a fast reboot +void set_fast_reboot(enum rtc_boot_magic v) +{ + set_rtc_backup0(v); +} diff --git a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h index 96bda180ca..2caa4c4d4d 100644 --- a/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h +++ b/libraries/AP_HAL_ChibiOS/hwdef/common/stm32_util.h @@ -52,6 +52,18 @@ uint32_t get_fattime(void); #define OTP_BASE 0x1ff0f000 #define OTP_SIZE 1024 #endif + +enum rtc_boot_magic { + RTC_BOOT_OFF = 0, + RTC_BOOT_HOLD = 0xb0070001, + RTC_BOOT_FAST = 0xb0070002 +}; + +// see if RTC registers is setup for a fast reboot +enum rtc_boot_magic check_fast_reboot(void); + +// set RTC register for a fast reboot +void set_fast_reboot(enum rtc_boot_magic v); #ifdef __cplusplus }