From bbe8ddaf66635658ee48124209dbb9d4296a2e67 Mon Sep 17 00:00:00 2001 From: Christoph Baumann Date: Tue, 6 May 2025 17:40:53 +0200 Subject: [PATCH] ask to resize, if emu partition is larger than required --- nyx/nyx_gui/frontend/gui_emummc_tools.c | 150 +++++++++++++++++++++--- 1 file changed, 132 insertions(+), 18 deletions(-) diff --git a/nyx/nyx_gui/frontend/gui_emummc_tools.c b/nyx/nyx_gui/frontend/gui_emummc_tools.c index a1af25a2..9bedc980 100644 --- a/nyx/nyx_gui/frontend/gui_emummc_tools.c +++ b/nyx/nyx_gui/frontend/gui_emummc_tools.c @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -50,6 +51,7 @@ typedef struct _mbr_ctxt_t u32 available; u32 sector[3]; u32 resized_cnt[3]; + u32 part_size[3]; int part_idx; u32 sector_start; @@ -64,6 +66,8 @@ typedef struct _gpt_ctxt_t u8 emmc_part_cnt; } gpt_ctxt_t; + +static u32 emmc_safe_size; static bool emummc_backup; static mbr_ctxt_t mbr_ctx; static lv_obj_t *emummc_parent_cont; @@ -187,34 +191,87 @@ static lv_res_t _create_emummc_raw_format(lv_obj_t * btns, const char * txt) return LV_RES_INV; } -static lv_res_t _create_emummc_raw_action(lv_obj_t * btns, const char * txt) -{ - int btn_idx = lv_btnm_get_pressed(btns); - lv_obj_t *bg = lv_obj_get_parent(lv_obj_get_parent(btns)); +static int idx_selected; - emummc_part_cfg.sector = 0x8000; // 16mb protective offset +static void _create_emummc(u8 btn_idx){ + emummc_part_cfg.sector = 0x8000; // Protective offset. if(btn_idx < 3){ emummc_part_cfg.drive = DRIVE_SD; emummc_part_cfg.part_idx = btn_idx + 1; emummc_part_cfg.resized_cnt = mbr_ctx.resized_cnt[btn_idx]; emummc_part_cfg.sector += mbr_ctx.sector[btn_idx]; - lv_obj_set_style(bg, &lv_style_transp); _create_window_emummc(); } memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); +} + +static lv_res_t _ask_resize_action(lv_obj_t *btns, const char *txt){ + int btn_idx = lv_btnm_get_pressed(btns); + + switch(btn_idx){ + case 0: + // Yes resize + mbr_ctx.resized_cnt[idx_selected] = mbr_ctx.part_size[idx_selected] - 0xc000; + _create_emummc(idx_selected); + break; + case 1: + // No resize + _create_emummc(idx_selected); + break; + case 2: + // cancel + memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); + break; + } mbox_action(btns, txt); return LV_RES_INV; } -static lv_res_t _create_emummc_emmc_raw_action(lv_obj_t * btns, const char * txt) -{ - int btn_idx = lv_btnm_get_pressed(btns); - lv_obj_t *bg = lv_obj_get_parent(lv_obj_get_parent(btns)); +static void _create_mbox_ask_resize(){ + lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL); + lv_obj_set_style(dark_bg, &mbox_darken); + lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES); + lv_obj_t * mbox = lv_mbox_create(dark_bg, NULL); + lv_mbox_set_recolor_text(mbox, true); + lv_obj_set_width(mbox, LV_HOR_RES / 9 * 6); + + static const char *mbox_btns[] = { "\222Yes", "\222No", "\222Cancel", "" }; + lv_mbox_add_btns(mbox, mbox_btns, _ask_resize_action); + + lv_mbox_set_text(mbox, "#C7EA46 Selected partition is larger than required!#\n" + "Resize USER to use all available space?\n\n" + "#FFDD00 Note:# This will format USER"); + + lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0); +} + +static lv_res_t _create_emummc_raw_action(lv_obj_t * btns, const char * txt) +{ + idx_selected = lv_btnm_get_pressed(btns); + + if(idx_selected < 3){ + if(mbr_ctx.part_size[idx_selected] > emmc_safe_size + (0x8000 * 8)){ + // partition larger than required for full emmc, ask to resize + _create_mbox_ask_resize(); + }else{ + _create_emummc(idx_selected); + } + }else{ + // cancel + memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); + } + + mbox_action(btns, txt); + + return LV_RES_INV; +} + +static void _create_emummc_emmc(u8 btn_idx){ emummc_part_cfg.sector = 0x8000; // Protective offset. if(btn_idx < gpt_ctx.emmc_part_cnt){ @@ -222,11 +279,69 @@ static lv_res_t _create_emummc_emmc_raw_action(lv_obj_t * btns, const char * txt emummc_part_cfg.drive = DRIVE_EMMC; emummc_part_cfg.resized_cnt = gpt_ctx.emmc_part_resize_cnt[btn_idx]; emummc_part_cfg.sector += gpt_ctx.emmc_part_offset[btn_idx]; - lv_obj_set_style(bg, &lv_style_transp); _create_window_emummc(); } memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); +} + +static lv_res_t _ask_resize_action_emmc(lv_obj_t *btns, const char *txt){ + int btn_idx = lv_btnm_get_pressed(btns); + + switch(btn_idx){ + case 0: + // Yes resize + gpt_ctx.emmc_part_resize_cnt[idx_selected] = gpt_ctx.emmc_part_size[idx_selected] - 0xc000; + _create_emummc_emmc(idx_selected); + break; + case 1: + // No resize + _create_emummc_emmc(idx_selected); + break; + case 2: + // cancel + memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); + break; + } + + mbox_action(btns, txt); + + return LV_RES_INV; +} + +static void _create_mbox_ask_resize_emmc(){ + lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL); + lv_obj_set_style(dark_bg, &mbox_darken); + lv_obj_set_size(dark_bg, LV_HOR_RES, LV_VER_RES); + + lv_obj_t * mbox = lv_mbox_create(dark_bg, NULL); + lv_mbox_set_recolor_text(mbox, true); + lv_obj_set_width(mbox, LV_HOR_RES / 9 * 6); + + static const char *mbox_btns[] = { "\222Yes", "\222No", "\222Cancel", "" }; + lv_mbox_add_btns(mbox, mbox_btns, _ask_resize_action_emmc); + + lv_mbox_set_text(mbox, "#C7EA46 Selected partition is larger than required!#\n" + "Resize USER to use all available space?\n\n" + "#FFDD00 Note:# This will format USER"); + + lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0); +} + +static lv_res_t _create_emummc_emmc_raw_action(lv_obj_t *btns, const char *txt){ + idx_selected = lv_btnm_get_pressed(btns); + + if(idx_selected < gpt_ctx.emmc_part_cnt){ + if(gpt_ctx.emmc_part_size[idx_selected] > emmc_safe_size + (0x8000 * 8)){ + // partition larger than required for full emmc, ask to resize + _create_mbox_ask_resize_emmc(); + }else{ + _create_emummc_emmc(idx_selected); + } + }else{ + // cancel + memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg)); + } mbox_action(btns, txt); @@ -272,7 +387,7 @@ static void _create_mbox_emummc_raw() emmc_initialize(false); - u32 emmc_size_safe = emmc_storage.sec_cnt + 0xC000; // eMMC GPP size + BOOT0/1. + emmc_safe_size = 0xf00000;//emmc_storage.sec_cnt + 0xC000; // eMMC GPP size + BOOT0/1 + 16mb safety offset. emmc_end(); @@ -290,12 +405,13 @@ static void _create_mbox_emummc_raw() { mbr_ctx.available |= BIT(i - 1); mbr_ctx.sector[i - 1] = part_start; + mbr_ctx.part_size[i - 1] = part_size; // *Why?* Only allow up to 16GB resized emuMMC. // if (part_size < 0x2010000) - if (part_size < emmc_size_safe) + if (part_size < emmc_safe_size) mbr_ctx.resized_cnt[i - 1] = part_size - 0xC000; // Save sectors count without protective size and BOOT0/1. - else if (part_size >= emmc_size_safe) + else if (part_size >= emmc_safe_size) mbr_ctx.resized_cnt[i - 1] = 0; else { @@ -381,12 +497,10 @@ static void _create_mbox_emummc_emmc_raw() mbr_t *mbr = (mbr_t *)malloc(sizeof(mbr_t)); gpt_t *gpt = zalloc(sizeof *gpt); - u32 emmc_safe_size; - memset(&gpt_ctx, 0, sizeof(gpt_ctx)); emmc_mount(); - emmc_safe_size = emmc_storage.sec_cnt + 0xc000; + emmc_safe_size = 0xf00000;//emmc_storage.sec_cnt + 0xc000; sdmmc_storage_read(&emmc_storage, 0, 1, mbr); @@ -429,7 +543,7 @@ static void _create_mbox_emummc_emmc_raw() for(u32 i = 0; i < gpt_ctx.emmc_part_cnt; i++){ char name[36]; wctombs(gpt->entries[gpt_ctx.emmc_part_idx[i]].name, name, 36); - s_printf(txt_buf + strlen(txt_buf), "#%s Part. %d (%s): Start: 0x%x, Size. 0x%x#\n", gpt_ctx.emmc_part_resize_cnt[i] ? "FFDD00" : "C7EA46", gpt_ctx.emmc_part_idx[i], name, gpt_ctx.emmc_part_offset[i], gpt_ctx.emmc_part_size[i]); + s_printf(txt_buf + strlen(txt_buf), "#%s Part. %d (%s): Start: 0x%x, Size. 0x%x#\n", gpt_ctx.emmc_part_resize_cnt[i] ? "FFDD00" : "C0C0C0", gpt_ctx.emmc_part_idx[i], name, gpt_ctx.emmc_part_offset[i], gpt_ctx.emmc_part_size[i]); s_printf(mbox_btn_parts[i], "\222Part. %d", gpt_ctx.emmc_part_idx[i]); } s_printf(mbox_btn_parts[gpt_ctx.emmc_part_cnt], "Cancel");