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_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() {
|
||||
//---------------------------------------------------------------------------------
|
||||
i2cWriteRegister(0x4A, 0x70, 0x01); // Bootflag = Warmboot/SkipHealthSafety
|
||||
i2cWriteRegister(0x4A, 0x11, 0x01); // Reset to DSi Menu
|
||||
if (isDSiMode()) {
|
||||
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);
|
||||
|
||||
// Check for 3DS
|
||||
if(isDSiMode()) {
|
||||
u8 byteBak = i2cReadRegister(0x4A, 0x71);
|
||||
i2cWriteRegister(0x4A, 0x71, 0xD2);
|
||||
fifoSendValue32(FIFO_USER_05, i2cReadRegister(0x4A, 0x71));
|
||||
i2cWriteRegister(0x4A, 0x71, byteBak);
|
||||
if(isDSiMode() || REG_SCFG_EXT != 0) {
|
||||
u8 byteBak = my_i2cReadRegister(0x4A, 0x71);
|
||||
my_i2cWriteRegister(0x4A, 0x71, 0xD2);
|
||||
fifoSendValue32(FIFO_USER_05, my_i2cReadRegister(0x4A, 0x71));
|
||||
my_i2cWriteRegister(0x4A, 0x71, byteBak);
|
||||
}
|
||||
|
||||
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
|
||||
bool ram32MB = *(vu32*)(0x0DFFFE0C) == 0x474D3969;
|
||||
ramdriveMount(ram32MB);
|
||||
if (ram32MB) {
|
||||
is3DS = fifoGetValue32(FIFO_USER_05) != 0xD2;
|
||||
}
|
||||
} else if (isRegularDS && (io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS)) {
|
||||
ramdriveMount(false);
|
||||
}
|
||||
|
||||
@ -40,7 +40,7 @@ constexpr std::array<std::pair<const char *, const char *>, 10> languageList = {
|
||||
|
||||
void startMenu() {
|
||||
std::vector<StartMenuItem> startMenuItems;
|
||||
if(isDSiMode()) {
|
||||
if(!isRegularDS) {
|
||||
startMenuItems = {
|
||||
StartMenuItem::powerOff,
|
||||
StartMenuItem::reboot,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user