Add error printing for issues with libraries

It will now show erros for the following:
- Missing or old libsys_minerva.bso (DRAM training).
- Missing libsys_lp0.bso (LP0 sleep mode).
- Missing or old Nyx version
This commit is contained in:
CTCaer 2019-12-11 11:22:11 +02:00
parent 24d30a40f9
commit c6e92311f9
11 changed files with 115 additions and 50 deletions

View file

@ -8,11 +8,7 @@ include $(DEVKITARM)/base_rules
IPL_LOAD_ADDR := 0x40008000 IPL_LOAD_ADDR := 0x40008000
IPL_MAGIC := 0x43544349 #"ICTC" IPL_MAGIC := 0x43544349 #"ICTC"
BLVERSION_MAJOR := 5 include ./Versions.inc
BLVERSION_MINOR := 1
BLVERSION_HOTFX := 0
BL_RESERVED := 0
################################################################################ ################################################################################
@ -60,7 +56,8 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
################################################################################ ################################################################################
CUSTOMDEFINES := -DIPL_LOAD_ADDR=$(IPL_LOAD_ADDR) -DBL_MAGIC=$(IPL_MAGIC) 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 #CUSTOMDEFINES += -DMENU_LOGO_ENABLE
# 0: UART_A, 1: UART_B. # 0: UART_A, 1: UART_B.

11
Versions.inc Normal file
View file

@ -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

View file

@ -40,11 +40,6 @@ typedef struct _hekate_config
u32 errors; u32 errors;
} hekate_config; } hekate_config;
typedef enum
{
ERR_LIBSYS_LP0 = (1 << 0),
} hsysmodule_t;
void set_default_configuration(); void set_default_configuration();
int create_config_entry(); int create_config_entry();
void config_autoboot(); void config_autoboot();

View file

@ -157,13 +157,9 @@ void *tui_do_menu(menu_t *menu)
gfx_con_setcol(0xFFCCCCCC, 1, 0xFF1B1B1B); gfx_con_setcol(0xFFCCCCCC, 1, 0xFF1B1B1B);
gfx_putc('\n'); gfx_putc('\n');
// Print erros, help and battery status. // Print errors, help and battery status.
gfx_con_setpos(0, h_cfg.errors ? 1111 : 1127); gfx_con_setpos(0, 1127);
gfx_printf("%k Warning: %k", 0xFF800000, 0xFF555555); gfx_printf("%k Warning: %k Nyx is missing!", 0xFF800000, 0xFF555555);
if (h_cfg.errors & ERR_LIBSYS_LP0)
gfx_printf("Sleep mode library is missing!\n");
gfx_printf(" Nyx is missing!\n");
gfx_con_setpos(0, 1191); gfx_con_setpos(0, 1191);
gfx_printf("%k VOL: Move up/down\n PWR: Select option%k", 0xFF555555, 0xFFCCCCCC); gfx_printf("%k VOL: Move up/down\n PWR: Select option%k", 0xFF555555, 0xFFCCCCCC);

View file

@ -678,6 +678,8 @@ out:
btn_wait(); btn_wait();
} }
#define NYX_VER_OFF 0x9C
void nyx_load_run() void nyx_load_run()
{ {
sd_mount(); sd_mount();
@ -688,6 +690,9 @@ void nyx_load_run()
sd_unmount(); 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); gfx_clear_grey(0x1B);
u8 *BOOTLOGO = (void *)malloc(0x4000); u8 *BOOTLOGO = (void *)malloc(0x4000);
blz_uncompress_srcdest(BOOTLOGO_BLZ, SZ_BOOTLOGO_BLZ, BOOTLOGO, SZ_BOOTLOGO); blz_uncompress_srcdest(BOOTLOGO_BLZ, SZ_BOOTLOGO_BLZ, BOOTLOGO, SZ_BOOTLOGO);
@ -695,16 +700,29 @@ void nyx_load_run()
free(BOOTLOGO); free(BOOTLOGO);
display_backlight_brightness(h_cfg.backlight, 1000); 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; nyx_str->cfg = 0;
if (b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP) if (b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP)
{ {
b_cfg.extra_cfg &= ~(EXTRA_CFG_NYX_DUMP); b_cfg.extra_cfg &= ~(EXTRA_CFG_NYX_DUMP);
nyx_str->cfg |= NYX_CFG_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); //memcpy((u8 *)nyx_str->irama, (void *)IRAM_BASE, 0x8000);
volatile reloc_meta_t *reloc = (reloc_meta_t *)(IPL_LOAD_ADDR + RELOC_META_OFF); 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; return cfg_sec;
} }
void auto_launch_firmware() static void _auto_launch_firmware()
{ {
if(b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP) if(b_cfg.extra_cfg & EXTRA_CFG_NYX_DUMP)
{ {
@ -1019,7 +1037,7 @@ skip_list:
hos_launch(cfg_sec); hos_launch(cfg_sec);
EPRINTF("\nFailed to launch HOS!"); EPRINTF("\nFailed to launch HOS!");
gfx_printf("\nPress any key and try again...\n"); gfx_printf("\nPress any key...\n");
msleep(500); msleep(500);
btn_wait(); btn_wait();
} }
@ -1038,7 +1056,7 @@ out:
sd_unmount(); sd_unmount();
} }
void patched_rcm_protection() static void _patched_rcm_protection()
{ {
sdmmc_storage_t storage; sdmmc_storage_t storage;
sdmmc_t sdmmc; sdmmc_t sdmmc;
@ -1080,7 +1098,28 @@ void patched_rcm_protection()
sdmmc_storage_end(&storage); 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[] = static const char credits[] =
"\nhekate (c) 2018 naehrwert, st4rk\n\n" "\nhekate (c) 2018 naehrwert, st4rk\n\n"
@ -1228,7 +1267,7 @@ ment_t ment_top[] = {
MDEF_HANDLER("Reboot (RCM)", reboot_rcm), MDEF_HANDLER("Reboot (RCM)", reboot_rcm),
MDEF_HANDLER("Power off", power_off), MDEF_HANDLER("Power off", power_off),
MDEF_CAPTION("---------------", 0xFF444444), MDEF_CAPTION("---------------", 0xFF444444),
MDEF_HANDLER("About", about), MDEF_HANDLER("About", _about),
MDEF_END() MDEF_END()
}; };
@ -1262,7 +1301,8 @@ void ipl_main()
h_cfg.errors |= ERR_LIBSYS_LP0; h_cfg.errors |= ERR_LIBSYS_LP0;
// Train DRAM and switch to max frequency. // Train DRAM and switch to max frequency.
minerva_init(); if (minerva_init())
h_cfg.errors |= ERR_SYSOLD_MTC;
display_init(); display_init();
@ -1286,13 +1326,16 @@ void ipl_main()
secmon_exo_check_panic(); secmon_exo_check_panic();
// Check if RCM is patched and protect from a possible brick. // Check if RCM is patched and protect from a possible brick.
patched_rcm_protection(); _patched_rcm_protection();
// Load emuMMC configuration from SD. // Load emuMMC configuration from SD.
emummc_load_cfg(); emummc_load_cfg();
// Show library errors.
_show_errors();
// Load saved configuration and auto boot if enabled. // Load saved configuration and auto boot if enabled.
auto_launch_firmware(); _auto_launch_firmware();
minerva_change_freq(FREQ_800); minerva_change_freq(FREQ_800);

View file

@ -21,8 +21,17 @@
#include "types.h" #include "types.h"
#include "../mem/minerva.h" #include "../mem/minerva.h"
#define NYX_CFG_DUMP (1 << 7) typedef enum
#define NYX_CFG_MINERVA (1 << 8) {
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) | \ #define byte_swap_32(num) (((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \
((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000)) ((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000))
@ -33,13 +42,20 @@ typedef struct _cfg_op_t
u32 val; u32 val;
} cfg_op_t; } cfg_op_t;
typedef struct _nyx_info_t
{
u32 rsvd;
u32 errors;
} nyx_info_t;
typedef struct _nyx_storage_t typedef struct _nyx_storage_t
{ {
u32 version; u32 version;
u32 cfg; u32 cfg;
u8 irama[0x8000]; u8 irama[0x8000];
u8 hekate[0x30000]; u8 hekate[0x30000];
u8 rsvd[0x800000]; u8 rsvd[0x800000 - sizeof(nyx_info_t)];
nyx_info_t info;
mtc_config_t mtc_cfg; mtc_config_t mtc_cfg;
emc_table_t mtc_table; emc_table_t mtc_table;
} nyx_storage_t; } nyx_storage_t;

View file

@ -8,11 +8,7 @@ include $(DEVKITARM)/base_rules
NYX_LOAD_ADDR := 0x81000000 NYX_LOAD_ADDR := 0x81000000
NYX_MAGIC := 0x43544347 #"GCTC" NYX_MAGIC := 0x43544347 #"GCTC"
BLVERSION_MAJOR := 0 include ./../Versions.inc
BLVERSION_MINOR := 8
BLVERSION_HOTFX := 3
BL_RESERVED := 0
################################################################################ ################################################################################
@ -72,8 +68,8 @@ OBJS += $(addprefix $(BUILDDIR)/$(TARGET)/, \
################################################################################ ################################################################################
CUSTOMDEFINES += -DNYX_LOAD_ADDR=$(NYX_LOAD_ADDR) -DBL_MAGIC=$(NYX_MAGIC) CUSTOMDEFINES += -DNYX_LOAD_ADDR=$(NYX_LOAD_ADDR) -DNYX_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_VER_MJ=$(NYXVERSION_MAJOR) -DNYX_VER_MN=$(NYXVERSION_MINOR) -DNYX_VER_HF=$(NYXVERSION_HOTFX) -DNYX_RESERVED=$(NYXVERSION_RSVD)
# 0: UART_A, 1: UART_B. # 0: UART_A, 1: UART_B.
#CUSTOMDEFINES += -DDEBUG_UART_PORT=1 #CUSTOMDEFINES += -DDEBUG_UART_PORT=1

View file

@ -40,11 +40,6 @@ typedef struct _hekate_config
u32 errors; u32 errors;
} hekate_config; } hekate_config;
typedef enum
{
ERR_LIBSYS_LP0 = (1 << 0),
} hsysmodule_t;
void set_default_configuration(); void set_default_configuration();
int create_config_entry(); int create_config_entry();

View file

@ -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); lv_obj_align(ctcaer_img, lbl_octopus, LV_ALIGN_OUT_BOTTOM_RIGHT, 0, LV_DPI * 2 / 3);
char version[32]; 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_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_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); lv_ta_set_style(lbl_ver, LV_TA_STYLE_BG, &monospace_text);

View file

@ -63,8 +63,8 @@ u8 *Kc_MENU_LOGO;
hekate_config h_cfg; hekate_config h_cfg;
const volatile ipl_ver_meta_t __attribute__((section ("._ipl_version"))) ipl_ver = { const volatile ipl_ver_meta_t __attribute__((section ("._ipl_version"))) ipl_ver = {
.magic = BL_MAGIC, .magic = NYX_MAGIC,
.version = (BL_VER_MJ + '0') | ((BL_VER_MN + '0') << 8) | ((BL_VER_HF + '0') << 16), .version = (NYX_VER_MJ + '0') | ((NYX_VER_MN + '0') << 8) | ((NYX_VER_HF + '0') << 16),
.rsvd0 = 0, .rsvd0 = 0,
.rsvd1 = 0 .rsvd1 = 0
}; };

View file

@ -21,8 +21,17 @@
#include "types.h" #include "types.h"
#include "../mem/minerva.h" #include "../mem/minerva.h"
#define NYX_CFG_DUMP (1 << 7) typedef enum
#define NYX_CFG_MINERVA (1 << 8) {
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) | \ #define byte_swap_32(num) (((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | \
((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000)) ((num >> 8 )& 0xff00) | ((num << 24) & 0xff000000))
@ -33,13 +42,20 @@ typedef struct _cfg_op_t
u32 val; u32 val;
} cfg_op_t; } cfg_op_t;
typedef struct _nyx_info_t
{
u32 rsvd;
u32 errors;
} nyx_info_t;
typedef struct _nyx_storage_t typedef struct _nyx_storage_t
{ {
u32 version; u32 version;
u32 cfg; u32 cfg;
u8 irama[0x8000]; u8 irama[0x8000];
u8 hekate[0x30000]; u8 hekate[0x30000];
u8 rsvd[0x800000]; u8 rsvd[0x800000 - sizeof(nyx_info_t)];
nyx_info_t info;
mtc_config_t mtc_cfg; mtc_config_t mtc_cfg;
emc_table_t mtc_table; emc_table_t mtc_table;
} nyx_storage_t; } nyx_storage_t;