Automatically enumerate IPC cmds.
Actually power off bottom screen backlight instead of dimming it to basically off.
This commit is contained in:
parent
1a93fd579d
commit
2e8f7d92a5
|
@ -67,6 +67,13 @@ typedef enum
|
|||
GFX_EVENT_P3D = 5u
|
||||
} GfxEvent;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GFX_BLIGHT_BOT = 1u<<2,
|
||||
GFX_BLIGHT_TOP = 1u<<4,
|
||||
GFX_BLIGHT_BOTH = GFX_BLIGHT_TOP | GFX_BLIGHT_BOT
|
||||
} GfxBlight;
|
||||
|
||||
|
||||
|
||||
void GFX_init(GfxFbFmt fmtTop, GfxFbFmt fmtBot);
|
||||
|
@ -80,6 +87,10 @@ void GFX_deinit(void);
|
|||
|
||||
void GFX_setFramebufFmt(GfxFbFmt fmtTop, GfxFbFmt fmtBot);
|
||||
|
||||
void GFX_powerOnBacklights(GfxBlight mask);
|
||||
|
||||
void GFX_powerOffBacklights(GfxBlight mask);
|
||||
|
||||
void GFX_setBrightness(u8 top, u8 bot);
|
||||
|
||||
void GFX_setForceBlack(bool top, bool bot);
|
||||
|
|
|
@ -29,24 +29,30 @@
|
|||
#define IPC_CMD_PARAMS_MASK(cmd) ((cmd) & 15u) // Max 15
|
||||
|
||||
|
||||
#define MAKE_CMD(id, inBufs, outBufs, params) ((id)<<8 | (inBufs)<<6 | (outBufs)<<4 | params)
|
||||
// https://stackoverflow.com/a/52770279
|
||||
// Note: __COUNTER__ is non standard.
|
||||
#define MAKE_CMD9(inBufs, outBufs, params) ((__COUNTER__ - _CMD9_C_BASE)<<8 | (inBufs)<<6 | (outBufs)<<4 | params)
|
||||
#define MAKE_CMD11(inBufs, outBufs, params) ((__COUNTER__ - _CMD11_C_BASE)<<8 | (inBufs)<<6 | (outBufs)<<4 | params)
|
||||
|
||||
enum {_CMD9_C_BASE = __COUNTER__ + 1}; // Start at 0.
|
||||
typedef enum
|
||||
{
|
||||
IPC_CMD9_PREPARE_GBA = MAKE_CMD(0, 0, 0, 2),
|
||||
IPC_CMD9_SET_GBA_RTC = MAKE_CMD(1, 0, 0, 2),
|
||||
IPC_CMD9_GET_GBA_RTC = MAKE_CMD(2, 0, 1, 0),
|
||||
IPC_CMD9_PREPARE_POWER = MAKE_CMD(3, 0, 0, 0)
|
||||
IPC_CMD9_PREPARE_GBA = MAKE_CMD9(0, 0, 2),
|
||||
IPC_CMD9_SET_GBA_RTC = MAKE_CMD9(0, 0, 2),
|
||||
IPC_CMD9_GET_GBA_RTC = MAKE_CMD9(0, 1, 0),
|
||||
IPC_CMD9_PREPARE_POWER = MAKE_CMD9(0, 0, 0)
|
||||
} IpcCmd9;
|
||||
|
||||
enum {_CMD11_C_BASE = __COUNTER__ + 1}; // Start at 0.
|
||||
typedef enum
|
||||
{
|
||||
IPC_CMD11_PRINT_MSG = MAKE_CMD(0, 0, 0, 0), // Invalid on purpose. Will be decided later.
|
||||
IPC_CMD11_PANIC = MAKE_CMD(1, 0, 0, 0),
|
||||
IPC_CMD11_EXCEPTION = MAKE_CMD(2, 0, 0, 0)
|
||||
IPC_CMD11_PRINT_MSG = MAKE_CMD11(0, 0, 0), // Invalid on purpose. Will be decided later.
|
||||
IPC_CMD11_PANIC = MAKE_CMD11(0, 0, 0),
|
||||
IPC_CMD11_EXCEPTION = MAKE_CMD11(0, 0, 0)
|
||||
} IpcCmd11;
|
||||
|
||||
#undef MAKE_CMD
|
||||
#undef MAKE_CMD9
|
||||
#undef MAKE_CMD11
|
||||
|
||||
|
||||
typedef struct
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
#include <string.h>
|
||||
#include <stdatomic.h>
|
||||
#include "types.h"
|
||||
#include "fb_assert.h"
|
||||
#include "hardware/gfx.h"
|
||||
#include "arm11/hardware/lcd.h"
|
||||
#include "arm11/hardware/gx.h"
|
||||
|
@ -163,7 +164,7 @@ void GFX_deinit(void)
|
|||
if(power & ~1u) // Poweroff backlights if on.
|
||||
{
|
||||
MCU_controlLCDPower(power & ~1u);
|
||||
if(MCU_waitEvents(0x3Fu<<24) != (power & ~1u)<<24) panic();
|
||||
if(MCU_waitEvents(0x3Fu<<24) != (u32)(power & ~1u)<<24) panic();
|
||||
}
|
||||
if(power & 1u) // Poweroff LCDs if on.
|
||||
{
|
||||
|
@ -245,8 +246,8 @@ static void setupFramebufs(GfxFbFmt fmtTop, GfxFbFmt fmtBot)
|
|||
g_gfxState.strides[0] = 240u * topPixSize; // No gap.
|
||||
g_gfxState.strides[1] = 240u * botPixSize; // No gap.
|
||||
|
||||
const u32 topSize = 400 * 240 * topPixSize;
|
||||
const u32 botSize = 320 * 240 * botPixSize;
|
||||
const u32 topSize = 400u * 240 * topPixSize;
|
||||
const u32 botSize = 320u * 240 * botPixSize;
|
||||
g_gfxState.framebufs[0][0] = vramAlloc(topSize); // Top A1 (3D left eye)
|
||||
void *botPtr = vramAlloc(botSize);
|
||||
g_gfxState.framebufs[1][0] = botPtr; // Bottom A1
|
||||
|
@ -398,6 +399,25 @@ static void waitLcdsReady(void)
|
|||
}
|
||||
}
|
||||
|
||||
void GFX_powerOnBacklights(GfxBlight mask)
|
||||
{
|
||||
fb_assert((mask & ~GFX_BLIGHT_BOTH) == 0u);
|
||||
g_gfxState.lcdPower |= mask;
|
||||
|
||||
mask <<= 1;
|
||||
MCU_controlLCDPower(mask); // Power on backlights.
|
||||
if(MCU_waitEvents(0x3Fu<<24) != (u32)mask<<24) panic();
|
||||
}
|
||||
|
||||
void GFX_powerOffBacklights(GfxBlight mask)
|
||||
{
|
||||
fb_assert((mask & ~GFX_BLIGHT_BOTH) == 0u);
|
||||
g_gfxState.lcdPower &= ~mask;
|
||||
|
||||
MCU_controlLCDPower(mask); // Power off backlights.
|
||||
if(MCU_waitEvents(0x3Fu<<24) != (u32)mask<<24) panic();
|
||||
}
|
||||
|
||||
void GFX_setBrightness(u8 top, u8 bot)
|
||||
{
|
||||
if(top > 64 || bot > 64) return;
|
||||
|
@ -410,8 +430,8 @@ void GFX_setBrightness(u8 top, u8 bot)
|
|||
|
||||
void GFX_setForceBlack(bool top, bool bot)
|
||||
{
|
||||
REG_LCD_ABL0_FILL = top<<24; // Force blackscreen
|
||||
REG_LCD_ABL1_FILL = bot<<24; // Force blackscreen
|
||||
REG_LCD_ABL0_FILL = (u32)top<<24; // Force blackscreen
|
||||
REG_LCD_ABL1_FILL = (u32)bot<<24; // Force blackscreen
|
||||
}
|
||||
|
||||
void GFX_setDoubleBuffering(u8 screen, bool dBuf)
|
||||
|
|
|
@ -41,7 +41,7 @@ int main(void)
|
|||
{
|
||||
#ifdef NDEBUG
|
||||
GFX_setForceBlack(false, true);
|
||||
GFX_setBrightness(DEFAULT_BRIGHTNESS, 0);
|
||||
GFX_powerOffBacklights(GFX_BLIGHT_BOT);
|
||||
#endif
|
||||
// Sync LgyFb start with LCD VBlank.
|
||||
GFX_waitForVBlank0();
|
||||
|
|
Loading…
Reference in New Issue