diff --git a/include/arm.h b/include/arm.h index 699ccbc..8dcd25f 100644 --- a/include/arm.h +++ b/include/arm.h @@ -93,19 +93,6 @@ return cpuId & 3; } -// Control Register -static inline u32 __getCr(void) -{ - u32 cr; - __asm__("mrc p15, 0, %0, c1, c0, 0" : "=r" (cr) : ); - return cr; -} - -static inline void __setCr(u32 cr) -{ - __asm__ volatile("mcr p15, 0, %0, c1, c0, 0" : : "r" (cr) : "memory"); -} - // Auxiliary Control Register static inline u32 __getAcr(void) { @@ -227,4 +214,17 @@ __asm__ volatile("msr spsr_cxsf, %0" : : "r" (spsr) : "memory"); } +// Control Register +static inline u32 __getCr(void) +{ + u32 cr; + __asm__("mrc p15, 0, %0, c1, c0, 0" : "=r" (cr) : ); + return cr; +} + +static inline void __setCr(u32 cr) +{ + __asm__ volatile("mcr p15, 0, %0, c1, c0, 0" : : "r" (cr) : "memory"); +} + #endif // if !__ASSEMBLER__ diff --git a/include/arm11/hardware/cfg11.h b/include/arm11/hardware/cfg11.h index 4b7b5b9..773b2c7 100644 --- a/include/arm11/hardware/cfg11.h +++ b/include/arm11/hardware/cfg11.h @@ -22,6 +22,7 @@ #define CFG11_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x40000) +#define REG_CFG11_FIQ_CNT *((vu8* )(CFG11_REGS_BASE + 0x0104)) #define REG_UNK_10140400 *((vu8* )(CFG11_REGS_BASE + 0x0400)) #define REG_UNK_10140410 *((vu32*)(CFG11_REGS_BASE + 0x0410)) #define REG_CFG11_BOOTROM_OVERLAY_CNT *((vu8* )(CFG11_REGS_BASE + 0x0420)) diff --git a/source/arm11/hardware/gfx.c b/source/arm11/hardware/gfx.c index 7350847..9d6ea6e 100644 --- a/source/arm11/hardware/gfx.c +++ b/source/arm11/hardware/gfx.c @@ -323,7 +323,6 @@ if(keepLcdsOn) { - // Temporary Luma workaround GX_memoryFill((u64*)FRAMEBUF_TOP_A_1, 1u<<9, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB + 0x2A300, 0, (u64*)FRAMEBUF_TOP_A_2, 1u<<9, SCREEN_SIZE_TOP + SCREEN_SIZE_SUB + 0x2A300, 0); *((vu32*)(0x10400400+0x70)) = 0x00080341; // Format GL_RGB8_OES @@ -337,7 +336,6 @@ } else { - // This deinits the GPU correctly but it is broken with Luma. MCU_powerOffLCDs(); GFX_setBrightness(0, 0); *((vu32*)0x10202244) = 0; diff --git a/source/arm11/hardware/interrupt.c b/source/arm11/hardware/interrupt.c index a3d5fc4..0e2e8ba 100644 --- a/source/arm11/hardware/interrupt.c +++ b/source/arm11/hardware/interrupt.c @@ -19,9 +19,7 @@ #include "types.h" #include "arm11/hardware/interrupt.h" #include "arm.h" - - -#define REG_CFG11_FIQ_CNT *((vu8* )(IO_MEM_ARM9_ARM11 + 0x40000 + 0x0104)) +#include "arm11/hardware/cfg11.h" IrqHandler irqHandlerTable[224] = {0}; // First 32 interrupts are private to each core (4 * 32). diff --git a/source/arm11/main.c b/source/arm11/main.c index c8f5a1e..055c59f 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -271,8 +271,7 @@ // deinit GFX if it was initialized - // if(gfx_initialized) GFX_deinit(firm_err == 1); - if(gfx_initialized) GFX_deinit(true); + if(gfx_initialized) GFX_deinit(firm_err == 1); // deinit filesystem fsUnmountAll(); diff --git a/source/arm11/start.s b/source/arm11/start.s index 7e81406..4154e9d 100644 --- a/source/arm11/start.s +++ b/source/arm11/start.s @@ -50,7 +50,7 @@ .extern core123Init .extern __systemInit .extern main -.extern power_off +.extern __systemDeinit .section ".crt0", "ax" @@ -148,7 +148,10 @@ mov r0, #0 @ argc mov r1, #0 @ argv blx main - b power_off + blx __systemDeinit +_start_lp: + wfi + b _start_lp #define MAKE_BRANCH(src, dst) (0xEA000000 | (((((dst) - (src)) >> 2) - 2) & 0xFFFFFF))