nyx: Add resized raw emuMMC support in partition manager

This commit is contained in:
CTCaer 2021-02-06 04:10:02 +02:00
parent 9de5a4ba66
commit 8ccc47dfa5

View file

@ -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 * This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License, * under the terms and conditions of the GNU General Public License,
@ -48,6 +48,8 @@ typedef struct _partition_ctxt_t
u32 l4t_size; u32 l4t_size;
u32 and_size; u32 and_size;
bool emu_double;
mbr_t *mbr_old; mbr_t *mbr_old;
lv_obj_t *bar_hos; 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) if (part_info.l4t_size && !part_info.and_size)
{ {
mbr.partitions[mbr_idx].type = 0x83; // Linux system partition. 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; 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. sdmmc_storage_write(&sd_storage, mbr.partitions[mbr_idx].start_sct, 0x800, (void *)SDMMC_UPPER_BUFFER); // Clear the first 1MB.
mbr_idx++; mbr_idx++;
} }
// emuMMC goes second or third. Next to L4T if no Android. // emuMMC goes second or third. Next to L4T if no Android.
bool double_emummc = part_info.emu_size > 29856;
if (part_info.emu_size) if (part_info.emu_size)
{ {
mbr.partitions[mbr_idx].type = 0xE0; // emuMMC partition. 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.emu_double)
{
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. mbr.partitions[mbr_idx].size_sct = (part_info.emu_size << 11) - 0x800; // Reserve 1MB.
}
else else
{ {
mbr.partitions[mbr_idx].type = 0xE0; // emuMMC partition. mbr.partitions[mbr_idx].type = 0xE0; // emuMMC partition.
@ -272,9 +268,6 @@ static void _prepare_and_flash_mbr_gpt()
// 2nd emuMMC. // 2nd emuMMC.
mbr.partitions[mbr_idx].start_sct = mbr.partitions[mbr_idx - 1].start_sct + (part_info.emu_size << 10); 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++; 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); 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; 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 }; 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) if (part_info.l4t_size)
{ {
@ -440,14 +433,14 @@ static void _prepare_and_flash_mbr_gpt()
se_gen_prng128(random_number); se_gen_prng128(random_number);
memcpy(gpt.entries[gpt_idx].part_guid, random_number, 16); memcpy(gpt.entries[gpt_idx].part_guid, random_number, 16);
gpt.entries[gpt_idx].lba_start = curr_part_lba; 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. gpt.entries[gpt_idx].lba_end = curr_part_lba + (part_info.emu_size << 11) - 0x800 - 1; // Reserve 1MB.
else 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); memcpy(gpt.entries[gpt_idx].name, (char[]) { 'e', 0, 'm', 0, 'u', 0, 'm', 0, 'm', 0, 'c', 0 }, 12);
gpt_idx++; gpt_idx++;
if (double_emummc) if (part_info.emu_double)
{ {
curr_part_lba += (part_info.emu_size << 10); curr_part_lba += (part_info.emu_size << 10);
memcpy(gpt.entries[gpt_idx].type_guid, emu_part_guid, 16); memcpy(gpt.entries[gpt_idx].type_guid, emu_part_guid, 16);
@ -1677,12 +1670,33 @@ static void _update_partition_bar()
static lv_res_t _action_slider_emu(lv_obj_t *slider) static lv_res_t _action_slider_emu(lv_obj_t *slider)
{ {
u32 size;
char lbl_text[64]; char lbl_text[64];
bool prev_emu_double = part_info.emu_double;
int slide_val = lv_slider_get_value(slider); int slide_val = lv_slider_get_value(slider);
u32 size = slide_val ? ((slide_val < 2) ? 29856 : 59712) : 0; const u32 rsvd_mb = 4 + 4 + 16 + 8; // BOOT0 + BOOT1 + 16MB offset + 8MB alignment.
s32 hos_size = (part_info.total_sct >> 11) - 16 - size - part_info.l4t_size - part_info.and_size;
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) if (hos_size > 2048)
{ {
part_info.emu_size = size; 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_label_set_text(part_info.lbl_hos, lbl_text);
lv_bar_set_value(part_info.slider_bar_hos, hos_size >> 10); 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); s_printf(lbl_text, "#FF3C28 %d GiB#", size >> 10);
else 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); lv_label_set_text(part_info.lbl_emu, lbl_text);
} }
else else
{ {
int new_slider_val; u32 emu_size = part_info.emu_size;
switch (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: if (prev_emu_double)
new_slider_val = 1; emu_size /= 2;
break; emu_size -= rsvd_mb;
case 59712: emu_size /= 1024;
new_slider_val = 2; emu_size -= 3;
break;
case 0: if (prev_emu_double)
default: emu_size += 11;
new_slider_val = 0;
break;
} }
int new_slider_val = emu_size;
part_info.emu_double = prev_emu_double ? true : false;
lv_slider_set_value(slider, new_slider_val); 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_t *slider_emu = lv_slider_create(h1, NULL);
lv_obj_set_size(slider_emu, LV_DPI * 7, LV_DPI / 3); 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_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_BG, &bar_emu_bg);
lv_slider_set_style(slider_emu, LV_SLIDER_STYLE_INDIC, &bar_emu_ind); 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_recolor(lbl_notes, true);
lv_label_set_static_text(lbl_notes, 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 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 2: Resized emuMMC formats the USER partition. A save data manager can be used to move them over.\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 3: The #C7EA46 Flash Linux# and #C7EA46 Flash Android# will flash files if suitable partitions and installer files are found.\n"
"Note 4: #FFDD00 The installation files will be deleted after a successful flashing.#"); "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_label_set_style(lbl_notes, &hint_small_style);
lv_obj_align(lbl_notes, lbl_and, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 5); lv_obj_align(lbl_notes, lbl_and, LV_ALIGN_OUT_BOTTOM_LEFT, 0, LV_DPI / 5);