allow configuring size for file based emummc

This commit is contained in:
Christoph Baumann
2025-05-07 16:44:51 +02:00
parent 2af1cc0b8c
commit ea3dae672e
4 changed files with 528 additions and 259 deletions

View File

@@ -15,10 +15,13 @@
*/
#include <libs/lvgl/lv_core/lv_obj.h>
#include <libs/lvgl/lv_core/lv_style.h>
#include <libs/lvgl/lv_objx/lv_btn.h>
#include <libs/lvgl/lv_objx/lv_btnm.h>
#include <libs/lvgl/lv_objx/lv_cont.h>
#include <libs/lvgl/lv_objx/lv_label.h>
#include <libs/lvgl/lv_objx/lv_mbox.h>
#include <libs/lvgl/lv_objx/lv_slider.h>
#include <memory_map.h>
#include <module.h>
#include <stdlib.h>
@@ -168,7 +171,7 @@ static void _create_window_emummc()
emmc_tool_gui_ctxt.label_finish = label_finish;
if (emummc_part_cfg.file_based)
dump_emummc_file(&emmc_tool_gui_ctxt);
dump_emummc_file(&emmc_tool_gui_ctxt, emummc_part_cfg.resized_cnt);
else
dump_emummc_raw(&emmc_tool_gui_ctxt, emummc_part_cfg.part_idx, emummc_part_cfg.sector, emummc_part_cfg.resized_cnt, emummc_part_cfg.drive);
@@ -387,7 +390,7 @@ static void _create_mbox_emummc_raw()
emmc_initialize(false);
emmc_safe_size = 0xf00000;//emmc_storage.sec_cnt + 0xC000; // eMMC GPP size + BOOT0/1 + 16mb safety offset.
emmc_safe_size = emmc_storage.sec_cnt + 0xC000; // eMMC GPP size + BOOT0/1 + 16mb safety offset.
emmc_end();
@@ -500,7 +503,7 @@ static void _create_mbox_emummc_emmc_raw()
memset(&gpt_ctx, 0, sizeof(gpt_ctx));
emmc_mount();
emmc_safe_size = 0xf00000;//emmc_storage.sec_cnt + 0xc000;
emmc_safe_size = emmc_storage.sec_cnt + 0xc000;
sdmmc_storage_read(&emmc_storage, 0, 1, mbr);
@@ -569,19 +572,178 @@ static void _create_mbox_emummc_emmc_raw()
lv_obj_set_top(mbox, true);
}
#define SECTORS_PER_GB 0x200000
typedef struct _slider_ctx_t{
lv_obj_t *label;
u32 emu_size; // mb
u32 full_size; // mb
} slider_ctx_t;
static slider_ctx_t slider_ctx;
static lv_res_t _action_slider_emummc_file(lv_obj_t *slider){
u32 slider_val = lv_slider_get_value(slider);
u32 size = slider_val <<= 10;
gfx_printf("sz %d\n", size);
if(size >= (slider_ctx.full_size > (3 * 1024) ? slider_ctx.full_size - (3 * 1024) : 0) && size <= slider_ctx.full_size + (3 * 1024)){
gfx_printf("reset full lth: %d uth %d\n",(slider_ctx.full_size > (3 * 1024) ? slider_ctx.full_size - (3 * 1024) : 0),slider_ctx.full_size + (3 * 1024));
size = slider_ctx.full_size;
lv_slider_set_value(slider, size >> 10);
}
slider_ctx.emu_size = size;
char txt_buf[0x20];
if(size == slider_ctx.full_size){
s_printf(txt_buf, "#FF3C28 %d FULL#", size >> 10);
}else{
s_printf(txt_buf, "#FF3C28 %d GiB#", size >> 10);
}
lv_label_set_text(slider_ctx.label, txt_buf);
return LV_RES_OK;
}
static lv_res_t _create_emummc_file_based_action(lv_obj_t *btns, const char *txt){
int idx = lv_btnm_get_pressed(btns);
if(!idx && slider_ctx.emu_size){
if(slider_ctx.emu_size != slider_ctx.full_size)
emummc_part_cfg.resized_cnt = slider_ctx.emu_size << 11;
_create_window_emummc();
}
mbox_action(btns, txt);
return LV_RES_INV;
}
static void _create_mbox_emummc_file_based(){
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[] = { "\222Continue", "\222Cancel", "" };
static const char *mbox_btns_ok[] = { "\251", "\222OK", "\251", "" };
lv_mbox_set_text(mbox, "#C7EA46 Select emuMMC size!#\n\n"
"#00DDFF Status:# Checking for available free space...");
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
manual_system_maintenance(true);
u32 value_full = emmc_storage.sec_cnt >> 11;
gfx_printf("full: 0x%x\n", emmc_storage.sec_cnt);
char txt_buf[0x20];
sd_mount();
emmc_initialize(false);
f_getfree("sd:", &sd_fs.free_clst, NULL);
sd_unmount();
// leave 1gb free
u32 available = sd_fs.free_clst * sd_fs.csize;
available >>= 11;
available = available > (5 * 1024) ? available - (1 * 1024) : 0;
if(available == 0){
lv_mbox_set_text(mbox, "#C7EA46 Select emuMMC size!#\n\n"
"#FFDD00 Note:# Not enough free space on SD");
}else if(value_full > available){
lv_mbox_set_text(mbox, "#C7EA46 Select emuMMC size!#\n\n"
"#FFDD00 Note:# Not enough space for full eMMC, \nUSER will be resized and formatted");
}else{
lv_mbox_set_text(mbox, "#C7EA46 Select emuMMC size!#\n\n"
"#FFDD00 Note:# Any value other than \"FULL\" will format USER");
}
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
slider_ctx.full_size = value_full;
slider_ctx.emu_size = slider_ctx.full_size > available ? available : slider_ctx.full_size;
if(available){
lv_coord_t pad = lv_mbox_get_style(mbox, LV_MBOX_STYLE_BG)->body.padding.hor;
lv_coord_t w = lv_obj_get_width(mbox) - 2 * pad - 2 * LV_DPI;
// Set eMUMMC bar styles.
static lv_style_t bar_emu_bg, bar_emu_ind, bar_emu_btn;
lv_style_copy(&bar_emu_bg, lv_theme_get_current()->bar.bg);
bar_emu_bg.body.main_color = LV_COLOR_HEX(0x940F00);
bar_emu_bg.body.grad_color = bar_emu_bg.body.main_color;
lv_style_copy(&bar_emu_ind, lv_theme_get_current()->bar.indic);
bar_emu_ind.body.main_color = LV_COLOR_HEX(0xFF3C28);
bar_emu_ind.body.grad_color = bar_emu_ind.body.main_color;
lv_style_copy(&bar_emu_btn, lv_theme_get_current()->slider.knob);
bar_emu_btn.body.main_color = LV_COLOR_HEX(0xB31200);
bar_emu_btn.body.grad_color = bar_emu_btn.body.main_color;
lv_obj_t *slider_cont = lv_cont_create(mbox, NULL);
lv_cont_set_fit(slider_cont, false, true);
lv_cont_set_style(slider_cont, &lv_style_transp);
lv_obj_set_width(slider_cont, lv_obj_get_width(mbox));
lv_obj_t *slider = lv_slider_create(slider_cont, NULL);
lv_obj_set_size(slider, w, LV_DPI / 3);
lv_slider_set_range(slider, 4, available >> 10);
lv_slider_set_value(slider, slider_ctx.emu_size >> 10);
lv_slider_set_style(slider, LV_SLIDER_STYLE_BG, &bar_emu_bg);
lv_slider_set_style(slider, LV_SLIDER_STYLE_INDIC, &bar_emu_ind);
lv_slider_set_style(slider, LV_SLIDER_STYLE_KNOB, &bar_emu_btn);
lv_slider_set_action(slider, _action_slider_emummc_file);
lv_obj_align(slider, slider_cont, LV_ALIGN_CENTER, - (LV_DPI / 2), 0);
lv_obj_t *label = lv_label_create(slider_cont, NULL);
lv_label_set_recolor(label, true);
if(slider_ctx.emu_size == value_full){
s_printf(txt_buf, "#FF3C28 %d FULL#", slider_ctx.emu_size >> 10);
}else{
s_printf(txt_buf, "#FF3C28 %d GiB#", slider_ctx.emu_size >> 10);
}
lv_label_set_text(label, txt_buf);
lv_obj_align(label, slider, LV_ALIGN_OUT_RIGHT_MID, LV_DPI * 2 / 5, 0);
slider_ctx.label = label;
}
if(available){
lv_mbox_add_btns(mbox, mbox_btns, _create_emummc_file_based_action);
}else{
lv_mbox_add_btns(mbox, mbox_btns_ok, _create_emummc_file_based_action);
}
lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0);
emummc_part_cfg.file_based = true;
}
static lv_res_t _create_emummc_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));
// lv_obj_t *bg = lv_obj_get_parent(lv_obj_get_parent(btns));
memset(&emummc_part_cfg, 0, sizeof(emummc_part_cfg));
mbox_action(btns, txt);
switch (btn_idx)
{
case 0:
lv_obj_set_style(bg, &lv_style_transp);
emummc_part_cfg.file_based = true;
_create_window_emummc();
// lv_obj_set_style(bg, &lv_style_transp);
_create_mbox_emummc_file_based();
break;
case 1:
_create_mbox_emummc_raw();
@@ -591,7 +753,6 @@ static lv_res_t _create_emummc_action(lv_obj_t * btns, const char * txt)
break;
}
mbox_action(btns, txt);
return LV_RES_INV;
}