From 21548545fcd4b25663ea8004b7dd55fa02b36950 Mon Sep 17 00:00:00 2001 From: CTCaer Date: Sat, 13 Jun 2020 18:32:40 +0300 Subject: [PATCH] Equalize hekate main and Nyx sd based functions --- bootloader/config/config.c | 6 +-- bootloader/frontend/fe_emmc_tools.c | 4 +- bootloader/frontend/fe_info.c | 12 ++--- bootloader/frontend/fe_tools.c | 4 +- bootloader/hos/hos.c | 8 +-- bootloader/hos/pkg2.c | 4 +- bootloader/hos/sept.c | 2 +- bootloader/ianos/ianos.c | 4 +- bootloader/main.c | 18 +++---- bootloader/storage/emummc.c | 2 +- bootloader/storage/nx_sd.c | 51 ++++++++++++++++--- bootloader/storage/nx_sd.h | 12 +++++ bootloader/storage/sdmmc.c | 9 ++++ bootloader/utils/util.c | 6 +-- nyx/nyx_gui/config/config.c | 4 +- nyx/nyx_gui/frontend/fe_emmc_tools.c | 6 +-- nyx/nyx_gui/frontend/fe_emummc_tools.c | 4 +- nyx/nyx_gui/frontend/gui.c | 10 ++-- nyx/nyx_gui/frontend/gui_emummc_tools.c | 22 ++++---- nyx/nyx_gui/frontend/gui_info.c | 14 ++--- nyx/nyx_gui/frontend/gui_options.c | 4 +- nyx/nyx_gui/frontend/gui_tools.c | 14 ++--- .../frontend/gui_tools_partition_manager.c | 20 ++++---- nyx/nyx_gui/hos/sept.c | 2 +- nyx/nyx_gui/ianos/ianos.c | 4 +- nyx/nyx_gui/nyx.c | 6 +-- nyx/nyx_gui/storage/nx_sd.c | 9 +++- nyx/nyx_gui/storage/nx_sd.h | 3 +- nyx/nyx_gui/utils/util.c | 6 +-- 29 files changed, 167 insertions(+), 103 deletions(-) diff --git a/bootloader/config/config.c b/bootloader/config/config.c index aaaa154..a333b57 100644 --- a/bootloader/config/config.c +++ b/bootloader/config/config.c @@ -161,7 +161,7 @@ int create_config_entry() } f_close(&fp); - sd_unmount(); + sd_end(); return 0; } @@ -268,7 +268,7 @@ out2:; free(boot_values); free(boot_text); - sd_unmount(); + sd_end(); } void config_autoboot() @@ -380,7 +380,7 @@ out2:; free(boot_values); free(boot_text); - sd_unmount(); + sd_end(); if (temp_autoboot == NULL) return; diff --git a/bootloader/frontend/fe_emmc_tools.c b/bootloader/frontend/fe_emmc_tools.c index 5da3745..7d28c51 100644 --- a/bootloader/frontend/fe_emmc_tools.c +++ b/bootloader/frontend/fe_emmc_tools.c @@ -574,7 +574,7 @@ static void _dump_emmc_selected(emmcPartType_t dumpType) gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC); out: - sd_unmount(); + sd_end(); btn_wait(); } @@ -911,7 +911,7 @@ static void _restore_emmc_selected(emmcPartType_t restoreType) gfx_printf("\n%kFinished and verified!%k\nPress any key...\n", 0xFF96FF00, 0xFFCCCCCC); out: - sd_unmount(); + sd_end(); btn_wait(); } diff --git a/bootloader/frontend/fe_info.c b/bootloader/frontend/fe_info.c index e97a10b..a787c18 100644 --- a/bootloader/frontend/fe_info.c +++ b/bootloader/frontend/fe_info.c @@ -93,7 +93,7 @@ void print_fuseinfo() if (!sd_save_to_file((u8 *)words, sizeof(words), path)) gfx_puts("\nfuse_array_raw.bin saved!\n"); - sd_unmount(); + sd_end(); } btn_wait(); @@ -123,7 +123,7 @@ void print_kfuseinfo() emmcsn_path_impl(path, "/dumps", "kfuses.bin", NULL); if (!sd_save_to_file((u8 *)buf, KFUSE_NUM_WORDS * 4, path)) gfx_puts("\nDone!\n"); - sd_unmount(); + sd_end(); } btn_wait(); @@ -308,7 +308,7 @@ void print_sdcard_info() gfx_printf("%kFound %s volume:%k\n Free: %d MiB\n Cluster: %d KiB\n", 0xFF00DDFF, sd_fs.fs_type == FS_EXFAT ? "exFAT" : "FAT32", 0xFFCCCCCC, sd_fs.free_clst * sd_fs.csize >> SECTORS_TO_MIB_COEFF, (sd_fs.csize > 1) ? (sd_fs.csize >> 1) : 512); - sd_unmount(); + sd_end(); } btn_wait(); @@ -410,7 +410,7 @@ void print_tsec_key() emmcsn_path_impl(path, "/dumps", "tsec_keys.bin", NULL); if (!sd_save_to_file(keys, 0x10 * 2, path)) gfx_puts("\nDone!\n"); - sd_unmount(); + sd_end(); } } else @@ -576,7 +576,7 @@ void print_battery_info() EPRINTF("\nError creating fuel.bin file."); else gfx_puts("\nDone!\n"); - sd_unmount(); + sd_end(); } btn_wait(); @@ -645,7 +645,7 @@ void bootrom_ipatches_info() memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup)); - sd_unmount(); + sd_end(); } btn_wait(); diff --git a/bootloader/frontend/fe_tools.c b/bootloader/frontend/fe_tools.c index 985ef55..0c360c2 100644 --- a/bootloader/frontend/fe_tools.c +++ b/bootloader/frontend/fe_tools.c @@ -244,7 +244,7 @@ out_free: free(loader); free(pkg2); sdmmc_storage_end(&storage); - sd_unmount(); + sd_end(); if (kb >= KB_FIRMWARE_VERSION_620) se_aes_key_clear(8); @@ -499,7 +499,7 @@ void _fix_sd_attr(u32 type) gfx_printf("Traversing all %s files!\nThis may take some time...\n\n", label); _fix_attributes(path, &total, type, type); gfx_printf("%kTotal archive bits cleared: %d!%k\n\nDone! Press any key...", 0xFF96FF00, total, 0xFFCCCCCC); - sd_unmount(); + sd_end(); } btn_wait(); } diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index 2208571..c822a2e 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -621,7 +621,7 @@ static bool _get_fs_exfat_compatible(link_t *info) if (strncmp((const char*)ki->kip1->name, "FS", 2)) continue; - if (!se_calc_sha256(sha_buf, ki->kip1, ki->size)) + if (!se_calc_sha256_oneshot(sha_buf, ki->kip1, ki->size)) break; pkg2_get_ids(&kip_ids, &fs_ids_cnt); @@ -823,9 +823,9 @@ int hos_launch(ini_sec_t *cfg) u8 kernel_hash[0x20]; // Hash only Kernel when it embeds INI1. if (!ctxt.new_pkg2) - se_calc_sha256(kernel_hash, ctxt.kernel, ctxt.kernel_size); + se_calc_sha256_oneshot(kernel_hash, ctxt.kernel, ctxt.kernel_size); else - se_calc_sha256(kernel_hash, ctxt.kernel + PKG2_NEWKERN_START, + se_calc_sha256_oneshot(kernel_hash, ctxt.kernel + PKG2_NEWKERN_START, pkg2_newkern_ini1_start - PKG2_NEWKERN_START); ctxt.pkg2_kernel_id = pkg2_identify(kernel_hash); @@ -945,7 +945,7 @@ int hos_launch(ini_sec_t *cfg) config_exosphere(&ctxt); // Unmount SD card. - sd_unmount(); + sd_end(); // Finalize MC carveout. if (ctxt.pkg1_id->kb <= KB_FIRMWARE_VERSION_301) diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index d85f937..d66694f 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -1110,7 +1110,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames) if (shaBuf[0] == 0) { - if (!se_calc_sha256(shaBuf, ki->kip1, ki->size)) + if (!se_calc_sha256_oneshot(shaBuf, ki->kip1, ki->size)) memset(shaBuf, 0, sizeof(shaBuf)); } @@ -1148,7 +1148,7 @@ const char* pkg2_patch_kips(link_t *info, char* patchNames) #ifdef DEBUG_PRINTING u32 postDecompTime = get_tmr_us(); - if (!se_calc_sha256(shaBuf, ki->kip1, ki->size)) + if (!se_calc_sha256_oneshot(shaBuf, ki->kip1, ki->size)) memset(shaBuf, 0, sizeof(shaBuf)); DPRINTF("%dms %s KIP1 size %d hash %08X\n", (postDecompTime-preDecompTime) / 1000, ki->kip1->name, (int)ki->size, __builtin_bswap32(shaBuf[0])); diff --git a/bootloader/hos/sept.c b/bootloader/hos/sept.c index d2b726c..287be1b 100644 --- a/bootloader/hos/sept.c +++ b/bootloader/hos/sept.c @@ -228,7 +228,7 @@ int reboot_to_sept(const u8 *tsec_fw, u32 kb, ini_sec_t *cfg_sec) f_close(&fp); } - sd_unmount(); + sd_end(); u32 pk1t_sept = SEPT_PK1T_ADDR - (ALIGN(PATCHED_RELOC_SZ, 0x10) + WB_RST_SIZE); diff --git a/bootloader/ianos/ianos.c b/bootloader/ianos/ianos.c index 85ac9c9..f807404 100644 --- a/bootloader/ianos/ianos.c +++ b/bootloader/ianos/ianos.c @@ -76,7 +76,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon fileBuf = sd_file_read(path, NULL); if (sdmount) - sd_unmount(); + sd_end(); if (!fileBuf) goto elfLoadFinalOut; @@ -94,7 +94,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon case EXEC_ELF: case AR64_ELF: elfBuf = (void *)DRAM_LIB_ADDR; - sd_unmount(); + sd_end(); break; default: elfBuf = malloc(ctx.memsz); // Aligned to 0x10 by default. diff --git a/bootloader/main.c b/bootloader/main.c index 37c3e8f..7788066 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -119,7 +119,7 @@ void check_power_off_from_hos() u8 hosWakeup = i2c_recv_byte(I2C_5, MAX77620_I2C_ADDR, MAX77620_REG_IRQTOP); if (hosWakeup & MAX77620_IRQ_TOP_RTC_MASK) { - sd_unmount(); + sd_end(); // Stop the alarm, in case we injected too fast. max77620_rtc_stop_alarm(); @@ -249,7 +249,7 @@ int launch_payload(char *path, bool update) if (update && is_ipl_updated(buf, path, false)) goto out; - sd_unmount(); + sd_end(); if (size < 0x30000) { @@ -284,7 +284,7 @@ int launch_payload(char *path, bool update) out: if (!update) - sd_unmount(); + sd_end(); return 1; } @@ -353,7 +353,7 @@ void launch_tools() free(ments); free(dir); free(filelist); - sd_unmount(); + sd_end(); return; } @@ -380,7 +380,7 @@ void launch_tools() } out: - sd_unmount(); + sd_end(); free(dir); btn_wait(); @@ -618,7 +618,7 @@ void launch_firmware() if (!cfg_sec) { free(ments); - sd_unmount(); + sd_end(); return; } @@ -656,7 +656,7 @@ wrong_emupath: } out: - sd_unmount(); + sd_end(); h_cfg.emummc_force_disable = false; @@ -673,7 +673,7 @@ void nyx_load_run() if (!nyx) return; - sd_unmount(); + sd_end(); u32 expected_nyx_ver = ((NYX_VER_MJ + '0') << 24) | ((NYX_VER_MN + '0') << 16) | ((NYX_VER_HF + '0') << 8); u32 nyx_ver = byte_swap_32(*(u32 *)(nyx + NYX_VER_OFF)); @@ -1074,7 +1074,7 @@ out: nyx_load_run(); - sd_unmount(); + sd_end(); } static void _patched_rcm_protection() diff --git a/bootloader/storage/emummc.c b/bootloader/storage/emummc.c index 3da09e2..eecc453 100644 --- a/bootloader/storage/emummc.c +++ b/bootloader/storage/emummc.c @@ -168,7 +168,7 @@ out: int emummc_storage_end(sdmmc_storage_t *storage) { - sd_unmount(); + sd_end(); sdmmc_storage_end(storage); return 1; diff --git a/bootloader/storage/nx_sd.c b/bootloader/storage/nx_sd.c index 0a791ad..a93c8e0 100644 --- a/bootloader/storage/nx_sd.c +++ b/bootloader/storage/nx_sd.c @@ -23,13 +23,42 @@ #include "../mem/heap.h" static bool sd_mounted = false; +static u16 sd_errors[3] = { 0 }; // Init and Read/Write errors. static u32 sd_mode = SD_UHS_SDR82; - sdmmc_t sd_sdmmc; sdmmc_storage_t sd_storage; FATFS sd_fs; +void sd_error_count_increment(u8 type) +{ + switch (type) + { + case SD_ERROR_INIT_FAIL: + sd_errors[0]++; + break; + case SD_ERROR_RW_FAIL: + sd_errors[1]++; + break; + case SD_ERROR_RW_RETRY: + sd_errors[2]++; + break; + } +} + +u16 *sd_get_error_count() +{ + return sd_errors; +} + +bool sd_get_card_removed() +{ + if (!sdmmc_get_sd_inserted()) + return true; + + return false; +} + u32 sd_get_mode() { return sd_mode; @@ -85,10 +114,15 @@ bool sd_initialize(bool power_cycle) sd_mode = SD_UHS_SDR82; break; } - else if (sd_mode == SD_INIT_FAIL) - break; else - res = !sd_init_retry(true); + { + sd_errors[SD_ERROR_INIT_FAIL]++; + + if (sd_mode == SD_INIT_FAIL) + break; + else + res = !sd_init_retry(true); + } } sdmmc_storage_end(&sd_storage); @@ -130,9 +164,11 @@ bool sd_mount() return false; } -void sd_unmount() +static void _sd_deinit() { - sd_mode = SD_UHS_SDR82; + if (sd_mode == SD_INIT_FAIL) + sd_mode = SD_UHS_SDR82; + if (sd_mounted) { f_mount(NULL, "", 1); @@ -141,6 +177,9 @@ void sd_unmount() } } +void sd_unmount() { _sd_deinit(); } +void sd_end() { _sd_deinit(); } + void *sd_file_read(const char *path, u32 *fsize) { FIL fp; diff --git a/bootloader/storage/nx_sd.h b/bootloader/storage/nx_sd.h index 22e5f3b..fc1ad18 100644 --- a/bootloader/storage/nx_sd.h +++ b/bootloader/storage/nx_sd.h @@ -28,17 +28,29 @@ enum SD_1BIT_HS25 = 1, SD_4BIT_HS25 = 2, SD_UHS_SDR82 = 3, + SD_UHS_SDR104 = 4 +}; + +enum +{ + SD_ERROR_INIT_FAIL = 0, + SD_ERROR_RW_FAIL = 1, + SD_ERROR_RW_RETRY = 2 }; extern sdmmc_t sd_sdmmc; extern sdmmc_storage_t sd_storage; extern FATFS sd_fs; +void sd_error_count_increment(u8 type); +u16 *sd_get_error_count(); +bool sd_get_card_removed(); u32 sd_get_mode(); int sd_init_retry(bool power_cycle); bool sd_initialize(bool power_cycle); bool sd_mount(); void sd_unmount(); +void sd_end(); void *sd_file_read(const char *path, u32 *fsize); int sd_save_to_file(void *buf, u32 size, const char *filename); diff --git a/bootloader/storage/sdmmc.c b/bootloader/storage/sdmmc.c index 902d0ca..a6f8d8a 100644 --- a/bootloader/storage/sdmmc.c +++ b/bootloader/storage/sdmmc.c @@ -187,6 +187,8 @@ reinit_try: else retries--; + sd_error_count_increment(SD_ERROR_RW_RETRY); + msleep(50); } while (retries); @@ -194,10 +196,17 @@ reinit_try: if (storage->sdmmc->id == SDMMC_1) { int res; + + sd_error_count_increment(SD_ERROR_RW_FAIL); + if (!first_reinit) res = sd_initialize(true); else + { res = sd_init_retry(true); + if (!res) + sd_error_count_increment(SD_ERROR_INIT_FAIL); + } retries = 3; first_reinit = true; diff --git a/bootloader/utils/util.c b/bootloader/utils/util.c index a6455fe..e7b66ee 100644 --- a/bootloader/utils/util.c +++ b/bootloader/utils/util.c @@ -137,7 +137,7 @@ void reboot_normal() { bpmp_mmu_disable(); - sd_unmount(); + sd_end(); display_end(); nyx_str->mtc_cfg.init_done = 0; @@ -149,7 +149,7 @@ void reboot_rcm() { bpmp_mmu_disable(); - sd_unmount(); + sd_end(); display_end(); nyx_str->mtc_cfg.init_done = 0; @@ -163,7 +163,7 @@ void reboot_rcm() void power_off() { - sd_unmount(); + sd_end(); display_end(); nyx_str->mtc_cfg.init_done = 0; diff --git a/nyx/nyx_gui/config/config.c b/nyx/nyx_gui/config/config.c index c87d8d3..494ccc2 100644 --- a/nyx/nyx_gui/config/config.c +++ b/nyx/nyx_gui/config/config.c @@ -171,7 +171,7 @@ int create_config_entry() } f_close(&fp); - sd_unmount(false); + sd_unmount(); return 0; } @@ -209,7 +209,7 @@ int create_nyx_config_entry() f_puts("\n", &fp); f_close(&fp); - sd_unmount(false); + sd_unmount(); return 0; } diff --git a/nyx/nyx_gui/frontend/fe_emmc_tools.c b/nyx/nyx_gui/frontend/fe_emmc_tools.c index 03a4e53..0acff43 100644 --- a/nyx/nyx_gui/frontend/fe_emmc_tools.c +++ b/nyx/nyx_gui/frontend/fe_emmc_tools.c @@ -919,11 +919,11 @@ out: free(txt_buf); free(gui->base_path); if (!partial_sd_full_unmount) - sd_unmount(false); + sd_unmount(); else { partial_sd_full_unmount = false; - sd_unmount(true); + sd_end(); } } @@ -1503,5 +1503,5 @@ void restore_emmc_selected(emmcPartType_t restoreType, emmc_tool_gui_t *gui) out: free(txt_buf); free(gui->base_path); - sd_unmount(false); + sd_unmount(); } diff --git a/nyx/nyx_gui/frontend/fe_emummc_tools.c b/nyx/nyx_gui/frontend/fe_emummc_tools.c index f4880c5..7448603 100644 --- a/nyx/nyx_gui/frontend/fe_emummc_tools.c +++ b/nyx/nyx_gui/frontend/fe_emummc_tools.c @@ -491,7 +491,7 @@ out_failed: out: free(txt_buf); free(gui->base_path); - sd_unmount(false); + sd_unmount(); } static int _dump_emummc_raw_part(emmc_tool_gui_t *gui, int active_part, int part_idx, u32 sd_part_off, sdmmc_storage_t *storage, emmc_part_t *part) @@ -766,5 +766,5 @@ out_failed: out: free(txt_buf); free(gui->base_path); - sd_unmount(false); + sd_unmount(); } diff --git a/nyx/nyx_gui/frontend/gui.c b/nyx/nyx_gui/frontend/gui.c index 7efc9fc..bca4de3 100644 --- a/nyx/nyx_gui/frontend/gui.c +++ b/nyx/nyx_gui/frontend/gui.c @@ -264,7 +264,7 @@ static void _save_fb_to_bmp() _save_log_to_bmp(bmp_tmr_name); - sd_unmount(false); + sd_unmount(); free(bitmap); free(fb); @@ -814,7 +814,7 @@ static void _launch_hos(u8 autoboot, u8 autoboot_list) void (*main_ptr)() = (void *)nyx_str->hekate; - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); @@ -834,7 +834,7 @@ void reload_nyx() void (*main_ptr)() = (void *)nyx_str->hekate; - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); @@ -1262,7 +1262,7 @@ static lv_res_t _create_mbox_payloads(lv_obj_t *btn) strcpy(dir, "bootloader/payloads"); char *filelist = dirlist(dir, NULL, false, false); - sd_unmount(false); + sd_unmount(); u32 i = 0; @@ -1687,7 +1687,7 @@ ini_parsing: if (curr_btn_idx < 2) no_boot_entries = true; - sd_unmount(false); + sd_unmount(); free(tmp_path); diff --git a/nyx/nyx_gui/frontend/gui_emummc_tools.c b/nyx/nyx_gui/frontend/gui_emummc_tools.c index 8cafa8c..29e5b74 100644 --- a/nyx/nyx_gui/frontend/gui_emummc_tools.c +++ b/nyx/nyx_gui/frontend/gui_emummc_tools.c @@ -221,7 +221,7 @@ static void _create_mbox_emummc_raw() sd_mount(); sdmmc_storage_read(&sd_storage, 0, 1, mbr); - sd_unmount(false); + sd_unmount(); sdmmc_storage_t storage; sdmmc_t sdmmc; @@ -406,7 +406,7 @@ static void _migrate_sd_raw_emummc_based() free(tmp); - sd_unmount(false); + sd_unmount(); } static void _migrate_sd_file_based() @@ -442,7 +442,7 @@ static void _migrate_sd_file_based() free(path2); save_emummc_cfg(0, 0, "emuMMC/EF00"); - sd_unmount(false); + sd_unmount(); } static void _migrate_sd_backup_file_based() @@ -492,7 +492,7 @@ static void _migrate_sd_backup_file_based() free(path3); save_emummc_cfg(0, 0, "emuMMC/BK00"); - sd_unmount(false); + sd_unmount(); } static lv_res_t _create_emummc_mig1_action(lv_obj_t * btns, const char * txt) @@ -603,8 +603,6 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn) sd_mount(); sdmmc_storage_read(&sd_storage, 0, 1, mbr); - memcpy(mbr, mbr + 0x1BE, 0x40); - sdmmc_storage_t storage; sdmmc_t sdmmc; sdmmc_storage_init_mmc(&storage, &sdmmc, SDMMC_BUS_WIDTH_8, SDHCI_TIMING_MMC_HS400); @@ -675,7 +673,7 @@ static lv_res_t _create_mbox_emummc_migrate(lv_obj_t *btn) else backup = false; - sd_unmount(false); + sd_unmount(); sdmmc_storage_end(&storage); if (backup) @@ -794,7 +792,7 @@ static lv_res_t _save_raw_emummc_cfg_action(lv_obj_t * btn) } _create_emummc_saved_mbox(); - sd_unmount(false); + sd_unmount(); return LV_RES_INV; } @@ -803,7 +801,7 @@ static lv_res_t _save_disable_emummc_cfg_action(lv_obj_t * btn) { save_emummc_cfg(0, 0, NULL); _create_emummc_saved_mbox(); - sd_unmount(false); + sd_unmount(); return LV_RES_INV; } @@ -812,7 +810,7 @@ static lv_res_t _save_file_emummc_cfg_action(lv_obj_t *btn) { save_emummc_cfg(0, 0, lv_list_get_btn_text(btn)); _create_emummc_saved_mbox(); - sd_unmount(false); + sd_unmount(); return LV_RES_INV; } @@ -1032,7 +1030,7 @@ out0:; out1: free(path); - sd_unmount(false); + sd_unmount(); return LV_RES_OK; } @@ -1049,7 +1047,7 @@ lv_res_t create_win_emummc_tools(lv_obj_t *btn) emummc_cfg_t emu_info; load_emummc_cfg(&emu_info); - sd_unmount(false); + sd_unmount(); static lv_style_t h_style; lv_style_copy(&h_style, &lv_style_transp); diff --git a/nyx/nyx_gui/frontend/gui_info.c b/nyx/nyx_gui/frontend/gui_info.c index 0d5b15d..947c955 100644 --- a/nyx/nyx_gui/frontend/gui_info.c +++ b/nyx/nyx_gui/frontend/gui_info.c @@ -104,7 +104,7 @@ static lv_res_t _battery_dump_window_action(lv_obj_t * btn) emmcsn_path_impl(path, "/dumps", "fuel_gauge.bin", NULL); error = sd_save_to_file((u8 *)buf, 0x200, path); - sd_unmount(false); + sd_unmount(); } _create_window_dump_done(error, "fuel_gauge.bin"); @@ -147,7 +147,7 @@ static lv_res_t _bootrom_dump_window_action(lv_obj_t * btn) memcpy((void*)IPATCH_BASE, ipatch_backup, sizeof(ipatch_backup)); - sd_unmount(false); + sd_unmount(); } _create_window_dump_done(error, "evp_thunks.bin, bootrom_patched.bin, bootrom_unpatched.bin"); @@ -170,7 +170,7 @@ static lv_res_t _fuse_dump_window_action(lv_obj_t * btn) if (!error) error = res; - sd_unmount(false); + sd_unmount(); } _create_window_dump_done(error, "fuse_cached.bin, fuse_array_raw.bin"); @@ -191,7 +191,7 @@ static lv_res_t _kfuse_dump_window_action(lv_obj_t * btn) emmcsn_path_impl(path, "/dumps", "kfuses.bin", NULL); error = sd_save_to_file((u8 *)buf, KFUSE_NUM_WORDS * 4, path); - sd_unmount(false); + sd_unmount(); } _create_window_dump_done(error, "kfuses.bin"); @@ -210,7 +210,7 @@ static lv_res_t _tsec_keys_dump_window_action(lv_obj_t * btn) emmcsn_path_impl(path, "/dumps", "tsec_keys.bin", NULL); error = sd_save_to_file(tsec_keys, 0x10 * 2, path); - sd_unmount(false); + sd_unmount(); } _create_window_dump_done(error, "tsec_keys.bin"); @@ -798,7 +798,7 @@ static lv_res_t _create_mbox_benchmark(bool sd_bench) lv_obj_del(bar); if (sd_bench) - sd_unmount(false); + sd_unmount(); else sdmmc_storage_end(&emmc_storage); } @@ -1143,7 +1143,7 @@ static lv_res_t _create_window_sdcard_info_status(lv_obj_t *btn) lv_obj_align(val4, desc4, LV_ALIGN_OUT_RIGHT_MID, LV_DPI / 2, 0); free(txt_buf); - sd_unmount(false); + sd_unmount(); } nyx_window_toggle_buttons(win, false); diff --git a/nyx/nyx_gui/frontend/gui_options.c b/nyx/nyx_gui/frontend/gui_options.c index dd3ac34..297a9cb 100644 --- a/nyx/nyx_gui/frontend/gui_options.c +++ b/nyx/nyx_gui/frontend/gui_options.c @@ -277,7 +277,7 @@ static void _create_autoboot_window() } } - sd_unmount(false); + sd_unmount(); } static lv_res_t _autoboot_hide_delay_action(lv_obj_t *btn) @@ -751,7 +751,7 @@ static lv_res_t _joycon_info_dump_action(lv_obj_t * btn) f_close(&fp); } - sd_unmount(false); + sd_unmount(); } lv_obj_t *dark_bg = lv_obj_create(lv_scr_act(), NULL); diff --git a/nyx/nyx_gui/frontend/gui_tools.c b/nyx/nyx_gui/frontend/gui_tools.c index bdbfe77..dc3bdb6 100644 --- a/nyx/nyx_gui/frontend/gui_tools.c +++ b/nyx/nyx_gui/frontend/gui_tools.c @@ -341,7 +341,7 @@ static void usb_gadget_set_text(void *lbl, const char *text) static lv_res_t _action_hid_jc(lv_obj_t *btn) { // Reduce BPMP, RAM and backlight and power off SDMMC1 to conserve power. - sd_unmount(true); + sd_end(); minerva_change_freq(FREQ_800); bpmp_clk_rate_set(BPMP_CLK_NORMAL); display_backlight_brightness(10, 1000); @@ -365,7 +365,7 @@ static lv_res_t _action_hid_jc(lv_obj_t *btn) static lv_res_t _action_hid_touch(lv_obj_t *btn) { // Reduce BPMP, RAM and backlight and power off SDMMC1 to conserve power. - sd_unmount(true); + sd_end(); minerva_change_freq(FREQ_800); bpmp_clk_rate_set(BPMP_CLK_NORMAL); display_backlight_brightness(10, 1000); @@ -484,7 +484,7 @@ static lv_res_t _action_ums_emuemmc_boot0(lv_obj_t *btn) } } } - sd_unmount(false); + sd_unmount(); if (error) _create_mbox_ums_error(error); @@ -526,7 +526,7 @@ static lv_res_t _action_ums_emuemmc_boot1(lv_obj_t *btn) } } } - sd_unmount(false); + sd_unmount(); if (error) _create_mbox_ums_error(error); @@ -578,7 +578,7 @@ static lv_res_t _action_ums_emuemmc_gpp(lv_obj_t *btn) } } } - sd_unmount(false); + sd_unmount(); if (error) _create_mbox_ums_error(error); @@ -913,7 +913,7 @@ static lv_res_t _create_window_unset_abit_tool(lv_obj_t *btn) u32 total[2] = { 0 }; _fix_attributes(lb_val, path, total); - sd_unmount(false); + sd_unmount(); lv_obj_t *desc2 = lv_cont_create(win, NULL); lv_obj_set_size(desc2, LV_HOR_RES * 10 / 11, LV_VER_RES - (LV_DPI * 11 / 7) * 4); @@ -1357,7 +1357,7 @@ out_free: free(txt_buf); free(txt_buf2); sdmmc_storage_end(&storage); - sd_unmount(false); + sd_unmount(); if (kb >= KB_FIRMWARE_VERSION_620) se_aes_key_clear(8); diff --git a/nyx/nyx_gui/frontend/gui_tools_partition_manager.c b/nyx/nyx_gui/frontend/gui_tools_partition_manager.c index cf6371b..8e70892 100644 --- a/nyx/nyx_gui/frontend/gui_tools_partition_manager.c +++ b/nyx/nyx_gui/frontend/gui_tools_partition_manager.c @@ -511,7 +511,7 @@ static lv_res_t _action_delete_linux_installer_files(lv_obj_t * btns, const char idx++; } - sd_unmount(false); + sd_unmount(); } return LV_RES_INV; @@ -701,7 +701,7 @@ exit: lv_mbox_add_btns(mbox, mbox_btn_map2, _action_delete_linux_installer_files); lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0); - sd_unmount(false); + sd_unmount(); } return LV_RES_INV; @@ -838,7 +838,7 @@ error: exit: lv_obj_align(mbox, NULL, LV_ALIGN_CENTER, 0, 0); - sd_unmount(false); + sd_unmount(); return LV_RES_OK; } @@ -860,7 +860,7 @@ static lv_res_t _action_reboot_twrp(lv_obj_t * btns, const char * txt) void (*main_ptr)() = (void *)nyx_str->hekate; - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); @@ -1104,7 +1104,7 @@ error: free(txt_buf); - sd_unmount(false); + sd_unmount(); } return LV_RES_INV; @@ -1345,7 +1345,7 @@ static lv_res_t _create_mbox_start_partitioning(lv_obj_t *btn) lv_label_set_text(lbl_paths[0], " "); manual_system_maintenance(true); - sd_unmount(true); + sd_end(); while (!(btn_wait() & BTN_POWER)); @@ -1416,7 +1416,7 @@ static lv_res_t _create_mbox_start_partitioning(lv_obj_t *btn) manual_system_maintenance(true); _prepare_and_flash_mbr_gpt(); - sd_unmount(false); + sd_unmount(); lv_label_set_text(lbl_status, "#00DDFF Status:# Done!"); manual_system_maintenance(true); @@ -1891,7 +1891,7 @@ static lv_res_t _action_fix_mbr(lv_obj_t *btn) memcpy(&mbr[1], &mbr[0], sizeof(mbr_t)); - sd_unmount(false); + sd_unmount(); if (memcmp(&gpt.header.signature, "EFI PART", 8)) { @@ -2013,7 +2013,7 @@ static lv_res_t _action_fix_mbr(lv_obj_t *btn) // Write MBR. sd_mount(); sdmmc_storage_write(&sd_storage, 0, 1, &mbr[1]); - sd_unmount(false); + sd_unmount(); lv_label_set_text(lbl_status, "#96FF00 The new Hybrid MBR was written successfully!#"); } else @@ -2289,7 +2289,7 @@ lv_res_t create_window_partition_manager(lv_obj_t *btn) free(txt_buf); - sd_unmount(false); + sd_unmount(); return LV_RES_OK; } diff --git a/nyx/nyx_gui/hos/sept.c b/nyx/nyx_gui/hos/sept.c index ab728d8..0f1519f 100644 --- a/nyx/nyx_gui/hos/sept.c +++ b/nyx/nyx_gui/hos/sept.c @@ -211,7 +211,7 @@ int reboot_to_sept(const u8 *tsec_fw, u32 kb) f_close(&fp); } - sd_unmount(true); + sd_end(); u32 pk1t_sept = SEPT_PK1T_ADDR - (ALIGN(PATCHED_RELOC_SZ, 0x10) + WB_RST_SIZE); diff --git a/nyx/nyx_gui/ianos/ianos.c b/nyx/nyx_gui/ianos/ianos.c index 6ae477e..0b5a2e6 100644 --- a/nyx/nyx_gui/ianos/ianos.c +++ b/nyx/nyx_gui/ianos/ianos.c @@ -76,7 +76,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon fileBuf = sd_file_read(path, NULL); if (sdmount) - sd_unmount(true); + sd_end(); if (!fileBuf) goto elfLoadFinalOut; @@ -94,7 +94,7 @@ uintptr_t ianos_loader(bool sdmount, char *path, elfType_t type, void *moduleCon case EXEC_ELF: case AR64_ELF: elfBuf = (void *)DRAM_LIB_ADDR; - sd_unmount(true); + sd_end; break; default: elfBuf = malloc(ctx.memsz); // Aligned to 0x10 by default. diff --git a/nyx/nyx_gui/nyx.c b/nyx/nyx_gui/nyx.c index 92fe952..938ab36 100644 --- a/nyx/nyx_gui/nyx.c +++ b/nyx/nyx_gui/nyx.c @@ -180,7 +180,7 @@ lv_res_t launch_payload(lv_obj_t *list) f_close(&fp); - sd_unmount(true); + sd_end(); if (size < 0x30000) { @@ -203,7 +203,7 @@ lv_res_t launch_payload(lv_obj_t *list) } out: - sd_unmount(false); + sd_unmount(); return LV_RES_OK; } @@ -378,7 +378,7 @@ void nyx_init_load_res() // Load background resource if any. hekate_bg = bmp_to_lvimg_obj("bootloader/res/background.bmp"); - sd_unmount(false); + sd_unmount(); h_cfg.rcm_patched = fuse_check_patched_rcm(); } diff --git a/nyx/nyx_gui/storage/nx_sd.c b/nyx/nyx_gui/storage/nx_sd.c index 97b36c9..c7eb3d6 100644 --- a/nyx/nyx_gui/storage/nx_sd.c +++ b/nyx/nyx_gui/storage/nx_sd.c @@ -120,7 +120,7 @@ bool sd_initialize(bool power_cycle) } else { - sd_errors[0]++; // Increment init errors. + sd_errors[SD_ERROR_INIT_FAIL]++; if (sd_mode == SD_INIT_FAIL) break; @@ -146,6 +146,7 @@ bool sd_mount() if (res) { + gfx_con.mute = false; EPRINTF("Failed to init SD card."); if (!sdmmc_get_sd_inserted()) EPRINTF("Make sure that it is inserted."); @@ -163,6 +164,7 @@ bool sd_mount() } else { + gfx_con.mute = false; EPRINTFARGS("Failed to mount SD card (FatFS Error %d).\nMake sure that a FAT partition exists..", res); } } @@ -170,7 +172,7 @@ bool sd_mount() return false; } -void sd_unmount(bool deinit) +static void _sd_deinit(bool deinit) { if (sd_mode == SD_INIT_FAIL) sd_mode = SD_UHS_SDR104; @@ -187,6 +189,9 @@ void sd_unmount(bool deinit) } } +void sd_unmount() { _sd_deinit(false); } +void sd_end() { _sd_deinit(true); } + void *sd_file_read(const char *path, u32 *fsize) { FIL fp; diff --git a/nyx/nyx_gui/storage/nx_sd.h b/nyx/nyx_gui/storage/nx_sd.h index 45f0e57..fc1ad18 100644 --- a/nyx/nyx_gui/storage/nx_sd.h +++ b/nyx/nyx_gui/storage/nx_sd.h @@ -49,7 +49,8 @@ u32 sd_get_mode(); int sd_init_retry(bool power_cycle); bool sd_initialize(bool power_cycle); bool sd_mount(); -void sd_unmount(bool deinit); +void sd_unmount(); +void sd_end(); void *sd_file_read(const char *path, u32 *fsize); int sd_save_to_file(void *buf, u32 size, const char *filename); diff --git a/nyx/nyx_gui/utils/util.c b/nyx/nyx_gui/utils/util.c index b718b0d..76af201 100644 --- a/nyx/nyx_gui/utils/util.c +++ b/nyx/nyx_gui/utils/util.c @@ -136,7 +136,7 @@ void panic(u32 val) void reboot_normal() { - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); nyx_str->mtc_cfg.init_done = 0; @@ -146,7 +146,7 @@ void reboot_normal() void reboot_rcm() { - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); PMC(APBDEV_PMC_SCRATCH0) = PMC_SCRATCH0_MODE_RCM; @@ -158,7 +158,7 @@ void reboot_rcm() void power_off() { - sd_unmount(true); + sd_end(); reconfig_hw_workaround(false, 0); // Stop the alarm, in case we injected and powered off too fast.