mirror of
https://github.com/rvtr/GodMode9i.git
synced 2025-11-02 00:11:07 -04:00
Run 3DS detection code and show Reboot option in DS mode
This commit is contained in:
parent
22e469c09c
commit
8edf33099b
@ -37,11 +37,20 @@
|
|||||||
void my_installSystemFIFO(void);
|
void my_installSystemFIFO(void);
|
||||||
void my_sdmmc_get_cid(int devicenumber, u32 *cid);
|
void my_sdmmc_get_cid(int devicenumber, u32 *cid);
|
||||||
|
|
||||||
|
u8 my_i2cReadRegister(u8 device, u8 reg);
|
||||||
|
u8 my_i2cWriteRegister(u8 device, u8 reg, u8 data);
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
void ReturntoDSiMenu() {
|
void ReturntoDSiMenu() {
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
i2cWriteRegister(0x4A, 0x70, 0x01); // Bootflag = Warmboot/SkipHealthSafety
|
if (isDSiMode()) {
|
||||||
i2cWriteRegister(0x4A, 0x11, 0x01); // Reset to DSi Menu
|
i2cWriteRegister(0x4A, 0x70, 0x01); // Bootflag = Warmboot/SkipHealthSafety
|
||||||
|
i2cWriteRegister(0x4A, 0x11, 0x01); // Reset to DSi Menu
|
||||||
|
} else {
|
||||||
|
u8 readCommand = readPowerManagement(0x10);
|
||||||
|
readCommand |= BIT(0);
|
||||||
|
writePowerManagement(0x10, readCommand);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------
|
||||||
@ -128,11 +137,11 @@ int main() {
|
|||||||
setPowerButtonCB(powerButtonCB);
|
setPowerButtonCB(powerButtonCB);
|
||||||
|
|
||||||
// Check for 3DS
|
// Check for 3DS
|
||||||
if(isDSiMode()) {
|
if(isDSiMode() || REG_SCFG_EXT != 0) {
|
||||||
u8 byteBak = i2cReadRegister(0x4A, 0x71);
|
u8 byteBak = my_i2cReadRegister(0x4A, 0x71);
|
||||||
i2cWriteRegister(0x4A, 0x71, 0xD2);
|
my_i2cWriteRegister(0x4A, 0x71, 0xD2);
|
||||||
fifoSendValue32(FIFO_USER_05, i2cReadRegister(0x4A, 0x71));
|
fifoSendValue32(FIFO_USER_05, my_i2cReadRegister(0x4A, 0x71));
|
||||||
i2cWriteRegister(0x4A, 0x71, byteBak);
|
my_i2cWriteRegister(0x4A, 0x71, byteBak);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isDSiMode() /*|| ((REG_SCFG_EXT & BIT(17)) && (REG_SCFG_EXT & BIT(18)))*/) {
|
if (isDSiMode() /*|| ((REG_SCFG_EXT & BIT(17)) && (REG_SCFG_EXT & BIT(18)))*/) {
|
||||||
|
|||||||
132
arm7/source/my_i2c.c
Normal file
132
arm7/source/my_i2c.c
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
/*---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
I2C control for the ARM7
|
||||||
|
|
||||||
|
Copyright (C) 2011
|
||||||
|
Dave Murphy (WinterMute)
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied
|
||||||
|
warranty. In no event will the authors be held liable for any
|
||||||
|
damages arising from the use of this software.
|
||||||
|
|
||||||
|
Permission is granted to anyone to use this software for any
|
||||||
|
purpose, including commercial applications, and to alter it and
|
||||||
|
redistribute it freely, subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you
|
||||||
|
must not claim that you wrote the original software. If you use
|
||||||
|
this software in a product, an acknowledgment in the product
|
||||||
|
documentation would be appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and
|
||||||
|
must not be misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <nds/arm7/i2c.h>
|
||||||
|
#include <nds/bios.h>
|
||||||
|
|
||||||
|
static u32 i2cCurrentDelay = 0;
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
void my_i2cDelay() {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
i2cWaitBusy();
|
||||||
|
swiDelay(i2cCurrentDelay);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
void my_i2cStop(u8 arg0) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
if(i2cCurrentDelay) {
|
||||||
|
REG_I2CCNT = (arg0 << 5) | 0xC0;
|
||||||
|
my_i2cDelay();
|
||||||
|
REG_I2CCNT = 0xC5;
|
||||||
|
} else REG_I2CCNT = (arg0 << 5) | 0xC1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cGetResult() {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
i2cWaitBusy();
|
||||||
|
return (REG_I2CCNT >> 4) & 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cGetData() {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
i2cWaitBusy();
|
||||||
|
return REG_I2CDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
void my_i2cSetDelay(u8 device) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
if (device == I2C_PM ) {
|
||||||
|
i2cCurrentDelay = 0x180;
|
||||||
|
} else {
|
||||||
|
i2cCurrentDelay = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cSelectDevice(u8 device) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
i2cWaitBusy();
|
||||||
|
REG_I2CDATA = device;
|
||||||
|
REG_I2CCNT = 0xC2;
|
||||||
|
return my_i2cGetResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cSelectRegister(u8 reg) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
my_i2cDelay();
|
||||||
|
REG_I2CDATA = reg;
|
||||||
|
REG_I2CCNT = 0xC0;
|
||||||
|
return my_i2cGetResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cWriteRegister(u8 device, u8 reg, u8 data) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
my_i2cSetDelay(device);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
if((my_i2cSelectDevice(device) != 0) && (my_i2cSelectRegister(reg) != 0)) {
|
||||||
|
my_i2cDelay();
|
||||||
|
REG_I2CDATA = data;
|
||||||
|
my_i2cStop(0);
|
||||||
|
if(my_i2cGetResult() != 0) return 1;
|
||||||
|
}
|
||||||
|
REG_I2CCNT = 0xC5;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
u8 my_i2cReadRegister(u8 device, u8 reg) {
|
||||||
|
//---------------------------------------------------------------------------------
|
||||||
|
my_i2cSetDelay(device);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < 8; i++) {
|
||||||
|
|
||||||
|
if((my_i2cSelectDevice(device) != 0) && (my_i2cSelectRegister(reg) != 0)) {
|
||||||
|
my_i2cDelay();
|
||||||
|
if(my_i2cSelectDevice(device | 1)) {
|
||||||
|
my_i2cDelay();
|
||||||
|
my_i2cStop(1);
|
||||||
|
return my_i2cGetData();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
REG_I2CCNT = 0xC5;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0xff;
|
||||||
|
}
|
||||||
@ -175,6 +175,9 @@ int main(int argc, char **argv) {
|
|||||||
*(vu32*)(0x0DFFFE0C) = 0x474D3969; // Check for 32MB of RAM
|
*(vu32*)(0x0DFFFE0C) = 0x474D3969; // Check for 32MB of RAM
|
||||||
bool ram32MB = *(vu32*)(0x0DFFFE0C) == 0x474D3969;
|
bool ram32MB = *(vu32*)(0x0DFFFE0C) == 0x474D3969;
|
||||||
ramdriveMount(ram32MB);
|
ramdriveMount(ram32MB);
|
||||||
|
if (ram32MB) {
|
||||||
|
is3DS = fifoGetValue32(FIFO_USER_05) != 0xD2;
|
||||||
|
}
|
||||||
} else if (isRegularDS && (io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS)) {
|
} else if (isRegularDS && (io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS)) {
|
||||||
ramdriveMount(false);
|
ramdriveMount(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ constexpr std::array<std::pair<const char *, const char *>, 10> languageList = {
|
|||||||
|
|
||||||
void startMenu() {
|
void startMenu() {
|
||||||
std::vector<StartMenuItem> startMenuItems;
|
std::vector<StartMenuItem> startMenuItems;
|
||||||
if(isDSiMode()) {
|
if(!isRegularDS) {
|
||||||
startMenuItems = {
|
startMenuItems = {
|
||||||
StartMenuItem::powerOff,
|
StartMenuItem::powerOff,
|
||||||
StartMenuItem::reboot,
|
StartMenuItem::reboot,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user