diff --git a/include/arm11/hardware/cfg11.h b/include/arm11/hardware/cfg11.h index 3570d93..7221e18 100644 --- a/include/arm11/hardware/cfg11.h +++ b/include/arm11/hardware/cfg11.h @@ -22,6 +22,9 @@ #define CFG11_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x40000) +#define REGs_CFG11_SHAREDWRAM_32K_CODE (( vu8*)(CFG11_REGS_BASE + 0x000)) // 8 regs. +#define REGs_CFG11_SHAREDWRAM_32K_DATA (( vu8*)(CFG11_REGS_BASE + 0x008)) // 8 regs. +#define REG_CFG11_UNK100 *(( vu32*)(CFG11_REGS_BASE + 0x100)) #define REG_CFG11_FIQ_MASK *(( vu8*)(CFG11_REGS_BASE + 0x104)) #define REG_CFG11_UNK105 *(( vu8*)(CFG11_REGS_BASE + 0x105)) // Debug related? Mask? #define REG_CFG11_UNK108 *(( vu8*)(CFG11_REGS_BASE + 0x108)) // LGY gamecard related? @@ -75,6 +78,6 @@ #define BOOTROM_OVERLAY_CNT_E (1u) // REG_CFG11_SOCINFO -#define SOCINFO_O3DS (1u) // Also set on New3DS. -#define SOCINFO_N3DS_PROTO (1u<<1) // Never saw the daylight? -#define SOCINFO_N3DS (1u<<2) // Set on New3DS. +#define SOCINFO_CTR (1u) // Also set on New 3DS. +#define SOCINFO_LGR1 (1u<<1) // Never saw the daylight? Set on retail N3DS (LGR2). +#define SOCINFO_LGR2 (1u<<2) // Set on New 3DS. diff --git a/include/arm11/hardware/pdn.h b/include/arm11/hardware/pdn.h index 24e1d2b..76c643c 100644 --- a/include/arm11/hardware/pdn.h +++ b/include/arm11/hardware/pdn.h @@ -26,6 +26,7 @@ #define REG_PDN_CNT *((vu16*)(PDN_REGS_BASE + 0x000)) #define REG_PDN_WAKE_ENABLE *((vu32*)(PDN_REGS_BASE + 0x008)) #define REG_PDN_WAKE_REASON *((vu32*)(PDN_REGS_BASE + 0x00C)) // Write 1 to acknowledge and 0 to clear? +// Some LGY regs are located inbetween. See lgy.h/c. #define REG_PDN_GPU_CNT *((vu32*)(PDN_REGS_BASE + 0x200)) #define REG_PDN_VRAM_CNT *((vu8* )(PDN_REGS_BASE + 0x204)) // This reg doesn't seem to exist on retail hardware. #define REG_PDN_LCD_CNT *((vu8* )(PDN_REGS_BASE + 0x208)) // This reg doesn't seem to exist on retail hardware. @@ -33,10 +34,10 @@ #define REG_PDN_I2S_CNT *((vu8* )(PDN_REGS_BASE + 0x220)) #define REG_PDN_CAM_CNT *((vu8* )(PDN_REGS_BASE + 0x224)) #define REG_PDN_DSP_CNT *((vu8* )(PDN_REGS_BASE + 0x230)) -#define REG_PDN_G1_CNT *((vu8* )(PDN_REGS_BASE + 0x240)) // Hantro G1 decoder. -#define REG_PDN_MPCORE_SOCMODE *((vu16*)(PDN_REGS_BASE + 0x300)) -#define REG_PDN_MPCORE_CNT *((vu16*)(PDN_REGS_BASE + 0x304)) // Is this reg actually only vu8? -#define REGs_PDN_MPCORE_BOOTCNT ((vu8* )(PDN_REGS_BASE + 0x310)) +#define REG_PDN_G1_CNT *((vu8* )(PDN_REGS_BASE + 0x240)) // Hantro G1 decoder aka MVD. +#define REG_PDN_LGR_SOCMODE *((vu16*)(PDN_REGS_BASE + 0x300)) +#define REG_PDN_LGR_CNT *((vu16*)(PDN_REGS_BASE + 0x304)) // Is this reg actually only vu8? +#define REGs_PDN_LGR_CPU_CNT ((vu8* )(PDN_REGS_BASE + 0x310)) // 4 regs. // REG_PDN_CNT @@ -63,15 +64,15 @@ enum // Note: The resets are active low. enum { - PDN_GPU_CNT_RST_REGS = 1u, // And more? - PDN_GPU_CNT_RST_PSC = 1u<<1, // ? - PDN_GPU_CNT_RST_GEOSHADER = 1u<<2, // ? - PDN_GPU_CNT_RST_RASTERIZER = 1u<<3, // ? - PDN_GPU_CNT_RST_PPF = 1u<<4, - PDN_GPU_CNT_RST_PDC = 1u<<5, // ? - PDN_GPU_CNT_RST_PDC2 = 1u<<6, // Maybe pixel pipeline or so? + PDN_GPU_CNT_NORST_REGS = 1u, // And more? + PDN_GPU_CNT_NORST_PSC = 1u<<1, // ? + PDN_GPU_CNT_NORST_GEOSHADER = 1u<<2, // ? + PDN_GPU_CNT_NORST_RASTERIZER = 1u<<3, // ? + PDN_GPU_CNT_NORST_PPF = 1u<<4, + PDN_GPU_CNT_NORST_PDC = 1u<<5, // ? + PDN_GPU_CNT_NORST_PDC2 = 1u<<6, // Maybe pixel pipeline or so? - PDN_GPU_CNT_RST_ALL = (PDN_GPU_CNT_RST_PDC2<<1) - 1 + PDN_GPU_CNT_NORST_ALL = (PDN_GPU_CNT_NORST_PDC2<<1) - 1 }; #define PDN_GPU_CNT_CLK_E (1u<<16) @@ -84,7 +85,7 @@ enum // REG_PDN_FCRAM_CNT // Note: Reset is active low. -#define PDN_FCRAM_CNT_RST (1u) +#define PDN_FCRAM_CNT_NORST (1u) #define PDN_FCRAM_CNT_CLK_E (1u<<1) #define PDN_FCRAM_CNT_CLK_E_ACK (1u<<2) // Gets set or unset depending on CLK_E. @@ -97,37 +98,37 @@ enum // REG_PDN_DSP_CNT // Note: Reset is active low. -#define PDN_DSP_CNT_RST (1u) +#define PDN_DSP_CNT_NORST (1u) #define PDN_DSP_CNT_CLK_E (1u<<1) // REG_PDN_G1_CNT // TODO: Active low or high? -#define PDN_G1_CNT_RST (1u) +#define PDN_G1_CNT_NORST (1u) -// REG_PDN_MPCORE_SOCMODE +// REG_PDN_LGR_SOCMODE typedef enum { - SOCMODE_O3DS_268MHz = 0u, - SOCMODE_N3DS_268MHz = 1u, // Also enables FCRAM extension. - SOCMODE_N3DS_PROTO_268MHz = 2u, // Also enables FCRAM extension? - SOCMODE_N3DS_PROTO_536MHz = 3u, // Also enables FCRAM extension? - SOCMODE_N3DS_804MHz = 5u, // Also enables FCRAM extension. + SOCMODE_CTR_268MHz = 0u, + SOCMODE_LGR2_268MHz = 1u, // Also enables FCRAM extension. + SOCMODE_LGR1_268MHz = 2u, // Also enables FCRAM extension? + SOCMODE_LGR1_536MHz = 3u, // Also enables FCRAM extension? + SOCMODE_LGR2_804MHz = 5u, // Also enables FCRAM extension. - SOCMODE_MASK = 7u + SOCMODE_MASK = 7u } PdnSocmode; -#define PDN_MPCORE_SOCMODE_ACK (1u<<15) +#define PDN_LGR_SOCMODE_ACK (1u<<15) -// REG_PDN_MPCORE_CNT -#define PDN_MPCORE_CNT_MEM_EXT_E (1u) // Does it actually affect all mem extensions or just QTM? -#define PDN_MPCORE_CNT_L2C_E (1u<<8) +// REG_PDN_LGR_CNT +#define PDN_LGR_CNT_WRAM_EXT_E (1u) // QTM WRAM enable. +#define PDN_LGR_CNT_L2C_E (1u<<8) // L2C L2 cache enable. -// REGs_PDN_MPCORE_BOOTCNT +// REGs_PDN_LGR_CPU_CNT // Note: Reset is active low. -#define MPCORE_BOOTCNT_RST (1u) // Core 2/3 only. Reset and instruction overlay enable. -#define MPCORE_BOOTCNT_D_OVERL_E (1u<<1) // Core 2/3 only. Data overlay enable. Also used to signal a core booted. -#define MPCORE_BOOTCNT_RST_STAT (1u<<4) -#define MPCORE_BOOTCNT_UNK (1u<<5) +#define LGR_CPU_CNT_NORST (1u) // Core 2/3 only. Reset and instruction overlay enable. +#define LGR_CPU_CNT_D_OVERL_E (1u<<1) // Core 2/3 only. Data overlay enable. Also used to signal a core booted. +#define LGR_CPU_CNT_RST_STAT (1u<<4) // Reset status. +#define LGR_CPU_CNT_UNK (1u<<5) // Something ready? diff --git a/source/arm11/hardware/gfx.c b/source/arm11/hardware/gfx.c index 57d0999..26eb116 100644 --- a/source/arm11/hardware/gfx.c +++ b/source/arm11/hardware/gfx.c @@ -74,7 +74,7 @@ void GFX_init(GfxFbFmt fmtTop, GfxFbFmt fmtBot) // Reset REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E; wait_cycles(12); - REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_RST_ALL; + REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_NORST_ALL; REG_GX_GPU_CLK = 0x100; REG_GX_PSC_VRAM = 0; REG_GX_PSC_FILL0_CNT = 0; @@ -177,7 +177,7 @@ void GFX_deinit(void) REG_LCD_RST = 0; REG_GX_PSC_VRAM = 0xF00; REG_GX_GPU_CLK = 0; - REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_RST_REGS; + REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_NORST_REGS; deallocFramebufs(); @@ -472,12 +472,12 @@ void GX_processCommandList(u32 size, const u32 *const cmdList) REG_LCD_PDC1_SWAP = 0x70100; REG_GX_PSC_VRAM = 0xF00; - REG_PDN_GPU_CNT = PDN_GPU_CNT_RST_ALL; + REG_PDN_GPU_CNT = PDN_GPU_CNT_NORST_ALL; } void GFX_returnFromLowPowerState(void) { - REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_RST_ALL; + REG_PDN_GPU_CNT = PDN_GPU_CNT_CLK_E | PDN_GPU_CNT_NORST_ALL; REG_GX_PSC_VRAM = 0; //REG_GX_GPU_CLK = 0x70100; REG_GX_PSC_FILL0_CNT = 0; diff --git a/source/arm11/hardware/lgy.c b/source/arm11/hardware/lgy.c index f77da29..1265d1b 100644 --- a/source/arm11/hardware/lgy.c +++ b/source/arm11/hardware/lgy.c @@ -72,7 +72,7 @@ static void powerDownFcramForLegacy(u8 mode) *((vu32*)0x10201000) &= ~1u; // Bug fix for the GBA cart emu? REG_PDN_FCRAM_CNT = PDN_FCRAM_CNT_CLK_E; // Set reset low (active) but keep clock on. } - REG_PDN_FCRAM_CNT = PDN_FCRAM_CNT_RST; // Take it out of reset but disable clock. + REG_PDN_FCRAM_CNT = PDN_FCRAM_CNT_NORST; // Take it out of reset but disable clock. while(REG_PDN_FCRAM_CNT & PDN_FCRAM_CNT_CLK_E_ACK); // Wait until clock is disabled. } diff --git a/source/arm11/hardware/lgyfb.c b/source/arm11/hardware/lgyfb.c index 999d4ad..4b67f0a 100644 --- a/source/arm11/hardware/lgyfb.c +++ b/source/arm11/hardware/lgyfb.c @@ -99,22 +99,25 @@ static void lgyFbDmaIrqHandler(UNUSED u32 intSource) signalEvent(g_frameReadyEvent, false); } -static void setScaleMatrix(vu32 *const regs, u8 colorAdjust, u32 len, u32 patt, const s16 *const matrix) +static void setScaleMatrix(vu32 *const regs, u32 len, u32 patt, const s16 *const matrix, u8 inBits, u8 outBits) { regs[0] = len - 1; // Reg *_LEN regs[1] = patt; // Reg *_PATT + const u8 inMax = (inBits == 0 ? 0 : (s8)-128>>(inBits - 1)); + const u8 outMax = (1u<