mirror of
https://github.com/wiidev/usbloadergx.git
synced 2024-11-22 11:19:17 +01:00
Fix some hangs during boot & Wiimote sync issues
This commit is contained in:
parent
4b2372e150
commit
e25c4e7bd8
@ -34,24 +34,24 @@ StartUpProcess::StartUpProcess()
|
|||||||
//! Load default font for the next text outputs
|
//! Load default font for the next text outputs
|
||||||
Theme::LoadFont("");
|
Theme::LoadFont("");
|
||||||
|
|
||||||
background = new GuiImage(screenwidth, screenheight, (GXColor) {0, 0, 0, 255});
|
background = new GuiImage(screenwidth, screenheight, (GXColor){0, 0, 0, 255});
|
||||||
|
|
||||||
GXImageData = Resources::GetImageData("gxlogo.png");
|
GXImageData = Resources::GetImageData("gxlogo.png");
|
||||||
GXImage = new GuiImage(GXImageData);
|
GXImage = new GuiImage(GXImageData);
|
||||||
GXImage->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
GXImage->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
||||||
GXImage->SetPosition(screenwidth/2, screenheight/2-50);
|
GXImage->SetPosition(screenwidth / 2, screenheight / 2 - 50);
|
||||||
|
|
||||||
titleTxt = new GuiText("Loading...", 24, (GXColor) {255, 255, 255, 255});
|
titleTxt = new GuiText("Loading...", 24, (GXColor){255, 255, 255, 255});
|
||||||
titleTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
titleTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
||||||
titleTxt->SetPosition(screenwidth/2, screenheight/2+30);
|
titleTxt->SetPosition(screenwidth / 2, screenheight / 2 + 30);
|
||||||
|
|
||||||
messageTxt = new GuiText(" ", 22, (GXColor) {255, 255, 255, 255});
|
messageTxt = new GuiText(" ", 22, (GXColor){255, 255, 255, 255});
|
||||||
messageTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
messageTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
||||||
messageTxt->SetPosition(screenwidth/2, screenheight/2+60);
|
messageTxt->SetPosition(screenwidth / 2, screenheight / 2 + 60);
|
||||||
|
|
||||||
versionTxt = new GuiText(" ", 18, (GXColor) {255, 255, 255, 255});
|
versionTxt = new GuiText(" ", 18, (GXColor){255, 255, 255, 255});
|
||||||
versionTxt->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
versionTxt->SetAlignment(ALIGN_LEFT, ALIGN_BOTTOM);
|
||||||
versionTxt->SetPosition(20, screenheight-20);
|
versionTxt->SetPosition(20, screenheight - 20);
|
||||||
|
|
||||||
#ifdef FULLCHANNEL
|
#ifdef FULLCHANNEL
|
||||||
versionTxt->SetTextf("v3.0c Rev. %s (%s)", GetRev(), commitID());
|
versionTxt->SetTextf("v3.0c Rev. %s (%s)", GetRev(), commitID());
|
||||||
@ -63,9 +63,9 @@ StartUpProcess::StartUpProcess()
|
|||||||
versionTxt->SetTextf("v3.0 Rev. %s mod (%s)", GetRev(), commitID());
|
versionTxt->SetTextf("v3.0 Rev. %s mod (%s)", GetRev(), commitID());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cancelTxt = new GuiText("Press B to cancel", 18, (GXColor) {255, 255, 255, 255});
|
cancelTxt = new GuiText("Press B to cancel", 18, (GXColor){255, 255, 255, 255});
|
||||||
cancelTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
cancelTxt->SetAlignment(ALIGN_CENTER, ALIGN_MIDDLE);
|
||||||
cancelTxt->SetPosition(screenwidth/2, screenheight/2+90);
|
cancelTxt->SetPosition(screenwidth / 2, screenheight / 2 + 90);
|
||||||
|
|
||||||
trigB = new GuiTrigger;
|
trigB = new GuiTrigger;
|
||||||
trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
trigB->SetButtonOnlyTrigger(-1, WPAD_BUTTON_B | WPAD_CLASSIC_BUTTON_B, PAD_BUTTON_B);
|
||||||
@ -94,35 +94,37 @@ int StartUpProcess::ParseArguments(int argc, char *argv[])
|
|||||||
int quickBoot = -1;
|
int quickBoot = -1;
|
||||||
|
|
||||||
//! The arguments override
|
//! The arguments override
|
||||||
for(int i = 0; i < argc; ++i)
|
for (int i = 0; i < argc; ++i)
|
||||||
{
|
{
|
||||||
if(!argv[i]) continue;
|
if (!argv[i])
|
||||||
|
continue;
|
||||||
|
|
||||||
gprintf("Boot argument %i: %s\n", i+1, argv[i]);
|
gprintf("Boot argument %i: %s\n", i + 1, argv[i]);
|
||||||
|
|
||||||
char *ptr = strcasestr(argv[i], "-ios=");
|
char *ptr = strcasestr(argv[i], "-bootios=");
|
||||||
if(ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
if(atoi(ptr+strlen("-ios=")) == 58)
|
if (atoi(ptr + strlen("-bootios=")) == 58)
|
||||||
Settings.LoaderIOS = 58;
|
Settings.LoaderIOS = 58;
|
||||||
else
|
else
|
||||||
Settings.LoaderIOS = LIMIT(atoi(ptr+strlen("-ios=")), 200, 255);
|
Settings.LoaderIOS = LIMIT(atoi(ptr + strlen("-bootios=")), 200, 255);
|
||||||
Settings.UseArgumentIOS = ON;
|
Settings.UseArgumentIOS = ON;
|
||||||
|
Settings.BootIOS = Settings.LoaderIOS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = strcasestr(argv[i], "-usbport=");
|
ptr = strcasestr(argv[i], "-usbport=");
|
||||||
if(ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
Settings.USBPort = LIMIT(atoi(ptr+strlen("-usbport=")), 0, 2);
|
Settings.USBPort = LIMIT(atoi(ptr + strlen("-usbport=")), 0, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = strcasestr(argv[i], "-mountusb=");
|
ptr = strcasestr(argv[i], "-mountusb=");
|
||||||
if(ptr)
|
if (ptr)
|
||||||
{
|
{
|
||||||
Settings.USBAutoMount = LIMIT(atoi(ptr+strlen("-mountusb=")), 0, 1);
|
Settings.USBAutoMount = LIMIT(atoi(ptr + strlen("-mountusb=")), 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(strlen(argv[i]) == 6 && strchr(argv[i], '=') == 0 && strchr(argv[i], '-') == 0)
|
if (strlen(argv[i]) == 6 && strchr(argv[i], '=') == 0 && strchr(argv[i], '-') == 0)
|
||||||
quickBoot = i;
|
quickBoot = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,9 +133,9 @@ int StartUpProcess::ParseArguments(int argc, char *argv[])
|
|||||||
|
|
||||||
void StartUpProcess::TextFade(int direction)
|
void StartUpProcess::TextFade(int direction)
|
||||||
{
|
{
|
||||||
if(direction > 0)
|
if (direction > 0)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < 255; i += direction)
|
for (int i = 0; i < 255; i += direction)
|
||||||
{
|
{
|
||||||
messageTxt->SetAlpha(i);
|
messageTxt->SetAlpha(i);
|
||||||
Draw();
|
Draw();
|
||||||
@ -141,9 +143,9 @@ void StartUpProcess::TextFade(int direction)
|
|||||||
messageTxt->SetAlpha(255);
|
messageTxt->SetAlpha(255);
|
||||||
Draw();
|
Draw();
|
||||||
}
|
}
|
||||||
else if(direction < 0)
|
else if (direction < 0)
|
||||||
{
|
{
|
||||||
for(int i = 255; i > 0; i += direction)
|
for (int i = 255; i > 0; i += direction)
|
||||||
{
|
{
|
||||||
messageTxt->SetAlpha(i);
|
messageTxt->SetAlpha(i);
|
||||||
Draw();
|
Draw();
|
||||||
@ -153,12 +155,12 @@ void StartUpProcess::TextFade(int direction)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartUpProcess::SetTextf(const char * format, ...)
|
void StartUpProcess::SetTextf(const char *format, ...)
|
||||||
{
|
{
|
||||||
char * tmp = NULL;
|
char *tmp = NULL;
|
||||||
va_list va;
|
va_list va;
|
||||||
va_start(va, format);
|
va_start(va, format);
|
||||||
if((vasprintf(&tmp, format, va) >= 0) && tmp)
|
if ((vasprintf(&tmp, format, va) >= 0) && tmp)
|
||||||
{
|
{
|
||||||
TextFade(-40);
|
TextFade(-40);
|
||||||
gprintf(tmp);
|
gprintf(tmp);
|
||||||
@ -167,7 +169,7 @@ void StartUpProcess::SetTextf(const char * format, ...)
|
|||||||
}
|
}
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
|
||||||
if(tmp)
|
if (tmp)
|
||||||
free(tmp);
|
free(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,40 +180,36 @@ bool StartUpProcess::USBSpinUp()
|
|||||||
bool started0 = false;
|
bool started0 = false;
|
||||||
bool started1 = false;
|
bool started1 = false;
|
||||||
|
|
||||||
const DISC_INTERFACE * handle0 = NULL;
|
const DISC_INTERFACE *handle0 = NULL;
|
||||||
const DISC_INTERFACE * handle1 = NULL;
|
const DISC_INTERFACE *handle1 = NULL;
|
||||||
if(Settings.USBPort == 0 || Settings.USBPort == 2)
|
if (Settings.USBPort == 0 || Settings.USBPort == 2)
|
||||||
handle0 = DeviceHandler::GetUSB0Interface();
|
handle0 = DeviceHandler::GetUSB0Interface();
|
||||||
if(Settings.USBPort == 1 || Settings.USBPort == 2)
|
if (Settings.USBPort == 1 || Settings.USBPort == 2)
|
||||||
handle1 = DeviceHandler::GetUSB1Interface();
|
handle1 = DeviceHandler::GetUSB1Interface();
|
||||||
|
|
||||||
// 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
|
||||||
{
|
{
|
||||||
if(handle0)
|
if (handle0)
|
||||||
started0 = (handle0->startup() && handle0->isInserted());
|
started0 = (handle0->startup() && handle0->isInserted());
|
||||||
|
|
||||||
if(handle1)
|
if (handle1)
|
||||||
started1 = (handle1->startup() && handle1->isInserted());
|
started1 = (handle1->startup() && handle1->isInserted());
|
||||||
|
|
||||||
if( (!handle0 || started0)
|
if ((!handle0 || started0) && (!handle1 || started1))
|
||||||
&& (!handle1 || started1)) {
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
UpdatePads();
|
UpdatePads();
|
||||||
for(int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
cancelBtn->Update(&userInput[i]);
|
cancelBtn->Update(&userInput[i]);
|
||||||
|
|
||||||
if(cancelBtn->GetState() == STATE_CLICKED)
|
if (cancelBtn->GetState() == STATE_CLICKED)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
messageTxt->SetTextf("Waiting for HDD: %i sec left\n", 20-(int)countDown.elapsed());
|
messageTxt->SetTextf("Waiting for HDD: %i sec left\n", 20 - (int)countDown.elapsed());
|
||||||
Draw();
|
Draw();
|
||||||
usleep(50000);
|
usleep(50000);
|
||||||
}
|
} while (countDown.elapsed() < 20.f);
|
||||||
while(countDown.elapsed() < 20.f);
|
|
||||||
|
|
||||||
drawCancel = false;
|
drawCancel = false;
|
||||||
|
|
||||||
@ -224,54 +222,46 @@ int StartUpProcess::Run(int argc, char *argv[])
|
|||||||
|
|
||||||
StartUpProcess Process;
|
StartUpProcess Process;
|
||||||
|
|
||||||
int ret = Process.Execute();
|
int ret = Process.Execute(quickGameBoot != -1);
|
||||||
|
|
||||||
if(quickGameBoot != -1)
|
if (quickGameBoot != -1)
|
||||||
return QuickGameBoot(argv[quickGameBoot]);
|
return QuickGameBoot(argv[quickGameBoot]);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int StartUpProcess::Execute()
|
int StartUpProcess::Execute(bool quickGameBoot)
|
||||||
{
|
{
|
||||||
Settings.EntryIOS = IOS_GetVersion();
|
Settings.EntryIOS = IOS_GetVersion();
|
||||||
gprintf("Current IOS: %i - have AHB access: %s\n", Settings.EntryIOS, AHBPROT_DISABLED ? "yes" : "no");
|
// Disable AHBPROT
|
||||||
|
IosLoader::PatchAHB();
|
||||||
// Only reload the IOS if the XML requests it, we don't have full HW access or the entry IOS isn't 58
|
gprintf("Current IOS: %d - have AHB access: %s\n", Settings.EntryIOS, AHBPROT_DISABLED ? "yes" : "no");
|
||||||
if(Settings.UseArgumentIOS || !AHBPROT_DISABLED || IOS_GetVersion() != 58)
|
// Reload to a cIOS if required (old forwarder?) or requested
|
||||||
|
if (!AHBPROT_DISABLED || (Settings.EntryIOS != Settings.BootIOS))
|
||||||
{
|
{
|
||||||
if (Settings.UseArgumentIOS)
|
SetTextf("Reloading to cIOS %d%s\n", Settings.LoaderIOS, Settings.UseArgumentIOS ? "requested in meta.xml" : "");
|
||||||
SetTextf("Reloading to %sIOS %i requested in meta.xml\n", Settings.LoaderIOS >= 200 ? "c" : "", Settings.LoaderIOS);
|
if (IosLoader::LoadAppCios(Settings.LoaderIOS) < 0)
|
||||||
else
|
|
||||||
SetTextf("Reloading to %sIOS %i\n", Settings.LoaderIOS >= 200 ? "c" : "", Settings.LoaderIOS);
|
|
||||||
// Reload to the default loader IOS or the IOS set in meta.xml
|
|
||||||
// And on failure try cIOS 249, 250, 222, 223, 245, 246, 247 and 248
|
|
||||||
if(IosLoader::LoadAppCios(Settings.LoaderIOS) < 0)
|
|
||||||
{
|
{
|
||||||
SetTextf("Failed to load an IOS. USB Loader GX requires a cIOS or IOS58 with AHB access. Exiting...\n");
|
SetTextf("Failed to load an IOS. USB Loader GX requires a cIOS or IOS58 with AHB access. Exiting...\n");
|
||||||
sleep(5);
|
sleep(5);
|
||||||
Sys_BackToLoader();
|
Sys_BackToLoader();
|
||||||
}
|
}
|
||||||
if(!AHBPROT_DISABLED && IOS_GetVersion() < 200)
|
SetTextf("Reloaded to cIOS %d\n", Settings.LoaderIOS);
|
||||||
{
|
gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
||||||
SetTextf("Failed to load into IOS %i. USB Loader GX requires a cIOS or IOS58 with AHB access. Exiting...\n", IOS_GetVersion());
|
|
||||||
sleep(5);
|
|
||||||
Sys_BackToLoader();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SetupPads();
|
SetupPads();
|
||||||
gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
|
||||||
|
|
||||||
SetTextf("Initializing sd card\n");
|
SetTextf("Initializing SD card\n");
|
||||||
DeviceHandler::Instance()->MountSD();
|
DeviceHandler::Instance()->MountSD();
|
||||||
|
|
||||||
// Do not mount USB if not needed. USB is not available with WiiU WiiVC injected channel.
|
// Do not mount USB if not needed. USB is not available with WiiU WiiVC injected channel
|
||||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
if (Settings.USBAutoMount == ON && !isWiiVC)
|
||||||
{
|
{
|
||||||
SetTextf("Initializing usb devices\n");
|
SetTextf("Initializing USB devices\n");
|
||||||
USBSpinUp();
|
USBSpinUp();
|
||||||
DeviceHandler::Instance()->MountAllUSB(false);
|
DeviceHandler::Instance()->MountAllUSB(false);
|
||||||
|
gprintf("Completed initialization of USB devices\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SetTextf("Loading config files\n");
|
SetTextf("Loading config files\n");
|
||||||
@ -280,73 +270,83 @@ int 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");
|
||||||
gprintf("\tLoading game categories...%s\n", GameCategories.Load(Settings.ConfigPath) ? "done" : "failed");
|
gprintf("\tLoading game categories...%s\n", GameCategories.Load(Settings.ConfigPath) ? "done" : "failed");
|
||||||
if(Settings.CacheTitles)
|
if (Settings.CacheTitles)
|
||||||
gprintf("\tLoading cached titles...%s\n", GameTitles.ReadCachedTitles(Settings.titlestxt_path) ? "done" : "failed (using default)");
|
gprintf("\tLoading cached titles...%s\n", GameTitles.ReadCachedTitles(Settings.titlestxt_path) ? "done" : "failed (using default)");
|
||||||
|
|
||||||
// Reload to users settings if different than current IOS, and if not using an injected WiiU WiiVC IOS255 (fw.img)
|
// Some settings need to be enabled to boot directly into games
|
||||||
if(Settings.LoaderIOS != IOS_GetVersion() && !isWiiVC && !Settings.UseArgumentIOS)
|
gprintf("Quick game boot: %s\n", quickGameBoot ? "yes" : "no");
|
||||||
|
if (quickGameBoot)
|
||||||
{
|
{
|
||||||
// Unmount devices
|
Settings.USBAutoMount = ON;
|
||||||
DeviceHandler::DestroyInstance();
|
Settings.LoaderMode = MODE_ALL;
|
||||||
if(Settings.USBAutoMount == ON)
|
Settings.skipSaving = true;
|
||||||
USBStorage2_Deinit();
|
}
|
||||||
|
|
||||||
|
// Reload to users settings if different than current IOS, and if not using an injected WiiU WiiVC IOS255 (fw.img)
|
||||||
|
if (Settings.LoaderIOS != IOS_GetVersion() && !isWiiVC)
|
||||||
|
{
|
||||||
// Shutdown pads
|
// Shutdown pads
|
||||||
|
sleep(1); // Some Wiimotes won't reconnect as player 1 without this
|
||||||
Wpad_Disconnect();
|
Wpad_Disconnect();
|
||||||
|
|
||||||
|
// Unmount devices
|
||||||
|
DeviceHandler::DestroyInstance();
|
||||||
|
if (Settings.USBAutoMount == ON)
|
||||||
|
USBStorage2_Deinit();
|
||||||
|
|
||||||
// Now load the cIOS that was set in the settings menu
|
// Now load the cIOS that was set in the settings menu
|
||||||
if(IosLoader::LoadAppCios(Settings.LoaderIOS) > -1)
|
if (IosLoader::LoadAppCios(Settings.LoaderIOS) > -1)
|
||||||
{
|
{
|
||||||
SetTextf("Reloaded into cIOS %i R%i\n", IOS_GetVersion(), IOS_GetRevision());
|
SetTextf("Reloaded to %s%d r%d\n", IOS_GetVersion() >= 200 ? "cIOS " : "IOS", Settings.LoaderIOS, IOS_GetRevision());
|
||||||
// Re-Mount devices
|
// Re-Mount devices
|
||||||
SetTextf("Reinitializing devices\n");
|
SetTextf("Reinitializing devices\n");
|
||||||
}
|
}
|
||||||
|
gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
||||||
|
|
||||||
// Start pads again
|
// Start pads again
|
||||||
SetupPads();
|
SetupPads();
|
||||||
gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
|
||||||
|
|
||||||
DeviceHandler::Instance()->MountSD();
|
DeviceHandler::Instance()->MountSD();
|
||||||
if(Settings.USBAutoMount == ON)
|
if (Settings.USBAutoMount == ON)
|
||||||
{
|
{
|
||||||
USBSpinUp();
|
USBSpinUp();
|
||||||
DeviceHandler::Instance()->MountAllUSB(false);
|
DeviceHandler::Instance()->MountAllUSB(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!IosLoader::IsHermesIOS() && !IosLoader::IsD2X())
|
if (!IosLoader::IsHermesIOS() && !IosLoader::IsD2X())
|
||||||
{
|
{
|
||||||
Settings.USBPort = 0;
|
Settings.USBPort = 0;
|
||||||
}
|
}
|
||||||
else if(Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort)
|
else if (Settings.USBPort == 1 && USBStorage2_GetPort() != Settings.USBPort)
|
||||||
{
|
{
|
||||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
if (Settings.USBAutoMount == ON && !isWiiVC)
|
||||||
{
|
{
|
||||||
SetTextf("Changing USB Port to %i\n", Settings.USBPort);
|
SetTextf("Changing USB port to %i\n", Settings.USBPort);
|
||||||
DeviceHandler::Instance()->UnMountAllUSB();
|
DeviceHandler::Instance()->UnMountAllUSB();
|
||||||
DeviceHandler::Instance()->MountAllUSB();
|
DeviceHandler::Instance()->MountAllUSB();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(Settings.USBPort == 2)
|
else if (Settings.USBPort == 2)
|
||||||
{
|
{
|
||||||
if(Settings.USBAutoMount == ON && !isWiiVC)
|
if (Settings.USBAutoMount == ON && !isWiiVC)
|
||||||
{
|
{
|
||||||
SetTextf("Mounting USB Port to 1\n");
|
SetTextf("Mounting USB port to 1\n");
|
||||||
DeviceHandler::Instance()->MountUSBPort1();
|
DeviceHandler::Instance()->MountUSBPort1();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable isfs permission if using Hermes v4 without AHB, or WiiU WiiVC (IOS255 fw.img)
|
// Enable isfs permission if using Hermes v4 without AHB, or WiiU WiiVC (IOS255 fw.img)
|
||||||
if(IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4) || isWiiVC)
|
if (IOS_GetVersion() < 200 || (IosLoader::IsHermesIOS() && IOS_GetRevision() == 4) || isWiiVC)
|
||||||
{
|
{
|
||||||
SetTextf("Patching %sIOS%i\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
SetTextf("Patching %s%d\n", IOS_GetVersion() >= 200 ? "cIOS " : "IOS", IOS_GetVersion());
|
||||||
if (IosPatch_RUNTIME(!isWiiVC, false, false, isWiiVC, false) == ERROR_PATCH)
|
if (IosPatch_RUNTIME(!isWiiVC, false, false, isWiiVC, false) == ERROR_PATCH)
|
||||||
gprintf("Patching %sIOS%i failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
gprintf("Patching %sIOS%d failed!\n", IOS_GetVersion() >= 200 ? "c" : "", IOS_GetVersion());
|
||||||
else
|
else
|
||||||
NandTitles.Get(); // get NAND channel's titles
|
NandTitles.Get(); // get NAND channel's titles
|
||||||
}
|
|
||||||
|
|
||||||
gprintf("Current IOS: %i - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
gprintf("Current IOS: %d - have AHB access: %s\n", IOS_GetVersion(), AHBPROT_DISABLED ? "yes" : "no");
|
||||||
|
}
|
||||||
|
|
||||||
// We only initialize once for the whole session
|
// We only initialize once for the whole session
|
||||||
ISFS_Initialize();
|
ISFS_Initialize();
|
||||||
@ -358,7 +358,7 @@ int StartUpProcess::Execute()
|
|||||||
SetTextf("Loading resources\n");
|
SetTextf("Loading resources\n");
|
||||||
// Do not allow banner grid mode without AHBPROT
|
// Do not allow banner grid mode without AHBPROT
|
||||||
// this function does nothing if it was already initiated before
|
// this function does nothing if it was already initiated before
|
||||||
if(!SystemMenuResources::Instance()->IsLoaded() && !SystemMenuResources::Instance()->Init()
|
if (!SystemMenuResources::Instance()->IsLoaded() && !SystemMenuResources::Instance()->Init()
|
||||||
&& Settings.gameDisplay == BANNERGRID_MODE)
|
&& Settings.gameDisplay == BANNERGRID_MODE)
|
||||||
{
|
{
|
||||||
Settings.gameDisplay = LIST_MODE;
|
Settings.gameDisplay = LIST_MODE;
|
||||||
@ -368,7 +368,7 @@ int StartUpProcess::Execute()
|
|||||||
gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.ConfigPath) ? "done" : "failed (using default)");
|
gprintf("\tLoading font...%s\n", Theme::LoadFont(Settings.ConfigPath) ? "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)");
|
||||||
|
|
||||||
//! Init the rest of the System
|
//! Init the rest of the system
|
||||||
Sys_Init();
|
Sys_Init();
|
||||||
InitAudio();
|
InitAudio();
|
||||||
setlocale(LC_CTYPE, "en_US.UTF-8");
|
setlocale(LC_CTYPE, "en_US.UTF-8");
|
||||||
@ -385,26 +385,26 @@ void StartUpProcess::Draw()
|
|||||||
titleTxt->Draw();
|
titleTxt->Draw();
|
||||||
messageTxt->Draw();
|
messageTxt->Draw();
|
||||||
versionTxt->Draw();
|
versionTxt->Draw();
|
||||||
if(drawCancel)
|
if (drawCancel)
|
||||||
cancelTxt->Draw();
|
cancelTxt->Draw();
|
||||||
Menu_Render();
|
Menu_Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
int StartUpProcess::QuickGameBoot(const char * gameID)
|
int StartUpProcess::QuickGameBoot(const char *gameID)
|
||||||
{
|
{
|
||||||
MountGamePartition(false);
|
MountGamePartition(false);
|
||||||
|
|
||||||
struct discHdr *header = NULL;
|
struct discHdr *header = NULL;
|
||||||
for(int i = 0; i < gameList.size(); ++i)
|
for (int i = 0; i < gameList.size(); ++i)
|
||||||
{
|
{
|
||||||
if(strncasecmp((char *) gameList[i]->id, gameID, 6) == 0)
|
if (strncasecmp((char *)gameList[i]->id, gameID, 6) == 0)
|
||||||
header = gameList[i];
|
header = gameList[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!header)
|
if (!header)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id)+1);
|
GameStatistics.SetPlayCount(header->id, GameStatistics.GetPlayCount(header->id) + 1);
|
||||||
GameStatistics.Save();
|
GameStatistics.Save();
|
||||||
|
|
||||||
return GameBooter::BootGame(header);
|
return GameBooter::BootGame(header);
|
||||||
|
@ -5,30 +5,31 @@
|
|||||||
|
|
||||||
class StartUpProcess
|
class StartUpProcess
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static int Run(int argc, char *argv[]);
|
static int Run(int argc, char *argv[]);
|
||||||
private:
|
|
||||||
StartUpProcess();
|
|
||||||
~StartUpProcess();
|
|
||||||
int Execute();
|
|
||||||
bool USBSpinUp();
|
|
||||||
void TextFade(int direction);
|
|
||||||
void SetTextf(const char * format, ...);
|
|
||||||
void Draw();
|
|
||||||
static int ParseArguments(int argc, char *argv[]);
|
|
||||||
static int QuickGameBoot(const char * gameID);
|
|
||||||
|
|
||||||
bool drawCancel;
|
private:
|
||||||
|
StartUpProcess();
|
||||||
|
~StartUpProcess();
|
||||||
|
int Execute(bool quickGameBoot);
|
||||||
|
bool USBSpinUp();
|
||||||
|
void TextFade(int direction);
|
||||||
|
void SetTextf(const char *format, ...);
|
||||||
|
void Draw();
|
||||||
|
static int ParseArguments(int argc, char *argv[]);
|
||||||
|
static int QuickGameBoot(const char *gameID);
|
||||||
|
|
||||||
GuiImageData * GXImageData;
|
bool drawCancel;
|
||||||
GuiImage * background;
|
|
||||||
GuiImage * GXImage;
|
GuiImageData *GXImageData;
|
||||||
GuiText * titleTxt;
|
GuiImage *background;
|
||||||
GuiText * messageTxt;
|
GuiImage *GXImage;
|
||||||
GuiText * versionTxt;
|
GuiText *titleTxt;
|
||||||
GuiText * cancelTxt;
|
GuiText *messageTxt;
|
||||||
GuiButton * cancelBtn;
|
GuiText *versionTxt;
|
||||||
GuiTrigger * trigB;
|
GuiText *cancelTxt;
|
||||||
|
GuiButton *cancelBtn;
|
||||||
|
GuiTrigger *trigB;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -121,6 +121,7 @@ void CSettings::SetDefault()
|
|||||||
tooltips = ON;
|
tooltips = ON;
|
||||||
gamesound = ON;
|
gamesound = ON;
|
||||||
parentalcontrol = PARENTAL_LVL_ADULT;
|
parentalcontrol = PARENTAL_LVL_ADULT;
|
||||||
|
BootIOS = 58;
|
||||||
LoaderIOS = 249;
|
LoaderIOS = 249;
|
||||||
cios = 249;
|
cios = 249;
|
||||||
gridRows = 3;
|
gridRows = 3;
|
||||||
@ -306,6 +307,8 @@ bool CSettings::Reset()
|
|||||||
|
|
||||||
bool CSettings::Save()
|
bool CSettings::Save()
|
||||||
{
|
{
|
||||||
|
// Quick game booting doesn't need to save
|
||||||
|
if (skipSaving) return false;
|
||||||
if (!FindConfig()) return false;
|
if (!FindConfig()) return false;
|
||||||
|
|
||||||
char filedest[300];
|
char filedest[300];
|
||||||
|
@ -121,6 +121,7 @@ class CSettings
|
|||||||
short gamesoundvolume;
|
short gamesoundvolume;
|
||||||
short tooltips;
|
short tooltips;
|
||||||
short parentalcontrol;
|
short parentalcontrol;
|
||||||
|
u8 BootIOS;
|
||||||
u8 LoaderIOS;
|
u8 LoaderIOS;
|
||||||
u8 cios;
|
u8 cios;
|
||||||
short quickboot;
|
short quickboot;
|
||||||
@ -240,8 +241,9 @@ class CSettings
|
|||||||
short GCInstallAligned;
|
short GCInstallAligned;
|
||||||
short PrivateServer;
|
short PrivateServer;
|
||||||
|
|
||||||
// This variable is not saved to the settings file
|
// These variables are not saved to the settings file
|
||||||
bool FirstTimeRun;
|
bool FirstTimeRun;
|
||||||
|
bool skipSaving;
|
||||||
protected:
|
protected:
|
||||||
bool ValidVersion(FILE * file);
|
bool ValidVersion(FILE * file);
|
||||||
bool ValidateURL(char *value, int type = 0);
|
bool ValidateURL(char *value, int type = 0);
|
||||||
|
@ -212,7 +212,6 @@ LoaderSettings::LoaderSettings()
|
|||||||
|
|
||||||
oldLoaderMode = Settings.LoaderMode;
|
oldLoaderMode = Settings.LoaderMode;
|
||||||
oldGameCubeSource = Settings.GameCubeSource;
|
oldGameCubeSource = Settings.GameCubeSource;
|
||||||
oldLoaderIOS = Settings.LoaderIOS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LoaderSettings::~LoaderSettings()
|
LoaderSettings::~LoaderSettings()
|
||||||
@ -233,12 +232,6 @@ LoaderSettings::~LoaderSettings()
|
|||||||
{
|
{
|
||||||
GCGames::Instance()->LoadAllGames();
|
GCGames::Instance()->LoadAllGames();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(oldLoaderIOS != Settings.LoaderIOS)
|
|
||||||
{
|
|
||||||
// edit meta.xml arguments
|
|
||||||
editMetaArguments();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LoaderSettings::SetOptionNames()
|
void LoaderSettings::SetOptionNames()
|
||||||
|
@ -38,7 +38,6 @@ class LoaderSettings : public SettingsMenu
|
|||||||
|
|
||||||
short oldLoaderMode;
|
short oldLoaderMode;
|
||||||
short oldGameCubeSource;
|
short oldGameCubeSource;
|
||||||
short oldLoaderIOS;
|
|
||||||
OptionList GuiOptions;
|
OptionList GuiOptions;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ int updateMetaXML (void)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
char line[50];
|
char line[50];
|
||||||
snprintf(line, sizeof(line), "--ios=%d", Settings.LoaderIOS);
|
snprintf(line, sizeof(line), "--bootios=%d", Settings.BootIOS);
|
||||||
MetaXML.SetArgument(line);
|
MetaXML.SetArgument(line);
|
||||||
snprintf(line, sizeof(line), "--usbport=%d", Settings.USBPort);
|
snprintf(line, sizeof(line), "--usbport=%d", Settings.USBPort);
|
||||||
MetaXML.SetArgument(line);
|
MetaXML.SetArgument(line);
|
||||||
@ -73,21 +73,27 @@ int editMetaArguments (void)
|
|||||||
while (fgets(line, max_line_size, source) != NULL)
|
while (fgets(line, max_line_size, source) != NULL)
|
||||||
{
|
{
|
||||||
// delete commented lines
|
// delete commented lines
|
||||||
|
if( strstr(line, " <!-- remove this line to enable arguments") != NULL ||
|
||||||
|
strstr(line, " remove this line to enable arguments -->") != NULL)
|
||||||
|
{
|
||||||
|
strcpy(line, "");
|
||||||
|
}
|
||||||
|
// delete commented lines (old version)
|
||||||
if( strstr(line, "<!-- // remove this line to enable arguments") != NULL ||
|
if( strstr(line, "<!-- // remove this line to enable arguments") != NULL ||
|
||||||
strstr(line, "// remove this line to enable arguments -->") != NULL)
|
strstr(line, "// remove this line to enable arguments -->") != NULL)
|
||||||
{
|
{
|
||||||
strcpy(line, " \n");
|
strcpy(line, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate argurments
|
// generate argurments
|
||||||
if(strstr(line, "<arguments>") != NULL)
|
if(strstr(line, "<arguments>") != NULL)
|
||||||
{
|
{
|
||||||
fputs(line, destination);
|
fputs(line, destination);
|
||||||
snprintf(line, max_line_size, " <arg>--ios=%d</arg>\n", Settings.LoaderIOS);
|
snprintf(line, max_line_size, " <arg>--bootios=%d</arg>\n", Settings.BootIOS);
|
||||||
fputs(line, destination);
|
fputs(line, destination);
|
||||||
snprintf(line, max_line_size, " <arg>--usbport=%d</arg>\n", Settings.USBPort);
|
snprintf(line, max_line_size, " <arg>--usbport=%d</arg>\n", Settings.USBPort);
|
||||||
fputs(line, destination);
|
fputs(line, destination);
|
||||||
snprintf(line, max_line_size, " <arg>--mountusb=%d</arg>\n", Settings.USBAutoMount);
|
snprintf(line, max_line_size, " <arg>--mountusb=%d</arg>\n", Settings.USBAutoMount);
|
||||||
fputs(line, destination);
|
fputs(line, destination);
|
||||||
|
|
||||||
while(strstr(line, "</arguments>") == NULL)
|
while(strstr(line, "</arguments>") == NULL)
|
||||||
|
@ -175,6 +175,13 @@ s32 IosLoader::ReloadIosSafe(s32 ios)
|
|||||||
* Reloads a certain IOS and keeps the AHBPROT flag enabled if available.
|
* Reloads a certain IOS and keeps the AHBPROT flag enabled if available.
|
||||||
*/
|
*/
|
||||||
s32 IosLoader::ReloadIosKeepingRights(s32 ios)
|
s32 IosLoader::ReloadIosKeepingRights(s32 ios)
|
||||||
|
{
|
||||||
|
PatchAHB();
|
||||||
|
// Reload IOS. MEM2 protection is implicitly re-enabled
|
||||||
|
return IOS_ReloadIOS(ios);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IosLoader::PatchAHB()
|
||||||
{
|
{
|
||||||
if (CheckAHBPROT())
|
if (CheckAHBPROT())
|
||||||
{
|
{
|
||||||
@ -186,15 +193,14 @@ s32 IosLoader::ReloadIosKeepingRights(s32 ios)
|
|||||||
0x4698, // mov r8, r3 ; Store it for the DVD video bitcheck later
|
0x4698, // mov r8, r3 ; Store it for the DVD video bitcheck later
|
||||||
0x07DB // lsls r3, r3, 0x1F ; check AHBPROT bit
|
0x07DB // lsls r3, r3, 0x1F ; check AHBPROT bit
|
||||||
};
|
};
|
||||||
|
// Disable memory protection
|
||||||
/* Disable MEM 2 protection */
|
write16(MEM2_PROT, 0);
|
||||||
write16(MEM2_PROT, 2);
|
|
||||||
|
|
||||||
for (u16 *patchme = ES_MODULE_START; patchme < ES_MODULE_END; patchme++)
|
for (u16 *patchme = ES_MODULE_START; patchme < ES_MODULE_END; patchme++)
|
||||||
{
|
{
|
||||||
if (!memcmp(patchme, ticket_check, sizeof(ticket_check)))
|
if (!memcmp(patchme, ticket_check, sizeof(ticket_check)))
|
||||||
{
|
{
|
||||||
gprintf("ReloadIos: Found TMD access rights check at %p\n", patchme);
|
gprintf("PatchAHB: Found TMD access rights check at %p\n", patchme);
|
||||||
|
|
||||||
/* Apply patch */
|
/* Apply patch */
|
||||||
patchme[ES_HACK_OFFSET] = 0x23FF; // li r3, 0xFF ; Set full access rights
|
patchme[ES_HACK_OFFSET] = 0x23FF; // li r3, 0xFF ; Set full access rights
|
||||||
@ -204,9 +210,9 @@ s32 IosLoader::ReloadIosKeepingRights(s32 ios)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Enable memory protection
|
||||||
|
write16(MEM2_PROT, 1);
|
||||||
}
|
}
|
||||||
// Reload IOS. MEM2 protection is implicitly re-enabled
|
|
||||||
return IOS_ReloadIOS(ios);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -88,6 +88,7 @@ class IosLoader
|
|||||||
static s32 LoadGameCios(s32 ios);
|
static s32 LoadGameCios(s32 ios);
|
||||||
static s32 ReloadIosSafe(s32 ios);
|
static s32 ReloadIosSafe(s32 ios);
|
||||||
static s32 ReloadIosKeepingRights(s32 ios);
|
static s32 ReloadIosKeepingRights(s32 ios);
|
||||||
|
static void PatchAHB();
|
||||||
static bool IsHermesIOS(s32 ios = IOS_GetVersion());
|
static bool IsHermesIOS(s32 ios = IOS_GetVersion());
|
||||||
static bool IsWaninkokoIOS(s32 ios = IOS_GetVersion());
|
static bool IsWaninkokoIOS(s32 ios = IOS_GetVersion());
|
||||||
static bool IsD2X(s32 ios = IOS_GetVersion());
|
static bool IsD2X(s32 ios = IOS_GetVersion());
|
||||||
|
@ -5,9 +5,6 @@
|
|||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "wpad.h"
|
#include "wpad.h"
|
||||||
|
|
||||||
/* Constants */
|
|
||||||
#define MAX_WIIMOTES 4
|
|
||||||
|
|
||||||
extern u8 shutdown;
|
extern u8 shutdown;
|
||||||
|
|
||||||
void __Wpad_PowerCallback(s32 chan)
|
void __Wpad_PowerCallback(s32 chan)
|
||||||
@ -35,8 +32,12 @@ void Wpad_Disconnect(void)
|
|||||||
u32 cnt;
|
u32 cnt;
|
||||||
|
|
||||||
/* Disconnect Wiimotes */
|
/* Disconnect Wiimotes */
|
||||||
for (cnt = 0; cnt < MAX_WIIMOTES; cnt++)
|
for (cnt = 0; cnt < WPAD_MAX_WIIMOTES; cnt++)
|
||||||
|
{
|
||||||
|
if (WPAD_Probe(cnt, 0) < 0)
|
||||||
|
continue;
|
||||||
WPAD_Disconnect(cnt);
|
WPAD_Disconnect(cnt);
|
||||||
|
}
|
||||||
|
|
||||||
/* Shutdown Wiimote subsystem */
|
/* Shutdown Wiimote subsystem */
|
||||||
WPAD_Shutdown();
|
WPAD_Shutdown();
|
||||||
|
@ -49,7 +49,7 @@ cat <<EOF > ./HBC/meta.xml
|
|||||||
<release_date>$rev_date</release_date>
|
<release_date>$rev_date</release_date>
|
||||||
<!-- remove this line to enable arguments
|
<!-- remove this line to enable arguments
|
||||||
<arguments>
|
<arguments>
|
||||||
<arg>--ios=250</arg>
|
<arg>--bootios=58</arg>
|
||||||
<arg>--usbport=0</arg>
|
<arg>--usbport=0</arg>
|
||||||
<arg>--mountusb=1</arg>
|
<arg>--mountusb=1</arg>
|
||||||
</arguments>
|
</arguments>
|
||||||
|
Loading…
Reference in New Issue
Block a user