mirror of
https://github.com/Fledge68/WiiFlow_Lite.git
synced 2024-11-27 21:54:15 +01:00
* Some changes and fixes for temp region nand emulation feature
This commit is contained in:
parent
f2355ba238
commit
64773f440c
@ -39,9 +39,7 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "gecko.h"
|
#include "gecko.h"
|
||||||
#include "mem2.hpp"
|
#include "mem2.hpp"
|
||||||
|
#include "smartptr.hpp"
|
||||||
#define SYSCONFPATH "/shared2/sys/SYSCONF"
|
|
||||||
#define TXTPATH "/title/00000001/00000002/data/setting.txt"
|
|
||||||
|
|
||||||
u8 *confbuffer ATTRIBUTE_ALIGN(32);
|
u8 *confbuffer ATTRIBUTE_ALIGN(32);
|
||||||
u8 CCode[0x1008];
|
u8 CCode[0x1008];
|
||||||
@ -236,28 +234,19 @@ s32 Nand::__configread(void)
|
|||||||
txtbuffer = (char *)MEM2_alloc(0x100);
|
txtbuffer = (char *)MEM2_alloc(0x100);
|
||||||
cfg_hdr = (config_header *)NULL;
|
cfg_hdr = (config_header *)NULL;
|
||||||
|
|
||||||
ISFS_Deinitialize();
|
FILE *f = fopen(cfgpath, "rb");
|
||||||
ISFS_Initialize();
|
if(f)
|
||||||
|
{
|
||||||
|
fread(confbuffer, 1, 0x4000, f);
|
||||||
|
SAFE_CLOSE(f);
|
||||||
|
}
|
||||||
|
|
||||||
s32 fd = IOS_Open(SYSCONFPATH, IPC_OPEN_READ);
|
f = fopen(settxtpath, "rb");
|
||||||
if(fd < 0)
|
if(f)
|
||||||
return 0;
|
{
|
||||||
|
fread(txtbuffer, 1, 0x100, f);
|
||||||
s32 ret = IOS_Read(fd, confbuffer, 0x4000);
|
SAFE_CLOSE(f);
|
||||||
if(ret < 0)
|
}
|
||||||
return 0;
|
|
||||||
|
|
||||||
IOS_Close(fd);
|
|
||||||
|
|
||||||
fd = IOS_Open(TXTPATH, IPC_OPEN_READ);
|
|
||||||
if(fd < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ret = IOS_Read(fd, txtbuffer, 0x100);
|
|
||||||
if(ret < 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
IOS_Close(fd);
|
|
||||||
|
|
||||||
cfg_hdr = (config_header *)confbuffer;
|
cfg_hdr = (config_header *)confbuffer;
|
||||||
|
|
||||||
@ -284,7 +273,7 @@ s32 Nand::__configwrite(void)
|
|||||||
{
|
{
|
||||||
fwrite(confbuffer, 1, 0x4000, f);
|
fwrite(confbuffer, 1, 0x4000, f);
|
||||||
gprintf("SYSCONF written to:\"%s\"\n", cfgpath);
|
gprintf("SYSCONF written to:\"%s\"\n", cfgpath);
|
||||||
fclose(f);
|
SAFE_CLOSE(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
f = fopen(settxtpath, "wb");
|
f = fopen(settxtpath, "wb");
|
||||||
@ -292,7 +281,7 @@ s32 Nand::__configwrite(void)
|
|||||||
{
|
{
|
||||||
fwrite(txtbuffer, 1, 0x100, f);
|
fwrite(txtbuffer, 1, 0x100, f);
|
||||||
gprintf("setting.txt written to: \"%s\"\n", settxtpath);
|
gprintf("setting.txt written to: \"%s\"\n", settxtpath);
|
||||||
fclose(f);
|
SAFE_CLOSE(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
configloaded = configloaded ? false : true;
|
configloaded = configloaded ? false : true;
|
||||||
@ -301,8 +290,8 @@ s32 Nand::__configwrite(void)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MEM2_free(confbuffer);
|
free(confbuffer);
|
||||||
MEM2_free(txtbuffer);
|
free(txtbuffer);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,6 +360,138 @@ u32 Nand::__configsetsetting(const char *item, const char *val)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s32 Nand::__FlashNandFile(const char *source, const char *dest)
|
||||||
|
{
|
||||||
|
s32 ret;
|
||||||
|
FILE *file = fopen(source, "rb");
|
||||||
|
if(!file)
|
||||||
|
{
|
||||||
|
gprintf("Error opening source: \"%s\"\n", source);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(file, 0, SEEK_END);
|
||||||
|
u32 fsize = ftell(file);
|
||||||
|
fseek(file, 0, SEEK_SET);
|
||||||
|
|
||||||
|
gprintf("Flashing: %s (%uKB) to nand: %s...", source, (fsize / 0x400)+1, dest);
|
||||||
|
|
||||||
|
ISFS_Delete(dest);
|
||||||
|
ISFS_CreateFile(dest, 0, 3, 3, 3);
|
||||||
|
s32 fd = ISFS_Open(dest, ISFS_OPEN_RW);
|
||||||
|
if(fd < 0)
|
||||||
|
{
|
||||||
|
gprintf(" failed\nError: ISFS_OPEN(%s, %d) %d\n", dest, ISFS_OPEN_RW, fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 *buffer = (u8 *)MEM2_alloc(BLOCK);
|
||||||
|
u32 toread = fsize;
|
||||||
|
while(toread > 0)
|
||||||
|
{
|
||||||
|
u32 size = BLOCK;
|
||||||
|
if(toread < BLOCK)
|
||||||
|
size = toread;
|
||||||
|
|
||||||
|
ret = fread(buffer, 1, size, file);
|
||||||
|
if(ret <= 0)
|
||||||
|
{
|
||||||
|
gprintf(" failed\nError: fread(%p, 1, %d, %s) %d\n", buffer, size, source, ret);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ISFS_Write(fd, buffer, size);
|
||||||
|
if(ret <= 0)
|
||||||
|
{
|
||||||
|
gprintf(" failed\nError: ISFS_Write(%d, %p, %d) %d\n", fd, buffer, size, ret);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
toread -= size;
|
||||||
|
}
|
||||||
|
|
||||||
|
gprintf(" done!\n");
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 Nand::__DumpNandFile(const char *source, const char *dest)
|
||||||
|
{
|
||||||
|
s32 fd = ISFS_Open(source, ISFS_OPEN_READ);
|
||||||
|
if (fd < 0)
|
||||||
|
{
|
||||||
|
gprintf("Error: IOS_OPEN(%s, %d) %d\n", source, ISFS_OPEN_READ, fd);
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *file = fopen(dest, "wb");
|
||||||
|
if (!file)
|
||||||
|
{
|
||||||
|
gprintf("Error opening destination: \"%s\"\n", dest);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fstats *status = (fstats *)MEM2_alloc(sizeof(fstats));
|
||||||
|
s32 ret = ISFS_GetFileStats(fd, status);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
gprintf("Error: ISFS_GetFileStats(%d) %d\n", fd, ret);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(status);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
gprintf("Dumping: %s (%uKB) from nand to %s...", source, (status->file_length / 0x400)+1, dest);
|
||||||
|
|
||||||
|
u8 *buffer = (u8 *)MEM2_alloc(BLOCK);
|
||||||
|
u32 toread = status->file_length;
|
||||||
|
while(toread > 0)
|
||||||
|
{
|
||||||
|
u32 size = BLOCK;
|
||||||
|
if (toread < BLOCK)
|
||||||
|
size = toread;
|
||||||
|
|
||||||
|
ret = ISFS_Read(fd, buffer, size);
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
gprintf(" failed\nError: ISFS_Read(%d, %p, %d) %d\n", fd, buffer, size, ret);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(status);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = fwrite(buffer, 1, size, file);
|
||||||
|
if(ret < 0)
|
||||||
|
{
|
||||||
|
gprintf(" failed\nError writing to destination: \"%s\" (%d)\n", dest, ret);
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(status);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
toread -= size;
|
||||||
|
}
|
||||||
|
gprintf(" done!\n");
|
||||||
|
ISFS_Close(fd);
|
||||||
|
SAFE_CLOSE(file);
|
||||||
|
MEM2_free(status);
|
||||||
|
MEM2_free(buffer);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void Nand::__CreatePath(const char *path, ...)
|
void Nand::__CreatePath(const char *path, ...)
|
||||||
{
|
{
|
||||||
char *folder = NULL;
|
char *folder = NULL;
|
||||||
@ -405,17 +526,20 @@ s32 Nand::CreateConfig(const char *path)
|
|||||||
__CreatePath("%s/title/00000001", path);
|
__CreatePath("%s/title/00000001", path);
|
||||||
__CreatePath("%s/title/00000001/00000002", path);
|
__CreatePath("%s/title/00000001/00000002", path);
|
||||||
__CreatePath("%s/title/00000001/00000002/data", path);
|
__CreatePath("%s/title/00000001/00000002/data", path);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
s32 Nand::Do_Region_Change(string id, const char *path)
|
bzero(cfgpath, MAX_FAT_PATH);
|
||||||
{
|
bzero(settxtpath, MAX_FAT_PATH);
|
||||||
bzero(cfgpath, ISFS_MAXPATH);
|
|
||||||
bzero(settxtpath, ISFS_MAXPATH);
|
|
||||||
|
|
||||||
snprintf(cfgpath, sizeof(cfgpath), "%s%s", path, SYSCONFPATH);
|
snprintf(cfgpath, sizeof(cfgpath), "%s%s", path, SYSCONFPATH);
|
||||||
snprintf(settxtpath, sizeof(settxtpath), "%s%s", path, TXTPATH);
|
snprintf(settxtpath, sizeof(settxtpath), "%s%s", path, TXTPATH);
|
||||||
|
|
||||||
|
__DumpNandFile(SYSCONFPATH, cfgpath);
|
||||||
|
__DumpNandFile(TXTPATH, settxtpath);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 Nand::Do_Region_Change(string id)
|
||||||
|
{
|
||||||
if(__configread())
|
if(__configread())
|
||||||
{
|
{
|
||||||
switch(id[3])
|
switch(id[3])
|
||||||
@ -454,7 +578,7 @@ s32 Nand::Do_Region_Change(string id, const char *path)
|
|||||||
{
|
{
|
||||||
gprintf("Switching region to PAL \n");
|
gprintf("Switching region to PAL \n");
|
||||||
CCode[0] = 110;
|
CCode[0] = 110;
|
||||||
__configsetbyte( "IPL.LNG", 6 );
|
__configsetbyte( "IPL.LNG", 1 );
|
||||||
__configsetbigarray( "IPL.SADR", CCode, 0x1007 );
|
__configsetbigarray( "IPL.SADR", CCode, 0x1007 );
|
||||||
__configsetsetting( "AREA", "EUR" );
|
__configsetsetting( "AREA", "EUR" );
|
||||||
__configsetsetting( "MODEL", "RVL-001(EUR)" );
|
__configsetsetting( "MODEL", "RVL-001(EUR)" );
|
||||||
@ -480,8 +604,3 @@ s32 Nand::Do_Region_Change(string id, const char *path)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -18,6 +18,11 @@
|
|||||||
#define RF_NEWS_CHANNEL 0x48414741
|
#define RF_NEWS_CHANNEL 0x48414741
|
||||||
#define RF_FORECAST_CHANNEL 0x48414641
|
#define RF_FORECAST_CHANNEL 0x48414641
|
||||||
|
|
||||||
|
#define SYSCONFPATH "/shared2/sys/SYSCONF"
|
||||||
|
#define TXTPATH "/title/00000001/00000002/data/setting.txt"
|
||||||
|
|
||||||
|
#define BLOCK 0x4000
|
||||||
|
|
||||||
/* 'NAND Device' structure */
|
/* 'NAND Device' structure */
|
||||||
typedef struct nandDevice
|
typedef struct nandDevice
|
||||||
{
|
{
|
||||||
@ -57,7 +62,7 @@ class Nand
|
|||||||
void Set_NandPath(string path);
|
void Set_NandPath(string path);
|
||||||
|
|
||||||
s32 CreateConfig(const char *path);
|
s32 CreateConfig(const char *path);
|
||||||
s32 Do_Region_Change(string id, const char *path);
|
s32 Do_Region_Change(string id);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Nand() : MountedDevice(0), EmuDevice(REAL_NAND), Disabled(true), Partition(0), FullMode(0x100), NandPath() {}
|
Nand() : MountedDevice(0), EmuDevice(REAL_NAND), Disabled(true), Partition(0), FullMode(0x100), NandPath() {}
|
||||||
@ -75,6 +80,8 @@ class Nand
|
|||||||
u32 __configsetbyte(const char *item, u8 val);
|
u32 __configsetbyte(const char *item, u8 val);
|
||||||
u32 __configsetbigarray(const char *item, void *val, u32 size);
|
u32 __configsetbigarray(const char *item, void *val, u32 size);
|
||||||
u32 __configsetsetting(const char *item, const char *val);
|
u32 __configsetsetting(const char *item, const char *val);
|
||||||
|
s32 __FlashNandFile(const char *source, const char *dest);
|
||||||
|
s32 __DumpNandFile(const char *source, const char *dest);
|
||||||
void __CreatePath(const char *path, ...);
|
void __CreatePath(const char *path, ...);
|
||||||
|
|
||||||
|
|
||||||
@ -85,8 +92,8 @@ class Nand
|
|||||||
u32 Partition ATTRIBUTE_ALIGN(32);
|
u32 Partition ATTRIBUTE_ALIGN(32);
|
||||||
u32 FullMode ATTRIBUTE_ALIGN(32);
|
u32 FullMode ATTRIBUTE_ALIGN(32);
|
||||||
char NandPath[32] ATTRIBUTE_ALIGN(32);
|
char NandPath[32] ATTRIBUTE_ALIGN(32);
|
||||||
char cfgpath[1024] ATTRIBUTE_ALIGN(32);
|
char cfgpath[1024];
|
||||||
char settxtpath[1024] ATTRIBUTE_ALIGN(32);
|
char settxtpath[1024];
|
||||||
|
|
||||||
static Nand * instance;
|
static Nand * instance;
|
||||||
};
|
};
|
||||||
|
@ -1035,7 +1035,7 @@ void CMenu::_launchGame(dir_discHdr *hdr, bool dvd)
|
|||||||
if(emuSave > 2)
|
if(emuSave > 2)
|
||||||
{
|
{
|
||||||
Nand::Instance()->CreateConfig(basepath);
|
Nand::Instance()->CreateConfig(basepath);
|
||||||
Nand::Instance()->Do_Region_Change(id, basepath);
|
Nand::Instance()->Do_Region_Change(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user