[FL-3075] Pin Reset (#2367)
* Nfc: fix PVS warnings * Factory reset combo, initial version * Recovery screen and correct input pin initialization * Better pin and factory reset message * Down to cancel factory reset
This commit is contained in:
		
							parent
							
								
									d035872cf6
								
							
						
					
					
						commit
						1eda913367
					
				| @ -8,6 +8,8 @@ void flipper_boot_update_exec(); | |||||||
| 
 | 
 | ||||||
| void flipper_boot_dfu_exec(); | void flipper_boot_dfu_exec(); | ||||||
| 
 | 
 | ||||||
|  | void flipper_boot_recovery_exec(); | ||||||
|  | 
 | ||||||
| #ifdef __cplusplus | #ifdef __cplusplus | ||||||
| } | } | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -49,6 +49,10 @@ int main() { | |||||||
|         // But if we do, abandon to avoid bootloops
 |         // But if we do, abandon to avoid bootloops
 | ||||||
|         furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal); |         furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal); | ||||||
|         furi_hal_power_reset(); |         furi_hal_power_reset(); | ||||||
|  |     } else if(!furi_hal_gpio_read(&gpio_button_up)) { | ||||||
|  |         furi_hal_light_sequence("rgb WR"); | ||||||
|  |         flipper_boot_recovery_exec(); | ||||||
|  |         furi_hal_power_reset(); | ||||||
|     } else { |     } else { | ||||||
|         furi_hal_light_sequence("rgb G"); |         furi_hal_light_sequence("rgb G"); | ||||||
|         furi_thread_start(main_thread); |         furi_thread_start(main_thread); | ||||||
|  | |||||||
							
								
								
									
										54
									
								
								firmware/targets/f7/Src/recovery.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								firmware/targets/f7/Src/recovery.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | #include <furi.h> | ||||||
|  | #include <furi_hal.h> | ||||||
|  | #include <flipper.h> | ||||||
|  | #include <alt_boot.h> | ||||||
|  | #include <u8g2_glue.h> | ||||||
|  | #include <assets_icons.h> | ||||||
|  | 
 | ||||||
|  | #define COUNTER_VALUE (100U) | ||||||
|  | 
 | ||||||
|  | static void flipper_boot_recovery_draw_splash(u8g2_t* fb, size_t progress) { | ||||||
|  |     u8g2_ClearBuffer(fb); | ||||||
|  |     u8g2_SetDrawColor(fb, 0x01); | ||||||
|  | 
 | ||||||
|  |     u8g2_SetFont(fb, u8g2_font_helvB08_tr); | ||||||
|  |     u8g2_DrawStr(fb, 2, 8, "PIN and Factory Reset"); | ||||||
|  |     u8g2_SetFont(fb, u8g2_font_haxrcorp4089_tr); | ||||||
|  |     u8g2_DrawStr(fb, 2, 21, "Hold Right to confirm"); | ||||||
|  |     u8g2_DrawStr(fb, 2, 31, "Press Down to cancel"); | ||||||
|  | 
 | ||||||
|  |     if(progress < COUNTER_VALUE) { | ||||||
|  |         size_t width = progress / (COUNTER_VALUE / 100); | ||||||
|  |         u8g2_DrawBox(fb, 14 + (50 - width / 2), 54, width, 3); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     u8g2_SetPowerSave(fb, 0); | ||||||
|  |     u8g2_SendBuffer(fb); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void flipper_boot_recovery_exec() { | ||||||
|  |     u8g2_t* fb = malloc(sizeof(u8g2_t)); | ||||||
|  |     u8g2_Setup_st756x_flipper(fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); | ||||||
|  |     u8g2_InitDisplay(fb); | ||||||
|  | 
 | ||||||
|  |     size_t counter = COUNTER_VALUE; | ||||||
|  |     while(counter) { | ||||||
|  |         if(!furi_hal_gpio_read(&gpio_button_down)) { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(!furi_hal_gpio_read(&gpio_button_right)) { | ||||||
|  |             counter--; | ||||||
|  |         } else { | ||||||
|  |             counter = COUNTER_VALUE; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         flipper_boot_recovery_draw_splash(fb, counter); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if(!counter) { | ||||||
|  |         furi_hal_rtc_set_flag(FuriHalRtcFlagFactoryReset); | ||||||
|  |         furi_hal_rtc_set_pin_fails(0); | ||||||
|  |         furi_hal_rtc_reset_flag(FuriHalRtcFlagLock); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -73,8 +73,18 @@ const InputPin input_pins[] = { | |||||||
| 
 | 
 | ||||||
| const size_t input_pins_count = sizeof(input_pins) / sizeof(InputPin); | const size_t input_pins_count = sizeof(input_pins) / sizeof(InputPin); | ||||||
| 
 | 
 | ||||||
|  | static void furi_hal_resources_init_input_pins(GpioMode mode) { | ||||||
|  |     for(size_t i = 0; i < input_pins_count; i++) { | ||||||
|  |         furi_hal_gpio_init( | ||||||
|  |             input_pins[i].gpio, | ||||||
|  |             mode, | ||||||
|  |             (input_pins[i].inverted) ? GpioPullUp : GpioPullDown, | ||||||
|  |             GpioSpeedLow); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void furi_hal_resources_init_early() { | void furi_hal_resources_init_early() { | ||||||
|     furi_hal_gpio_init(&gpio_button_left, GpioModeInput, GpioPullUp, GpioSpeedLow); |     furi_hal_resources_init_input_pins(GpioModeInput); | ||||||
| 
 | 
 | ||||||
|     // SD Card stepdown control
 |     // SD Card stepdown control
 | ||||||
|     furi_hal_gpio_write(&periph_power, 1); |     furi_hal_gpio_write(&periph_power, 1); | ||||||
| @ -117,14 +127,12 @@ void furi_hal_resources_init_early() { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_resources_deinit_early() { | void furi_hal_resources_deinit_early() { | ||||||
|  |     furi_hal_resources_init_input_pins(GpioModeAnalog); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void furi_hal_resources_init() { | void furi_hal_resources_init() { | ||||||
|     // Button pins
 |     // Button pins
 | ||||||
|     for(size_t i = 0; i < input_pins_count; i++) { |     furi_hal_resources_init_input_pins(GpioModeInterruptRiseFall); | ||||||
|         furi_hal_gpio_init( |  | ||||||
|             input_pins[i].gpio, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedLow); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     // Display pins
 |     // Display pins
 | ||||||
|     furi_hal_gpio_init(&gpio_display_rst_n, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); |     furi_hal_gpio_init(&gpio_display_rst_n, GpioModeOutputPushPull, GpioPullNo, GpioSpeedLow); | ||||||
|  | |||||||
| @ -438,9 +438,9 @@ bool mf_classic_block_to_value(const uint8_t* block, int32_t* value, uint8_t* ad | |||||||
| void mf_classic_value_to_block(int32_t value, uint8_t addr, uint8_t* block) { | void mf_classic_value_to_block(int32_t value, uint8_t addr, uint8_t* block) { | ||||||
|     uint32_t v_inv = ~((uint32_t)value); |     uint32_t v_inv = ~((uint32_t)value); | ||||||
| 
 | 
 | ||||||
|     memcpy(block, &value, 4); |     memcpy(block, &value, 4); //-V1086
 | ||||||
|     memcpy(block + 4, &v_inv, 4); |     memcpy(block + 4, &v_inv, 4); //-V1086
 | ||||||
|     memcpy(block + 8, &value, 4); |     memcpy(block + 8, &value, 4); //-V1086
 | ||||||
| 
 | 
 | ||||||
|     block[12] = addr; |     block[12] = addr; | ||||||
|     block[13] = ~addr & 0xFF; |     block[13] = ~addr & 0xFF; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく