[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_recovery_exec(); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| @ -49,6 +49,10 @@ int main() { | ||||
|         // But if we do, abandon to avoid bootloops
 | ||||
|         furi_hal_rtc_set_boot_mode(FuriHalRtcBootModeNormal); | ||||
|         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 { | ||||
|         furi_hal_light_sequence("rgb G"); | ||||
|         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); | ||||
| 
 | ||||
| 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() { | ||||
|     furi_hal_gpio_init(&gpio_button_left, GpioModeInput, GpioPullUp, GpioSpeedLow); | ||||
|     furi_hal_resources_init_input_pins(GpioModeInput); | ||||
| 
 | ||||
|     // SD Card stepdown control
 | ||||
|     furi_hal_gpio_write(&periph_power, 1); | ||||
| @ -117,14 +127,12 @@ void furi_hal_resources_init_early() { | ||||
| } | ||||
| 
 | ||||
| void furi_hal_resources_deinit_early() { | ||||
|     furi_hal_resources_init_input_pins(GpioModeAnalog); | ||||
| } | ||||
| 
 | ||||
| void furi_hal_resources_init() { | ||||
|     // Button pins
 | ||||
|     for(size_t i = 0; i < input_pins_count; i++) { | ||||
|         furi_hal_gpio_init( | ||||
|             input_pins[i].gpio, GpioModeInterruptRiseFall, GpioPullUp, GpioSpeedLow); | ||||
|     } | ||||
|     furi_hal_resources_init_input_pins(GpioModeInterruptRiseFall); | ||||
| 
 | ||||
|     // Display pins
 | ||||
|     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) { | ||||
|     uint32_t v_inv = ~((uint32_t)value); | ||||
| 
 | ||||
|     memcpy(block, &value, 4); | ||||
|     memcpy(block + 4, &v_inv, 4); | ||||
|     memcpy(block + 8, &value, 4); | ||||
|     memcpy(block, &value, 4); //-V1086
 | ||||
|     memcpy(block + 4, &v_inv, 4); //-V1086
 | ||||
|     memcpy(block + 8, &value, 4); //-V1086
 | ||||
| 
 | ||||
|     block[12] = addr; | ||||
|     block[13] = ~addr & 0xFF; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく