file based emmc emummc, some other stuff

This commit is contained in:
Christoph Baumann
2025-05-12 01:24:01 +02:00
parent 79b6df64d6
commit 76508c74e8
14 changed files with 143 additions and 113 deletions

View File

@@ -35,7 +35,7 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
mc.o sdram.o minerva.o \ mc.o sdram.o minerva.o \
gpio.o pinmux.o pmc.o se.o smmu.o tsec.o uart.o \ gpio.o pinmux.o pmc.o se.o smmu.o tsec.o uart.o \
fuse.o kfuse.o \ fuse.o kfuse.o \
sdmmc.o sdmmc_driver.o emmc.o sd.o emummc.o \ sdmmc.o sdmmc_driver.o emmc.o sd.o emummc.o emummc_file_based.o \
bq24193.o max17050.o max7762x.o max77620-rtc.o \ bq24193.o max17050.o max7762x.o max77620-rtc.o \
hw_init.o boot_storage.o \ hw_init.o boot_storage.o \
) )

View File

@@ -23,6 +23,7 @@
#include <storage/mbr_gpt.h> #include <storage/mbr_gpt.h>
#include <gfx_utils.h> #include <gfx_utils.h>
#include <utils/list.h> #include <utils/list.h>
#include <storage/emummc_file_based.h>
static u16 emmc_errors[3] = { 0 }; // Init and Read/Write errors. static u16 emmc_errors[3] = { 0 }; // Init and Read/Write errors.
static u32 emmc_mode = EMMC_MMC_HS400; static u32 emmc_mode = EMMC_MMC_HS400;

View File

@@ -1,4 +1,4 @@
#include "emummc.h" #include "emummc_file_based.h"
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <libs/fatfs/ff.h> #include <libs/fatfs/ff.h>

View File

@@ -1,5 +1,5 @@
#ifndef EMUMMC_H #ifndef _EMUMMC_FILE_BASED_H
#define EMUMMC_H #define _EMUMMC_FILE_BASED_H
#include <bdk.h> #include <bdk.h>

View File

@@ -29,7 +29,7 @@
#include <storage/emmc.h> #include <storage/emmc.h>
#include <storage/sd.h> #include <storage/sd.h>
#include <storage/sdmmc.h> #include <storage/sdmmc.h>
#include <storage/emummc.h> #include <storage/emummc_file_based.h>
#include <utils/types.h> #include <utils/types.h>
#define BIS_CLUSTER_SECTORS 32 #define BIS_CLUSTER_SECTORS 32

View File

@@ -20,7 +20,7 @@
*/ */
#include <storage/emmc.h> #include <storage/emmc.h>
#include <storage/emummc.h> #include <storage/emummc_file_based.h>
#include <string.h> #include <string.h>
#include <usb/usbd.h> #include <usb/usbd.h>

View File

@@ -786,6 +786,7 @@ int hos_launch(ini_sec_t *cfg)
} }
// Check if SD Card is GPT. // Check if SD Card is GPT.
// TODO: not relevant with emuSD
if (sd_is_gpt()) if (sd_is_gpt())
{ {
_hos_crit_error("SD has GPT only!"); _hos_crit_error("SD has GPT only!");

View File

@@ -15,6 +15,7 @@
*/ */
#include <storage/emmc.h> #include <storage/emmc.h>
#include <storage/sd.h>
#include <storage/sdmmc.h> #include <storage/sdmmc.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
@@ -24,6 +25,7 @@
#include "emummc.h" #include "emummc.h"
#include "../config.h" #include "../config.h"
#include <libs/fatfs/ff.h> #include <libs/fatfs/ff.h>
#include <storage/emummc_file_based.h>
extern hekate_config h_cfg; extern hekate_config h_cfg;
emummc_cfg_t emu_cfg = { 0 }; emummc_cfg_t emu_cfg = { 0 };
@@ -123,6 +125,20 @@ bool emummc_set_path(char *path)
goto out; goto out;
} }
// strcpy(emu_cfg.emummc_file_based_path, "sd:");
strcpy(emu_cfg.emummc_file_based_path, "");
strcat(emu_cfg.emummc_file_based_path, path);
strcat(emu_cfg.emummc_file_based_path, "/file_emmc_based");
if (!f_stat(emu_cfg.emummc_file_based_path, NULL))
{
emu_cfg.sector = 0;
emu_cfg.path = path;
emu_cfg.enabled = 4;
found = true;
goto out;
}
out: out:
if (found) if (found)
@@ -157,7 +173,7 @@ static int emummc_raw_get_part_off(int part_idx)
int emummc_storage_init_mmc() int emummc_storage_init_mmc()
{ {
FILINFO fno; // FILINFO fno;
emu_cfg.active_part = 0; emu_cfg.active_part = 0;
// Always init eMMC even when in emuMMC. eMMC is needed from the emuMMC driver anyway. // Always init eMMC even when in emuMMC. eMMC is needed from the emuMMC driver anyway.
@@ -167,43 +183,59 @@ int emummc_storage_init_mmc()
if (!emu_cfg.enabled || h_cfg.emummc_force_disable) if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
return 0; return 0;
if (emu_cfg.enabled == 1 && !sd_mount()) bool file_based = false;
goto out;
if (!emu_cfg.sector) if(emu_cfg.enabled == 4){
{ // emmc based
strcpy(emu_cfg.emummc_file_based_path, "sd:"); if(!emu_cfg.sector){
strcat(emu_cfg.emummc_file_based_path, emu_cfg.path); // file based
strcat(emu_cfg.emummc_file_based_path, "/eMMC"); if(!emmc_mount()){
return 1;
if (f_stat(emu_cfg.emummc_file_based_path, &fno)) }
{ strcpy(emu_cfg.emummc_file_based_path, "emmc:");
EPRINTF("Failed to open eMMC folder."); strcat(emu_cfg.emummc_file_based_path, emu_cfg.path);
goto out; strcat(emu_cfg.emummc_file_based_path, "/eMMC");
file_based = true;
}else{
// raw based
// emmc already initialized
} }
f_chmod(emu_cfg.emummc_file_based_path, AM_ARC, AM_ARC); }else{
// sd based
strcat(emu_cfg.emummc_file_based_path, "/00"); if(!emu_cfg.sector){
if (f_stat(emu_cfg.emummc_file_based_path, &fno)) // file based
{ if(!sd_mount()){
EPRINTF("Failed to open emuMMC rawnand."); return 1;
goto out; }
strcpy(emu_cfg.emummc_file_based_path, "sd:");
strcat(emu_cfg.emummc_file_based_path, emu_cfg.path);
strcat(emu_cfg.emummc_file_based_path, "/eMMC");
file_based = true;
}else{
// raw based
if(!sd_initialize(false)){
return 1;
}
} }
emu_cfg.file_based_part_size = fno.fsize >> 9; }
if(file_based){
return emummc_storage_file_based_init(emu_cfg.emummc_file_based_path) == 0;
} }
return 0; return 0;
out:
return 1;
} }
int emummc_storage_end() int emummc_storage_end()
{ {
if (!emu_cfg.enabled || h_cfg.emummc_force_disable || emu_cfg.enabled == 4) if(!h_cfg.emummc_force_disable && emu_cfg.enabled && !emu_cfg.sector){
emummc_storage_file_based_end();
}
if(!emu_cfg.enabled || h_cfg.emummc_force_disable || emu_cfg.enabled == 4){
emmc_end(); emmc_end();
else }else{
sd_end(); sd_end();
}
return 1; return 1;
} }
@@ -211,7 +243,7 @@ int emummc_storage_end()
int emummc_storage_read(u32 sector, u32 num_sectors, void *buf) int emummc_storage_read(u32 sector, u32 num_sectors, void *buf)
{ {
sdmmc_storage_t *storage = emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage; sdmmc_storage_t *storage = emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage;
FIL fp; // FIL fp;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable) if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
return sdmmc_storage_read(&emmc_storage, sector, num_sectors, buf); return sdmmc_storage_read(&emmc_storage, sector, num_sectors, buf);
else if (emu_cfg.sector) else if (emu_cfg.sector)
@@ -222,33 +254,34 @@ int emummc_storage_read(u32 sector, u32 num_sectors, void *buf)
} }
else else
{ {
if (!emu_cfg.active_part) return emummc_storage_file_based_read(sector, num_sectors, buf);
{ // if (!emu_cfg.active_part)
u32 file_part = sector / emu_cfg.file_based_part_size; // {
sector = sector % emu_cfg.file_based_part_size; // u32 file_part = sector / emu_cfg.file_based_part_size;
if (file_part >= 10) // sector = sector % emu_cfg.file_based_part_size;
itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 2, 10); // if (file_part >= 10)
else // itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 2, 10);
{ // else
emu_cfg.emummc_file_based_path[strlen(emu_cfg.emummc_file_based_path) - 2] = '0'; // {
itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 1, 10); // emu_cfg.emummc_file_based_path[strlen(emu_cfg.emummc_file_based_path) - 2] = '0';
} // itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 1, 10);
} // }
if (f_open(&fp, emu_cfg.emummc_file_based_path, FA_READ)) // }
{ // if (f_open(&fp, emu_cfg.emummc_file_based_path, FA_READ))
EPRINTF("Failed to open emuMMC image."); // {
return 0; // EPRINTF("Failed to open emuMMC image.");
} // return 0;
f_lseek(&fp, (u64)sector << 9); // }
if (f_read(&fp, buf, (u64)num_sectors << 9, NULL)) // f_lseek(&fp, (u64)sector << 9);
{ // if (f_read(&fp, buf, (u64)num_sectors << 9, NULL))
EPRINTF("Failed to read emuMMC image."); // {
f_close(&fp); // EPRINTF("Failed to read emuMMC image.");
return 0; // f_close(&fp);
} // return 0;
// }
f_close(&fp); // f_close(&fp);
return 1; // return 1;
} }
return 1; return 1;
@@ -257,7 +290,7 @@ int emummc_storage_read(u32 sector, u32 num_sectors, void *buf)
int emummc_storage_write(u32 sector, u32 num_sectors, void *buf) int emummc_storage_write(u32 sector, u32 num_sectors, void *buf)
{ {
sdmmc_storage_t *storage = emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage; sdmmc_storage_t *storage = emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage;
FIL fp; // FIL fp;
if (!emu_cfg.enabled || h_cfg.emummc_force_disable) if (!emu_cfg.enabled || h_cfg.emummc_force_disable)
return sdmmc_storage_write(&emmc_storage, sector, num_sectors, buf); return sdmmc_storage_write(&emmc_storage, sector, num_sectors, buf);
else if (emu_cfg.sector) else if (emu_cfg.sector)
@@ -268,31 +301,32 @@ int emummc_storage_write(u32 sector, u32 num_sectors, void *buf)
} }
else else
{ {
if (!emu_cfg.active_part) return emummc_storage_file_based_write(sector, num_sectors, buf);
{ // if (!emu_cfg.active_part)
u32 file_part = sector / emu_cfg.file_based_part_size; // {
sector = sector % emu_cfg.file_based_part_size; // u32 file_part = sector / emu_cfg.file_based_part_size;
if (file_part >= 10) // sector = sector % emu_cfg.file_based_part_size;
itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 2, 10); // if (file_part >= 10)
else // itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 2, 10);
{ // else
emu_cfg.emummc_file_based_path[strlen(emu_cfg.emummc_file_based_path) - 2] = '0'; // {
itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 1, 10); // emu_cfg.emummc_file_based_path[strlen(emu_cfg.emummc_file_based_path) - 2] = '0';
} // itoa(file_part, emu_cfg.emummc_file_based_path + strlen(emu_cfg.emummc_file_based_path) - 1, 10);
} // }
// }
if (f_open(&fp, emu_cfg.emummc_file_based_path, FA_WRITE)) // if (f_open(&fp, emu_cfg.emummc_file_based_path, FA_WRITE))
return 0; // return 0;
f_lseek(&fp, (u64)sector << 9); // f_lseek(&fp, (u64)sector << 9);
if (f_write(&fp, buf, (u64)num_sectors << 9, NULL)) // if (f_write(&fp, buf, (u64)num_sectors << 9, NULL))
{ // {
f_close(&fp); // f_close(&fp);
return 0; // return 0;
} // }
f_close(&fp); // f_close(&fp);
return 1; // return 1;
} }
} }
@@ -300,40 +334,28 @@ int emummc_storage_set_mmc_partition(u32 partition)
{ {
emu_cfg.active_part = partition; emu_cfg.active_part = partition;
if(h_cfg.emummc_force_disable){
emmc_set_partition(partition);
return 1;
}
if(!emu_cfg.enabled){
return 1;
}
if(!emu_cfg.sector){
emummc_storage_file_base_set_partition(partition);
return 1;
}
if(emu_cfg.enabled != 4){ if(emu_cfg.enabled != 4){
emmc_set_partition(partition); emmc_set_partition(partition);
}else{ }else{
emmc_set_partition(EMMC_GPP); emmc_set_partition(EMMC_GPP);
} }
if (!emu_cfg.enabled || h_cfg.emummc_force_disable || emu_cfg.sector)
return 1;
else
{
strcpy(emu_cfg.emummc_file_based_path, "sd:");
strcat(emu_cfg.emummc_file_based_path, emu_cfg.path);
strcat(emu_cfg.emummc_file_based_path, "/eMMC");
switch (partition)
{
case 0:
strcat(emu_cfg.emummc_file_based_path, "/00");
break;
case 1:
strcat(emu_cfg.emummc_file_based_path, "/BOOT0");
break;
case 2:
strcat(emu_cfg.emummc_file_based_path, "/BOOT1");
break;
}
return 1;
}
return 1; return 1;
} }
sdmmc_storage_t *emummc_get_storage(){ sdmmc_storage_t *emummc_get_storage(){
// TODO: should return &emummc_storage if emummc lives on emmc
return emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage; return emu_cfg.enabled == 4 ? &emmc_storage : &sd_storage;
} }

View File

@@ -41,7 +41,7 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
bm92t36.o bq24193.o max17050.o max7762x.o max77620-rtc.o regulator_5v.o \ bm92t36.o bq24193.o max17050.o max7762x.o max77620-rtc.o regulator_5v.o \
touch.o joycon.o tmp451.o fan.o \ touch.o joycon.o tmp451.o fan.o \
usbd.o xusbd.o usb_descriptors.o usb_gadget_ums.o usb_gadget_hid.o \ usbd.o xusbd.o usb_descriptors.o usb_gadget_ums.o usb_gadget_hid.o \
hw_init.o boot_storage.o sfd.o mbr_gpt.o emummc.o \ hw_init.o boot_storage.o sfd.o mbr_gpt.o emummc_file_based.o \
) )
# Utilities. # Utilities.

View File

@@ -23,7 +23,7 @@
#include <mem/heap.h> #include <mem/heap.h>
#include <storage/boot_storage.h> #include <storage/boot_storage.h>
#include <storage/emmc.h> #include <storage/emmc.h>
#include <storage/emummc.h> #include <storage/emummc_file_based.h>
#include <storage/mbr_gpt.h> #include <storage/mbr_gpt.h>
#include <storage/nx_emmc_bis.h> #include <storage/nx_emmc_bis.h>
#include <storage/sd.h> #include <storage/sd.h>

View File

@@ -54,7 +54,7 @@ void save_emusd_cfg(u32 part_idx, u32 sector_start){
// Add config entry. // Add config entry.
f_puts("[emusd]\nenabled=", &fp); f_puts("[emusd]\nenabled=", &fp);
if(sector_start){ if(sector_start){
f_puts("1", &fp); f_puts("4", &fp);
}else{ }else{
f_puts("0", &fp); f_puts("0", &fp);
} }

View File

@@ -923,7 +923,9 @@ static void _launch_hos(u8 autoboot, u8 autoboot_list)
void (*main_ptr)() = (void *)nyx_str->hekate; void (*main_ptr)() = (void *)nyx_str->hekate;
boot_storage_end();
sd_end(); sd_end();
emmc_end();
hw_deinit(false, 0); hw_deinit(false, 0);

View File

@@ -36,7 +36,7 @@
#include <libs/fatfs/ff.h> #include <libs/fatfs/ff.h>
#include <storage/boot_storage.h> #include <storage/boot_storage.h>
#include <storage/emmc.h> #include <storage/emmc.h>
#include <storage/emummc.h> #include <storage/emummc_file_based.h>
#include <storage/mbr_gpt.h> #include <storage/mbr_gpt.h>
#include <storage/sd.h> #include <storage/sd.h>
#include <storage/sdmmc.h> #include <storage/sdmmc.h>

View File

@@ -224,8 +224,12 @@ static int _stat_and_copy_files(const char *src, const char *dst, char *path, u3
// Open directory. // Open directory.
res = f_opendir(&dir, path); res = f_opendir(&dir, path);
if (res != FR_OK) if (res != FR_OK){
if(res == FR_NO_PATH){
return FR_OK;
}
return res; return res;
}
if (labels) if (labels)
lv_label_set_text(labels[0], path); lv_label_set_text(labels[0], path);