[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…
Reference in New Issue
Block a user