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
	 あく
						あく