#include #include #include #include #include #include #include #include #define MAX_SIZE (1*1024*1024) int menuTop = 8, statusTop = 15; //--------------------------------------------------------------------------------- int saveToFile(const char *filename, u8 *buffer, size_t size) { //--------------------------------------------------------------------------------- FILE *f = fopen(filename, "wb"); if (NULL==f) return -1; size_t written = fwrite(buffer, 1, size, f); fclose(f); if (written != size) return -2; return 0; } //--------------------------------------------------------------------------------- int readJEDEC() { //--------------------------------------------------------------------------------- fifoSendValue32(FIFO_USER_01, 1); fifoWaitValue32(FIFO_USER_01); return fifoGetValue32(FIFO_USER_01); } struct menuItem { const char* name; fp function; }; u8 *firmware_buffer; size_t userSettingsOffset, fwSize, wifiOffset, wifiSize; //--------------------------------------------------------------------------------- void clearStatus() { //--------------------------------------------------------------------------------- iprintf("\x1b[%d;0H\x1b[J\x1b[15;0H",statusTop); } //--------------------------------------------------------------------------------- void dummy() { //--------------------------------------------------------------------------------- clearStatus(); iprintf("\x1b[%d;6HNOT IMPLEMENTED!",statusTop+3); } char dirname[15] = "FW"; char serial[13]; //--------------------------------------------------------------------------------- void backupFirmware() { //--------------------------------------------------------------------------------- clearStatus(); readFirmware(0, firmware_buffer, fwSize); if (saveToFile("firmware.bin", firmware_buffer, fwSize) < 0) { iprintf("Error saving firmware!\n"); } else { iprintf("Firmware saved as\n\n%s/firmware.bin", dirname ); } } //--------------------------------------------------------------------------------- void backupBIOS() { //--------------------------------------------------------------------------------- int dumpcmd = 0; clearStatus(); const char *arm7file, *arm9file; size_t arm7size, arm9size; if (isDSiMode()) { arm7file = "bios7i.bin"; arm7size = 64 * 1024; arm9file = "bios9i.bin"; arm9size = 64 * 1024; dumpcmd = 3; } else { arm7file = "bios7.bin"; arm7size = 16 * 1024; arm9file = "bios9.bin"; arm9size = 32 * 1024; dumpcmd = 2; } if (saveToFile(arm9file, (u8*)0xffff0000, arm9size ) < 0) { iprintf("Error saving arm9 bios\n"); return; } fifoSendValue32(FIFO_USER_01, dumpcmd); fifoSendValue32(FIFO_USER_01, (u32)firmware_buffer); fifoWaitValue32(FIFO_USER_01); fifoGetValue32(FIFO_USER_01); if (saveToFile(arm7file, firmware_buffer, arm7size) < 0 ) { iprintf("Error saving arm7 bios\n"); return; } iprintf("BIOS saved as\n\n%1$s/%2$s\n%1$s/%3$s", dirname, arm7file, arm9file ); } //--------------------------------------------------------------------------------- void backupSettings() { //--------------------------------------------------------------------------------- clearStatus(); readFirmware(userSettingsOffset, firmware_buffer + userSettingsOffset, 512); if (saveToFile("UserSettings.bin", firmware_buffer + userSettingsOffset, 512) < 0) { iprintf("Error saving settings1!\n"); } else { iprintf("User settings saved as\n\n%s/UserSettings.bin", dirname ); } } //--------------------------------------------------------------------------------- void backupWifi() { //--------------------------------------------------------------------------------- clearStatus(); readFirmware(wifiOffset, firmware_buffer + wifiOffset, wifiSize); if (saveToFile("WifiSettings.bin", firmware_buffer + wifiOffset, wifiSize) < 0) { iprintf("Error saving Wifi settings!\n"); } else { iprintf("Wifi settings saved as\n\n%s/WifiSettings.bin", dirname ); } } //--------------------------------------------------------------------------------- void backupNAND() { //--------------------------------------------------------------------------------- clearStatus(); if (!isDSiMode()) { iprintf("Not a DSi!\n"); } else { FILE *f = fopen("nand.bin", "wb"); if (NULL == f) { iprintf("failure creating nand.bin\n"); } else { iprintf("Writing %s/nand.bin\n\n", dirname ); size_t i; size_t sectors = 128; size_t blocks = nand_GetSize() / sectors; for (i=0; i < blocks; i++) { if(!nand_ReadSectors(i * sectors,sectors,firmware_buffer)) { iprintf("\nError reading NAND!\n"); break; } size_t written = fwrite(firmware_buffer, 1, 512 * sectors, f); if(written != 512 * sectors) { iprintf("\nError writing to SD!\n"); break; } iprintf("Block %d of %d\r", i+1, blocks); } fclose(f); } } } bool quitting = false; //--------------------------------------------------------------------------------- void quit() { //--------------------------------------------------------------------------------- quitting = true; } struct menuItem mainMenu[] = { { "Backup Firmware", backupFirmware } , { "Dump Bios", backupBIOS } , { "Backup User Settings", backupSettings } , { "Backup Wifi Settings", backupWifi } , { "Backup DSi NAND", backupNAND}, /* TODO { "Restore Firmware", dummy } , { "Restore User Settings", dummy } , { "Restore Wifi Settings", dummy } , */ { "Exit", quit } }; //--------------------------------------------------------------------------------- void showMenu(menuItem menu[], int count) { //--------------------------------------------------------------------------------- int i; for (i=0; i