FuriHal: RTC register reset API. New factory reset routine that wipes all RTC backup registers content. (#3288)
This commit is contained in:
parent
e2e3663524
commit
90cb1c4f2e
@ -179,7 +179,8 @@ static void rpc_system_system_factory_reset_process(const PB_Main* request, void
|
|||||||
RpcSession* session = (RpcSession*)context;
|
RpcSession* session = (RpcSession*)context;
|
||||||
furi_assert(session);
|
furi_assert(session);
|
||||||
|
|
||||||
furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_reset_registers();
|
||||||
|
furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
power_reboot(PowerBootModeNormal);
|
power_reboot(PowerBootModeNormal);
|
||||||
|
|
||||||
(void)session;
|
(void)session;
|
||||||
|
|||||||
@ -603,7 +603,8 @@ static void storage_cli_factory_reset(Cli* cli, FuriString* args, void* context)
|
|||||||
char c = cli_getc(cli);
|
char c = cli_getc(cli);
|
||||||
if(c == 'y' || c == 'Y') {
|
if(c == 'y' || c == 'Y') {
|
||||||
printf("Data will be wiped after reboot.\r\n");
|
printf("Data will be wiped after reboot.\r\n");
|
||||||
furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_reset_registers();
|
||||||
|
furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
power_reboot(PowerBootModeNormal);
|
power_reboot(PowerBootModeNormal);
|
||||||
} else {
|
} else {
|
||||||
printf("Safe choice.\r\n");
|
printf("Safe choice.\r\n");
|
||||||
|
|||||||
@ -189,7 +189,7 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
|
|||||||
lfs_t* lfs = &lfs_data->lfs;
|
lfs_t* lfs = &lfs_data->lfs;
|
||||||
|
|
||||||
bool was_fingerprint_outdated = storage_int_check_and_set_fingerprint(lfs_data);
|
bool was_fingerprint_outdated = storage_int_check_and_set_fingerprint(lfs_data);
|
||||||
bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagFactoryReset) ||
|
bool need_format = furi_hal_rtc_is_flag_set(FuriHalRtcFlagStorageFormatInternal) ||
|
||||||
was_fingerprint_outdated;
|
was_fingerprint_outdated;
|
||||||
|
|
||||||
if(need_format) {
|
if(need_format) {
|
||||||
@ -197,7 +197,7 @@ static void storage_int_lfs_mount(LFSData* lfs_data, StorageData* storage) {
|
|||||||
err = lfs_format(lfs, &lfs_data->config);
|
err = lfs_format(lfs, &lfs_data->config);
|
||||||
if(err == 0) {
|
if(err == 0) {
|
||||||
FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount");
|
FURI_LOG_I(TAG, "Factory reset: Format successful, trying to mount");
|
||||||
furi_hal_rtc_reset_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_reset_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
err = lfs_mount(lfs, &lfs_data->config);
|
err = lfs_mount(lfs, &lfs_data->config);
|
||||||
if(err == 0) {
|
if(err == 0) {
|
||||||
FURI_LOG_I(TAG, "Factory reset: Mounted");
|
FURI_LOG_I(TAG, "Factory reset: Mounted");
|
||||||
|
|||||||
@ -63,7 +63,8 @@ bool storage_settings_scene_factory_reset_on_event(void* context, SceneManagerEv
|
|||||||
scene_manager_set_scene_state(
|
scene_manager_set_scene_state(
|
||||||
app->scene_manager, StorageSettingsFactoryReset, counter);
|
app->scene_manager, StorageSettingsFactoryReset, counter);
|
||||||
} else {
|
} else {
|
||||||
furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_reset_registers();
|
||||||
|
furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
power_reboot(PowerBootModeNormal);
|
power_reboot(PowerBootModeNormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -343,7 +343,7 @@ int32_t update_task_worker_flash_writer(void* context) {
|
|||||||
|
|
||||||
furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePostUpdate);
|
furi_hal_rtc_set_boot_mode(FuriHalRtcBootModePostUpdate);
|
||||||
// Format LFS before restoring backup on next boot
|
// Format LFS before restoring backup on next boot
|
||||||
furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
#ifdef FURI_NDEBUG
|
#ifdef FURI_NDEBUG
|
||||||
// Production
|
// Production
|
||||||
furi_hal_rtc_set_log_level(FuriLogLevelDefault);
|
furi_hal_rtc_set_log_level(FuriLogLevelDefault);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,49.1,,
|
Version,+,49.2,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
Header,+,applications/services/cli/cli_vcp.h,,
|
Header,+,applications/services/cli/cli_vcp.h,,
|
||||||
@ -1247,6 +1247,7 @@ Function,-,furi_hal_rtc_init_early,void,
|
|||||||
Function,+,furi_hal_rtc_is_flag_set,_Bool,FuriHalRtcFlag
|
Function,+,furi_hal_rtc_is_flag_set,_Bool,FuriHalRtcFlag
|
||||||
Function,+,furi_hal_rtc_is_leap_year,_Bool,uint16_t
|
Function,+,furi_hal_rtc_is_leap_year,_Bool,uint16_t
|
||||||
Function,+,furi_hal_rtc_reset_flag,void,FuriHalRtcFlag
|
Function,+,furi_hal_rtc_reset_flag,void,FuriHalRtcFlag
|
||||||
|
Function,+,furi_hal_rtc_reset_registers,void,
|
||||||
Function,+,furi_hal_rtc_set_boot_mode,void,FuriHalRtcBootMode
|
Function,+,furi_hal_rtc_set_boot_mode,void,FuriHalRtcBootMode
|
||||||
Function,+,furi_hal_rtc_set_datetime,void,FuriHalRtcDateTime*
|
Function,+,furi_hal_rtc_set_datetime,void,FuriHalRtcDateTime*
|
||||||
Function,+,furi_hal_rtc_set_fault_data,void,uint32_t
|
Function,+,furi_hal_rtc_set_fault_data,void,uint32_t
|
||||||
|
|||||||
|
@ -1,5 +1,5 @@
|
|||||||
entry,status,name,type,params
|
entry,status,name,type,params
|
||||||
Version,+,49.1,,
|
Version,+,49.2,,
|
||||||
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
|
Header,+,applications/drivers/subghz/cc1101_ext/cc1101_ext_interconnect.h,,
|
||||||
Header,+,applications/services/bt/bt_service/bt.h,,
|
Header,+,applications/services/bt/bt_service/bt.h,,
|
||||||
Header,+,applications/services/cli/cli.h,,
|
Header,+,applications/services/cli/cli.h,,
|
||||||
@ -1414,6 +1414,7 @@ Function,-,furi_hal_rtc_init_early,void,
|
|||||||
Function,+,furi_hal_rtc_is_flag_set,_Bool,FuriHalRtcFlag
|
Function,+,furi_hal_rtc_is_flag_set,_Bool,FuriHalRtcFlag
|
||||||
Function,+,furi_hal_rtc_is_leap_year,_Bool,uint16_t
|
Function,+,furi_hal_rtc_is_leap_year,_Bool,uint16_t
|
||||||
Function,+,furi_hal_rtc_reset_flag,void,FuriHalRtcFlag
|
Function,+,furi_hal_rtc_reset_flag,void,FuriHalRtcFlag
|
||||||
|
Function,+,furi_hal_rtc_reset_registers,void,
|
||||||
Function,+,furi_hal_rtc_set_boot_mode,void,FuriHalRtcBootMode
|
Function,+,furi_hal_rtc_set_boot_mode,void,FuriHalRtcBootMode
|
||||||
Function,+,furi_hal_rtc_set_datetime,void,FuriHalRtcDateTime*
|
Function,+,furi_hal_rtc_set_datetime,void,FuriHalRtcDateTime*
|
||||||
Function,+,furi_hal_rtc_set_fault_data,void,uint32_t
|
Function,+,furi_hal_rtc_set_fault_data,void,uint32_t
|
||||||
@ -2289,8 +2290,8 @@ Function,+,mf_classic_is_value_block,_Bool,"MfClassicSectorTrailer*, uint8_t"
|
|||||||
Function,+,mf_classic_load,_Bool,"MfClassicData*, FlipperFormat*, uint32_t"
|
Function,+,mf_classic_load,_Bool,"MfClassicData*, FlipperFormat*, uint32_t"
|
||||||
Function,+,mf_classic_poller_auth,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
Function,+,mf_classic_poller_auth,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
||||||
Function,+,mf_classic_poller_auth_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
Function,+,mf_classic_poller_auth_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
||||||
Function,+,mf_classic_poller_get_nt_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
|
|
||||||
Function,+,mf_classic_poller_get_nt,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
|
Function,+,mf_classic_poller_get_nt,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
|
||||||
|
Function,+,mf_classic_poller_get_nt_nested,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicKeyType, MfClassicNt*"
|
||||||
Function,+,mf_classic_poller_halt,MfClassicError,MfClassicPoller*
|
Function,+,mf_classic_poller_halt,MfClassicError,MfClassicPoller*
|
||||||
Function,+,mf_classic_poller_read_block,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicBlock*"
|
Function,+,mf_classic_poller_read_block,MfClassicError,"MfClassicPoller*, uint8_t, MfClassicBlock*"
|
||||||
Function,+,mf_classic_poller_sync_auth,MfClassicError,"Nfc*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
Function,+,mf_classic_poller_sync_auth,MfClassicError,"Nfc*, uint8_t, MfClassicKey*, MfClassicKeyType, MfClassicAuthContext*"
|
||||||
|
|||||||
|
@ -132,13 +132,7 @@ void furi_hal_rtc_init_early() {
|
|||||||
uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterHeader);
|
uint32_t data_reg = furi_hal_rtc_get_register(FuriHalRtcRegisterHeader);
|
||||||
FuriHalRtcHeader* data = (FuriHalRtcHeader*)&data_reg;
|
FuriHalRtcHeader* data = (FuriHalRtcHeader*)&data_reg;
|
||||||
if(data->magic != FURI_HAL_RTC_HEADER_MAGIC || data->version != FURI_HAL_RTC_HEADER_VERSION) {
|
if(data->magic != FURI_HAL_RTC_HEADER_MAGIC || data->version != FURI_HAL_RTC_HEADER_VERSION) {
|
||||||
// Reset all our registers to ensure consistency
|
furi_hal_rtc_reset_registers();
|
||||||
for(size_t i = 0; i < FuriHalRtcRegisterMAX; i++) {
|
|
||||||
furi_hal_rtc_set_register(i, 0);
|
|
||||||
}
|
|
||||||
data->magic = FURI_HAL_RTC_HEADER_MAGIC;
|
|
||||||
data->version = FURI_HAL_RTC_HEADER_VERSION;
|
|
||||||
furi_hal_rtc_set_register(FuriHalRtcRegisterHeader, data_reg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagDebug)) {
|
||||||
@ -171,6 +165,18 @@ void furi_hal_rtc_sync_shadow() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void furi_hal_rtc_reset_registers() {
|
||||||
|
for(size_t i = 0; i < RTC_BKP_NUMBER; i++) {
|
||||||
|
furi_hal_rtc_set_register(i, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t data_reg = 0;
|
||||||
|
FuriHalRtcHeader* data = (FuriHalRtcHeader*)&data_reg;
|
||||||
|
data->magic = FURI_HAL_RTC_HEADER_MAGIC;
|
||||||
|
data->version = FURI_HAL_RTC_HEADER_VERSION;
|
||||||
|
furi_hal_rtc_set_register(FuriHalRtcRegisterHeader, data_reg);
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg) {
|
uint32_t furi_hal_rtc_get_register(FuriHalRtcRegister reg) {
|
||||||
return LL_RTC_BAK_GetRegister(RTC, reg);
|
return LL_RTC_BAK_GetRegister(RTC, reg);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,8 +56,7 @@ void flipper_boot_recovery_exec() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!counter) {
|
if(!counter) {
|
||||||
furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset);
|
furi_hal_rtc_reset_registers();
|
||||||
furi_hal_rtc_set_pin_fails(0);
|
furi_hal_rtc_set_flag(FuriHalRtcFlagStorageFormatInternal);
|
||||||
furi_hal_rtc_reset_flag(FuriHalRtcFlagLock);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,7 +26,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FuriHalRtcFlagDebug = (1 << 0),
|
FuriHalRtcFlagDebug = (1 << 0),
|
||||||
FuriHalRtcFlagFactoryReset = (1 << 1),
|
FuriHalRtcFlagStorageFormatInternal = (1 << 1),
|
||||||
FuriHalRtcFlagLock = (1 << 2),
|
FuriHalRtcFlagLock = (1 << 2),
|
||||||
FuriHalRtcFlagC2Update = (1 << 3),
|
FuriHalRtcFlagC2Update = (1 << 3),
|
||||||
FuriHalRtcFlagHandOrient = (1 << 4),
|
FuriHalRtcFlagHandOrient = (1 << 4),
|
||||||
@ -91,6 +91,9 @@ void furi_hal_rtc_init();
|
|||||||
/** Force sync shadow registers */
|
/** Force sync shadow registers */
|
||||||
void furi_hal_rtc_sync_shadow();
|
void furi_hal_rtc_sync_shadow();
|
||||||
|
|
||||||
|
/** Reset ALL RTC registers content */
|
||||||
|
void furi_hal_rtc_reset_registers();
|
||||||
|
|
||||||
/** Get RTC register content
|
/** Get RTC register content
|
||||||
*
|
*
|
||||||
* @param[in] reg The register identifier
|
* @param[in] reg The register identifier
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user