emummc: fix file based mode

This commit is contained in:
hexkyz 2019-06-16 20:51:25 +01:00
parent ef0c8e0aac
commit 2c46ec9638
2 changed files with 18 additions and 12 deletions

View file

@ -239,7 +239,7 @@ static bool nxboot_configure_emummc(exo_emummc_config_t *exo_emummc_config) {
exo_emummc_config->emu_dir_path[sizeof(exo_emummc_config->emu_dir_path) - 1] = '\0'; exo_emummc_config->emu_dir_path[sizeof(exo_emummc_config->emu_dir_path) - 1] = '\0';
if (emummc_cfg.enabled) { if (emummc_cfg.enabled) {
if (emummc_cfg.sector >= 0) { if (emummc_cfg.sector != -1) {
exo_emummc_config->base_cfg.type = EMUMMC_TYPE_PARTITION; exo_emummc_config->base_cfg.type = EMUMMC_TYPE_PARTITION;
exo_emummc_config->partition_cfg.start_sector = emummc_cfg.sector; exo_emummc_config->partition_cfg.start_sector = emummc_cfg.sector;
@ -254,13 +254,13 @@ static bool nxboot_configure_emummc(exo_emummc_config_t *exo_emummc_config) {
int num_parts = 0; int num_parts = 0;
uint64_t part_limit = 0; uint64_t part_limit = 0;
char emummc_path[0x300 + 1] = {0}; char emummc_path[0x100 + 1] = {0};
char emummc_boot0_path[0x300 + 1] = {0}; char emummc_boot0_path[0x300 + 1] = {0};
char emummc_boot1_path[0x300 + 1] = {0}; char emummc_boot1_path[0x300 + 1] = {0};
char emummc_rawnand_path[0x300 + 1] = {0}; char emummc_rawnand_path[0x300 + 1] = {0};
/* Prepare base folder path. */ /* Prepare base folder path. */
snprintf(emummc_path, sizeof(emummc_path) - 1, "sdmc:/%s/%s", emummc_cfg.path, "eMMC"); snprintf(emummc_path, sizeof(emummc_path) - 1, "%s/%s", emummc_cfg.path, "eMMC");
/* Check if eMMC folder is present. */ /* Check if eMMC folder is present. */
if (!is_valid_folder(emummc_path)) { if (!is_valid_folder(emummc_path)) {
@ -268,8 +268,8 @@ static bool nxboot_configure_emummc(exo_emummc_config_t *exo_emummc_config) {
} }
/* Prepare expected file paths. */ /* Prepare expected file paths. */
snprintf(emummc_boot0_path, sizeof(emummc_boot0_path) - 1, "sdmc:/%s/%s", emummc_path, "boot0"); snprintf(emummc_boot0_path, sizeof(emummc_boot0_path) - 1, "%s/%s", emummc_path, "boot0");
snprintf(emummc_boot1_path, sizeof(emummc_boot1_path) - 1, "sdmc:/%s/%s", emummc_path, "boot1"); snprintf(emummc_boot1_path, sizeof(emummc_boot1_path) - 1, "%s/%s", emummc_path, "boot1");
/* Check if boot0 and boot1 image files are present. */ /* Check if boot0 and boot1 image files are present. */
if (!is_valid_file(emummc_boot0_path) || !is_valid_file(emummc_boot1_path)) { if (!is_valid_file(emummc_boot0_path) || !is_valid_file(emummc_boot1_path)) {
@ -278,7 +278,7 @@ static bool nxboot_configure_emummc(exo_emummc_config_t *exo_emummc_config) {
/* Find raw image files (single or multi part). */ /* Find raw image files (single or multi part). */
for (int i = 0; i < 64; i++) { for (int i = 0; i < 64; i++) {
snprintf(emummc_rawnand_path, sizeof(emummc_rawnand_path) - 1, "sdmc:/%s/%02d", emummc_path, i); snprintf(emummc_rawnand_path, sizeof(emummc_rawnand_path) - 1, "%s/%02d", emummc_path, i);
if (is_valid_file(emummc_rawnand_path)) { if (is_valid_file(emummc_rawnand_path)) {
if (i == 0) { if (i == 0) {
/* The size of the first file should tell us the part limit. */ /* The size of the first file should tell us the part limit. */

View file

@ -190,7 +190,7 @@ static int emummc_partition_read(device_partition_t *devpart, void *dst, uint64_
/* Read partition data using our backing file. */ /* Read partition data using our backing file. */
int rc = 0; int rc = 0;
FILE *emummc_file = fopen(devpart->emu_file_path, "rb"); FILE *emummc_file = fopen(devpart->emu_file_path, "rb");
fseek(emummc_file, sector * devpart->sector_size, SEEK_CUR); fseek(emummc_file, (devpart->start_sector + sector) * devpart->sector_size, SEEK_CUR);
rc = (fread(dst, devpart->sector_size, num_sectors, emummc_file) > 0) ? 0 : -1; rc = (fread(dst, devpart->sector_size, num_sectors, emummc_file) > 0) ? 0 : -1;
fclose(emummc_file); fclose(emummc_file);
return rc; return rc;
@ -205,7 +205,7 @@ static int emummc_partition_write(device_partition_t *devpart, const void *src,
/* Write partition data using our backing file. */ /* Write partition data using our backing file. */
int rc = 0; int rc = 0;
FILE *emummc_file = fopen(devpart->emu_file_path, "wb"); FILE *emummc_file = fopen(devpart->emu_file_path, "wb");
fseek(emummc_file, sector * devpart->sector_size, SEEK_CUR); fseek(emummc_file, (devpart->start_sector + sector) * devpart->sector_size, SEEK_CUR);
rc = (fwrite(src, devpart->sector_size, num_sectors, emummc_file) > 0) ? 0 : -1; rc = (fwrite(src, devpart->sector_size, num_sectors, emummc_file) > 0) ? 0 : -1;
fclose(emummc_file); fclose(emummc_file);
return rc; return rc;
@ -691,7 +691,7 @@ int nxfs_mount_emummc_file(const char *emummc_path, int num_parts, uint64_t part
model.emu_use_file = true; model.emu_use_file = true;
/* Prepare boot0 file path. */ /* Prepare boot0 file path. */
snprintf(emummc_boot0_path, sizeof(emummc_boot0_path) - 1, "sdmc:/%s/%s", emummc_path, "boot0"); snprintf(emummc_boot0_path, sizeof(emummc_boot0_path) - 1, "%s/%s", emummc_path, "boot0");
/* Mount emulated boot0 device. */ /* Mount emulated boot0 device. */
rc = emudev_mount_device("boot0", &model, emummc_boot0_path); rc = emudev_mount_device("boot0", &model, emummc_boot0_path);
@ -716,7 +716,7 @@ int nxfs_mount_emummc_file(const char *emummc_path, int num_parts, uint64_t part
model.emu_use_file = true; model.emu_use_file = true;
/* Prepare boot1 file path. */ /* Prepare boot1 file path. */
snprintf(emummc_boot1_path, sizeof(emummc_boot1_path) - 1, "sdmc:/%s/%s", emummc_path, "boot1"); snprintf(emummc_boot1_path, sizeof(emummc_boot1_path) - 1, "%s/%s", emummc_path, "boot1");
/* Mount emulated boot1 device. */ /* Mount emulated boot1 device. */
rc = emudev_mount_device("boot1", &model, emummc_boot1_path); rc = emudev_mount_device("boot1", &model, emummc_boot1_path);
@ -726,7 +726,13 @@ int nxfs_mount_emummc_file(const char *emummc_path, int num_parts, uint64_t part
return -1; return -1;
} }
/* Don't register emulated boot1 for now. */ /* Register emulated boot1 device. */
rc = emudev_register_device("boot1");
/* Failed to register boot1 device. */
if (rc == -1) {
return -1;
}
/* Setup a template for raw NAND. */ /* Setup a template for raw NAND. */
model = g_emummc_devpart_template; model = g_emummc_devpart_template;
@ -735,7 +741,7 @@ int nxfs_mount_emummc_file(const char *emummc_path, int num_parts, uint64_t part
model.emu_use_file = true; model.emu_use_file = true;
/* Prepare single raw NAND file path. */ /* Prepare single raw NAND file path. */
snprintf(emummc_rawnand_path, sizeof(emummc_rawnand_path) - 1, "sdmc:/%s/%02d", emummc_path, 0); snprintf(emummc_rawnand_path, sizeof(emummc_rawnand_path) - 1, "%s/%02d", emummc_path, 0);
/* Mount emulated raw NAND device from single or multiple parts. */ /* Mount emulated raw NAND device from single or multiple parts. */
if (!is_exfat) { if (!is_exfat) {