* Some changes and fixes for temp region nand emulation feature

This commit is contained in:
overjoy.psm 2012-03-17 22:30:16 +00:00
parent f2355ba238
commit 64773f440c
3 changed files with 176 additions and 50 deletions

View File

@ -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;
} }

View File

@ -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;
}; };

View File

@ -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);
} }
} }