From 8ccc47dfa5060ca20444a97b436c89d7842a2560 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sat, 6 Feb 2021 04:10:02 +0200 Subject: [PATCH] nyx: Add resized raw emuMMC support in partition manager --- .../frontend/gui_tools_partition_manager.c | 103 +++++++++++------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/nyx/nyx_gui/frontend/gui_tools_partition_manager.c b/nyx/nyx_gui/frontend/gui_tools_partition_manager.c index 117f656..53e4da7 100644 --- a/nyx/nyx_gui/frontend/gui_tools_partition_manager.c +++ b/nyx/nyx_gui/frontend/gui_tools_partition_manager.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 CTCaer + * Copyright (c) 2019-2021 CTCaer * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -48,6 +48,8 @@ typedef struct _partition_ctxt_t u32 l4t_size; u32 and_size; + bool emu_double; + mbr_t *mbr_old; lv_obj_t *bar_hos; @@ -244,26 +246,20 @@ static void _prepare_and_flash_mbr_gpt() if (part_info.l4t_size && !part_info.and_size) { mbr.partitions[mbr_idx].type = 0x83; // Linux system partition. - mbr.partitions[mbr_idx].start_sct = 0x8000 + (part_info.hos_size << 11); + mbr.partitions[mbr_idx].start_sct = 0x8000 + ((u32)part_info.hos_size << 11); mbr.partitions[mbr_idx].size_sct = part_info.l4t_size << 11; sdmmc_storage_write(&sd_storage, mbr.partitions[mbr_idx].start_sct, 0x800, (void *)SDMMC_UPPER_BUFFER); // Clear the first 1MB. mbr_idx++; } // emuMMC goes second or third. Next to L4T if no Android. - bool double_emummc = part_info.emu_size > 29856; if (part_info.emu_size) { mbr.partitions[mbr_idx].type = 0xE0; // emuMMC partition. - mbr.partitions[mbr_idx].start_sct = 0x8000 + (part_info.hos_size << 11) + (part_info.l4t_size << 11) + (part_info.and_size << 11); + mbr.partitions[mbr_idx].start_sct = 0x8000 + ((u32)part_info.hos_size << 11) + (part_info.l4t_size << 11) + (part_info.and_size << 11); - if (!double_emummc) - { - if (!part_info.and_size) - mbr.partitions[mbr_idx].size_sct = part_info.emu_size << 11; - else - mbr.partitions[mbr_idx].size_sct = (part_info.emu_size << 11) - 0x800; // Reserve 1MB. - } + if (!part_info.emu_double) + mbr.partitions[mbr_idx].size_sct = (part_info.emu_size << 11) - 0x800; // Reserve 1MB. else { mbr.partitions[mbr_idx].type = 0xE0; // emuMMC partition. @@ -272,10 +268,7 @@ static void _prepare_and_flash_mbr_gpt() // 2nd emuMMC. mbr.partitions[mbr_idx].start_sct = mbr.partitions[mbr_idx - 1].start_sct + (part_info.emu_size << 10); - if (!part_info.and_size) - mbr.partitions[mbr_idx].size_sct = part_info.emu_size << 10; - else - mbr.partitions[mbr_idx].size_sct = (part_info.emu_size << 10) - 0x800; // Reserve 1MB. + mbr.partitions[mbr_idx].size_sct = (part_info.emu_size << 10) - 0x800; // Reserve 1MB. } mbr_idx++; } @@ -315,7 +308,7 @@ static void _prepare_and_flash_mbr_gpt() memcpy(gpt.entries[0].name, (char[]) { 'h', 0, 'o', 0, 's', 0, '_', 0, 'd', 0, 'a', 0, 't', 0, 'a', 0 }, 16); u8 gpt_idx = 1; - u32 curr_part_lba = 0x8000 + (part_info.hos_size << 11); + u32 curr_part_lba = 0x8000 + ((u32)part_info.hos_size << 11); u8 android_part_guid[] = { 0xAF, 0x3D, 0xC6, 0x0F, 0x83, 0x84, 0x72, 0x47, 0x8E, 0x79, 0x3D, 0x69, 0xD8, 0x47, 0x7D, 0xE4 }; if (part_info.l4t_size) { @@ -440,14 +433,14 @@ static void _prepare_and_flash_mbr_gpt() se_gen_prng128(random_number); memcpy(gpt.entries[gpt_idx].part_guid, random_number, 16); gpt.entries[gpt_idx].lba_start = curr_part_lba; - if (!double_emummc) + if (!part_info.emu_double) gpt.entries[gpt_idx].lba_end = curr_part_lba + (part_info.emu_size << 11) - 0x800 - 1; // Reserve 1MB. else - gpt.entries[gpt_idx].lba_end = curr_part_lba + (part_info.emu_size << 10); // Reserve 1MB. + gpt.entries[gpt_idx].lba_end = curr_part_lba + (part_info.emu_size << 10) - 1; memcpy(gpt.entries[gpt_idx].name, (char[]) { 'e', 0, 'm', 0, 'u', 0, 'm', 0, 'm', 0, 'c', 0 }, 12); gpt_idx++; - if (double_emummc) + if (part_info.emu_double) { curr_part_lba += (part_info.emu_size << 10); memcpy(gpt.entries[gpt_idx].type_guid, emu_part_guid, 16); @@ -1292,7 +1285,7 @@ static lv_res_t _create_mbox_start_partitioning(lv_obj_t *btn) lv_obj_set_style(dark_bg, &mbox_darken); lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES); - static const char *mbox_btn_map[] = { "\211", "\222OK", "\211", "" }; + static const char *mbox_btn_map[] = { "\211", "\222OK", "\211", "" }; static const char *mbox_btn_map1[] = { "\222SD UMS", "\222Flash Linux", "\222Flash Android", "\221OK", "" }; static const char *mbox_btn_map2[] = { "\222SD UMS", "\222Flash Linux", "\221OK", "" }; static const char *mbox_btn_map3[] = { "\222SD UMS", "\222Flash Android", "\221OK", "" }; @@ -1677,12 +1670,33 @@ static void _update_partition_bar() static lv_res_t _action_slider_emu(lv_obj_t *slider) { + u32 size; char lbl_text[64]; - + bool prev_emu_double = part_info.emu_double; int slide_val = lv_slider_get_value(slider); - u32 size = slide_val ? ((slide_val < 2) ? 29856 : 59712) : 0; - s32 hos_size = (part_info.total_sct >> 11) - 16 - size - part_info.l4t_size - part_info.and_size; + const u32 rsvd_mb = 4 + 4 + 16 + 8; // BOOT0 + BOOT1 + 16MB offset + 8MB alignment. + part_info.emu_double = false; + + size = slide_val + 3; // Min 4GB. + size *= 1024; // Convert to GB. + size += rsvd_mb; // Add reserved size. + + if (!slide_val) + size = 0; // Reset if 0. + else if (slide_val >= 11) + { + size *= 2; + part_info.emu_double = true; + } + + // Handle special case. + if (slide_val == 10) + size = 29856; + else if (slide_val == 20) + size = 59712; + + s32 hos_size = (part_info.total_sct >> 11) - 16 - size - part_info.l4t_size - part_info.and_size; if (hos_size > 2048) { part_info.emu_size = size; @@ -1692,28 +1706,35 @@ static lv_res_t _action_slider_emu(lv_obj_t *slider) lv_label_set_text(part_info.lbl_hos, lbl_text); lv_bar_set_value(part_info.slider_bar_hos, hos_size >> 10); - if (slide_val < 2) + if (!part_info.emu_double) s_printf(lbl_text, "#FF3C28 %d GiB#", size >> 10); else - s_printf(lbl_text, "#FF3C28 2x%d GiB#", size >> 11); + s_printf(lbl_text, "#FFDD00 2x##FF3C28 %d GiB#", size >> 11); lv_label_set_text(part_info.lbl_emu, lbl_text); } else { - int new_slider_val; - switch (part_info.emu_size) + u32 emu_size = part_info.emu_size; + + if (emu_size == 29856) + emu_size = 10; + else if (emu_size == 59712) + emu_size = 20; + else if (emu_size) { - case 29856: - new_slider_val = 1; - break; - case 59712: - new_slider_val = 2; - break; - case 0: - default: - new_slider_val = 0; - break; + if (prev_emu_double) + emu_size /= 2; + emu_size -= rsvd_mb; + emu_size /= 1024; + emu_size -= 3; + + if (prev_emu_double) + emu_size += 11; } + + int new_slider_val = emu_size; + part_info.emu_double = prev_emu_double ? true : false; + lv_slider_set_value(slider, new_slider_val); } @@ -2317,7 +2338,7 @@ lv_res_t create_window_partition_manager(lv_obj_t *btn) lv_obj_t *slider_emu = lv_slider_create(h1, NULL); lv_obj_set_size(slider_emu, LV_DPI * 7, LV_DPI / 3); - lv_slider_set_range(slider_emu, 0, 2); + lv_slider_set_range(slider_emu, 0, 20); lv_slider_set_value(slider_emu, 0); lv_slider_set_style(slider_emu, LV_SLIDER_STYLE_BG, &bar_emu_bg); lv_slider_set_style(slider_emu, LV_SLIDER_STYLE_INDIC, &bar_emu_ind); @@ -2374,9 +2395,9 @@ lv_res_t create_window_partition_manager(lv_obj_t *btn) lv_label_set_recolor(lbl_notes, true); lv_label_set_static_text(lbl_notes, "Note 1: Only up to #C7EA46 1GB# can be backed up. If more, you will be asked to back them manually at the next step.\n" - "Note 2: The #C7EA46 Flash Linux# and #C7EA46 Flash Android# work independently and will flash files if suitable partitions and installer files are found.\n" - "Note 3: The installation files reside in #C7EA46 switchroot/install# folder. Linux uses #C7EA46 l4t.XX# and Android uses #C7EA46 twrp.img# and #C7EA46 tegra210-icosa.dtb#.\n" - "Note 4: #FFDD00 The installation files will be deleted after a successful flashing.#"); + "Note 2: Resized emuMMC formats the USER partition. A save data manager can be used to move them over.\n" + "Note 3: The #C7EA46 Flash Linux# and #C7EA46 Flash Android# will flash files if suitable partitions and installer files are found.\n" + "Note 4: The installation folder is #C7EA46 switchroot/install#. Linux uses #C7EA46 l4t.XX# and Android uses #C7EA46 twrp.img# and #C7EA46 tegra210-icosa.dtb#."); lv_label_set_style(lbl_notes, &hint_small_style); lv_obj_align(lbl_notes, lbl_and, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 5);