Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/flipperzero-firmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorあく <alleteam@gmail.com>2021-12-24 17:33:58 +0300
committerGitHub <noreply@github.com>2021-12-24 17:33:58 +0300
commit7cea359be84cb8bf72879f1264faf9b088b054f9 (patch)
treeb3db66dd1ed9265c0d61584c9b7a20bce8a0b900 /firmware
parent79e0aed1e6be9e8670595219a5e1567e92ab183b (diff)
Storage: lfs config fingerprinting. RTC: fix data collision in lock register, refactor and cleanup. (#928)
Diffstat (limited to 'firmware')
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-bootloader.c8
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-lock.c17
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-rtc.c45
-rw-r--r--firmware/targets/f6/furi-hal/furi-hal-version.c6
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-bootloader.c8
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-lock.c17
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-rtc.c45
-rw-r--r--firmware/targets/f7/furi-hal/furi-hal-version.c6
-rw-r--r--firmware/targets/furi-hal-include/furi-hal-lock.h5
-rw-r--r--firmware/targets/furi-hal-include/furi-hal-rtc.h13
10 files changed, 87 insertions, 83 deletions
diff --git a/firmware/targets/f6/furi-hal/furi-hal-bootloader.c b/firmware/targets/f6/furi-hal/furi-hal-bootloader.c
index b5e7cb5c..eca6f947 100644
--- a/firmware/targets/f6/furi-hal/furi-hal-bootloader.c
+++ b/firmware/targets/f6/furi-hal/furi-hal-bootloader.c
@@ -1,5 +1,5 @@
#include <furi-hal-bootloader.h>
-#include <stm32wbxx_ll_rtc.h>
+#include <furi-hal-rtc.h>
#include <furi.h>
#define TAG "FuriHalBoot"
@@ -11,15 +11,15 @@
void furi_hal_bootloader_init() {
#ifndef DEBUG
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_TAINTED);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_TAINTED);
#endif
FURI_LOG_I(TAG, "Init OK");
}
void furi_hal_bootloader_set_mode(FuriHalBootloaderMode mode) {
if (mode == FuriHalBootloaderModeNormal) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_CLEAN);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_CLEAN);
} else if (mode == FuriHalBootloaderModeDFU) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_DFU);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_DFU);
}
}
diff --git a/firmware/targets/f6/furi-hal/furi-hal-lock.c b/firmware/targets/f6/furi-hal/furi-hal-lock.c
deleted file mode 100644
index 0f519380..00000000
--- a/firmware/targets/f6/furi-hal/furi-hal-lock.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "furi-hal-lock.h"
-#include <stm32wbxx_ll_rtc.h>
-
-#define FLIPPER_LOCKED_VALUE 0x5432FAFA
-
-bool furi_hal_lock_get() {
- return FLIPPER_LOCKED_VALUE == LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR3);
-}
-
-void furi_hal_lock_set(bool locked) {
- if (locked) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR3, FLIPPER_LOCKED_VALUE);
- } else {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR3, 0);
- }
-}
-
diff --git a/firmware/targets/f6/furi-hal/furi-hal-rtc.c b/firmware/targets/f6/furi-hal/furi-hal-rtc.c
index 20e77e13..45498077 100644
--- a/firmware/targets/f6/furi-hal/furi-hal-rtc.c
+++ b/firmware/targets/f6/furi-hal/furi-hal-rtc.c
@@ -6,10 +6,6 @@
#define TAG "FuriHalRtc"
-#define FURI_HAL_RTC_BOOT_FLAGS_REG LL_RTC_BKP_DR0
-#define FURI_HAL_RTC_BOOT_VERSION_REG LL_RTC_BKP_DR1
-#define FURI_HAL_RTC_SYSTEM_REG LL_RTC_BKP_DR2
-
typedef struct {
uint8_t log_level:4;
uint8_t log_reserved:4;
@@ -17,6 +13,8 @@ typedef struct {
uint16_t reserved;
} DeveloperReg;
+_Static_assert(sizeof(DeveloperReg) == 4, "DeveloperReg size mismatch");
+
void furi_hal_rtc_init() {
if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) {
LL_RCC_ForceBackupDomainReset();
@@ -38,33 +36,46 @@ void furi_hal_rtc_init() {
FURI_LOG_I(TAG, "Init OK");
}
+uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg) {
+ return LL_RTC_BAK_GetRegister(RTC, reg);
+}
+
+void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value) {
+ LL_RTC_BAK_SetRegister(RTC, reg, value);
+}
+
void furi_hal_rtc_set_log_level(uint8_t level) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->log_level = level;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->log_level = level;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
furi_log_set_level(level);
}
uint8_t furi_hal_rtc_get_log_level() {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- return ((DeveloperReg*)&data)->log_level;
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ return data->log_level;
}
void furi_hal_rtc_set_flag(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->flags |= flag;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->flags |= flag;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
}
void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->flags &= ~flag;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->flags &= ~flag;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
}
bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- return ((DeveloperReg*)&data)->flags & flag;
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ return data->flags & flag;
}
void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) {
diff --git a/firmware/targets/f6/furi-hal/furi-hal-version.c b/firmware/targets/f6/furi-hal/furi-hal-version.c
index 8f5f26d9..218a6be4 100644
--- a/firmware/targets/f6/furi-hal/furi-hal-version.c
+++ b/firmware/targets/f6/furi-hal/furi-hal-version.c
@@ -1,4 +1,5 @@
#include <furi-hal-version.h>
+#include <furi-hal-rtc.h>
#include <furi.h>
#include <stm32wbxx.h>
@@ -193,6 +194,9 @@ void furi_hal_version_init() {
break;
default: furi_crash(NULL);
}
+
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystemVersion, (uint32_t)version_get());
+
FURI_LOG_I(TAG, "Init OK");
}
@@ -283,7 +287,7 @@ const struct Version* furi_hal_version_get_bootloader_version(void) {
return 0;
#else
/* Backup register which points to structure in flash memory */
- return (const struct Version*)LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR1);
+ return (const struct Version*)furi_hal_rtc_get_register(FuriHalRtcRegisterBootVersion);
#endif
}
diff --git a/firmware/targets/f7/furi-hal/furi-hal-bootloader.c b/firmware/targets/f7/furi-hal/furi-hal-bootloader.c
index b5e7cb5c..eca6f947 100644
--- a/firmware/targets/f7/furi-hal/furi-hal-bootloader.c
+++ b/firmware/targets/f7/furi-hal/furi-hal-bootloader.c
@@ -1,5 +1,5 @@
#include <furi-hal-bootloader.h>
-#include <stm32wbxx_ll_rtc.h>
+#include <furi-hal-rtc.h>
#include <furi.h>
#define TAG "FuriHalBoot"
@@ -11,15 +11,15 @@
void furi_hal_bootloader_init() {
#ifndef DEBUG
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_TAINTED);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_TAINTED);
#endif
FURI_LOG_I(TAG, "Init OK");
}
void furi_hal_bootloader_set_mode(FuriHalBootloaderMode mode) {
if (mode == FuriHalBootloaderModeNormal) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_CLEAN);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_CLEAN);
} else if (mode == FuriHalBootloaderModeDFU) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR0, BOOT_REQUEST_DFU);
+ furi_hal_rtc_set_register(FuriHalRtcRegisterBoot, BOOT_REQUEST_DFU);
}
}
diff --git a/firmware/targets/f7/furi-hal/furi-hal-lock.c b/firmware/targets/f7/furi-hal/furi-hal-lock.c
deleted file mode 100644
index 0f519380..00000000
--- a/firmware/targets/f7/furi-hal/furi-hal-lock.c
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "furi-hal-lock.h"
-#include <stm32wbxx_ll_rtc.h>
-
-#define FLIPPER_LOCKED_VALUE 0x5432FAFA
-
-bool furi_hal_lock_get() {
- return FLIPPER_LOCKED_VALUE == LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR3);
-}
-
-void furi_hal_lock_set(bool locked) {
- if (locked) {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR3, FLIPPER_LOCKED_VALUE);
- } else {
- LL_RTC_BAK_SetRegister(RTC, LL_RTC_BKP_DR3, 0);
- }
-}
-
diff --git a/firmware/targets/f7/furi-hal/furi-hal-rtc.c b/firmware/targets/f7/furi-hal/furi-hal-rtc.c
index 20e77e13..45498077 100644
--- a/firmware/targets/f7/furi-hal/furi-hal-rtc.c
+++ b/firmware/targets/f7/furi-hal/furi-hal-rtc.c
@@ -6,10 +6,6 @@
#define TAG "FuriHalRtc"
-#define FURI_HAL_RTC_BOOT_FLAGS_REG LL_RTC_BKP_DR0
-#define FURI_HAL_RTC_BOOT_VERSION_REG LL_RTC_BKP_DR1
-#define FURI_HAL_RTC_SYSTEM_REG LL_RTC_BKP_DR2
-
typedef struct {
uint8_t log_level:4;
uint8_t log_reserved:4;
@@ -17,6 +13,8 @@ typedef struct {
uint16_t reserved;
} DeveloperReg;
+_Static_assert(sizeof(DeveloperReg) == 4, "DeveloperReg size mismatch");
+
void furi_hal_rtc_init() {
if(LL_RCC_GetRTCClockSource() != LL_RCC_RTC_CLKSOURCE_LSE) {
LL_RCC_ForceBackupDomainReset();
@@ -38,33 +36,46 @@ void furi_hal_rtc_init() {
FURI_LOG_I(TAG, "Init OK");
}
+uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg) {
+ return LL_RTC_BAK_GetRegister(RTC, reg);
+}
+
+void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value) {
+ LL_RTC_BAK_SetRegister(RTC, reg, value);
+}
+
void furi_hal_rtc_set_log_level(uint8_t level) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->log_level = level;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->log_level = level;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
furi_log_set_level(level);
}
uint8_t furi_hal_rtc_get_log_level() {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- return ((DeveloperReg*)&data)->log_level;
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ return data->log_level;
}
void furi_hal_rtc_set_flag(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->flags |= flag;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->flags |= flag;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
}
void furi_hal_rtc_reset_flag(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- ((DeveloperReg*)&data)->flags &= ~flag;
- LL_RTC_BAK_SetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG, data);
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ data->flags &= ~flag;
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystem, data_reg);
}
bool furi_hal_rtc_is_flag_set(FuriHalRtcFlag flag) {
- uint32_t data = LL_RTC_BAK_GetRegister(RTC, FURI_HAL_RTC_SYSTEM_REG);
- return ((DeveloperReg*)&data)->flags & flag;
+ uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterSystem);
+ DeveloperReg* data = (DeveloperReg*)&data_reg;
+ return data->flags & flag;
}
void furi_hal_rtc_set_datetime(FuriHalRtcDateTime* datetime) {
diff --git a/firmware/targets/f7/furi-hal/furi-hal-version.c b/firmware/targets/f7/furi-hal/furi-hal-version.c
index f38e6cdc..bd561c72 100644
--- a/firmware/targets/f7/furi-hal/furi-hal-version.c
+++ b/firmware/targets/f7/furi-hal/furi-hal-version.c
@@ -1,4 +1,5 @@
#include <furi-hal-version.h>
+#include <furi-hal-rtc.h>
#include <furi.h>
#include <stm32wbxx.h>
@@ -193,6 +194,9 @@ void furi_hal_version_init() {
break;
default: furi_crash(NULL);
}
+
+ furi_hal_rtc_set_register(FuriHalRtcRegisterSystemVersion, (uint32_t)version_get());
+
FURI_LOG_I(TAG, "Init OK");
}
@@ -283,7 +287,7 @@ const struct Version* furi_hal_version_get_bootloader_version(void) {
return 0;
#else
/* Backup register which points to structure in flash memory */
- return (const struct Version*)LL_RTC_BAK_GetRegister(RTC, LL_RTC_BKP_DR1);
+ return (const struct Version*)furi_hal_rtc_get_register(FuriHalRtcRegisterBootVersion);
#endif
}
diff --git a/firmware/targets/furi-hal-include/furi-hal-lock.h b/firmware/targets/furi-hal-include/furi-hal-lock.h
deleted file mode 100644
index d07ce571..00000000
--- a/firmware/targets/furi-hal-include/furi-hal-lock.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#pragma once
-#include <stdbool.h>
-
-bool furi_hal_lock_get();
-void furi_hal_lock_set(bool locked);
diff --git a/firmware/targets/furi-hal-include/furi-hal-rtc.h b/firmware/targets/furi-hal-include/furi-hal-rtc.h
index cc2f56f5..36bf218c 100644
--- a/firmware/targets/furi-hal-include/furi-hal-rtc.h
+++ b/firmware/targets/furi-hal-include/furi-hal-rtc.h
@@ -28,11 +28,24 @@ typedef struct {
typedef enum {
FuriHalRtcFlagDebug = (1<<0),
FuriHalRtcFlagFactoryReset = (1<<1),
+ FuriHalRtcFlagLock = (1<<2),
} FuriHalRtcFlag;
+typedef enum {
+ FuriHalRtcRegisterBoot,
+ FuriHalRtcRegisterBootVersion,
+ FuriHalRtcRegisterSystem,
+ FuriHalRtcRegisterSystemVersion,
+ FuriHalRtcRegisterLfsFingerprint,
+} FuriHalRtcRegister;
+
/** Initialize RTC subsystem */
void furi_hal_rtc_init();
+uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg);
+
+void furi_hal_rtc_set_register(FuriHalRtcRegister reg, uint32_t value);
+
void furi_hal_rtc_set_log_level(uint8_t level);
uint8_t furi_hal_rtc_get_log_level();