diff --git a/arm7/source/main.c b/arm7/source/main.c index 31515f7..3adfe58 100644 --- a/arm7/source/main.c +++ b/arm7/source/main.c @@ -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)))*/) { diff --git a/arm7/source/my_i2c.c b/arm7/source/my_i2c.c new file mode 100644 index 0000000..e49d5bc --- /dev/null +++ b/arm7/source/my_i2c.c @@ -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 +#include + +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; +} \ No newline at end of file diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index 6b4715a..6da95e3 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -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); } diff --git a/arm9/source/startMenu.cpp b/arm9/source/startMenu.cpp index 3298858..bbe639d 100644 --- a/arm9/source/startMenu.cpp +++ b/arm9/source/startMenu.cpp @@ -40,7 +40,7 @@ constexpr std::array, 10> languageList = { void startMenu() { std::vector startMenuItems; - if(isDSiMode()) { + if(!isRegularDS) { startMenuItems = { StartMenuItem::powerOff, StartMenuItem::reboot,