usbloadergx/source/sys.cpp
giantpune 55a401e4a5 lots of changes here
changed gprintf() to use crediar's method because it is smaller and works just the same.

allow r-win's debug printf() stuff to be sent to the gecko to reduce redundant stuff there 

issue 1073.  headless mode - allow game to be booted via argv[1].

took out all the params from the exitprompt since they aren't used.

took out all the #ifdef stuff for building for a wii.  obviously this wont run on a gamecube so it isn't needed.

added a way to check what version of a IOS is installed before trying to boot into it.  added IOS_ReloadIOSsafe(). this should stop idiots with the 4.2 stubs from bitching about why stuff doesn't work.

use that check so you only see the "222v4 is needed" prompt in the settings if you don't already have that installed.

fix issue 1039. (must still be compiled without NO_DEBUG defined because technically WiiRD is a debugger)
2009-12-03 01:06:09 +00:00

239 lines
4.7 KiB
C++

#include <stdio.h>
#include <ogcsys.h>
#include <unistd.h>
#include "usbloader/wdvd.h"
#include "usbloader/usbstorage.h"
#include "usbloader/disc.h"
#include "usbloader/wbfs.h"
#include "mload/mload.h"
#include "video.h"
#include "audio.h"
#include "menu.h"
#include "fatmounter.h"
#include "sys.h"
#include "wpad.h"
extern char game_partition[6];
extern bool load_from_fat;
//Wiilight stuff
static vu32 *_wiilight_reg = (u32*)0xCD0000C0;
void wiilight(int enable) { // Toggle wiilight (thanks Bool for wiilight source)
u32 val = (*_wiilight_reg&~0x20);
if (enable && Settings.wiilight) val |= 0x20;
*_wiilight_reg=val;
}
/* Variables */
u8 shutdown = 0;
u8 reset = 0;
void __Sys_ResetCallback(void) {
/* Reboot console */
reset = 1;
}
void __Sys_PowerCallback(void) {
/* Poweroff console */
shutdown = 1;
}
void Sys_Init(void) {
/* Initialize video subsytem */
//VIDEO_Init();
/* Set RESET/POWER button callback */
SYS_SetResetCallback(__Sys_ResetCallback);
SYS_SetPowerCallback(__Sys_PowerCallback);
}
static void _ExitApp() {
ExitGUIThreads();
StopGX();
ShutdownAudio();
SDCard_deInit();
USBDevice_deInit();
mload_set_ES_ioctlv_vector(NULL);
mload_close();
}
void Sys_Reboot(void) {
/* Restart console */
_ExitApp();
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();
USBStorage_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 (load_from_fat && (ios == 222 || ios == 223)) {
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();
USBStorage_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);
USBStorage_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
static void _Sys_Shutdown(int SHUTDOWN_MODE) {
_ExitApp();
WPAD_Flush(0);
WPAD_Disconnect(0);
WPAD_Shutdown();
/* Poweroff console */
if ((CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE && SHUTDOWN_MODE != ShutdownToStandby) || SHUTDOWN_MODE == ShutdownToIdle) {
s32 ret;
/* Set LED mode */
ret = CONF_GetIdleLedMode();
if (ret >= 0 && ret <= 2)
STM_SetLedMode(ret);
/* Shutdown to idle */
STM_ShutdownToIdle();
} else {
/* Shutdown to standby */
STM_ShutdownToStandby();
}
}
void Sys_Shutdown(void) {
_Sys_Shutdown(ShutdownToDefault);
}
void Sys_ShutdownToIdel(void) {
_Sys_Shutdown(ShutdownToIdle);
}
void Sys_ShutdownToStandby(void) {
_Sys_Shutdown(ShutdownToStandby);
}
void Sys_LoadMenu(void) {
_ExitApp();
/* Return to the Wii system menu */
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
}
void Sys_BackToLoader(void) {
if (*((u32*) 0x80001800)) {
_ExitApp();
exit(0);
}
// Channel Version
Sys_LoadMenu();
}
bool Sys_IsHermes() {
return IOS_GetVersion() == 222 || IOS_GetVersion() == 223;
}
#include "wad/title.h"
s32 ios222rev = -69;
s32 ios249rev = -69;
s32 IOS_ReloadIOSsafe(int ios)
{
if (ios==222)
{
if (ios222rev == -69)
ios222rev = getIOSrev(0x00000001000000dell);
if (ios222rev != 4)return -2;
}
else if (ios==249)
{
if (ios249rev == -69)
ios249rev = getIOSrev(0x00000001000000f9ll);
if (!(ios249rev>=9 && ios249rev<65535))return -2;
}
return IOS_ReloadIOS(ios);
}