diff --git a/Makefile b/Makefile index 3e4394e..b860e7a 100755 --- a/Makefile +++ b/Makefile @@ -8,11 +8,7 @@ include $(DEVKITARM)/base_rules IPL_LOAD_ADDR := 0x40008000 IPL_MAGIC := 0x43544349 #"ICTC" -BLVERSION_MAJOR := 5 -BLVERSION_MINOR := 1 -BLVERSION_HOTFX := 0 - -BL_RESERVED := 0 +include ./Versions.inc ################################################################################ @@ -60,7 +56,8 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \ ################################################################################ CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR) -DBL_MAGIC=$(IPL_MAGIC) -CUSTOMDEFINES += -DBL_VER_MJ=$(BLVERSION_MAJOR) -DBL_VER_MN=$(BLVERSION_MINOR) -DBL_VER_HF=$(BLVERSION_HOTFX) -DBL_RESERVED=$(BL_RESERVED) +CUSTOMDEFINES += -DBL_VER_MJ=$(BLVERSION_MAJOR) -DBL_VER_MN=$(BLVERSION_MINOR) -DBL_VER_HF=$(BLVERSION_HOTFX) -DBL_RESERVED=$(BLVERSION_RSVD) +CUSTOMDEFINES += -DNYX_VER_MJ=$(NYXVERSION_MAJOR) -DNYX_VER_MN=$(NYXVERSION_MINOR) -DNYX_VER_HF=$(NYXVERSION_HOTFX) -DNYX_RESERVED=$(NYXVERSION_RSVD) #CUSTOMDEFINES += -DMENU_LOGO_ENABLE # 0: UART_A, 1: UART_B. diff --git a/Versions.inc b/Versions.inc new file mode 100644 index 0000000..5440828 --- /dev/null +++ b/Versions.inc @@ -0,0 +1,11 @@ +# IPL Version. +BLVERSION_MAJOR := 5 +BLVERSION_MINOR := 1 +BLVERSION_HOTFX := 0 +BLVERSION_RSVD := 0 + +# Nyx Version. +NYXVERSION_MAJOR := 0 +NYXVERSION_MINOR := 8 +NYXVERSION_HOTFX := 3 +NYXVERSION_RSVD := 0 diff --git a/bootloader/config/config.h b/bootloader/config/config.h index 8cd34e1..96ca8d0 100644 --- a/bootloader/config/config.h +++ b/bootloader/config/config.h @@ -40,11 +40,6 @@ typedef struct _hekate_config u32 errors; } hekate_config; -typedef enum -{ - ERR_LIBSYS_LP0 = (1 << 0), -} hsysmodule_t; - void set_default_configuration(); int create_config_entry(); void config_autoboot(); diff --git a/bootloader/gfx/tui.c b/bootloader/gfx/tui.c index c15ddbc..b31cb39 100644 --- a/bootloader/gfx/tui.c +++ b/bootloader/gfx/tui.c @@ -157,13 +157,9 @@ void *tui_do_menu(menu_t *menu) gfx_con_setcol(0xFFCCCCCC, 1, 0xFF1B1B1B); gfx_putc('\n'); - // Print erros, help and battery status. - gfx_con_setpos(0, h_cfg.errors ? 1111 : 1127); - gfx_printf("%k Warning: %k", 0xFF800000, 0xFF555555); - if (h_cfg.errors & ERR_LIBSYS_LP0) - gfx_printf("Sleep mode library is missing!\n"); - gfx_printf(" Nyx is missing!\n"); - + // Print errors, help and battery status. + gfx_con_setpos(0, 1127); + gfx_printf("%k Warning: %k Nyx is missing!", 0xFF800000, 0xFF555555); gfx_con_setpos(0, 1191); gfx_printf("%k VOL: Move up/down\n PWR: Select option%k", 0xFF555555, 0xFFCCCCCC); diff --git a/bootloader/main.c b/bootloader/main.c index 526ee3e..1f05246 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -678,6 +678,8 @@ out: btn_wait(); } +#define NYX_VER_OFF 0x9C + void nyx_load_run() { sd_mount(); @@ -688,6 +690,9 @@ void nyx_load_run() sd_unmount(); + u32 expected_nyx_ver = ((NYX_VER_MJ + '0') << 24) | ((NYX_VER_MN + '0') << 16) | ((NYX_VER_HF + '0') << 8); + u32 nyx_ver = byte_swap_32(*(u32 *)(nyx + NYX_VER_OFF)); + gfx_clear_grey(0x1B); u8 *BOOTLOGO = (void *)malloc(0x4000); blz_uncompress_srcdest(BOOTLOGO_BLZ, SZ_BOOTLOGO_BLZ, BOOTLOGO, SZ_BOOTLOGO); @@ -695,16 +700,29 @@ void nyx_load_run() free(BOOTLOGO); display_backlight_brightness(h_cfg.backlight, 1000); + // Check if Nyx version is old. + if (nyx_ver < expected_nyx_ver) + { + h_cfg.errors |= ERR_SYSOLD_NYX; + + gfx_con_setpos(0, 0); + WPRINTF("Old Nyx GUI found! There will be dragons!\n"); + WPRINTF("\nUpdate your bootloader folder!\n\n"); + WPRINTF("Press any key..."); + + msleep(2000); + btn_wait(); + } + + nyx_str->info.errors = h_cfg.errors; nyx_str->cfg = 0; if (b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP) { b_cfg.extra_cfg &= ~(EXTRA_CFG_NYX_DUMP); nyx_str->cfg |= NYX_CFG_DUMP; } - if (nyx_str->mtc_cfg.mtc_table) - nyx_str->cfg |= NYX_CFG_MINERVA; - nyx_str->version = ipl_ver.version - 0x303030; + nyx_str->version = ipl_ver.version - 0x303030; // Convert ASCII to numbers. //memcpy((u8 *)nyx_str->irama, (void *)IRAM_BASE, 0x8000); volatile reloc_meta_t *reloc = (reloc_meta_t *)(IPL_LOAD_ADDR + RELOC_META_OFF); @@ -749,7 +767,7 @@ static ini_sec_t *get_ini_sec_from_id(ini_sec_t *ini_sec, char **bootlogoCustomE return cfg_sec; } -void auto_launch_firmware() +static void _auto_launch_firmware() { if(b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP) { @@ -1019,7 +1037,7 @@ skip_list: hos_launch(cfg_sec); EPRINTF("\nFailed to launch HOS!"); - gfx_printf("\nPress any key and try again...\n"); + gfx_printf("\nPress any key...\n"); msleep(500); btn_wait(); } @@ -1038,7 +1056,7 @@ out: sd_unmount(); } -void patched_rcm_protection() +static void _patched_rcm_protection() { sdmmc_storage_t storage; sdmmc_t sdmmc; @@ -1080,7 +1098,28 @@ void patched_rcm_protection() sdmmc_storage_end(&storage); } -void about() +static void _show_errors() +{ + if (h_cfg.errors) + { + gfx_clear_grey(0x1B); + gfx_con_setpos(0, 0); + display_backlight_brightness(h_cfg.backlight, 1000); + + if (h_cfg.errors & ERR_LIBSYS_LP0) + WPRINTF("Missing LP0 (sleep mode) library!\n"); + if (h_cfg.errors & ERR_SYSOLD_MTC) + WPRINTF("Missing or old Minerva library!\n"); + + WPRINTF("\nUpdate your bootloader folder!\n\n"); + WPRINTF("Press any key..."); + + msleep(2000); + btn_wait(); + } +} + +static void _about() { static const char credits[] = "\nhekate (c) 2018 naehrwert, st4rk\n\n" @@ -1228,7 +1267,7 @@ ment_t ment_top[] = { MDEF_HANDLER("Reboot (RCM)", reboot_rcm), MDEF_HANDLER("Power off", power_off), MDEF_CAPTION("---------------", 0xFF444444), - MDEF_HANDLER("About", about), + MDEF_HANDLER("About", _about), MDEF_END() }; @@ -1262,7 +1301,8 @@ void ipl_main() h_cfg.errors |= ERR_LIBSYS_LP0; // Train DRAM and switch to max frequency. - minerva_init(); + if (minerva_init()) + h_cfg.errors |= ERR_SYSOLD_MTC; display_init(); @@ -1286,13 +1326,16 @@ void ipl_main() secmon_exo_check_panic(); // Check if RCM is patched and protect from a possible brick. - patched_rcm_protection(); + _patched_rcm_protection(); // Load emuMMC configuration from SD. emummc_load_cfg(); + // Show library errors. + _show_errors(); + // Load saved configuration and auto boot if enabled. - auto_launch_firmware(); + _auto_launch_firmware(); minerva_change_freq(FREQ_800); diff --git a/bootloader/utils/util.h b/bootloader/utils/util.h index 55f5f18..cdddc85 100644 --- a/bootloader/utils/util.h +++ b/bootloader/utils/util.h @@ -21,8 +21,17 @@ #include "types.h" #include "../mem/minerva.h" -#define NYX_CFG_DUMP (1 << 7) -#define NYX_CFG_MINERVA (1 << 8) +typedef enum +{ + NYX_CFG_DUMP = (1 << 7), +} nyx_cfg_t; + +typedef enum +{ + ERR_LIBSYS_LP0 = (1 << 0), + ERR_SYSOLD_NYX = (1 << 1), + ERR_SYSOLD_MTC = (1 << 2), +} hekate_errors_t; #define byte_swap_32(num) (((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \ ((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000)) @@ -33,13 +42,20 @@ typedef struct _cfg_op_t u32 val; } cfg_op_t; +typedef struct _nyx_info_t +{ + u32 rsvd; + u32 errors; +} nyx_info_t; + typedef struct _nyx_storage_t { u32 version; u32 cfg; u8 irama[0x8000]; u8 hekate[0x30000]; - u8 rsvd[0x800000]; + u8 rsvd[0x800000 - sizeof(nyx_info_t)]; + nyx_info_t info; mtc_config_t mtc_cfg; emc_table_t mtc_table; } nyx_storage_t; diff --git a/nyx/Makefile b/nyx/Makefile index 6213835..af144ab 100644 --- a/nyx/Makefile +++ b/nyx/Makefile @@ -8,11 +8,7 @@ include $(DEVKITARM)/base_rules NYX_LOAD_ADDR := 0x81000000 NYX_MAGIC := 0x43544347 #"GCTC" -BLVERSION_MAJOR := 0 -BLVERSION_MINOR := 8 -BLVERSION_HOTFX := 3 - -BL_RESERVED := 0 +include ./../Versions.inc ################################################################################ @@ -72,8 +68,8 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \ ################################################################################ -CUSTOMDEFINES += -DNYX_LOAD_ADDR=$(NYX_LOAD_ADDR) -DBL_MAGIC=$(NYX_MAGIC) -CUSTOMDEFINES += -DBL_VER_MJ=$(BLVERSION_MAJOR) -DBL_VER_MN=$(BLVERSION_MINOR) -DBL_VER_HF=$(BLVERSION_HOTFX) -DBL_RESERVED=$(BL_RESERVED) +CUSTOMDEFINES += -DNYX_LOAD_ADDR=$(NYX_LOAD_ADDR) -DNYX_MAGIC=$(NYX_MAGIC) +CUSTOMDEFINES += -DNYX_VER_MJ=$(NYXVERSION_MAJOR) -DNYX_VER_MN=$(NYXVERSION_MINOR) -DNYX_VER_HF=$(NYXVERSION_HOTFX) -DNYX_RESERVED=$(NYXVERSION_RSVD) # 0: UART_A, 1: UART_B. #CUSTOMDEFINES += -DDEBUG_UART_PORT=1 diff --git a/nyx/nyx_gui/config/config.h b/nyx/nyx_gui/config/config.h index 9e29de1..32e934c 100644 --- a/nyx/nyx_gui/config/config.h +++ b/nyx/nyx_gui/config/config.h @@ -40,11 +40,6 @@ typedef struct _hekate_config u32 errors; } hekate_config; -typedef enum -{ - ERR_LIBSYS_LP0 = (1 << 0), -} hsysmodule_t; - void set_default_configuration(); int create_config_entry(); diff --git a/nyx/nyx_gui/frontend/gui.c b/nyx/nyx_gui/frontend/gui.c index 81e86ab..680024b 100644 --- a/nyx/nyx_gui/frontend/gui.c +++ b/nyx/nyx_gui/frontend/gui.c @@ -757,7 +757,7 @@ static void _create_tab_about(lv_theme_t * th, lv_obj_t * parent) lv_obj_align(ctcaer_img, lbl_octopus, LV_ALIGN_OUT_BOTTOM_RIGHT, 0, LV_DPI * 2 / 3); char version[32]; - s_printf(version, "Nyx v%d.%d.%d", BL_VER_MJ, BL_VER_MN, BL_VER_HF); + s_printf(version, "Nyx v%d.%d.%d", NYX_VER_MJ, NYX_VER_MN, NYX_VER_HF); lv_obj_t * lbl_ver = lv_label_create(parent, NULL); lv_obj_align(lbl_ver, ctcaer_img, LV_ALIGN_OUT_BOTTOM_RIGHT, -LV_DPI / 20, LV_DPI / 4); lv_ta_set_style(lbl_ver, LV_TA_STYLE_BG, &monospace_text); diff --git a/nyx/nyx_gui/nyx.c b/nyx/nyx_gui/nyx.c index 15e4e0f..79296e7 100644 --- a/nyx/nyx_gui/nyx.c +++ b/nyx/nyx_gui/nyx.c @@ -63,8 +63,8 @@ u8 *Kc_MENU_LOGO; hekate_config h_cfg; const volatile ipl_ver_meta_t __attribute__((section ("._ipl_version"))) ipl_ver = { - .magic = BL_MAGIC, - .version = (BL_VER_MJ + '0') | ((BL_VER_MN + '0') << 8) | ((BL_VER_HF + '0') << 16), + .magic = NYX_MAGIC, + .version = (NYX_VER_MJ + '0') | ((NYX_VER_MN + '0') << 8) | ((NYX_VER_HF + '0') << 16), .rsvd0 = 0, .rsvd1 = 0 }; diff --git a/nyx/nyx_gui/utils/util.h b/nyx/nyx_gui/utils/util.h index 55f5f18..cdddc85 100644 --- a/nyx/nyx_gui/utils/util.h +++ b/nyx/nyx_gui/utils/util.h @@ -21,8 +21,17 @@ #include "types.h" #include "../mem/minerva.h" -#define NYX_CFG_DUMP (1 << 7) -#define NYX_CFG_MINERVA (1 << 8) +typedef enum +{ + NYX_CFG_DUMP = (1 << 7), +} nyx_cfg_t; + +typedef enum +{ + ERR_LIBSYS_LP0 = (1 << 0), + ERR_SYSOLD_NYX = (1 << 1), + ERR_SYSOLD_MTC = (1 << 2), +} hekate_errors_t; #define byte_swap_32(num) (((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \ ((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000)) @@ -33,13 +42,20 @@ typedef struct _cfg_op_t u32 val; } cfg_op_t; +typedef struct _nyx_info_t +{ + u32 rsvd; + u32 errors; +} nyx_info_t; + typedef struct _nyx_storage_t { u32 version; u32 cfg; u8 irama[0x8000]; u8 hekate[0x30000]; - u8 rsvd[0x800000]; + u8 rsvd[0x800000 - sizeof(nyx_info_t)]; + nyx_info_t info; mtc_config_t mtc_cfg; emc_table_t mtc_table; } nyx_storage_t;