亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? power.cpp

?? SM501基于ARMV4/ARMV4I平臺
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
// -----------------------------------------------------------------------------
//
//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
//  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
//  PARTICULAR PURPOSE.
//  Copyright (c) 2002 Silicon Motion, Inc.
//
//  Module Name:	power.cpp
//
//  Abstract:		Power Management
//
// -----------------------------------------------------------------------------

#include "precomp.h"
#include "smi.h"

#ifdef USE_WATCHDOG
#include <pm.h>
#include <msgqueue.h>
#endif


///////////////////////////////////////////////////////////////////////////////
// The periodicity in seconds for the thread function to check if the power
// consumption can be adjusted for the chip's modules.

#define POWER_CHECK_DELAY 30


///////////////////////////////////////////////////////////////////////////////
// Power broadcast message size. The message consists of the two structures:
// POWER_BROADCAST and POWER_BROADCAST_POWER_INFO. The later is embedded into
// the first starting from SystemPowerState member.

#ifdef USE_WATCHDOG
#define MESSAGE_SIZE \
	(sizeof(POWER_BROADCAST) + \
	 sizeof(POWER_BROADCAST_POWER_INFO) - \
	 sizeof(PPOWER_BROADCAST(0)->SystemPowerState))
#endif


///////////////////////////////////////////////////////////////////////////////
// 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 1
#endif


BOOL
WINAPI
GetSystemPowerStatusEx(
    PSYSTEM_POWER_STATUS_EX pSystemPowerStatusEx,
	BOOL fUpdate
    );

///////////////////////////////////////////////////////////////////////////////
// Define to see ALL messages

//#define ENABLE_ALL_MESSAGES


#ifdef USE_WATCHDOG
///////////////////////////////////////////////////////////////////////////////
// The thread function awaits for changes in the power source type from
// AC to DC and vice versa. In the mean time if the timeout has occured
// (no change in power has been detected for a while), the function will
// check the activity for each supported module of the chip to determine
// whether the power consumption can be reduced.

DWORD WINAPI PowerManagementThread(LPVOID lpParameter)
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+PowerManagementThread\r\n")));
	SMI* pSMI = (SMI*)lpParameter;

	while (1)
	{
		// Wait for a message.
		MESSAGE(MESSAGE_ZONE, (TEXT("PowerManagementThread: entering WaitForSingleObject\r\n")));
		DWORD dwResult = WaitForSingleObject(
			pSMI->GetPMMessageQueue(), POWER_CHECK_DELAY * 1000);

		if (dwResult == WAIT_OBJECT_0)
		{
			// Received a message.
			MESSAGE(MESSAGE_ZONE, (TEXT("PowerManagementThread: received a message\r\n")));

			// Init message buffer.
			// Message buffer size is a size of combined structures
			// POWER_BROADCAST and POWER_BROADCAST_POWER_INFO, where
			// the latter is located starting from SystemPowerState member
			// of the first.
			BYTE MessageBuffer[MESSAGE_SIZE];
			PPOWER_BROADCAST PowerBroadcast =
				(PPOWER_BROADCAST)&MessageBuffer;
			PPOWER_BROADCAST_POWER_INFO PowerInfo =
				(PPOWER_BROADCAST_POWER_INFO)&MessageBuffer +
				FIELD_OFFSET(POWER_BROADCAST, SystemPowerState);

			// These're required by ReadMsgQueue.
			DWORD BytesRead;
			DWORD Flags;

			BOOL bOk = ReadMsgQueue(
				pSMI->GetPMMessageQueue(),	// Queue handle.
				PowerBroadcast,				// Buffer pointer.
				MESSAGE_SIZE,				// Buffer size.
				&BytesRead,					// [out] number of bytes read.
				0,							// Don't wait, just read.
				&Flags);					// [out] Message flags.

			if (bOk)
			{
				if (PowerBroadcast->Message == PBT_POWERINFOCHANGE)
				{
					if (pSMI->IsMonitorEnabled())
					{
#if 0
						// It has been decided to remove the power level adjustment
						// from the PBT_POWERINFOCHANGE message and leave the power
						// level management completely up to the timeout mechanism.
						// This is done while pursuing two goals. First to centralize
						// the control to one mechanism only and secondly, to prevent
						// possible screen corruptions during the boot time noticed on
						// some Fujitsu systems (03/10/04).
						SYSTEM_POWER_STATUS_EX PowerStatus;
						if (GetSystemPowerStatusEx(&PowerStatus, TRUE))
						{
							switch (PowerStatus.ACLineStatus)
							{
							case 0:
								// DC mode.
								MESSAGE(MESSAGE_ZONE, (TEXT("DC Power Mode Switch Detected.\r\n")));
								if (pSMI->GetCurrentPowerState() < VGXPowerStandBy)
								{
									pSMI->SetVGXPowerManagement(VGXPowerReduced);
								}
								break;

							case 1:
								// AC mode.
								MESSAGE(MESSAGE_ZONE, (TEXT("AC Power Mode Switch Detected.\r\n")));
								if (pSMI->GetCurrentPowerState() < VGXPowerStandBy)
								{
									pSMI->SetVGXPowerManagement(VGXPowerOn);
								}
								break;

							default:
								MESSAGE(MESSAGE_ZONE, (TEXT("Unknown power mode: %d\r\n"), PowerStatus.ACLineStatus));
							}
						}
						else
						{
							MESSAGE(MESSAGE_ZONE, (TEXT("GetSystemPowerStatusEx failed\r\n")));
						}
#endif
					}
					else
					{
						MESSAGE(MESSAGE_ZONE, (TEXT("Power Monitor is currently disabled\r\n")));
					}
				}
				else
				{
					MESSAGE(MESSAGE_ZONE, (TEXT("The message is not PBT_POWERINFOCHANGE (%d)\r\n"), PowerBroadcast->Message));
				}
			}
			else
			{
				MESSAGE(MESSAGE_ZONE, (TEXT("ReadMsgQueue failed (%d)\r\n"), GetLastError()));
			}
		}
		else if (dwResult == WAIT_TIMEOUT)
		{
			MESSAGE(MESSAGE_ZONE, (TEXT("Timeout has occured.\r\n")));

			// Make sure the system is not in power down mode
			if (pSMI->GetCurrentPowerState() < VGXPowerStandBy)
			{
				MESSAGE(MESSAGE_ZONE, (TEXT("Checking if the power consumption can be reduced.\r\n")));
				MESSAGE(MESSAGE_ZONE, (TEXT("Current tick count = %u\r\n"), pSMI->GetTickCountSafe()));
				MESSAGE(MESSAGE_ZONE, (TEXT("Ticks to Minimal   = %u\r\n"), pSMI->GetTicksToMinimal()));
				MESSAGE(MESSAGE_ZONE, (TEXT("Ticks to Reduced   = %u\r\n"), pSMI->GetTicksToReduced()));

				// Check whether the monitor is enabled
				if (pSMI->IsMonitorEnabled())
				{
					// Check if we can switch to minimal mode
					DWORD Idle = pSMI->GetTicksSince(pSMI->GetReducedLastRequested());

					MESSAGE(MESSAGE_ZONE, (TEXT("Checking for Minimal mode:\r\n")));
					MESSAGE(MESSAGE_ZONE, (TEXT("* Tick count when Reduced was last requested ... : %u\r\n"), pSMI->GetReducedLastRequested()));
					MESSAGE(MESSAGE_ZONE, (TEXT("* Ticks since Reduced last requested ........... : %u\r\n"), Idle));

					if (Idle >= pSMI->GetTicksToMinimal())
					{
						if (pSMI->GetCurrentPowerState() < VGXPowerMinimal)
						{
							pSMI->SetVGXPowerManagement(VGXPowerMinimal);
						}
						else
						{
							MESSAGE(MESSAGE_ZONE, (TEXT("* The current power mode is slower or equal to the requested:\r\n")));
							MESSAGE(MESSAGE_ZONE, (TEXT("    Current: %d\r\n"), pSMI->GetCurrentPowerState()));
							MESSAGE(MESSAGE_ZONE, (TEXT("    Requested: %d\r\n"), VGXPowerMinimal));
						}
					}

					else
					{
						// Check if we can switch to reduced mode
						Idle = pSMI->GetTicksSince(pSMI->GetPowerOnLastRequested());

						MESSAGE(MESSAGE_ZONE, (TEXT("Checking for Reduced mode:\r\n")));
						MESSAGE(MESSAGE_ZONE, (TEXT("* Tick count when Full Power mode was last requested ... : %u\r\n"), pSMI->GetPowerOnLastRequested()));
						MESSAGE(MESSAGE_ZONE, (TEXT("* Ticks since Full Power mode last requested ........... : %u\r\n"), Idle));

						if (Idle >= pSMI->GetTicksToReduced())
						{
							if (pSMI->GetCurrentPowerState() < VGXPowerReduced)
							{
								MESSAGE(MESSAGE_ZONE, (TEXT("* SWITCHING...\r\n")));
								pSMI->SetVGXPowerManagement(VGXPowerReduced);
							}
							else
							{
								MESSAGE(MESSAGE_ZONE, (TEXT("* The current power mode is slower or equal to the requested:\r\n")));
								MESSAGE(MESSAGE_ZONE, (TEXT("    Current: %d\r\n"), pSMI->GetCurrentPowerState()));
								MESSAGE(MESSAGE_ZONE, (TEXT("    Requested: %d\r\n"), VGXPowerReduced));
							}
						}
					}
				}
				else
				{
					MESSAGE(MESSAGE_ZONE, (TEXT("The Power Monitor is disabled.\r\n")));
				}

				// Check if we can switch off any of the managed devices
				for (DWORD i = 0; i < VGXPM_MODULE_COUNT; i++)
				{
					// Check whether the monitor is enabled on the module
					BOOL bEnabled;
					pSMI->GetModuleMonitorEnabled((VGXPM_MODULES)i, bEnabled);

					if (bEnabled)
					{
						// Get the amount of ticks of the last call
						DWORD LastCallTickCount;
						pSMI->GetLastCallTickCount((VGXPM_MODULES)i, LastCallTickCount);

						// Calculate the idle time
						DWORD Idle = pSMI->GetTicksSince(LastCallTickCount);

						// Get the amount of ticks before power down
						DWORD TicksToPowerDown;
						pSMI->GetTicksToPowerDown((VGXPM_MODULES)i, TicksToPowerDown);

						MESSAGE(MESSAGE_ZONE, (TEXT("Module %u\r\n"), i));
						MESSAGE(MESSAGE_ZONE, (TEXT("* Idle = %u, TicksToPowerDown = %u\r\n"), Idle, TicksToPowerDown));

						// Check if it's time to switch off the power
						if (Idle >= TicksToPowerDown)
						{
							// Get the current module power state
							VGX_POWER_STATE PowerState;
							pSMI->GetModulePower((VGXPM_MODULES)i, PowerState);

							if (PowerState != VGXPowerOff)
							{
								MESSAGE(MESSAGE_ZONE, (TEXT("* SWITCHING OFF\r\n")));
								pSMI->SetModulePower((VGXPM_MODULES)i, VGXPowerOff);
							}
							else
							{
								MESSAGE(MESSAGE_ZONE, (TEXT("* The module is already off\r\n")));
							}
						}
					}
					else
					{
						MESSAGE(MESSAGE_ZONE, (TEXT("The Module Power Monitor is disabled for module #%u\r\n"), i));
					}
				}
			}
			else
			{
				MESSAGE(MESSAGE_ZONE, (TEXT("The system is in power down mode, the timeout is ignored.\r\n")));
			}
		}
	}

	return 0;
}
#endif


///////////////////////////////////////////////////////////////////////////////
// Returns the tick count.

DWORD SMI::GetTickCountSafe()
{
	static DWORD LastTickCount = 0;

	if (m_bInPowerHandler)
	{
		// We are currently called in PowerHandler's context, where we cannot
		// call certain APIs, otherwise exception will be raised.  Advance the
		// current tick counter so that internal time loops won't hang.
		LastTickCount++;
	}
	else
	{
		LastTickCount = GetTickCount();
	}

	return LastTickCount;
}


///////////////////////////////////////////////////////////////////////////////
// Returns the amount of ticks since the specified time mark.

DWORD SMI::GetTicksSince(DWORD Mark)
{
	DWORD CurrentCount = GetTickCountSafe();
	return (Mark <= CurrentCount)?
		CurrentCount - Mark : 0xFFFFFFFF - (Mark - CurrentCount - 1);
}


///////////////////////////////////////////////////////////////////////////////
// This function is called in response to GETPOWERMANAGEMENT message.

DWORD SMI::HandleGetPowerManagement(DWORD cjIn, PVOID pvIn, DWORD cjOut, PVOID pvOut)
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::HandleGetPowerManagement\r\n")));

	DWORD dwResult;

	if ((cjOut >= sizeof(VIDEO_POWER_MANAGEMENT)) && (pvOut != NULL))
	{
		PVIDEO_POWER_MANAGEMENT pParam;
		pParam = (PVIDEO_POWER_MANAGEMENT)pvOut;
		pParam->Length      = sizeof(VIDEO_POWER_MANAGEMENT);
		pParam->DPMSVersion = 0;
		pParam->PowerState  = GetCurrentPowerState();
		dwResult = VGXPM_RET_SUCCESS;
	}
	else
	{
		SetLastError(ERROR_INVALID_PARAMETER);
		dwResult = VGXPM_RET_INVALID_PARAMETER;
	}

	MESSAGE(MESSAGE_ZONE, (TEXT("-SMI::HandleGetPowerManagement\r\n")));
	return dwResult;
}


///////////////////////////////////////////////////////////////////////////////
// This function is called in response to SETPOWERMANAGEMENT message.

DWORD SMI::HandleSetPowerManagement(DWORD cjIn, PVOID pvIn, DWORD cjOut, PVOID pvOut)
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::HandleSetPowerManagement\r\n")));

	DWORD dwResult;

	if ((cjIn >= sizeof(VIDEO_POWER_MANAGEMENT)) && (pvIn != NULL))
	{
		PVIDEO_POWER_MANAGEMENT pParam;
		pParam = (PVIDEO_POWER_MANAGEMENT)pvIn;
		SetPowerManagement((VIDEO_POWER_STATE)pParam->PowerState);
		dwResult = VGXPM_RET_SUCCESS;
	}
	else
	{
		SetLastError(ERROR_INVALID_PARAMETER);
		dwResult = VGXPM_RET_INVALID_PARAMETER;
	}

	MESSAGE(MESSAGE_ZONE, (TEXT("-SMI::HandleSetPowerManagement\r\n")));
	return dwResult;
}


///////////////////////////////////////////////////////////////////////////////
// SMI Power Management API external entry point.

DWORD SMI::HandleSMIPowerManagement(DWORD cjIn, PVOID pvIn, DWORD cjOut, PVOID pvOut)
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::HandleSMIPowerManagement\r\n")));

	DWORD dwResult = VGXPM_RET_INVALID_PARAMETER;

	// Make sure the input structure is valid
	if ((cjIn >= sizeof(VGXPM_STRUCT)) && (pvIn != NULL))
	{
		PVGXPM_STRUCT pIn = (PVGXPM_STRUCT)pvIn;

		switch (pIn->Command)
		{
		case VGXPMCMD_INIT:
			if ((cjIn  == sizeof(VGXPM_STRUCT)) &&
				(cjOut == 0) && (pvOut == NULL))
			{
				dwResult = StartPowerThread();
			}
			else
			{
				MESSAGE(MESSAGE_ZONE,
					(TEXT("HandleSMIPowerManagement: invalid VGXPMCMD_INIT parameters\r\n")));
			}
			break;

		case VGXPMCMD_SET_MONITOR:
			if ((cjIn  == sizeof(VGXPM_MONITOR_STRUCT)) &&
				(cjOut == 0) && (pvOut == NULL))
			{
				PVGXPM_MONITOR_STRUCT pSetMonitor = (PVGXPM_MONITOR_STRUCT)pvIn;
				SetMonitorEnabled(pSetMonitor->bMonitorEnabled);
				dwResult = VGXPM_RET_SUCCESS;
			}
			else
			{
				MESSAGE(MESSAGE_ZONE,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本一本大道香蕉久在线精品| 91精品国产麻豆| 亚洲va韩国va欧美va精品| 777久久久精品| 成人av网站大全| 日本欧美肥老太交大片| 中文字幕一区二区三区视频 | 欧美亚洲一区二区三区四区| 久久91精品久久久久久秒播| 亚洲在线视频网站| 久久久www成人免费毛片麻豆| 欧美三级日韩三级| 99久久精品免费| 国产曰批免费观看久久久| 亚洲福利视频一区二区| 亚洲欧洲av色图| 久久亚洲精精品中文字幕早川悠里| 欧美艳星brazzers| av在线播放成人| 国产成人免费在线观看不卡| 奇米色一区二区| 午夜国产不卡在线观看视频| 亚洲精品国久久99热| 欧美高清在线一区| 久久蜜桃av一区二区天堂| 91精品国产色综合久久| 在线观看视频一区二区欧美日韩| 成人av网站在线观看免费| 色婷婷亚洲综合| 亚洲丝袜美腿综合| 国产欧美中文在线| 欧美精品一区二区久久婷婷| 欧美福利一区二区| 欧美色欧美亚洲另类二区| 91啪九色porn原创视频在线观看| 国产精品99久久久久久有的能看| 久久成人免费日本黄色| 日韩精品1区2区3区| 午夜天堂影视香蕉久久| 午夜精品aaa| 日本va欧美va精品发布| 日韩av一区二区三区| 午夜精品福利在线| 日韩精品91亚洲二区在线观看| 丝袜美腿亚洲综合| 日韩精品色哟哟| 日本欧美一区二区三区乱码| 免费人成网站在线观看欧美高清| 丝袜美腿亚洲色图| 日本欧美一区二区| 国产麻豆一精品一av一免费| 国产盗摄女厕一区二区三区| 国产成人免费视频精品含羞草妖精| 国产精品一区二区在线观看不卡| 国产麻豆精品一区二区| 成人毛片老司机大片| 9色porny自拍视频一区二区| av电影在线观看完整版一区二区| 99精品视频一区二区| 91麻豆精品一区二区三区| 欧美专区在线观看一区| 91精品欧美久久久久久动漫 | 精品国产乱码久久| 日韩欧美一级片| 精品成人一区二区| 久久久久99精品国产片| 中文字幕在线观看不卡| 亚洲综合丁香婷婷六月香| 日日夜夜免费精品视频| 久久91精品国产91久久小草| caoporm超碰国产精品| 91尤物视频在线观看| 精品视频一区 二区 三区| 欧美一区二区三区四区久久| 久久久久久久综合色一本| 中文字幕中文字幕中文字幕亚洲无线| 亚洲三级视频在线观看| 日本欧美一区二区三区乱码| 国产成人午夜视频| 一本色道久久加勒比精品| 欧美一区二区观看视频| 中文字幕欧美激情| 亚洲成av人在线观看| 国产精品77777| 欧美视频完全免费看| 久久精品无码一区二区三区| 亚洲一区视频在线| 国内精品久久久久影院色| 91在线播放网址| 精品免费视频一区二区| 亚洲免费观看高清完整版在线观看| 日韩高清国产一区在线| av中文字幕一区| 精品捆绑美女sm三区| 一区二区理论电影在线观看| 狠狠色狠狠色合久久伊人| 精品一区二区三区在线观看国产| 一本到不卡免费一区二区| 91久久线看在观草草青青| 奇米四色…亚洲| 欧美午夜一区二区三区| 久久蜜桃香蕉精品一区二区三区| 亚洲午夜激情网页| 国产69精品久久777的优势| 欧美日韩高清在线| 国产精品久久久久aaaa| 免费成人在线播放| 在线观看视频91| 自拍偷拍亚洲激情| 国产精选一区二区三区| 欧美一级淫片007| 亚洲图片欧美色图| 97aⅴ精品视频一二三区| 亚洲精品一区二区三区福利| 午夜影视日本亚洲欧洲精品| 91在线观看地址| 国产欧美日韩卡一| 奇米精品一区二区三区在线观看| 在线亚洲高清视频| 中文字幕一区日韩精品欧美| 美女视频免费一区| 欧美日韩mp4| 一区二区三区波多野结衣在线观看 | 一区二区三区产品免费精品久久75| 国产精品88888| 精品处破学生在线二十三| 日韩精品一卡二卡三卡四卡无卡| 色猫猫国产区一区二在线视频| 国产精品色噜噜| 福利电影一区二区三区| xnxx国产精品| 精品一区二区日韩| 精品剧情v国产在线观看在线| 日本少妇一区二区| 91精品国产综合久久婷婷香蕉 | 99久久精品情趣| 欧美国产日本视频| 国产一区二区不卡在线| 日韩免费一区二区| 精品一区二区三区在线视频| 精品国产乱码久久久久久夜甘婷婷| 免费人成精品欧美精品| 欧美一区二区三区免费| 五月天亚洲精品| 91麻豆精品国产| 激情综合网天天干| 精品99一区二区三区| 国产精品1区2区3区| 国产欧美精品国产国产专区| 国产成人免费在线观看| 中文字幕在线观看不卡视频| 色一区在线观看| 性感美女久久精品| 日韩一区二区麻豆国产| 国产在线精品一区二区三区不卡| 久久精品亚洲一区二区三区浴池| 国产又黄又大久久| 国产精品久久久久aaaa樱花 | 亚洲欧洲日韩一区二区三区| 99久久99久久精品国产片果冻| 一区二区三区小说| 欧美日本韩国一区二区三区视频| 免费一级欧美片在线观看| 欧美久久久久久久久中文字幕| 美国十次综合导航| 日本一区二区高清| 在线观看日韩电影| 麻豆精品视频在线| 亚洲国产精品黑人久久久| 色欧美片视频在线观看在线视频| 日韩欧美电影在线| |精品福利一区二区三区| 色av一区二区| 精油按摩中文字幕久久| 国产精品剧情在线亚洲| 欧美日韩精品一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ| 久久综合给合久久狠狠狠97色69| 99在线热播精品免费| 亚洲第一久久影院| 久久奇米777| 色综合久久99| 精油按摩中文字幕久久| 一卡二卡欧美日韩| 久久嫩草精品久久久久| 色av成人天堂桃色av| 免费成人av在线| 中文字幕一区二区三区不卡在线| 欧美二区乱c少妇| 粉嫩av一区二区三区在线播放| 一区二区三区日韩精品视频| 精品国产乱码久久久久久影片| 在线观看日韩毛片| 成人在线综合网站| 日韩av中文字幕一区二区| 国产精品毛片大码女人| 欧美欧美欧美欧美首页| 99精品欧美一区| 国产伦精品一区二区三区在线观看| 一区二区高清在线|