diff --git a/include/fs.h b/include/fs.h index b08af76..00e5688 100644 --- a/include/fs.h +++ b/include/fs.h @@ -89,3 +89,7 @@ s32 fUnlink(const char *const path); s32 fVerifyNandImage(const char *const path); s32 fSetNandProtection(bool protect); + +#ifdef ARM9 +void fsDeinit(void); +#endif diff --git a/include/ipc_handler.h b/include/ipc_handler.h index e63bc18..f56bf7a 100644 --- a/include/ipc_handler.h +++ b/include/ipc_handler.h @@ -69,9 +69,9 @@ IPC_CMD9_FREE = CMD_ID(31) | CMD_IN_BUFS(15) | CMD_OUT_BUFS(15) | CMD_PARAMS(15), IPC_CMD9_LOAD_VERIFY_FIRM = CMD_ID(32) | CMD_IN_BUFS(1) | CMD_OUT_BUFS(0) | CMD_PARAMS(1), IPC_CMD9_FIRM_LAUNCH = CMD_ID(33) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), - IPC_CMD9_PREPA_POWER = CMD_ID(34) | CMD_IN_BUFS(15) | CMD_OUT_BUFS(15) | CMD_PARAMS(15), - IPC_CMD9_PANIC = CMD_ID(35) | CMD_IN_BUFS(15) | CMD_OUT_BUFS(15) | CMD_PARAMS(15), - IPC_CMD9_EXCEPTION = CMD_ID(36) | CMD_IN_BUFS(15) | CMD_OUT_BUFS(15) | CMD_PARAMS(15) + IPC_CMD9_PREPARE_POWER = CMD_ID(34) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_PANIC = CMD_ID(35) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0), + IPC_CMD9_EXCEPTION = CMD_ID(36) | CMD_IN_BUFS(0) | CMD_OUT_BUFS(0) | CMD_PARAMS(0) } IpcCmd9; typedef enum diff --git a/source/arm11/debug.c b/source/arm11/debug.c index 205a861..38194a0 100644 --- a/source/arm11/debug.c +++ b/source/arm11/debug.c @@ -24,6 +24,7 @@ #include "arm11/fmt.h" #include "fs.h" #include "hardware/pxi.h" +#include "ipc_handler.h" #include "hardware/gfx.h" #include "arm11/hardware/interrupt.h" @@ -53,16 +54,13 @@ enterCriticalSection(); consoleInit(SCREEN_SUB, NULL, false); - ee_printf("\x1b[41m\x1b[0J\x1b[15C****PANIC!!!****\n\nlr = 0x%08" PRIX32 "\n", lr); - - //fsUnmountAll(); - //devs_close(); - GX_textureCopy((u64*)RENDERBUF_TOP, 0, (u64*)GFX_getFramebuffer(SCREEN_TOP), 0, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); GFX_swapFramebufs(); + PXI_sendCmd(IPC_CMD9_PANIC, NULL, 0); + while(1) __wfi(); } @@ -73,17 +71,14 @@ enterCriticalSection(); consoleInit(SCREEN_SUB, NULL, false); - ee_printf("\x1b[41m\x1b[0J\x1b[15C****PANIC!!!****\n\nlr = 0x%08" PRIX32 "\n", lr); ee_printf("\nERROR MESSAGE:\n%s\n", msg); - - //fsUnmountAll(); - //devs_close(); - GX_textureCopy((u64*)RENDERBUF_TOP, 0, (u64*)GFX_getFramebuffer(SCREEN_TOP), 0, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); GFX_swapFramebufs(); + PXI_sendCmd(IPC_CMD9_PANIC, NULL, 0); + while(1) __wfi(); } @@ -140,29 +135,11 @@ } //if(codeChanged) ee_printf("Attention: RO section data changed!!"); - - // avoid fs corruptions - //fsUnmountAll(); - //devs_close(); - GX_textureCopy((u64*)RENDERBUF_TOP, 0, (u64*)GFX_getFramebuffer(SCREEN_TOP), 0, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); GFX_swapFramebufs(); + PXI_sendCmd(IPC_CMD9_EXCEPTION, NULL, 0); + while(1) __wfi(); } - -/*void dumpMem(u8 *mem, u32 size, char *filepath) -{ - FIL file; - UINT bytesWritten; - - if(f_open(&file, filepath, FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) - return; - - f_write(&file, mem, size, &bytesWritten); - - f_sync(&file); - - f_close(&file); -}*/ diff --git a/source/arm11/power.c b/source/arm11/power.c index 5cc127d..57aca7e 100644 --- a/source/arm11/power.c +++ b/source/arm11/power.c @@ -21,6 +21,8 @@ #include "arm11/hardware/i2c.h" #include "hardware/cache.h" #include "arm11/hardware/interrupt.h" +#include "ipc_handler.h" +#include "hardware/pxi.h" @@ -46,6 +48,7 @@ noreturn void power_off(void) { + PXI_sendCmd(IPC_CMD9_PREPARE_POWER, NULL, 0); i2cmcu_lcd_poweroff(); flushDCache(); @@ -58,6 +61,7 @@ noreturn void power_reboot(void) { + PXI_sendCmd(IPC_CMD9_PREPARE_POWER, NULL, 0); i2cmcu_lcd_poweroff(); flushDCache(); diff --git a/source/arm9/debug.c b/source/arm9/debug.c index 2db0074..a54c82c 100644 --- a/source/arm9/debug.c +++ b/source/arm9/debug.c @@ -22,7 +22,7 @@ #include "mem_map.h" #include "hardware/pxi.h" #include "fatfs/ff.h" -#include "fsutils.h" +#include "fs.h" #include "arm9/hardware/interrupt.h" #include "hardware/gfx.h" #include "arm9/hardware/ndma.h" @@ -52,9 +52,7 @@ enterCriticalSection(); - fsUnmountAll(); - //devs_close(); - + fsDeinit(); //PXI_sendWord(PXI_CMD_ALLOW_POWER_OFF); while(1) @@ -71,9 +69,7 @@ enterCriticalSection(); - fsUnmountAll(); - //devs_close(); - + fsDeinit(); //PXI_sendWord(PXI_CMD_ALLOW_POWER_OFF); while(1) @@ -144,9 +140,7 @@ if(codeChanged) ee_printf("Attention: RO section data changed!!");*/ // avoid fs corruptions - fsUnmountAll(); - //devs_close(); - + fsDeinit(); //PXI_sendWord(PXI_CMD_ALLOW_POWER_OFF); while(1) __wfi(); diff --git a/source/arm9/fs.c b/source/arm9/fs.c index c7aff41..f0ef8f4 100644 --- a/source/arm9/fs.c +++ b/source/arm9/fs.c @@ -823,3 +823,12 @@ return FR_OK; } +void fsDeinit(void) +{ + for(u32 i = 0; i < FS_MAX_FILES; i++) fClose(i); + for(u32 i = 0; i < FS_MAX_DRIVES; i++) fUnmount(i); + + dev_decnand->close(); + dev_rawnand->close(); + dev_sdcard->close(); +} diff --git a/source/arm9/ipc_handler.c b/source/arm9/ipc_handler.c index a396a78..44cd6c3 100644 --- a/source/arm9/ipc_handler.c +++ b/source/arm9/ipc_handler.c @@ -138,10 +138,10 @@ g_startFirmLaunch = true; } break; - case IPC_CMD_ID_MASK(IPC_CMD9_PREPA_POWER): + case IPC_CMD_ID_MASK(IPC_CMD9_PREPARE_POWER): case IPC_CMD_ID_MASK(IPC_CMD9_PANIC): case IPC_CMD_ID_MASK(IPC_CMD9_EXCEPTION): - // Close and deinitalize everything. + fsDeinit(); break; default: panic(); diff --git a/source/fb_assert.c b/source/fb_assert.c index 25195e7..a4ebe90 100644 --- a/source/fb_assert.c +++ b/source/fb_assert.c @@ -22,6 +22,8 @@ #include "arm9/hardware/ndma.h" #elif ARM11 #include "arm11/fmt.h" + #include "ipc_handler.h" + #include "hardware/pxi.h" #include "arm11/hardware/interrupt.h" #endif #include "hardware/gfx.h" @@ -38,6 +40,10 @@ (void)line; #elif ARM11 ee_printf("Assertion failed: %s:%" PRIu32, str, line); + GX_textureCopy((u64*)RENDERBUF_TOP, 0, (u64*)GFX_getFramebuffer(SCREEN_TOP), + 0, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); + GFX_swapFramebufs(); + PXI_sendCmd(IPC_CMD9_PANIC, NULL, 0); #endif while(1) @@ -47,9 +53,6 @@ NDMA_fill((u32*)FRAMEBUF_SUB_A_1, color, SCREEN_SIZE_SUB); NDMA_fill((u32*)FRAMEBUF_SUB_A_2, color, SCREEN_SIZE_SUB); #elif ARM11 - GX_textureCopy((u64*)RENDERBUF_TOP, 0, (u64*)GFX_getFramebuffer(SCREEN_TOP), - 0, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB); - GFX_swapFramebufs(); __wfi(); #endif }