⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 panel.cpp

📁 VoyagerGX display driver for Windows CE .NET 5.XX Silicon Motion, Inc. VoyagerGX Driver is architec
💻 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 + -