From 8d9336f5613caf9063d121aaab957ada912308cb Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Thu, 20 Jun 2019 12:41:50 -0700 Subject: [PATCH] git subrepo clone --branch=develop --force https://github.com/m4xw/emuMMC emummc subrepo: subdir: "emummc" merged: "e935968d" upstream: origin: "https://github.com/m4xw/emuMMC" branch: "develop" commit: "e935968d" git-subrepo: version: "0.4.0" origin: "https://github.com/ingydotnet/git-subrepo" commit: "5d6aba9" --- emummc/.gitrepo | 4 +-- emummc/source/emuMMC/emummc.c | 58 ++++++++++++++++++----------------- emummc/source/emuMMC/emummc.h | 6 ++-- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/emummc/.gitrepo b/emummc/.gitrepo index f98935275..70f63cf15 100644 --- a/emummc/.gitrepo +++ b/emummc/.gitrepo @@ -6,7 +6,7 @@ [subrepo] remote = https://github.com/m4xw/emuMMC branch = develop - commit = e7799388e8d3de17fd178ffe310be2e81ef46d6f - parent = f2086fe05492cb523b60fa10e4425c4ea59521b3 + commit = e935968d3bf18936c4f9c954619ac6f115e8dfde + parent = 169ec9c12e9506df33e72d4745f4f56745d411d2 method = rebase cmdver = 0.4.0 diff --git a/emummc/source/emuMMC/emummc.c b/emummc/source/emuMMC/emummc.c index 4d959f459..8890eddce 100644 --- a/emummc/source/emuMMC/emummc.c +++ b/emummc/source/emuMMC/emummc.c @@ -103,15 +103,7 @@ void sdmmc_finalize(void) static void _file_based_update_filename(char *outFilename, u32 sd_path_len, u32 part_idx) { - if (part_idx < 10) - { - outFilename[sd_path_len] = '0'; - itoa(part_idx, &outFilename[sd_path_len + 1], 10); - } - else - { - itoa(part_idx, &outFilename[sd_path_len], 10); - } + snprintf(outFilename + sd_path_len, 3, "%02d", part_idx); } static void _file_based_emmc_finalize(void) @@ -119,11 +111,13 @@ static void _file_based_emmc_finalize(void) if ((emuMMC_ctx.EMMC_Type == emuMMC_SD_File) && fat_mounted) { // Close all open handles. - f_close(f_emu.fp_boot0); - f_close(f_emu.fp_boot1); + f_close(&f_emu.fp_boot0); + f_close(&f_emu.fp_boot1); for (int i = 0; i < f_emu.parts; i++) - f_close(f_emu.fp_gpp[i]); + { + f_close(&f_emu.fp_gpp[i]); + } // Force unmount FAT volume. f_mount(NULL, "", 1); @@ -143,36 +137,32 @@ static void _file_based_emmc_initialize(void) int path_len = strlen(path); // Open BOOT0 physical partition. - f_emu.fp_boot0 = (FIL *)malloc(sizeof(FIL)); memcpy(path + path_len, "BOOT0", 6); - if (f_open(f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK) + if (f_open(&f_emu.fp_boot0, path, FA_READ | FA_WRITE) != FR_OK) fatal_abort(Fatal_InitSD); // Open BOOT1 physical partition. - f_emu.fp_boot1 = (FIL *)malloc(sizeof(FIL)); memcpy(path + path_len, "BOOT1", 6); - if (f_open(f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK) + if (f_open(&f_emu.fp_boot1, path, FA_READ | FA_WRITE) != FR_OK) fatal_abort(Fatal_InitSD); // Open handles for GPP physical partition files. _file_based_update_filename(path, path_len, 00); - if (f_open(f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK) + + if (f_open(&f_emu.fp_gpp[0], path, FA_READ | FA_WRITE) != FR_OK) fatal_abort(Fatal_InitSD); - f_emu.part_size = f_size(f_emu.fp_gpp[0]); + f_emu.part_size = f_size(&f_emu.fp_gpp[0]) >> 9; // Iterate folder for split parts and stop if next doesn't exist. // Supports up to 32 parts of any size. // TODO: decide on max parts and define them. (hekate produces up to 30 parts on 1GB mode.) for (f_emu.parts = 1; f_emu.parts < 32; f_emu.parts++) { - f_emu.fp_gpp[f_emu.parts] = (FIL *)malloc(sizeof(FIL)); _file_based_update_filename(path, path_len, f_emu.parts); - if (f_open(f_emu.fp_gpp[f_emu.parts], path, FA_READ | FA_WRITE) != FR_OK) + if (f_open(&f_emu.fp_gpp[f_emu.parts], path, FA_READ | FA_WRITE) != FR_OK) { - free(f_emu.fp_gpp[f_emu.parts]); - // Check if single file. if (f_emu.parts == 1) f_emu.parts = 0; @@ -303,19 +293,19 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned case FS_EMMC_PARTITION_GPP: if (f_emu.parts) { - fp_tmp = f_emu.fp_gpp[sector / f_emu.part_size]; + fp_tmp = &f_emu.fp_gpp[sector / f_emu.part_size]; sector = sector % f_emu.part_size; } else { - fp_tmp = f_emu.fp_gpp[0]; + fp_tmp = &f_emu.fp_gpp[0]; } break; case FS_EMMC_PARTITION_BOOT1: - fp_tmp = f_emu.fp_boot1; + fp_tmp = &f_emu.fp_boot1; break; case FS_EMMC_PARTITION_BOOT0: - fp_tmp = f_emu.fp_boot0; + fp_tmp = &f_emu.fp_boot0; break; } @@ -324,10 +314,22 @@ static uint64_t emummc_read_write_inner(void *buf, unsigned int sector, unsigned ; //TODO. Out of range. close stuff and fatal? } + uint64_t res = 0; if (!is_write) - return !(f_read(fp_tmp, buf, num_sectors << 9, NULL)); + res = !(f_read(fp_tmp, buf, num_sectors << 9, NULL)); else - return !(f_write(fp_tmp, buf, num_sectors << 9, NULL)); + res = !(f_write(fp_tmp, buf, num_sectors << 9, NULL)); + + if (res) + { + if (is_write) + { + // TODO + f_sync(fp_tmp); + } + } + + return res; } // FS read wrapper. diff --git a/emummc/source/emuMMC/emummc.h b/emummc/source/emuMMC/emummc.h index 7595e2357..8a99f746e 100644 --- a/emummc/source/emuMMC/emummc.h +++ b/emummc/source/emuMMC/emummc.h @@ -59,9 +59,9 @@ typedef struct _file_based_ctxt uint64_t parts; uint64_t part_size; FATFS *sd_fs; - FIL *fp_boot0; - FIL *fp_boot1; - FIL *fp_gpp[32]; + FIL fp_boot0; + FIL fp_boot1; + FIL fp_gpp[32]; } file_based_ctxt; #ifdef __cplusplus