Storage: lfs config fingerprinting. RTC: fix data collision in lock register, refactor and cleanup. (#928)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -1,5 +0,0 @@
|
||||
#pragma once
|
||||
#include <stdbool.h>
|
||||
|
||||
bool furi_hal_lock_get();
|
||||
void furi_hal_lock_set(bool locked);
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user