* Fixed routine for slow USB devices.

* Minor refactoring of Ios loading algorithm.
This commit is contained in:
eraserxl 2010-09-23 23:47:51 +00:00
parent 4eab0cb29f
commit 05825a3231
10 changed files with 196 additions and 345 deletions

View File

@ -2,8 +2,8 @@
<app version="1">
<name> USB Loader GX</name>
<coder>USB Loader GX Team</coder>
<version>1.0 r960</version>
<release_date>201009211724</release_date>
<version>1.0 r961</version>
<release_date>201009222057</release_date>
<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.
The interactive GUI is completely controllable with WiiMote, Classic Controller or GC Controller.

View File

@ -21,6 +21,7 @@ SOURCES := source \
source/images \
source/fonts \
source/sounds \
source/system \
source/libwbfs \
source/unzip \
source/language \

View File

@ -19,10 +19,9 @@
//#include <debug.h>
extern "C"
{
extern void __exception_setreload( int t );
extern void __exception_setreload(int t);
}
#include <di/di.h>
#include <sys/iosupport.h>
@ -53,6 +52,7 @@ extern "C"
#include "lstub.h"
#include "usbloader/usbstorage2.h"
#include "wad/nandtitle.h"
#include "system/IosLoader.h"
extern bool geckoinit;
extern char headlessID[8];
@ -61,101 +61,98 @@ char bootDevice[10];
NandTitle titles;
PartList partitions;
int main( int argc, char *argv[] )
int main(int argc, char *argv[])
{
MEM2_init( 48 );
setlocale( LC_ALL, "en.UTF-8" );
MEM2_init(48);
setlocale(LC_ALL, "en.UTF-8");
geckoinit = InitGecko();
InitVideo();
__exception_setreload( 20 );
__exception_setreload(20);
printf( "\tStarting up\n" );
printf("\tStarting up\n");
titles.Get();
bool bootDevice_found = false;
if ( argc >= 1 )
if (argc >= 1)
{
if ( !strncasecmp( argv[0], "usb:/", 5 ) )
if (!strncasecmp(argv[0], "usb:/", 5))
{
strcpy( bootDevice, "USB:" );
strcpy(bootDevice, "USB:");
bootDevice_found = true;
}
else if ( !strncasecmp( argv[0], "sd:/", 4 ) )
bootDevice_found = true;
else if (!strncasecmp(argv[0], "sd:/", 4)) bootDevice_found = true;
}
//Let's use libogc sd/usb for config loading
printf( "\tInitialize sd card\n" );
printf("\tInitialize sd card\n");
SDCard_Init();
printf( "\tInitialize usb device\n" );
printf("\tInitialize usb device\n");
USBDevice_Init();
if ( !bootDevice_found )
if (!bootDevice_found)
{
printf( "\tSearch for configuration file\n" );
printf("\tSearch for configuration file\n");
//try USB
//left in all the dol and elf files in this check in case this is the first time running the app and they dont have the config
if ( checkfile( ( char* ) "USB:/config/GXglobal.cfg" ) || ( checkfile( ( char* ) "USB:/apps/usbloader_gx/boot.elf" ) )
|| checkfile( ( char* ) "USB:/apps/usbloadergx/boot.dol" ) || ( checkfile( ( char* ) "USB:/apps/usbloadergx/boot.elf" ) )
|| checkfile( ( char* ) "USB:/apps/usbloader_gx/boot.dol" ) )
strcpy( bootDevice, "USB:" );
if (checkfile((char*) "USB:/config/GXglobal.cfg") || (checkfile((char*) "USB:/apps/usbloader_gx/boot.elf"))
|| checkfile((char*) "USB:/apps/usbloadergx/boot.dol") || (checkfile(
(char*) "USB:/apps/usbloadergx/boot.elf")) || checkfile((char*) "USB:/apps/usbloader_gx/boot.dol")) strcpy(
bootDevice, "USB:");
printf( "\tConfiguration file is on %s\n", bootDevice );
printf("\tConfiguration file is on %s\n", bootDevice);
}
gettextCleanUp();
printf( "\tLoading configuration..." );
printf("\tLoading configuration...");
Settings.Load();
VIDEO_SetWidescreen(Settings.widescreen);
printf( "done\n" );
SDCard_deInit();// unmount SD for reloading IOS
USBDevice_deInit();// unmount USB for reloading IOS
USBStorage2_Deinit();
printf( "\tCheck for an existing cIOS\n" );
CheckForCIOS();
printf("done\n");
// Let's load the cIOS now
if ( LoadAppCIOS() < 0 )
IosLoader loader(titles);
if (loader.LoadAppCios() < 0)
{
printf( "\tERROR: No cIOS could be loaded. Exiting....\n" );
sleep( 5 );
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();
}
printf("\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision());
printf( "\tLoaded cIOS = %u (Rev %u)\n", IOS_GetVersion(), IOS_GetRevision() );
printf( "\tWaiting for USB:\n" );
if ( MountWBFS() < 0 )
printf("\tWaiting for USB:\n");
if (MountWBFS() < 0)
{
printf( "ERROR: No WBFS drive mounted.\n" );
sleep( 5 );
exit( 0 );
printf("ERROR: No WBFS drive mounted.\n");
sleep(5);
exit(0);
}
//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 ( argc > 1 && argv[1] )
if (argc > 1 && argv[1])
{
if ( strlen( argv[1] ) == 6 )
strncpy( headlessID, argv[1], sizeof( headlessID ) );
if (strlen(argv[1]) == 6) strncpy(headlessID, argv[1], sizeof(headlessID));
}
//! Init the rest of the System
Sys_Init();
SetupPads();
InitAudio();
char *fontPath = NULL;
asprintf( &fontPath, "%sfont.ttf", Settings.theme_path );
SetupDefaultFont( fontPath );
free( fontPath );
asprintf(&fontPath, "%sfont.ttf", Settings.theme_path);
SetupDefaultFont(fontPath);
free(fontPath);
gprintf( "\n\tEnd of Main()" );
gprintf("\n\tEnd of Main()");
InitGUIThreads();
MainMenu( MENU_CHECK );
MainMenu(MENU_CHECK);
return 0;
}

View File

@ -458,24 +458,7 @@ int MainMenu( int menu )
reloadblock = off;
returnToLoaderGV = 1;
}
int ios2;
// When the selected ios is 249, and you're loading from FAT, reset ios to 222
if ( load_from_fs != PART_FS_WBFS && ios2 == 249 )
{
ios2 = 222;
}
bool onlinefix = ShutdownWC24();
// You cannot reload ios when loading from fat
if ( IOS_GetVersion() != ios2 || onlinefix )
{
ret = Sys_ChangeIos( ios2 );
if ( ret < 0 )
{
Sys_ChangeIos( 249 );
}
}
if ( !mountMethod )
{
gprintf( "Loading fragment list..." );

View File

@ -1,22 +1,14 @@
#include <stdio.h>
#include <ogcsys.h>
#include <unistd.h>
#include <gctypes.h>
#include <ogc/system.h>
#include <wiiuse/wpad.h>
#include "usbloader/wdvd.h"
#include "usbloader/usbstorage2.h"
#include "usbloader/disc.h"
#include "usbloader/wbfs.h"
#include "usbloader/partition_usbloader.h"
#include "mload/mload_modules.h"
#include "video.h"
#include "mload/mload.h"
#include "settings/CSettings.h"
#include "audio.h"
#include "menu.h"
#include "fatmounter.h"
#include "gecko.h"
#include "sys.h"
#include "wpad.h"
#include "lstub.h"
#include "wad/nandtitle.h"
#include "menu.h"
#include "video.h"
extern char game_partition[6];
extern u8 load_from_fs;
@ -76,105 +68,6 @@ void Sys_Reboot( void )
STM_RebootSystem();
}
int Sys_ChangeIos( int ios )
{
s32 prevIos = IOS_GetVersion();
SDCard_deInit();
USBDevice_deInit();
WPAD_Flush( 0 );
WPAD_Disconnect( 0 );
WPAD_Shutdown();
WDVD_Close();
USBStorage2_Deinit();
s32 ret = IOS_ReloadIOSsafe( ios );
if ( ret < 0 )
{
ios = prevIos;
}
SDCard_Init();
if ( ios == 222 || ios == 223 )
{
load_ehc_module();
}
USBDevice_Init();
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat( WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR );
WPAD_SetVRes( WPAD_CHAN_ALL, screenwidth, screenheight );
WBFS_Init( WBFS_DEVICE_USB );
Disc_Init();
if ( Sys_IsHermes() )
{
WBFS_OpenNamed( ( char * ) &game_partition );
}
else
{
WBFS_Open();
}
return ret;
}
int Sys_IosReload( int IOS )
{
s32 ret = -1;
//shutdown SD and USB before IOS Reload in DiscWait
SDCard_deInit();
USBDevice_deInit();
WPAD_Flush( 0 );
WPAD_Disconnect( 0 );
WPAD_Shutdown();
WDVD_Close();
USBStorage2_Deinit();
if ( IOS == 249 || IOS == 222 || IOS == 223 )
{
for ( int i = 0; i < 10; i++ )
{
ret = IOS_ReloadIOSsafe( IOS );
if ( ret < 0 ) return ret;
if ( IOS == 222 || IOS == 223 ) load_ehc_module();
ret = WBFS_Init( WBFS_DEVICE_USB );
if ( !( ret < 0 ) ) break;
sleep( 1 );
USBStorage2_Deinit();
}
if ( ret >= 0 )
{
ret = Disc_Init();
if ( ret >= 0 )
{
ret = WBFS_Open();
}
}
else Sys_BackToLoader();
}
PAD_Init();
Wpad_Init();
WPAD_SetDataFormat( WPAD_CHAN_ALL, WPAD_FMT_BTNS_ACC_IR );
WPAD_SetVRes( WPAD_CHAN_ALL, screenwidth, screenheight );
//reinitialize SD and USB
SDCard_Init();
USBDevice_Init();
return ret;
}
#define ShutdownToDefault 0
#define ShutdownToIdle 1
#define ShutdownToStandby 2
@ -205,10 +98,12 @@ static void _Sys_Shutdown( int SHUTDOWN_MODE )
STM_ShutdownToStandby();
}
}
void Sys_Shutdown( void )
{
_Sys_Shutdown( ShutdownToDefault );
}
void Sys_ShutdownToIdel( void )
{
_Sys_Shutdown( ShutdownToIdle );
@ -242,151 +137,6 @@ bool Sys_IsHermes()
return IOS_GetVersion() == 222 || IOS_GetVersion() == 223;
}
#include "prompts/PromptWindows.h"
void ShowMemInfo()
{
char buf[255];
struct mallinfo mymallinfo = mallinfo();
sprintf( ( char * ) &buf, "Total: %d, Used: %d, Can be freed: %d", mymallinfo.arena / 1024, mymallinfo.uordblks / 1024, mymallinfo.keepcost / 1024 );
WindowPrompt( "Mem info", ( char * ) &buf, "OK" );
}
s32 IOS_ReloadIOSsafe( int ios )
{
if ( ios == 222 )
{
s32 ios222rev = titles.VersionOf( 0x1000000deULL );
if ( !ios222rev )
return -2;
if ( ios222rev != 4 && ios222rev != 5 && ios222rev != 65535 )
return -2;
}
else if ( ios == 223 )
{
s32 ios223rev = titles.VersionOf( 0x1000000dfULL );
if ( !ios223rev )
return -2;
if ( ios223rev != 4 && ios223rev != 5 && ios223rev != 65535 )
return -2;
}
else if ( ios == 249 )
{
s32 ios249rev = titles.VersionOf( 0x1000000f9ULL );
if ( !ios249rev )
return -2;
if ( ios249rev < 9 || ios249rev == 65280 )
return -2;
}
else if ( ios == 250 )
{
s32 ios250rev = titles.VersionOf( 0x1000000faULL );
if ( !ios250rev )
return -2;
if ( ios250rev < 9 || ios250rev == 65280 )
return -2;
}
s32 r = IOS_ReloadIOS( ios );
if ( r >= 0 )
{
WII_Initialize();
}
return r;
}
s32 CheckForCIOS()
{
gprintf( "\tChecking for stub IOS\n" );
s32 ret = 1;
s32 ios222rev = titles.VersionOf( 0x00000001000000deULL );
s32 ios249rev = titles.VersionOf( 0x00000001000000f9ULL );
u8 ios222OK = !( ios222rev < 4 || ios222rev == 65280 );
u8 ios249OK = !( ios249rev < 9 || ios249rev == 65280 );
gprintf( "222ok: %u\t 249ok: %u\n", ios222OK, ios249OK );
return 1;
//if we don't like either of the cIOS then scram
//if( !((ios222rev >= 4 && ios222rev < 65280) || (ios249rev >=9 && ios249rev < 65280)))
if ( ios222rev < 4 || ios222rev == 65280 || ios249rev < 9 || ios249rev == 65280 )
{
printf( "\x1b[2J" );
if ( ( ios222rev < 0 && ios222rev != WII_EINSTALL ) && ( ios249rev < 0 && ios249rev != WII_EINSTALL ) )
{
printf( "\n\n\n\tWARNING!" );
printf( "\n\tUSB Loader GX needs unstubbed cIOS 222 v4 or 249 v9+" );
printf( "\n\n\tWe cannot determine the versions on your system,\n\tsince you have no patched ios 36 or 236 installed." );
printf( "\n\tTherefor, if loading of USB Loader GX fails, you\n\tprobably have installed the 4.2 update," );
printf( "\n\tand you should go figure out how to get some cios action going on\n\tin your Wii." );
printf( "\n\n\tThis message will show every time." );
sleep( 5 );
}
else
{
printf( "\n\n\n\tERROR!" );
printf( "\n\tUSB Loader GX needs unstubbed cIOS 222 v4 or 249 v9+" );
printf( "\n\n\tI found \n\t\t222 = %d%s", ios222rev, ios222rev == 65280 ? " (Stubbed by 4.2 update)" : "" );
printf( "\n\t\t249 = %d%s", ios249rev, ios249rev == 65280 ? " (Stubbed by 4.2 update)" : "" );
printf( "\n\n\tGo figure out how to get some cIOS action going on\n\tin your Wii and come back and see me." );
sleep( 15 );
printf( "\n\n\tBye" );
USBDevice_deInit();
exit( 0 );
}
}
return ret;
}
int LoadAppCIOS()
{
s32 ret = 1;
/* Load Custom IOS */
SDCard_deInit();// unmount SD for reloading IOS
USBDevice_deInit();// unmount USB for reloading IOS
USBStorage2_Deinit();
if ( Settings.cios == 222 && IOS_GetVersion() != 222 )
{
printf( "\n\tReloading IOS to config setting (222)..." );
ret = IOS_ReloadIOSsafe( 222 );
printf( "%d", ret );
if ( ret < 0 )
{
Settings.cios = 249;
IOS_ReloadIOSsafe( Settings.cios );
}
}
if ( ( Settings.cios == 249 && IOS_GetVersion() != 249 )
|| ( Settings.cios == 250 && IOS_GetVersion() != 250 ) )
{
printf( "\n\tReloading IOS to config setting (%d)...", ( Settings.cios == 249 ) ? 249 : 250 );
ret = IOS_ReloadIOSsafe( ( Settings.cios == 249 ) ? 249 : 250 );
printf( "%d", ret );
if ( ret < 0 )
{
Settings.cios = 222;
ret = IOS_ReloadIOSsafe( Settings.cios );
}
}
SDCard_Init();
if ( IOS_GetVersion() == 222 )
load_ehc_module();
USBDevice_Init();
return ret;
}
#include <time.h>
void ScreenShot()
{
time_t rawtime;

View File

@ -11,19 +11,7 @@ void Sys_ShutdownToIdel( void );
void Sys_ShutdownToStandby( void );
void Sys_LoadMenu( void );
void Sys_BackToLoader( void );
int Sys_ChangeIos( int ios );
int Sys_IosReload( int IOS );
bool Sys_IsHermes();
s32 IOS_ReloadIOSsafe( int ios );
void ScreenShot();
s32 CheckForCIOS();
int LoadAppCIOS();
void ShowMemInfo();
extern s32 ios222rev;
extern s32 ios223rev;
extern s32 ios249rev;
extern s32 ios250rev;
#endif

115
source/system/IosLoader.cpp Normal file
View File

@ -0,0 +1,115 @@
#include <gctypes.h>
#include "IosLoader.h"
#include "../fatmounter.h"
#include "../usbloader/usbstorage2.h"
#include "../wad/nandtitle.h"
#include "../mload/mload_modules.h"
#include "../settings/CSettings.h"
/******************************************************************************
* Construction/Destruction:
******************************************************************************/
/* Initializes a new instance of the IosLoader class. */
IosLoader::IosLoader(NandTitle titles)
{
nandTitles = titles;
}
/* Finalizes an instance of the IosLoader class. */
IosLoader::~IosLoader()
{
}
/******************************************************************************
* Public Methods:
******************************************************************************/
/*
* Loads CIOS (If possible the one from the settings file).
* @return 0 if a cios has been successfully loaded. Else a value below 0 is returned.
*/
s32 IosLoader::LoadAppCios()
{
s32 ret = -1;
// Unmount devices before reloading IOS.
SDCard_deInit();
USBDevice_deInit();
USBStorage2_Deinit();
u32 ciosLoadPriority[] = { 250, 249, 222, Settings.cios }; // Descending.
u32 activeCios = IOS_GetVersion();
for (u8 i=(sizeof(ciosLoadPriority)/sizeof(ciosLoadPriority[0])); i>=0; i--)
{
u32 cios = ciosLoadPriority[i];
if (activeCios == cios)
{
ret = 0;
break;
}
if ((ret = ReloadIosSafe(cios)) > -1)
{
// Remember working cios.
Settings.cios = cios;
break;
}
}
// Remount devices after reloading IOS.
SDCard_Init();
if (IOS_GetVersion() == 222) load_ehc_module();
USBDevice_Init();
return ret;
}
/******************************************************************************
* Private/Protected Methods:
******************************************************************************/
/*
* Reloads a certain IOS under the condition, that an appropriate version of the IOS is installed.
* @return a negative value if a safe reload of the ios was not possible.
*/
s32 IosLoader::ReloadIosSafe(s32 ios)
{
switch (ios)
{
case 222:
{
s32 ios222rev = nandTitles.VersionOf(0x1000000deULL);
if (ios222rev == 4 || ios222rev == 5 || ios222rev == 65535) break;
return -2;
}
case 223:
{
s32 ios223rev = nandTitles.VersionOf(0x1000000dfULL);
if (ios223rev == 4 || ios223rev == 5 || ios223rev == 65535) break;
return -2;
}
case 249:
{
s32 ios249rev = nandTitles.VersionOf(0x1000000f9ULL);
if (ios249rev < 9 || ios249rev == 65280) return -2;
break;
}
case 250:
{
s32 ios250rev = nandTitles.VersionOf(0x1000000faULL);
if (ios250rev < 9 || ios250rev == 65280) return -2;
break;
}
default:
return -3;
}
s32 r = IOS_ReloadIOS(ios);
if (r >= 0) WII_Initialize();
return r;
}

19
source/system/IosLoader.h Normal file
View File

@ -0,0 +1,19 @@
#ifndef _IOSLOADER_H_
#define _IOSLOADER_H_
#include <gctypes.h>
#include "../wad/nandtitle.h"
class IosLoader
{
public:
IosLoader(NandTitle titles);
~IosLoader();
s32 CheckForCios();
s32 LoadAppCios();
private:
NandTitle nandTitles;
s32 ReloadIosSafe(s32 ios);
};
#endif

View File

@ -311,8 +311,9 @@ int MountWBFS()
int ret = -1;
time_t currTime = time( 0 );
while ( time( 0 ) - currTime < 15 )
while ( time( 0 ) - currTime < 30 )
{
USBDevice_deInit();
USBStorage2_Deinit();
USBDevice_Init();

View File

@ -34,8 +34,6 @@ using namespace std;
#define RF_NEWS_CHANNEL 0x48414741
#define RF_FORECAST_CHANNEL 0x48414641
typedef struct
{
u8 zeroes1[0x40];
@ -58,7 +56,6 @@ typedef struct
u8 md5[0x10];
} IMET;
class NandTitle
{
public: