nyx: Support multiple backup based emuMMC

This commit is contained in:
CTCaer 2020-06-14 12:52:54 +03:00
parent 87ce09f4b1
commit 3d00a1be21
3 changed files with 47 additions and 24 deletions

View file

@ -119,7 +119,7 @@ void save_emummc_cfg(u32 part_idx, u32 sector_start, const char *path)
f_close(&fp); f_close(&fp);
} }
static void _update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx) void update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx)
{ {
if (currPartIdx < 10) if (currPartIdx < 10)
{ {
@ -170,7 +170,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto
numSplitParts = (totalSectors + multipartSplitSectors - 1) / multipartSplitSectors; numSplitParts = (totalSectors + multipartSplitSectors - 1) / multipartSplitSectors;
// Continue from where we left, if Partial Backup in progress. // Continue from where we left, if Partial Backup in progress.
_update_emummc_base_folder(outFilename, sdPathLen, 0); update_emummc_base_folder(outFilename, sdPathLen, 0);
} }
FIL fp; FIL fp;
@ -217,7 +217,7 @@ static int _dump_emummc_file_part(emmc_tool_gui_t *gui, char *sd_path, sdmmc_sto
memset(&fp, 0, sizeof(fp)); memset(&fp, 0, sizeof(fp));
currPartIdx++; currPartIdx++;
_update_emummc_base_folder(outFilename, sdPathLen, currPartIdx); update_emummc_base_folder(outFilename, sdPathLen, currPartIdx);
// Create next part. // Create next part.
s_printf(gui->txt_buf, "%s#", outFilename + strlen(gui->base_path)); s_printf(gui->txt_buf, "%s#", outFilename + strlen(gui->base_path));
@ -386,7 +386,7 @@ void dump_emummc_file(emmc_tool_gui_t *gui)
for (int j = 0; j < 100; j++) for (int j = 0; j < 100; j++)
{ {
_update_emummc_base_folder(sdPath, base_len, j); update_emummc_base_folder(sdPath, base_len, j);
if(f_stat(sdPath, NULL) == FR_NO_FILE) if(f_stat(sdPath, NULL) == FR_NO_FILE)
break; break;
} }

View file

@ -33,5 +33,6 @@ void load_emummc_cfg(emummc_cfg_t *emu_info);
void save_emummc_cfg(u32 part_idx, u32 sector_start, const char *path); void save_emummc_cfg(u32 part_idx, u32 sector_start, const char *path);
void dump_emummc_file(emmc_tool_gui_t *gui); void dump_emummc_file(emmc_tool_gui_t *gui);
void dump_emummc_raw(emmc_tool_gui_t *gui, int part_idx, u32 sector_start); void dump_emummc_raw(emmc_tool_gui_t *gui, int part_idx, u32 sector_start);
void update_emummc_base_folder(char *outFilename, u32 sdPathLen, u32 currPartIdx);
#endif #endif

View file

@ -447,49 +447,71 @@ static void _migrate_sd_file_based()
static void _migrate_sd_backup_file_based() static void _migrate_sd_backup_file_based()
{ {
char *emu_path = (char *)malloc(128);
char *parts_path = (char *)malloc(128);
char *backup_path = (char *)malloc(128);
char *backup_file_path = (char *)malloc(128);
sd_mount(); sd_mount();
f_mkdir("emuMMC"); f_mkdir("emuMMC");
f_mkdir("emuMMC/BK00");
f_mkdir("emuMMC/BK00/eMMC"); strcpy(emu_path, "emuMMC/BK");
u32 base_len = strlen(emu_path);
for (int j = 0; j < 100; j++)
{
update_emummc_base_folder(emu_path, base_len, j);
if(f_stat(emu_path, NULL) == FR_NO_FILE)
break;
}
base_len = strlen(emu_path);
f_mkdir(emu_path);
strcat(emu_path, "/eMMC");
f_mkdir(emu_path);
FIL fp; FIL fp;
strcpy(emu_path + base_len, "/file_based");
f_open(&fp, "emuMMC/BK00/file_based", FA_CREATE_ALWAYS | FA_WRITE); f_open(&fp, "emuMMC/BK00/file_based", FA_CREATE_ALWAYS | FA_WRITE);
f_close(&fp); f_close(&fp);
char *path = (char *)malloc(128); emmcsn_path_impl(backup_path, "", "", NULL);
char *path2 = (char *)malloc(128);
char *path3 = (char *)malloc(128);
emmcsn_path_impl(path, "", "", NULL); s_printf(backup_file_path, "%s/BOOT0", backup_path);
strcpy(emu_path + base_len, "/eMMC/BOOT0");
f_rename(backup_file_path, emu_path);
s_printf(path2, "%s/BOOT0", path); s_printf(backup_file_path, "%s/BOOT1", backup_path);
f_rename(path2, "emuMMC/BK00/eMMC/BOOT0"); strcpy(emu_path + base_len, "/eMMC/BOOT1");
f_rename(backup_file_path, emu_path);
s_printf(path2, "%s/BOOT1", path);
f_rename(path2, "emuMMC/BK00/eMMC/BOOT1");
bool multipart = false; bool multipart = false;
s_printf(path2, "%s/rawnand.bin", path); s_printf(backup_file_path, "%s/rawnand.bin", backup_path);
if(f_stat(path2, NULL)) if(f_stat(backup_file_path, NULL))
multipart = true; multipart = true;
if (!multipart) if (!multipart)
f_rename(path2, "emuMMC/BK00/eMMC/00"); {
strcpy(emu_path + base_len, "/eMMC/00");
f_rename(backup_file_path, emu_path);
}
else else
{ {
emu_path[base_len] = 0;
for (int i = 0; i < 32; i++) for (int i = 0; i < 32; i++)
{ {
s_printf(path2, "%s/rawnand.bin.%02d", path, i); s_printf(backup_file_path, "%s/rawnand.bin.%02d", backup_path, i);
s_printf(path3, "emuMMC/BK00/eMMC/%02d", i); s_printf(parts_path, "%s/eMMC/%02d", emu_path, i);
if (f_rename(path2, path3)) if (f_rename(backup_file_path, parts_path))
break; break;
} }
} }
free(path); free(emu_path);
free(path2); free(parts_path);
free(path3); free(backup_path);
free(backup_file_path);
save_emummc_cfg(0, 0, "emuMMC/BK00"); save_emummc_cfg(0, 0, "emuMMC/BK00");
sd_unmount(); sd_unmount();