diff --git a/arm9/source/driveMenu.cpp b/arm9/source/driveMenu.cpp index 8558c8d..8b4780c 100644 --- a/arm9/source/driveMenu.cpp +++ b/arm9/source/driveMenu.cpp @@ -360,7 +360,7 @@ void driveMenu (void) { chdir("ram:/"); screenMode = 1; break; - } else if (dmOperations[dmCursorPosition] == DriveMenuOperation::sysNand && isDSiMode() && nandMounted) { + } else if (dmOperations[dmCursorPosition] == DriveMenuOperation::sysNand && nandMounted) { currentDrive = Drive::nand; chdir("nand:/"); screenMode = 1; diff --git a/arm9/source/driveOperations.cpp b/arm9/source/driveOperations.cpp index 10e1cfd..42a79bd 100644 --- a/arm9/source/driveOperations.cpp +++ b/arm9/source/driveOperations.cpp @@ -101,7 +101,7 @@ bool imgFound(void) { return (access("img:/", F_OK) == 0); } -TWL_CODE bool nandMount(void) { +bool nandMount(void) { fatMountSimple("nand", &io_dsi_nand); if (nandFound()) { struct statvfs st; @@ -113,7 +113,7 @@ TWL_CODE bool nandMount(void) { return false; } -TWL_CODE void nandUnmount(void) { +void nandUnmount(void) { fatUnmount("nand"); nandSize = 0; nandMounted = false; diff --git a/arm9/source/main.cpp b/arm9/source/main.cpp index fa4a96b..50f9831 100644 --- a/arm9/source/main.cpp +++ b/arm9/source/main.cpp @@ -154,13 +154,13 @@ int main(int argc, char **argv) { if (isDSiMode()) { if (!arm7SCFGLocked) { - font->print(-2, -4, false, " Held - Disable NAND access", Alignment::right); + //font->print(-2, -4, false, " Held - Disable NAND access", Alignment::right); font->print(-2, -3, false, " Held - Disable cart access", Alignment::right); - font->print(-2, -2, false, "Do these if it crashes here", Alignment::right); - } else { + font->print(-2, -2, false, "Do this if it crashes here", Alignment::right); + } /*else { font->print(-2, -3, false, " Held - Disable NAND access", Alignment::right); font->print(-2, -2, false, "Do this if it crashes here", Alignment::right); - } + }*/ } // Display for 2 seconds @@ -193,9 +193,9 @@ int main(int argc, char **argv) { if (ram32MB) { is3DS = fifoGetValue32(FIFO_USER_05) != 0xD2; } - if (!(keysHeld() & KEY_X)) { + //if (!(keysHeld() & KEY_X)) { nandMounted = nandMount(); - } + //} //is3DS = ((access("sd:/Nintendo 3DS", F_OK) == 0) && (*(vu32*)(0x0DFFFE0C) == 0x474D3969)); /*FILE* cidFile = fopen("sd:/gm9i/CID.bin", "wb"); fwrite((void*)0x2FFD7BC, 1, 16, cidFile); @@ -210,6 +210,7 @@ int main(int argc, char **argv) { if (ram32MB) { is3DS = fifoGetValue32(FIFO_USER_05) != 0xD2; } + //nandMounted = nandMount(); } else if (isRegularDS && (io_dldi_data->ioInterface.features & FEATURE_SLOT_NDS)) { ramdriveMount(false); } diff --git a/arm9/source/nandio.c b/arm9/source/nandio.c index 4c00af4..8ccd0f8 100644 --- a/arm9/source/nandio.c +++ b/arm9/source/nandio.c @@ -1,5 +1,7 @@ #include +#include +#include #include #include #include @@ -11,8 +13,6 @@ //#define SECTOR_SIZE 512 #define CRYPT_BUF_LEN 64 -extern bool nand_Startup(); - static u8* crypt_buf = 0; static u32 fat_sig_fix_offset = 0; @@ -43,10 +43,49 @@ void getConsoleID(u8 *consoleID){ tonccpy(&consoleID[4], &key_x[0xC], 4); } -bool nandio_startup() { - if (!nand_Startup()) return false; +//--------------------------------------------------------------------------------- +bool my_nand_Startup() { +//--------------------------------------------------------------------------------- + fifoSendValue32(FIFO_SDMMC,SDMMC_HAVE_SD); + while(!fifoCheckValue32(FIFO_SDMMC)); + int result = fifoGetValue32(FIFO_SDMMC); - nand_ReadSectors(0, 1, sector_buf); + if(result==0) return false; + + fifoSendValue32(FIFO_SDMMC,SDMMC_NAND_START); + + fifoWaitValue32(FIFO_SDMMC); + + result = fifoGetValue32(FIFO_SDMMC); + + return result == 0; +} + +//--------------------------------------------------------------------------------- +bool my_nand_ReadSectors(sec_t sector, sec_t numSectors,void* buffer) { +//--------------------------------------------------------------------------------- + FifoMessage msg; + + DC_FlushRange(buffer,numSectors * 512); + + msg.type = SDMMC_NAND_READ_SECTORS; + msg.sdParams.startsector = sector; + msg.sdParams.numsectors = numSectors; + msg.sdParams.buffer = buffer; + + fifoSendDatamsg(FIFO_SDMMC, sizeof(msg), (u8*)&msg); + + fifoWaitValue32(FIFO_SDMMC); + + int result = fifoGetValue32(FIFO_SDMMC); + + return result == 0; +} + +bool nandio_startup() { + if (!my_nand_Startup()) return false; + + my_nand_ReadSectors(0, 1, sector_buf); bool isDSi = parse_ncsd(sector_buf, 0) != 0; //if (!isDSi) return false; @@ -97,7 +136,7 @@ bool nandio_is_inserted() { // len is guaranteed <= CRYPT_BUF_LEN static bool read_sectors(sec_t start, sec_t len, void *buffer) { - if (nand_ReadSectors(start, len, crypt_buf)) { + if (my_nand_ReadSectors(start, len, crypt_buf)) { dsi_nand_crypt(buffer, crypt_buf, start * SECTOR_SIZE / AES_BLOCK_SIZE, len * SECTOR_SIZE / AES_BLOCK_SIZE); if (fat_sig_fix_offset && start == fat_sig_fix_offset