ESP Flasher dual boot

This commit is contained in:
Willy-JL
2023-08-31 22:47:40 +02:00
parent d76a324a59
commit 202d988dd5
29 changed files with 197 additions and 95 deletions

View File

@@ -7,7 +7,8 @@ enum SubmenuIndex {
SubmenuIndexPart,
SubmenuIndexNvs,
SubmenuIndexBootApp0,
SubmenuIndexApp,
SubmenuIndexAppA,
SubmenuIndexAppB,
SubmenuIndexCustom,
SubmenuIndexFlash,
};
@@ -97,19 +98,35 @@ static void esp_flasher_scene_browse_callback(void* context, uint32_t index) {
}
view_dispatcher_send_custom_event(app->view_dispatcher, EspFlasherEventRefreshSubmenu);
break;
case SubmenuIndexApp:
app->selected_flash_options[SelectedFlashApp] =
!app->selected_flash_options[SelectedFlashApp];
case SubmenuIndexAppA:
app->selected_flash_options[SelectedFlashAppA] =
!app->selected_flash_options[SelectedFlashAppA];
if(dialog_file_browser_show(
app->dialogs, selected_filepath, predefined_filepath, &browser_options)) {
strncpy(
app->bin_file_path_app,
app->bin_file_path_app_a,
furi_string_get_cstr(selected_filepath),
sizeof(app->bin_file_path_app));
sizeof(app->bin_file_path_app_a));
}
if(app->bin_file_path_app[0] == '\0') {
if(app->bin_file_path_app_a[0] == '\0') {
// if user didn't select a file, leave unselected
app->selected_flash_options[SelectedFlashApp] = false;
app->selected_flash_options[SelectedFlashAppA] = false;
}
view_dispatcher_send_custom_event(app->view_dispatcher, EspFlasherEventRefreshSubmenu);
break;
case SubmenuIndexAppB:
app->selected_flash_options[SelectedFlashAppB] =
!app->selected_flash_options[SelectedFlashAppB];
if(dialog_file_browser_show(
app->dialogs, selected_filepath, predefined_filepath, &browser_options)) {
strncpy(
app->bin_file_path_app_b,
furi_string_get_cstr(selected_filepath),
sizeof(app->bin_file_path_app_b));
}
if(app->bin_file_path_app_b[0] == '\0') {
// if user didn't select a file, leave unselected
app->selected_flash_options[SelectedFlashAppB] = false;
}
view_dispatcher_send_custom_event(app->view_dispatcher, EspFlasherEventRefreshSubmenu);
break;
@@ -157,7 +174,8 @@ static void esp_flasher_scene_browse_callback(void* context, uint32_t index) {
#define STR_PART "Part Table (" TOSTRING(ESP_ADDR_PART) ")"
#define STR_NVS "NVS (" TOSTRING(ESP_ADDR_NVS) ")"
#define STR_BOOT_APP0 "boot_app0 (" TOSTRING(ESP_ADDR_BOOT_APP0) ")"
#define STR_APP "Firmware (" TOSTRING(ESP_ADDR_APP) ")"
#define STR_APP_A "FirmwareA(" TOSTRING(ESP_ADDR_APP_A) ")"
#define STR_APP_B "FirmwareB(" TOSTRING(ESP_ADDR_APP_B) ")"
#define STR_CUSTOM "Custom"
#define STR_FLASH_S3 "[>] FLASH (ESP32-S3)"
#define STR_FLASH "[>] FLASH"
@@ -213,9 +231,16 @@ static void _refresh_submenu(EspFlasherApp* app) {
app);
submenu_add_item(
submenu,
app->selected_flash_options[SelectedFlashApp] ? STR_SELECT " " STR_APP :
STR_UNSELECT " " STR_APP,
SubmenuIndexApp,
app->selected_flash_options[SelectedFlashAppA] ? STR_SELECT " " STR_APP_A :
STR_UNSELECT " " STR_APP_A,
SubmenuIndexAppA,
esp_flasher_scene_browse_callback,
app);
submenu_add_item(
submenu,
app->selected_flash_options[SelectedFlashAppB] ? STR_SELECT " " STR_APP_B :
STR_UNSELECT " " STR_APP_B,
SubmenuIndexAppB,
esp_flasher_scene_browse_callback,
app);
// TODO: custom addr
@@ -241,7 +266,8 @@ void esp_flasher_scene_browse_on_enter(void* context) {
app->bin_file_path_part[0] = '\0';
app->bin_file_path_nvs[0] = '\0';
app->bin_file_path_boot_app0[0] = '\0';
app->bin_file_path_app[0] = '\0';
app->bin_file_path_app_a[0] = '\0';
app->bin_file_path_app_b[0] = '\0';
app->bin_file_path_custom[0] = '\0';
_refresh_submenu(app);

View File

@@ -4,12 +4,9 @@ enum QuickState {
QuickStart,
QuickBlackmagic,
QuickBlackmagicWifidev,
QuickEvilportal,
QuickEvilportalWifidevS2,
QuickEvilportalDevproWroom,
QuickMarauder,
QuickMarauderWifidevS2,
QuickMarauderDevproWroom,
QuickDualboot,
QuickDualbootWifidevS2,
QuickDualbootDevproWroom,
};
void esp_flasher_scene_quick_submenu_callback(void* context, uint32_t index) {
@@ -28,15 +25,16 @@ void esp_flasher_scene_quick_on_enter(void* context) {
switch(state) {
case QuickStart:
case QuickBlackmagic:
case QuickEvilportal:
case QuickMarauder:
case QuickDualboot:
submenu_set_header(submenu, "Flash Firmware:");
submenu_add_item(
submenu, "Black Magic", QuickBlackmagic, esp_flasher_scene_quick_submenu_callback, app);
submenu_add_item(
submenu, "Evil Portal", QuickEvilportal, esp_flasher_scene_quick_submenu_callback, app);
submenu_add_item(
submenu, "Marauder", QuickMarauder, esp_flasher_scene_quick_submenu_callback, app);
submenu,
"EvilPortal + Marauder",
QuickDualboot,
esp_flasher_scene_quick_submenu_callback,
app);
break;
case QuickBlackmagicWifidev:
submenu_set_header(submenu, "Flash Black Magic To:");
@@ -47,35 +45,19 @@ void esp_flasher_scene_quick_on_enter(void* context) {
esp_flasher_scene_quick_submenu_callback,
app);
break;
case QuickEvilportalWifidevS2:
case QuickEvilportalDevproWroom:
submenu_set_header(submenu, "Flash Evil Portal To:");
case QuickDualbootWifidevS2:
case QuickDualbootDevproWroom:
submenu_set_header(submenu, "Flash EP+MR To:");
submenu_add_item(
submenu,
"WiFi Dev (ESP32-S2)",
QuickEvilportalWifidevS2,
QuickDualbootWifidevS2,
esp_flasher_scene_quick_submenu_callback,
app);
submenu_add_item(
submenu,
"Dev Pro (ESP32-WROOM)",
QuickEvilportalDevproWroom,
esp_flasher_scene_quick_submenu_callback,
app);
break;
case QuickMarauderWifidevS2:
case QuickMarauderDevproWroom:
submenu_set_header(submenu, "Flash Marauder To:");
submenu_add_item(
submenu,
"WiFi Dev (ESP32-S2)",
QuickMarauderWifidevS2,
esp_flasher_scene_quick_submenu_callback,
app);
submenu_add_item(
submenu,
"Dev Pro (ESP32-WROOM)",
QuickMarauderDevproWroom,
QuickDualbootDevproWroom,
esp_flasher_scene_quick_submenu_callback,
app);
break;
@@ -100,47 +82,28 @@ bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
bool enter_bootloader = false;
const char* boot = NULL; // 0x1000
const char* part = NULL; // 0x8000
const char* nvs = NULL; // 0x9000
const char* app0 = APP_DATA_PATH("assets/boot_app0.bin"); // 0xE000
const char* firm = NULL; // 0x10000
switch(event.event) {
case QuickBlackmagic:
case QuickEvilportal:
case QuickMarauder:
case QuickDualboot:
scene_manager_set_scene_state(
app->scene_manager, EspFlasherSceneQuick, event.event + 1);
scene_manager_next_scene(app->scene_manager, EspFlasherSceneQuick);
flash = false;
break;
case QuickBlackmagicWifidev:
boot = APP_DATA_PATH("assets/blackmagic/wifidev/bootloader.bin");
part = APP_DATA_PATH("assets/blackmagic/wifidev/partition-table.bin");
nvs = APP_DATA_PATH("assets/blackmagic/wifidev/nvs.bin");
firm = APP_DATA_PATH("assets/blackmagic/wifidev/blackmagic.bin");
boot = APP_DATA_PATH("assets/blackmagic/bootloader.bin");
part = APP_DATA_PATH("assets/blackmagic/partition-table.bin");
firm = APP_DATA_PATH("assets/blackmagic/blackmagic.bin");
enter_bootloader = true;
break;
case QuickEvilportalWifidevS2:
boot = APP_DATA_PATH("assets/evilportal/wifidev-s2/EvilPortal.ino.bootloader.bin");
part = APP_DATA_PATH("assets/evilportal/EvilPortal.ino.partitions.bin");
firm = APP_DATA_PATH("assets/evilportal/wifidev-s2/EvilPortal.ino.bin");
case QuickDualbootWifidevS2:
boot = APP_DATA_PATH("assets/dualboot/wifidev-s2.bin");
enter_bootloader = true;
break;
case QuickEvilportalDevproWroom:
boot = APP_DATA_PATH("assets/evilportal/devpro-wroom/EvilPortal.ino.bootloader.bin");
part = APP_DATA_PATH("assets/evilportal/EvilPortal.ino.partitions.bin");
firm = APP_DATA_PATH("assets/evilportal/devpro-wroom/EvilPortal.ino.bin");
break;
case QuickMarauderWifidevS2:
boot = APP_DATA_PATH("assets/marauder/wifidev-s2/bootloader.bin");
part = APP_DATA_PATH("assets/marauder/partitions.bin");
firm = APP_DATA_PATH("assets/marauder/wifidev-s2/flipper_sd_serial.bin");
enter_bootloader = true;
break;
case QuickMarauderDevproWroom:
boot = APP_DATA_PATH("assets/marauder/devpro-wroom/bootloader.bin");
part = APP_DATA_PATH("assets/marauder/partitions.bin");
firm = APP_DATA_PATH("assets/marauder/devpro-wroom/marauder_dev_board_pro.bin");
case QuickDualbootDevproWroom:
boot = APP_DATA_PATH("assets/dualboot/devpro-wroom.bin");
break;
default:
flash = false;
@@ -155,7 +118,8 @@ bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
app->bin_file_path_part[0] = '\0';
app->bin_file_path_nvs[0] = '\0';
app->bin_file_path_boot_app0[0] = '\0';
app->bin_file_path_app[0] = '\0';
app->bin_file_path_app_a[0] = '\0';
app->bin_file_path_app_b[0] = '\0';
app->bin_file_path_custom[0] = '\0';
if(boot) {
@@ -166,17 +130,9 @@ bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
app->selected_flash_options[SelectedFlashPart] = true;
strncpy(app->bin_file_path_part, part, sizeof(app->bin_file_path_part));
}
if(nvs) {
app->selected_flash_options[SelectedFlashNvs] = true;
strncpy(app->bin_file_path_nvs, nvs, sizeof(app->bin_file_path_nvs));
}
if(app0) {
app->selected_flash_options[SelectedFlashBootApp0] = true;
strncpy(app->bin_file_path_boot_app0, app0, sizeof(app->bin_file_path_boot_app0));
}
if(firm) {
app->selected_flash_options[SelectedFlashApp] = true;
strncpy(app->bin_file_path_app, firm, sizeof(app->bin_file_path_app));
app->selected_flash_options[SelectedFlashAppA] = true;
strncpy(app->bin_file_path_app_a, firm, sizeof(app->bin_file_path_app_a));
}
app->reset = false;
@@ -186,10 +142,8 @@ bool esp_flasher_scene_quick_on_event(void* context, SceneManagerEvent event) {
}
} else if(event.type == SceneManagerEventTypeBack) {
uint32_t state = scene_manager_get_scene_state(app->scene_manager, EspFlasherSceneQuick);
if(state > QuickMarauder)
state = QuickMarauder;
else if(state > QuickEvilportal)
state = QuickEvilportal;
if(state > QuickDualboot)
state = QuickDualboot;
else if(state > QuickBlackmagic)
state = QuickBlackmagic;
scene_manager_set_scene_state(app->scene_manager, EspFlasherSceneQuick, state);

View File

@@ -2,6 +2,8 @@
enum SubmenuIndex {
SubmenuIndexEspFlasherQuickFlash,
SubmenuIndexEspFlasherSwitchA,
SubmenuIndexEspFlasherSwitchB,
SubmenuIndexEspFlasherManualFlash,
SubmenuIndexEspFlasherReset,
SubmenuIndexEspFlasherBootloader,
@@ -27,6 +29,18 @@ void esp_flasher_scene_start_on_enter(void* context) {
SubmenuIndexEspFlasherQuickFlash,
esp_flasher_scene_start_submenu_callback,
app);
submenu_add_item(
submenu,
"Switch to Firmware A",
SubmenuIndexEspFlasherSwitchA,
esp_flasher_scene_start_submenu_callback,
app);
submenu_add_item(
submenu,
"Switch to Firmware B",
SubmenuIndexEspFlasherSwitchB,
esp_flasher_scene_start_submenu_callback,
app);
submenu_add_item(
submenu,
"Manual Flash",
@@ -67,6 +81,14 @@ bool esp_flasher_scene_start_on_event(void* context, SceneManagerEvent event) {
if(event.event == SubmenuIndexEspFlasherQuickFlash) {
scene_manager_next_scene(app->scene_manager, EspFlasherSceneQuick);
consumed = true;
} else if(event.event == SubmenuIndexEspFlasherSwitchA) {
app->switch_fw = SwitchToFirmwareA;
scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
consumed = true;
} else if(event.event == SubmenuIndexEspFlasherSwitchB) {
app->switch_fw = SwitchToFirmwareB;
scene_manager_next_scene(app->scene_manager, EspFlasherSceneConsoleOutput);
consumed = true;
} else if(event.event == SubmenuIndexEspFlasherManualFlash) {
scene_manager_next_scene(app->scene_manager, EspFlasherSceneBrowse);
consumed = true;