extra.c (1071B)
1 // Copyright 2023 Nick Brassel (@tzarc) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 #include <hal.h> 4 #define BOOTLOADER_MAGIC 0xDEADBEEF 5 6 //////////////////////////////////////////////////////////////////////////////// 7 // Different signalling for bootloader entry 8 // - RAM is cleared on reset, so we can't use the usual __ram0_end__ symbol. 9 // - Use backup registers in the RTC peripheral to store the magic value instead. 10 11 static inline void enable_backup_register_access(void) { 12 PWR->CR1 |= PWR_CR1_DBP; 13 } 14 15 static inline void disable_backup_register_access(void) { 16 PWR->CR1 &= ~PWR_CR1_DBP; 17 } 18 19 void bootloader_marker_enable(void) { 20 enable_backup_register_access(); 21 RTC->BKP0R = BOOTLOADER_MAGIC; 22 disable_backup_register_access(); 23 } 24 25 bool bootloader_marker_active(void) { 26 enable_backup_register_access(); 27 bool ret = RTC->BKP0R == BOOTLOADER_MAGIC; 28 disable_backup_register_access(); 29 return ret; 30 } 31 32 void bootloader_marker_disable(void) { 33 enable_backup_register_access(); 34 RTC->BKP0R = 0; 35 disable_backup_register_access(); 36 }