📄 panel.cpp
字号:
#include "precomp.h"
///////////////////////////////////////////////////////////////////////////////
// Macro for printing debug messages
#if 1
// Print messages only in DEBUG mode
#define MESSAGE DEBUGMSG
#define MESSAGE_ZONE GPE_ZONE_WARNING
#else
// Force messages even in RELEASE mode
#define MESSAGE RETAILMSG
#define MESSAGE_ZONE 0
#endif
void SMI::panelWaitVSync(int vsync_count)
{
unsigned long start;
unsigned long timeout = 2000; // 2 seconds
unsigned long status;
while (vsync_count-- > 0)
{
// Wait for end of vsync.
start = GetTickCountSafe();
do
{
status = FIELD_GET(peekRegisterDWord(CMD_INTPR_STATUS),
CMD_INTPR_STATUS,
PANEL_SYNC);
}
while ((status == CMD_INTPR_STATUS_PANEL_SYNC_ACTIVE) &&
(GetTicksSince(start) < timeout));
// Wait for start of vsync.
start = GetTickCountSafe();
do
{
status = FIELD_GET(peekRegisterDWord(CMD_INTPR_STATUS),
CMD_INTPR_STATUS,
PANEL_SYNC);
}
while ((status == CMD_INTPR_STATUS_PANEL_SYNC_INACTIVE) &&
(GetTicksSince(start) < timeout));
}
}
void SMI::panelPowerSequence(panel_state_t on_off, int vsync_delay)
{
EnterCriticalSection(&m_PowerCriticalSection);
MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::panelPowerSequence\r\n")));
unsigned long panelControl = peekRegisterDWord(PANEL_DISPLAY_CTRL);
unsigned long panelControlMask =
_F_MASK(PANEL_DISPLAY_CTRL_FPVDDEN) |
_F_MASK(PANEL_DISPLAY_CTRL_DATA) |
_F_MASK(PANEL_DISPLAY_CTRL_VBIASEN) |
_F_MASK(PANEL_DISPLAY_CTRL_FPEN);
if (on_off == PANEL_ON)
{
unsigned long panelOn =
FIELD_SET(0, PANEL_DISPLAY_CTRL, FPVDDEN, HIGH) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, DATA, ENABLE) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, VBIASEN, HIGH) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, FPEN, HIGH);
if ((panelControl & panelControlMask) != panelOn)
{
// Turn on FPVDDEN.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, FPVDDEN, HIGH);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn on FPDATA.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, DATA, ENABLE);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn on FPVBIAS.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, VBIASEN, HIGH);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn on FPEN.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, FPEN, HIGH);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
}
else
{
MESSAGE(MESSAGE_ZONE, (TEXT("PANEL_ON is skipped - already on\r\n")));
}
}
else
{
unsigned long panelOff =
FIELD_SET(0, PANEL_DISPLAY_CTRL, FPVDDEN, LOW) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, DATA, DISABLE) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, VBIASEN, LOW) |
FIELD_SET(0, PANEL_DISPLAY_CTRL, FPEN, LOW);
if ((panelControl & panelControlMask) != panelOff)
{
// Turn off FPEN.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, FPEN, LOW);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn off FPVBIASEN.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, VBIASEN, LOW);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn off FPDATA.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, DATA, DISABLE);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
panelWaitVSync(vsync_delay);
// Turn off FPVDDEN.
panelControl = FIELD_SET(panelControl,
PANEL_DISPLAY_CTRL, FPVDDEN, LOW);
pokeRegisterDWord(PANEL_DISPLAY_CTRL, panelControl);
}
else
{
MESSAGE(MESSAGE_ZONE, (TEXT("PANEL_OFF is skipped - already off\r\n")));
}
}
MESSAGE(MESSAGE_ZONE, (TEXT("-SMI::panelPowerSequence\r\n")));
LeaveCriticalSection(&m_PowerCriticalSection);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -