diff --git a/include/arm9/menu_firmloader.h b/include/arm9/menu_firmloader.h index b0380f6..edc1a1d 100644 --- a/include/arm9/menu_firmloader.h +++ b/include/arm9/menu_firmloader.h @@ -4,3 +4,4 @@ bool menuLaunchFirm(const char *filePath, bool quick); bool menuTryLoadFirmwareFromSettings(void); bool TryLoadFirmwareFromSettings(void); +bool tryLoadFirmware(const char *filepath, bool skipHashCheck, bool printInfo); diff --git a/source/arm9/firmwriter.c b/source/arm9/firmwriter.c new file mode 100644 index 0000000..d34f053 --- /dev/null +++ b/source/arm9/firmwriter.c @@ -0,0 +1,27 @@ +#include +#include +#include "types.h" +#include "mem_map.h" +#include "arm9/console.h" +#include "arm9/dev.h" +#include "fatfs/ff.h" +#include "hid.h" +#include "util.h" +#include "arm9/main.h" +#include "arm9/menu.h" +#include "arm9/timer.h" + +void firmwriterInit() +{ + +} + +bool firmwriterWriteBlock() +{ + +} + +bool firmwriterFinish() +{ + +} diff --git a/source/arm9/menu_firmloader.c b/source/arm9/menu_firmloader.c index 242791b..547ab6b 100644 --- a/source/arm9/menu_firmloader.c +++ b/source/arm9/menu_firmloader.c @@ -17,7 +17,6 @@ static int firmLoaded = 0; -static bool tryLoadFirmware(const char *filepath, bool skipHashCheck, bool printInfo); static u32 loadFirmSd(const char *filePath); bool isFirmLoaded(void) @@ -289,14 +288,14 @@ return true; } -static bool tryLoadFirmware(const char *filepath, bool skipHashCheck, bool printInfo) +bool tryLoadFirmware(const char *filepath, bool skipHashCheck, bool printInfo) { u32 fw_size; if(!filepath) return false; - printf("Loading firmware:\n%s\n\n", filepath); + // printf("Loading firmware:\n%s\n\n", filepath); if(strncmp(filepath, "sdmc:", 5) == 0) fw_size = loadFirmSd(filepath); diff --git a/source/arm9/menu_update.c b/source/arm9/menu_update.c new file mode 100644 index 0000000..88a4c70 --- /dev/null +++ b/source/arm9/menu_update.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include "types.h" +#include "mem_map.h" +#include "arm9/console.h" +#include "arm9/dev.h" +#include "fatfs/ff.h" +#include "hid.h" +#include "util.h" +#include "version.h" +#include "arm9/main.h" +#include "arm9/menu.h" +#include "arm9/timer.h" + +static const char *updateFilePath = "sdmc:\\fastboot3ds.bin"; + +bool menuUpdateLoader() +{ + u8 *updateBuffer = (u8 *) FIRM_LOAD_ADDR; + FILINFO fileStat; + + uiClearConsoles(); + consoleSelect(&con_top); + + uiPrintCenteredInLine(1, "fastboot Updater"); + + uiPrintTextAt(0, 3, "Checking update file...\n"); + + if(f_stat(updateFilePath, &fileStat) != FR_OK) + { + uiPrintError("Could not find fastboot3ds.bin!\n"); + goto fail; + } + + // update file is just a firmware + if(!tryLoadFirmware(updateFilePath, false, false)) + { + uiPrintError("Invalid update file!\n"); + goto fail; + } + + // verify fastboot magic + if(memcmp(updateBuffer+0x208, "FASTBOOT 3DS ", 0x10) != 0) + { + uiPrintError("Invalid update file!\n"); + goto fail; + } + + /* check version */ + u32 updateVersion = *(u32 *)(updateBuffer + 0x218); + + if(updateVersion < BOOTLOADER_VERSION) + { + uiPrintError("Update version is below current version!\n"); + goto fail; + } + + if(updateVersion == BOOTLOADER_VERSION) + { + uiPrintWarning("You are on this version already.\n"); + goto fail; + } + + if(!uiDialogYesNo("Do you want to update to version XXX?", "Update", "Cancel")) + { + goto fail; + } + + uiPrintTextAt(0, 4, "Updating...\n"); + + +fail: + + uiPrintInfo("Press any key to return..."); + menuWaitForAnyPadkey(); + + menuSetReturnToState(STATE_PREVIOUS); + + return false; +}