Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 4 additions & 7 deletions src/stm32f103/backup.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,18 +24,15 @@

#define RTC_BKP_DR(reg) MMIO16(BACKUP_REGS_BASE + 4 + (4 * (reg)))

void backup_write(enum BackupRegister reg, uint32_t value) {
void backup_write(enum BackupRegister reg, uint16_t value) {
rcc_periph_clock_enable(RCC_PWR);
rcc_periph_clock_enable(RCC_BKP);

pwr_disable_backup_domain_write_protect();
RTC_BKP_DR((int)reg*2) = value & 0xFFFFUL;
RTC_BKP_DR((int)reg*2+1) = (value & 0xFFFF0000UL) >> 16;
RTC_BKP_DR((int)reg) = value;
pwr_enable_backup_domain_write_protect();
}

uint32_t backup_read(enum BackupRegister reg) {
uint32_t value = ((uint32_t)RTC_BKP_DR((int)reg*2+1) << 16)
| ((uint32_t)RTC_BKP_DR((int)reg*2) << 0);
return value;
uint16_t backup_read(enum BackupRegister reg) {
return RTC_BKP_DR((int)reg);
}
11 changes: 8 additions & 3 deletions src/stm32f103/backup.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,19 @@
#define BACKUP_H_INCLUDED

enum BackupRegister {
BKP0 = 0,
BKP1,
BKP2,
BKP3,
BKP4,
BKP5,
BKP6,
BKP7,
BKP8,
BKP9,
BKP10,
};

extern void backup_write(enum BackupRegister reg, uint32_t value);
extern uint32_t backup_read(enum BackupRegister reg);
extern void backup_write(enum BackupRegister reg, uint16_t value);
extern uint16_t backup_read(enum BackupRegister reg);

#endif
12 changes: 9 additions & 3 deletions src/stm32f103/target_stm32f103.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,13 @@ _Static_assert((FLASH_BASE + FLASH_SIZE_OVERRIDE >= APP_BASE_ADDRESS),
"Incompatible flash size");
#endif

static const uint32_t CMD_BOOT = 0x544F4F42UL;
#ifndef REG_BOOT
#define REG_BOOT BKP1
#endif

#ifndef CMD_BOOT
#define CMD_BOOT 0x4F42UL
#endif

void target_clock_setup(void) {
#ifdef USE_HSI
Expand Down Expand Up @@ -160,13 +166,13 @@ const usbd_driver* target_usb_init(void) {
bool target_get_force_bootloader(void) {
bool force = false;
/* Check the RTC backup register */
uint32_t cmd = backup_read(BKP0);
uint16_t cmd = backup_read(REG_BOOT);
if (cmd == CMD_BOOT) {
force = true;
}

/* Clear the RTC backup register */
backup_write(BKP0, 0);
backup_write(REG_BOOT, 0);

#if HAVE_BUTTON
/* Wait some time in case the button has some debounce capacitor */
Expand Down
13 changes: 10 additions & 3 deletions src/stm32l1/target_stm32l1.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,15 @@
#include "config.h"
#include "backup.h"

#ifndef REG_BOOT
#define REG_BOOT BKP1
#endif

#ifndef CMD_BOOT
#define CMD_BOOT 0x544F4F42UL
#endif

//#define CMD_FAST_BOOT 0xfa57b007
static const uint32_t CMD_BOOT = 0x544F4F42UL;

void target_clock_setup(void) {

Expand Down Expand Up @@ -82,11 +89,11 @@ const usbd_driver* target_usb_init(void)
bool target_get_force_bootloader(void)
{
bool enter_bl = false;
uint32_t cmd = backup_read(BKP0);
uint32_t cmd = backup_read(REG_BOOT);
if (cmd == CMD_BOOT) {
enter_bl = true;
}
backup_write(BKP0, 0);
backup_write(REG_BOOT, 0);

#if HAVE_BUTTON
#warning HAVE_BUTTON not implemented for L1
Expand Down