diff --git a/include/arm11/hardware/lgyfb.h b/include/arm11/hardware/lgyfb.h index 871bf5b..f5e4812 100644 --- a/include/arm11/hardware/lgyfb.h +++ b/include/arm11/hardware/lgyfb.h @@ -2,22 +2,22 @@ // REG_LGYFB_CNT -#define LGYFB_ENABLE (1u) -#define LGYFB_VSCALE_E (1u<<1) -#define LGYFB_HSCALE_E (1u<<2) -#define LGYFB_DITHER_E (1u<<4) -#define LGYFB_DITHER2_E (1u<<5) // ? -#define LGYFB_OUT_FMT_8888 (0u) -#define LGYFB_OUT_FMT_8880 (1u<<8) -#define LGYFB_OUT_FMT_5551 (2u<<8) -#define LGYFB_OUT_FMT_5650 (3u<<8) -#define LGYFB_ROT_NONE (0u) -#define LGYFB_ROT_90CW (1u<<10) -#define LGYFB_ROT_180CW (2u<<10) -#define LGYFB_ROT_270CW (3u<<10) -#define LGYFB_OUT_SWIZZLE (1u<<12) -#define LGYFB_DMA_E (1u<<15) -#define LGYFB_IN_FMT (1u<<16) // Use input format but this bit does nothing? +#define LGYFB_ENABLE (1u) +#define LGYFB_VSCALE_E (1u<<1) +#define LGYFB_HSCALE_E (1u<<2) +#define LGYFB_SPATIAL_DITHER_E (1u<<4) // Unset behaves like weight 0xCCCC in both pattern regs. +#define LGYFB_TEMPORAL_DITHER_E (1u<<5) // Unset behaves like weight 0xCCCC in both pattern regs. +#define LGYFB_OUT_FMT_8888 (0u) +#define LGYFB_OUT_FMT_8880 (1u<<8) +#define LGYFB_OUT_FMT_5551 (2u<<8) +#define LGYFB_OUT_FMT_5650 (3u<<8) +#define LGYFB_ROT_NONE (0u) +#define LGYFB_ROT_90CW (1u<<10) +#define LGYFB_ROT_180CW (2u<<10) +#define LGYFB_ROT_270CW (3u<<10) +#define LGYFB_OUT_SWIZZLE (1u<<12) +#define LGYFB_DMA_E (1u<<15) +#define LGYFB_IN_FMT (1u<<16) // Use input format but this bit does nothing? // REG_LGYFB_SIZE width and hight #define LGYFB_SIZE(w, h) (((h) - 1)<<16 | ((w) - 1)) diff --git a/source/arm11/hardware/lgyfb.c b/source/arm11/hardware/lgyfb.c index de4a1c1..63cf73f 100644 --- a/source/arm11/hardware/lgyfb.c +++ b/source/arm11/hardware/lgyfb.c @@ -8,28 +8,34 @@ #include "lgyfb_dma330.h" -#define REG_LGYFB_TOP_CNT *((vu32*)(0x10111000)) -#define REG_LGYFB_TOP_SIZE *((vu32*)(0x10111004)) -#define REG_LGYFB_TOP_STAT *((vu32*)(0x10111008)) -#define REG_LGYFB_TOP_IRQ *((vu32*)(0x1011100C)) -#define REG_LGYFB_TOP_FLUSH *((vu32*)(0x10111010)) // Write 0 to flush LgyFb FIFO. -#define REG_LGYFB_TOP_ALPHA *((vu32*)(0x10111020)) -#define REG_LGYFB_TOP_UNK_F0 *((vu32*)(0x101110F0)) -// TODO: Add the missing regs. -#define LGYFB_TOP_FIFO *((vu32*)(0x10311000)) +#define LGYFB_TOP_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x11000) +#define REG_LGYFB_TOP_CNT *((vu32*)(LGYFB_TOP_REGS_BASE + 0x000)) +#define REG_LGYFB_TOP_SIZE *((vu32*)(LGYFB_TOP_REGS_BASE + 0x004)) +#define REG_LGYFB_TOP_STAT *((vu32*)(LGYFB_TOP_REGS_BASE + 0x008)) +#define REG_LGYFB_TOP_IRQ *((vu32*)(LGYFB_TOP_REGS_BASE + 0x00C)) +#define REG_LGYFB_TOP_FLUSH *((vu32*)(LGYFB_TOP_REGS_BASE + 0x010)) // Write 0 to flush LgyFb FIFO. +#define REG_LGYFB_TOP_ALPHA *((vu32*)(LGYFB_TOP_REGS_BASE + 0x020)) +#define REG_LGYFB_TOP_UNK_F0 *((vu32*)(LGYFB_TOP_REGS_BASE + 0x0F0)) +#define REG_LGYFB_TOP_DITHPATT0 ((vu32*)(LGYFB_TOP_REGS_BASE + 0x100)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each. +#define REG_LGYFB_TOP_DITHPATT1 ((vu32*)(LGYFB_TOP_REGS_BASE + 0x108)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each. +// TODO: Missing scaling regs. +#define LGYFB_TOP_FIFO *((vu32*)(0x10311000)) -#define REG_LGYFB_BOT_CNT *((vu32*)(0x10110000)) -#define REG_LGYFB_BOT_SIZE *((vu32*)(0x10110004)) -#define REG_LGYFB_BOT_STAT *((vu32*)(0x10110008)) -#define REG_LGYFB_BOT_IRQ *((vu32*)(0x1011000C)) -#define REG_LGYFB_BOT_FLUSH *((vu32*)(0x10110010)) // Write 0 to flush LgyFb FIFO. -#define REG_LGYFB_BOT_ALPHA *((vu32*)(0x10110020)) // 8 bit alpha for all pixels. -#define REG_LGYFB_BOT_UNK_F0 *((vu32*)(0x101100F0)) -// TODO: Add the missing regs. -#define LGYFB_BOT_FIFO *((vu32*)(0x10310000)) +#define LGYFB_BOT_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x10000) +#define REG_LGYFB_BOT_CNT *((vu32*)(LGYFB_BOT_REGS_BASE + 0x000)) +#define REG_LGYFB_BOT_SIZE *((vu32*)(LGYFB_BOT_REGS_BASE + 0x004)) +#define REG_LGYFB_BOT_STAT *((vu32*)(LGYFB_BOT_REGS_BASE + 0x008)) +#define REG_LGYFB_BOT_IRQ *((vu32*)(LGYFB_BOT_REGS_BASE + 0x00C)) +#define REG_LGYFB_BOT_FLUSH *((vu32*)(LGYFB_BOT_REGS_BASE + 0x010)) // Write 0 to flush LgyFb FIFO. +#define REG_LGYFB_BOT_ALPHA *((vu32*)(LGYFB_BOT_REGS_BASE + 0x020)) // 8 bit alpha for all pixels. +#define REG_LGYFB_BOT_UNK_F0 *((vu32*)(LGYFB_BOT_REGS_BASE + 0x0F0)) +#define REG_LGYFB_BOT_DITHPATT0 ((vu32*)(LGYFB_BOT_REGS_BASE + 0x100)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each. +#define REG_LGYFB_BOT_DITHPATT1 ((vu32*)(LGYFB_BOT_REGS_BASE + 0x108)) // 2 u32 regs with 4x2 pattern bits (mask 0xCCCC) each. +// TODO: Missing scaling regs. +#define LGYFB_BOT_FIFO *((vu32*)(0x10310000)) -static bool flag = false; +static bool g_frameReady = false; @@ -46,7 +52,7 @@ static void lgyFbDmaIrqHandler(UNUSED u32 intSource) else vtotal = 414; // Faster than GBA. REG_LCD_PDC0_VTOTAL = vtotal; - atomic_store_explicit(&flag, true, memory_order_relaxed); + atomic_store_explicit(&g_frameReady, true, memory_order_relaxed); } void LGYFB_init(void) @@ -58,7 +64,7 @@ void LGYFB_init(void) REG_LGYFB_TOP_STAT = LGYFB_IRQ_MASK; REG_LGYFB_TOP_IRQ = 0; REG_LGYFB_TOP_ALPHA = 0xFF; - REG_LGYFB_TOP_CNT = LGYFB_DMA_E | LGYFB_OUT_SWIZZLE | LGYFB_OUT_FMT_5551 | LGYFB_ENABLE; + REG_LGYFB_TOP_CNT = LGYFB_DMA_E | LGYFB_OUT_SWIZZLE | LGYFB_OUT_FMT_8880 | LGYFB_ENABLE; IRQ_registerIsr(IRQ_CDMA_EVENT0, 13, 0, lgyFbDmaIrqHandler); } @@ -70,7 +76,7 @@ alignas(16) static const u8 firstList[1136] = 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x03, 0x1C, 0x01, 0x2F, 0x80, 0x00, 0x00, 0x03, 0x03, 0xF0, 0xF0, 0x18, 0x01, 0xF0, 0xF0, 0x18, 0x01, 0x6E, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x16, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x01, 0x0F, 0x00, + 0x16, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x17, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x12, 0x01, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x45, 0x00, @@ -115,7 +121,7 @@ alignas(16) static const u8 firstList[1136] = 0x18, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x4F, 0x80, 0x00, 0x01, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x01, 0x00, 0x00, 0x00, 0x8E, 0x00, 0x0F, 0x00, 0x01, 0x10, 0x01, 0x00, 0x80, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0x07, 0x00, @@ -169,7 +175,7 @@ alignas(16) static const u8 secondList[448] = 0x01, 0x00, 0x00, 0x00, 0x10, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x06, 0x03, 0x1C, 0x01, 0x2F, 0x80, 0x00, 0x00, 0x03, 0x03, 0xF0, 0xF0, 0x18, 0x01, 0xF0, 0xF0, 0x18, 0x01, 0x6E, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x16, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x02, 0x00, 0x17, 0x01, 0x0F, 0x00, + 0x16, 0x01, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x17, 0x01, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x01, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x12, 0x01, 0x3F, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x45, 0x00, @@ -223,16 +229,16 @@ alignas(16) static const u8 secondList[448] = } GX_processCommandList(listSize, list); GFX_waitForP3D(); - GX_displayTransfer((u32*)(0x18180000 + (16 * 240 * 2)), 368u<<16 | 240u, - GFX_getFramebuffer(SCREEN_TOP) + (16 * 240 * 2), 368u<<16 | 240u, 3u<<12 | 3u<<8); + GX_displayTransfer((u32*)(0x18180000 + (16 * 240 * 3)), 368u<<16 | 240u, + GFX_getFramebuffer(SCREEN_TOP) + (16 * 240 * 3), 368u<<16 | 240u, 1u<<12 | 1u<<8); GFX_waitForPPF(); } void LGYFB_processFrame(void) { - if(atomic_load_explicit(&flag, memory_order_relaxed)) + if(atomic_load_explicit(&g_frameReady, memory_order_relaxed)) { - atomic_store_explicit(&flag, false, memory_order_relaxed); + atomic_store_explicit(&g_frameReady, false, memory_order_relaxed); // Rotate the 240x160 frame using the GPU. rotateFrame(); diff --git a/source/arm11/hardware/lgyfb.dma330 b/source/arm11/hardware/lgyfb.dma330 index 61029bd..ffb0ff1 100644 --- a/source/arm11/hardware/lgyfb.dma330 +++ b/source/arm11/hardware/lgyfb.dma330 @@ -16,7 +16,7 @@ LPFE # LgyFb sometimes (at the end of each scanline?) sends # single requests. Since we can transfer all 8 scanlines # with bursts only we will ignore them. - LP 31 + LP 47 LDB STB LPENDB diff --git a/source/arm11/main.c b/source/arm11/main.c index ae1add4..8823d61 100644 --- a/source/arm11/main.c +++ b/source/arm11/main.c @@ -30,7 +30,7 @@ int main(void) { - GFX_init(GFX_RGB5A1, GFX_RGB565); + GFX_init(GFX_BGR8, GFX_RGB565); GFX_setBrightness(DEFAULT_BRIGHTNESS, DEFAULT_BRIGHTNESS); consoleInit(SCREEN_BOT, NULL); //CODEC_init();