*Added use of IOS58 for Loader option. It is enabled by default and can be disabled in the Loader Settings. If it is disabled the Boot/Standard cIOS is loaded on startup, after reading the config files.

WARNING: If you select to use IOS58 and you don't have IOS58 installed, the loader will be really really slow.
*Fixed reseting of Theme/Fonts when pressing the SD Card button. It is now reloading it instead.
This commit is contained in:
dimok321 2011-01-12 19:30:04 +00:00
parent 4b3120fccf
commit 3503f114ed
19 changed files with 86 additions and 77 deletions

View File

@ -2,8 +2,8 @@
<app version="1"> <app version="1">
<name> USB Loader GX</name> <name> USB Loader GX</name>
<coder>USB Loader GX Team</coder> <coder>USB Loader GX Team</coder>
<version>2.0 r1040</version> <version>2.0 r1041</version>
<release_date>201101091911</release_date> <release_date>201101111755</release_date>
<no_ios_reload/> <no_ios_reload/>
<short_description>Loads games from USB-devices</short_description> <short_description>Loads games from USB-devices</short_description>
<long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times. <long_description>USB Loader GX is a libwiigui based USB iso loader with a wii-like GUI. You can install games to your HDDs and boot them with shorter loading times.

View File

@ -133,14 +133,24 @@ bool DeviceHandler::MountSD()
return sd->Mount(0, DeviceName[SD], true); return sd->Mount(0, DeviceName[SD], true);
} }
const DISC_INTERFACE * DeviceHandler::GetUSBInterface()
{
if(IOS_GetVersion() < 200)
return &__io_usbstorage;
return &__io_usbstorage2;
}
static inline bool USBSpinUp() static inline bool USBSpinUp()
{ {
bool started = false; bool started = false;
int retries = 400; int retries = 400;
const DISC_INTERFACE * handle = DeviceHandler::GetUSBInterface();
// wait 20 sec for the USB to spin up...stupid slow ass HDD // wait 20 sec for the USB to spin up...stupid slow ass HDD
do do
{ {
started = (__io_usbstorage2.startup() && __io_usbstorage2.isInserted()); started = (handle->startup() && handle->isInserted());
if(started) break; if(started) break;
usleep(50000); usleep(50000);
} }
@ -155,7 +165,7 @@ bool DeviceHandler::MountUSB(int pos, bool spinup)
return false; return false;
if(!usb) if(!usb)
usb = new PartitionHandle(&__io_usbstorage2); usb = new PartitionHandle(GetUSBInterface());
if(usb->GetPartitionCount() < 1) if(usb->GetPartitionCount() < 1)
{ {
@ -176,7 +186,7 @@ bool DeviceHandler::MountAllUSB(bool spinup)
return false; return false;
if(!usb) if(!usb)
usb = new PartitionHandle(&__io_usbstorage2); usb = new PartitionHandle(GetUSBInterface());
bool result = false; bool result = false;

View File

@ -76,12 +76,13 @@ class DeviceHandler
void UnMountSD() { if(sd) delete sd; sd = NULL; }; void UnMountSD() { if(sd) delete sd; sd = NULL; };
void UnMountUSB(int pos); void UnMountUSB(int pos);
void UnMountAllUSB(); void UnMountAllUSB();
PartitionHandle * GetSDHandle() { return sd; }; PartitionHandle * GetSDHandle() const { return sd; };
PartitionHandle * GetUSBHandle() { return usb; }; PartitionHandle * GetUSBHandle() const { return usb; };
static int GetUSBFilesystemType(int part); static int GetUSBFilesystemType(int part);
static int PathToDriveType(const char * path); static int PathToDriveType(const char * path);
static const char * GetFSName(int dev); static const char * GetFSName(int dev);
static const char * PathToFSName(const char * path) { return GetFSName(PathToDriveType(path)); }; static const char * PathToFSName(const char * path) { return GetFSName(PathToDriveType(path)); };
static const DISC_INTERFACE * GetUSBInterface();
private: private:
DeviceHandler() : sd(0), usb(0) { }; DeviceHandler() : sd(0), usb(0) { };
~DeviceHandler(); ~DeviceHandler();

View File

@ -67,7 +67,7 @@ FreeTypeGX::FreeTypeGX(const uint8_t* fontBuffer, FT_Long bufferSize)
FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, 0, &ftFace); FT_New_Memory_Face(ftLibrary, (FT_Byte *) fontBuffer, bufferSize, 0, &ftFace);
setVertexFormat(GX_VTXFMT1); setVertexFormat(GX_VTXFMT1);
ftKerningEnabled = FT_HAS_KERNING( ftFace ); ftKerningEnabled = false;
} }
/** /**
@ -329,6 +329,7 @@ int16_t FreeTypeGX::getStyleOffsetHeight(int16_t format, uint16_t pixelSize)
* @param textStyle Flags which specify any styling which should be applied to the rendered string. * @param textStyle Flags which specify any styling which should be applied to the rendered string.
* @return The number of characters printed. * @return The number of characters printed.
*/ */
uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, GXColor color, uint16_t FreeTypeGX::drawText(int16_t x, int16_t y, int16_t z, const wchar_t *text, int16_t pixelSize, GXColor color,
uint16_t textStyle, uint16_t textWidth, uint16_t widthLimit) uint16_t textStyle, uint16_t textWidth, uint16_t widthLimit)
{ {

View File

@ -106,6 +106,9 @@ int BootGame(const char * gameID)
delete dvdheader; delete dvdheader;
dvdheader = NULL; dvdheader = NULL;
gameList.clear();
int ret = 0; int ret = 0;
u8 videoChoice = Settings.videomode; u8 videoChoice = Settings.videomode;

View File

@ -91,15 +91,16 @@ bool StartUpProcess::USBSpinUp()
{ {
bool started = false; bool started = false;
int retries = 400; int retries = 400;
const DISC_INTERFACE * handle = DeviceHandler::GetUSBInterface();
// wait 10 sec for the USB to spin up...stupid slow ass HDD // wait 10 sec for the USB to spin up...stupid slow ass HDD
do do
{ {
started = (__io_usbstorage2.startup() && __io_usbstorage2.isInserted()); started = (handle->startup() && handle->isInserted());
usleep(50000); usleep(50000);
if(retries < 400 && retries % 20 == 0) if(retries < 400 && retries % 20 == 0)
{ {
messageTxt->SetTextf("Waiting for slow HDD: %i sec left\n", retries/20); messageTxt->SetTextf("Waiting for HDD: %i sec left\n", retries/20);
Draw(); Draw();
} }
} }
@ -117,23 +118,6 @@ bool StartUpProcess::Run()
bool StartUpProcess::Execute() bool StartUpProcess::Execute()
{ {
//! Now we startup the GUI so no need for console prints. Output only to gecko.
USBGeckoOutput();
// Let's try loading some cIOS
if (IosLoader::LoadAppCios() < 0)
{
titleTxt->SetText("WARNING!");
messageTxt->SetMaxWidth(400, WRAP);
messageTxt->SetText("USB Loader GX needs unstubbed cIOS 222 v4+ or 249 v9+. \
We cannot determine the versions on your system, since you have no patched ios 36 or 236 installed. \
Therefor, if loading of USB Loader GX fails, you probably have installed the 4.2 update, \
and you should go figure out how to get some cios action going on\n\tin your Wii. \
ERROR: No cIOS could be loaded. Exiting....");
sleep(10);
Sys_BackToLoader();
}
SetTextf("Initialize sd card\n"); SetTextf("Initialize sd card\n");
DeviceHandler::Instance()->MountSD(); DeviceHandler::Instance()->MountSD();
@ -147,21 +131,21 @@ bool StartUpProcess::Execute()
gprintf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed"); gprintf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed");
gprintf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed"); gprintf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed");
if(Settings.cios != IOS_GetVersion()) if(!Settings.UseIOS58 && Settings.cios != IOS_GetVersion())
{ {
SetTextf("Loading cIOS %i\n", Settings.cios); SetTextf("Loading cIOS %i\n", Settings.cios);
DeviceHandler::Instance()->UnMountAll(); DeviceHandler::DestroyInstance();
// Loading now the cios setup in the settings // Loading now the cios setup in the settings
IosLoader::LoadAppCios(); IosLoader::LoadAppCios();
SetTextf("Loaded cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision()); SetTextf("Loaded cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision());
DeviceHandler::Instance()->MountAll(); DeviceHandler::Instance()->MountSD();
USBSpinUp();
DeviceHandler::Instance()->MountAllUSB(false);
} }
else
SetTextf("Loaded cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision());
gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.theme_path) ? "done" : "failed (using default)"); gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.theme_path) ? "done" : "failed (using default)");
gprintf("\tLoading theme...%s\n", Theme::Load(Settings.theme) ? "done" : "failed (using default)"); gprintf("\tLoading theme...%s\n", Theme::Load(Settings.theme) ? "done" : "failed (using default)");

View File

@ -20,9 +20,7 @@ void gprintf(const char *format, ...)
va_start(va, format); va_start(va, format);
if((vasprintf(&tmp, format, va) >= 0) && tmp) if((vasprintf(&tmp, format, va) >= 0) && tmp)
{ {
u32 level = IRQ_Disable();
usb_sendbuffer(1, tmp, strlen(tmp)); usb_sendbuffer(1, tmp, strlen(tmp));
IRQ_Restore(level);
} }
va_end(va); va_end(va);
@ -36,11 +34,11 @@ bool InitGecko()
if (geckoattached) if (geckoattached)
{ {
usb_flush(EXI_CHANNEL_1); usb_flush(EXI_CHANNEL_1);
CON_EnableGecko(1, false);
geckoinit = true; geckoinit = true;
return true; return true;
} }
else return false;
return false;
} }
char ascii(char s) char ascii(char s)
@ -79,12 +77,7 @@ void hexdump(void *d, int len)
static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len) static ssize_t __out_write(struct _reent *r, int fd, const char *ptr, size_t len)
{ {
if(geckoinit && ptr) if(geckoinit && ptr)
{
u32 level;
level = IRQ_Disable();
usb_sendbuffer(1, ptr, len); usb_sendbuffer(1, ptr, len);
IRQ_Restore(level);
}
return len; return len;
} }

View File

@ -402,8 +402,7 @@ void GuiText::ScrollText()
{ {
textDyn[pos][i] = text[i]; textDyn[pos][i] = text[i];
currentWidth currentWidth += (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0x0000);
+= (font ? font : fontSystem)->getCharWidth(text[i], currentSize, i > 0 ? text[i - 1] : 0x0000);
++i; ++i;
} }

View File

@ -39,22 +39,6 @@ extern "C"
static int QuickGameBoot(const char * gameID) static int QuickGameBoot(const char * gameID)
{ {
//if a ID was passed via args copy it and try to boot it after the partition is mounted
//its not really a headless mode. more like hairless.
if (IosLoader::LoadAppCios() < 0)
{
printf("\n\tWARNING!\n");
printf("\tUSB Loader GX needs unstubbed cIOS 222 v4+ or 249 v9+\n\n");
printf("\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed.\n");
printf("\tTherefor, if loading of USB Loader GX fails, you\n\tprobably have installed the 4.2 update,\n");
printf("\tand you should go figure out how to get some cios action going on\n\tin your Wii.\n");
printf("\tERROR: No cIOS could be loaded. Exiting....\n");
sleep(10);
Sys_BackToLoader();
}
DeviceHandler::Instance()->MountAll(); DeviceHandler::Instance()->MountAll();
Settings.Load(); Settings.Load();
@ -64,10 +48,14 @@ static int QuickGameBoot(const char * gameID)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
if(IOS_GetVersion() != 58)
IOS_ReloadIOS(58);
MEM2_init(48); MEM2_init(48);
__exception_setreload(20); __exception_setreload(20);
InitVideo(); InitVideo();
InitGecko(); InitGecko();
USBGeckoOutput();
NandTitles.Get(); NandTitles.Get();
setlocale(LC_ALL, "en.UTF-8"); setlocale(LC_ALL, "en.UTF-8");

View File

@ -793,7 +793,12 @@ int GameBrowseMenu::MainLoop()
bgMusic->Pause(); bgMusic->Pause();
Settings.Save(); Settings.Save();
DeviceHandler::Instance()->MountSD(); DeviceHandler::Instance()->MountSD();
Settings.Load(); gprintf("\tLoading config...%s\n", Settings.Load() ? "done" : "failed");
gprintf("\tLoading language...%s\n", Settings.LoadLanguage(Settings.language_path, CONSOLE_DEFAULT) ? "done" : "failed");
gprintf("\tLoading game settings...%s\n", GameSettings.Load(Settings.ConfigPath) ? "done" : "failed");
gprintf("\tLoading game statistics...%s\n", GameStatistics.Load(Settings.ConfigPath) ? "done" : "failed");
gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.theme_path) ? "done" : "failed (using default)");
gprintf("\tLoading theme...%s\n", Theme::Load(Settings.theme) ? "done" : "failed (using default)");
bgMusic->Resume(); bgMusic->Resume();
wString oldFilter(gameList.GetCurrentFilter()); wString oldFilter(gameList.GetCurrentFilter());
gameList.FilterList(oldFilter.c_str()); gameList.FilterList(oldFilter.c_str());

View File

@ -112,9 +112,8 @@ void CSettings::SetDefault()
InstallPartitions = ONLY_GAME_PARTITION; InstallPartitions = ONLY_GAME_PARTITION;
beta_upgrades = 0; beta_upgrades = 0;
PlaylogUpdate = 1; PlaylogUpdate = 1;
UseIOS58 = 1;
widescreen = (CONF_GetAspectRatio() == CONF_ASPECT_16_9); widescreen = (CONF_GetAspectRatio() == CONF_ASPECT_16_9);
Theme::SetDefault(); //! We need to move this later
} }
bool CSettings::Load() bool CSettings::Load()
@ -252,6 +251,7 @@ bool CSettings::Save()
fprintf(file, "InstallPartitions = %08X\n ", InstallPartitions); fprintf(file, "InstallPartitions = %08X\n ", InstallPartitions);
fprintf(file, "beta_upgrades = %d\n ", beta_upgrades); fprintf(file, "beta_upgrades = %d\n ", beta_upgrades);
fprintf(file, "PlaylogUpdate = %d\n ", PlaylogUpdate); fprintf(file, "PlaylogUpdate = %d\n ", PlaylogUpdate);
fprintf(file, "UseIOS58 = %d\n ", UseIOS58);
fprintf(file, "returnTo = %s\n ", returnTo); fprintf(file, "returnTo = %s\n ", returnTo);
fclose(file); fclose(file);
@ -495,6 +495,11 @@ bool CSettings::SetSetting(char *name, char *value)
if (sscanf(value, "%d", &i) == 1) PlaylogUpdate = i; if (sscanf(value, "%d", &i) == 1) PlaylogUpdate = i;
return true; return true;
} }
else if (strcmp(name, "UseIOS58") == 0)
{
if (sscanf(value, "%d", &i) == 1) UseIOS58 = i;
return true;
}
else if (strcmp(name, "InstallPartitions") == 0) else if (strcmp(name, "InstallPartitions") == 0)
{ {
InstallPartitions = strtoul(value, 0, 16); InstallPartitions = strtoul(value, 0, 16);

View File

@ -111,6 +111,7 @@ class CSettings
short beta_upgrades; short beta_upgrades;
short PlaylogUpdate; short PlaylogUpdate;
short ShowFreeSpace; short ShowFreeSpace;
short UseIOS58;
char returnTo[20]; char returnTo[20];
protected: protected:
bool ValidVersion(FILE * file); bool ValidVersion(FILE * file);

View File

@ -111,6 +111,7 @@ LoaderSettings::LoaderSettings()
Options->SetName(Idx++, "%s", tr( "Game Language" )); Options->SetName(Idx++, "%s", tr( "Game Language" ));
Options->SetName(Idx++, "%s", tr( "Patch Country Strings" )); Options->SetName(Idx++, "%s", tr( "Patch Country Strings" ));
Options->SetName(Idx++, "%s", tr( "Ocarina" )); Options->SetName(Idx++, "%s", tr( "Ocarina" ));
Options->SetName(Idx++, "%s", tr( "Use IOS58" ));
Options->SetName(Idx++, "%s", tr( "Boot/Standard" )); Options->SetName(Idx++, "%s", tr( "Boot/Standard" ));
Options->SetName(Idx++, "%s", tr( "Partition" )); Options->SetName(Idx++, "%s", tr( "Partition" ));
Options->SetName(Idx++, "%s", tr( "Install directories" )); Options->SetName(Idx++, "%s", tr( "Install directories" ));
@ -158,6 +159,12 @@ void LoaderSettings::SetOptionValues()
//! Settings: Ocarina //! Settings: Ocarina
Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.ocarina] )); Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.ocarina] ));
//! Settings: Use IOS58
if (Settings.godmode)
Options->SetValue(Idx++, "%s", tr( OnOffText[Settings.UseIOS58] ));
else
Options->SetValue(Idx++, "********");
//! Settings: Boot/Standard //! Settings: Boot/Standard
if (Settings.godmode) if (Settings.godmode)
Options->SetValue(Idx++, "IOS %i", Settings.cios); Options->SetValue(Idx++, "IOS %i", Settings.cios);
@ -240,6 +247,15 @@ int LoaderSettings::GetMenuInternal()
if (++Settings.ocarina >= MAX_ON_OFF) Settings.ocarina = 0; if (++Settings.ocarina >= MAX_ON_OFF) Settings.ocarina = 0;
} }
//! Settings: Use IOS58
else if (ret == ++Idx)
{
if(!Settings.godmode)
return MENU_NONE;
if (++Settings.UseIOS58 >= MAX_ON_OFF) Settings.UseIOS58 = 0;
}
//! Settings: Boot/Standard //! Settings: Boot/Standard
else if (ret == ++Idx) else if (ret == ++Idx)
{ {

View File

@ -6,6 +6,7 @@
#include "Controls/DeviceHandler.hpp" #include "Controls/DeviceHandler.hpp"
#include "FileOperations/fileops.h" #include "FileOperations/fileops.h"
#include "settings/CSettings.h" #include "settings/CSettings.h"
#include "settings/GameTitles.h"
#include "settings/newtitles.h" #include "settings/newtitles.h"
#include "language/gettext.h" #include "language/gettext.h"
#include "network/networkops.h" #include "network/networkops.h"
@ -81,12 +82,12 @@ void AppCleanUp(void)
delete pointer[i]; delete pointer[i];
gettextCleanUp(); gettextCleanUp();
CloseXMLDatabase();
Theme::CleanUp(); Theme::CleanUp();
NewTitles::DestroyInstance(); NewTitles::DestroyInstance();
ThreadedTask::DestroyInstance(); ThreadedTask::DestroyInstance();
SoundHandler::DestroyInstance(); SoundHandler::DestroyInstance();
DeinitNetwork(); DeinitNetwork();
GameTitles.SetDefault();
ShutdownAudio(); ShutdownAudio();

View File

@ -91,7 +91,7 @@ s32 IosLoader::LoadGameCios(s32 ios)
// Unmount fat before reloading IOS. // Unmount fat before reloading IOS.
WBFS_Close(); WBFS_Close();
WDVD_Close(); WDVD_Close();
DeviceHandler::Instance()->UnMountAll(); DeviceHandler::DestroyInstance();
ret = ReloadIosSafe(ios); ret = ReloadIosSafe(ios);

View File

@ -4,6 +4,7 @@
#include <ogcsys.h> #include <ogcsys.h>
#include <errno.h> #include <errno.h>
#include "Controls/DeviceHandler.hpp"
#include "usbloader/sdhc.h" #include "usbloader/sdhc.h"
#include "usbloader/usbstorage2.h" #include "usbloader/usbstorage2.h"
#include "wbfs_rw.h" #include "wbfs_rw.h"
@ -31,23 +32,22 @@ void Wbfs::GetProgressValue(s32 * d, s32 * m)
s32 Wbfs::Init(u32 device) s32 Wbfs::Init(u32 device)
{ {
s32 ret; s32 ret;
const DISC_INTERFACE * handle = DeviceHandler::GetUSBInterface();
switch (device) switch (device)
{ {
case WBFS_DEVICE_USB: case WBFS_DEVICE_USB:
/* Initialize USB storage */ /* Initialize USB storage */
ret = USBStorage2_Init(); ret = handle->startup();
if (ret >= 0) if (ret)
{ {
currentHandle = handle;
/* Setup callbacks */ /* Setup callbacks */
readCallback = __ReadUSB; readCallback = __ReadUSB;
writeCallback = __WriteUSB; writeCallback = __WriteUSB;
/* Device info */
/* Get USB capacity */
nb_sectors = USBStorage2_GetCapacity(&sector_size);
if (!nb_sectors) return -1;
} }
else return ret; else
return -1;
break; break;
case WBFS_DEVICE_SDHC: case WBFS_DEVICE_SDHC:
/* Initialize SDHC */ /* Initialize SDHC */

View File

@ -13,6 +13,7 @@
u32 sector_size = 512; u32 sector_size = 512;
rw_sector_callback_t readCallback = NULL; rw_sector_callback_t readCallback = NULL;
rw_sector_callback_t writeCallback = NULL; rw_sector_callback_t writeCallback = NULL;
const DISC_INTERFACE * currentHandle = NULL;
void SetSectorSize(u32 size) void SetSectorSize(u32 size)
{ {
@ -82,8 +83,8 @@ s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf)
if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS;
/* USB read */ /* USB read */
ret = USBStorage2_ReadSectors(lba + cnt, sectors, ptr); ret = currentHandle->readSectors(lba + cnt, sectors, ptr);
if (ret < 0) return ret; if (!ret) return -1;
/* Increment counter */ /* Increment counter */
cnt += sectors; cnt += sectors;
@ -107,8 +108,8 @@ s32 __WriteUSB(void *fp, u32 lba, u32 count, void *iobuf)
if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS; if (sectors > MAX_NB_SECTORS) sectors = MAX_NB_SECTORS;
/* USB write */ /* USB write */
ret = USBStorage2_WriteSectors(lba + cnt, sectors, ptr); ret = currentHandle->writeSectors(lba + cnt, sectors, ptr);
if (ret < 0) return ret; if (!ret) return -1;
/* Increment counter */ /* Increment counter */
cnt += sectors; cnt += sectors;

View File

@ -11,6 +11,7 @@ extern "C"
extern u32 sector_size; extern u32 sector_size;
extern rw_sector_callback_t readCallback; extern rw_sector_callback_t readCallback;
extern rw_sector_callback_t writeCallback; extern rw_sector_callback_t writeCallback;
extern const DISC_INTERFACE * currentHandle;
s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf); s32 __ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf); s32 __ReadUSB(void *fp, u32 lba, u32 count, void *iobuf);