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

📄 panel.cpp

📁 Sm501 VGA芯片wince下驱动代码
💻 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 timeout;
	unsigned long status;

	while (vsync_count-- > 0)
	{
		// Wait for end of vsync.
		for (timeout = 0x200000; timeout > 0; timeout--)
		{
			status = FIELD_GET(peekRegisterDWord(CMD_INTPR_STATUS),
							   CMD_INTPR_STATUS,
							   PANEL_SYNC);
			if (status != CMD_INTPR_STATUS_PANEL_SYNC_ACTIVE)
				break;
		}

		// Wait for start of vsync.
		for (timeout = 0x200000; timeout > 0; timeout--)
		{
			status = FIELD_GET(peekRegisterDWord(CMD_INTPR_STATUS),
							   CMD_INTPR_STATUS, 
							   PANEL_SYNC);
			if (status != CMD_INTPR_STATUS_PANEL_SYNC_INACTIVE)
				break;
		}
	}
}


// Alternative method for getting vsync - through line counting.
VOID SMI::WaitVSync2(INT vsync_count, DWORD vsyncReg, DWORD lineReg)
{
	DWORD timeOut = 1000;	// 1 second
	DWORD vsyncStart = FIELD_GET(peekRegisterDWord(vsyncReg), PANEL_VERTICAL_SYNC, START);
	DWORD vsyncQuarter = vsyncStart / 4;
	while (vsync_count-- > 0)
	{
		// Make sure we are not in vsync this moment
		DWORD start = GetTickCountSafe();
		while (peekRegisterDWord(lineReg) >= vsyncQuarter)
		{
			if (GetTicksSince(start) >= timeOut)
			{
				// vsync seems to be inactive
				return;
			}
		}

		// Wait for vsync
		start = GetTickCountSafe();
		while (peekRegisterDWord(lineReg) <= vsyncStart)
		{
			if (GetTicksSince(start) >= timeOut)
			{
				// vsync seems to be inactive
				return;
			}
		}
	}
}

// Alternative method for getting panel vsync - through line counting.
VOID SMI::panelWaitVSync2(INT vsync_count)
{
	WaitVSync2(vsync_count, PANEL_VERTICAL_SYNC, PANEL_CURRENT_LINE);
}

// Alternative method for getting crt vsync - through line counting.
VOID SMI::crtWaitVSync2(INT vsync_count)
{
	WaitVSync2(vsync_count, CRT_VERTICAL_SYNC, CRT_CURRENT_LINE);
}

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 + -