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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pwm.cpp

?? SM501基于ARMV4/ARMV4I平臺
?? CPP
字號:
// -----------------------------------------------------------------------------
//
//  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:	pwm.cpp
//
//  Abstract:		Pulse Width Modulation API
//
// -----------------------------------------------------------------------------

#include "precomp.h"
#include "pwm.h"
#include "smi.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


///////////////////////////////////////////////////////////////////////////////
// Returns field mask

#define FIELD_MASK(f) ((1 << _F_SIZE(f)) - 1)


///////////////////////////////////////////////////////////////////////////////
// PWM API Command Handler.

ULONG SMI::HandleSMIPWMAPI(ULONG cjIn, PVOID pvIn, ULONG cjOut, PVOID pvOut)
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::HandleSMIPWMAPI\r\n")));
	ULONG ulRetVal = VGXPWM_INVALID_PARAMETER;

	if ((cjIn == sizeof(VGXPWM_STRUCT)) && (pvIn != NULL))
	{
		PVGXPWM_STRUCT pIn = (PVGXPWM_STRUCT)pvIn;

		switch (pIn->Command)
		{
		case VGXPWMCMD_INIT:
			ulRetVal = pwmInit(pIn->PWMIndex, pIn->wLowCounter,
				pIn->wHighCounter, pIn->byClockDivider, pIn->bIntEnable);
			break;

		case VGXPWMCMD_START:
			ulRetVal = pwmStart(pIn->PWMIndex);
			break;

		case VGXPWMCMD_STOP:
			ulRetVal = pwmStop(pIn->PWMIndex);
			break;

		default:
			MESSAGE(MESSAGE_ZONE, (TEXT("SMI::HandleSMIPWMAPI: invalid command has been specified\r\n")));
		}
	}
	else
	{
		MESSAGE(MESSAGE_ZONE,
			(TEXT("SMI::HandleSMIPWMAPI: invalid input structure\r\n")));
	}

	if (ulRetVal == VGXPWM_INVALID_PARAMETER)
		SetLastError(ERROR_INVALID_PARAMETER);

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


///////////////////////////////////////////////////////////////////////////////
// PWM Interrupt Handler.

VOID SMI::pwmIntHandler()
{
	DWORD pwmStatus;

	// Test PWM 0.
	pwmStatus = peekRegisterDWord(PWM_0);
	if (FIELD_GET(pwmStatus, PWM_0, INTERRUPT_STATUS) == PWM_0_INTERRUPT_STATUS_PENDING)
	{
		pokeRegisterDWord(PWM_0, pwmStatus);
		if (FIELD_GET(pwmStatus, PWM_0, STATUS) == PWM_0_STATUS_ENABLE)
		{
			SetEvent(m_PWMInfo[VGXPWM0].hIntEvent);
		}
	}

	// Test PWM 1.
	pwmStatus = peekRegisterDWord(PWM_1);
	if (FIELD_GET(pwmStatus, PWM_1, INTERRUPT_STATUS) == PWM_1_INTERRUPT_STATUS_PENDING)
	{
		pokeRegisterDWord(PWM_1, pwmStatus);
		if (FIELD_GET(pwmStatus, PWM_1, STATUS) == PWM_1_STATUS_ENABLE)
		{
			SetEvent(m_PWMInfo[VGXPWM1].hIntEvent);
		}
	}

	// Test PWM 2.
	pwmStatus = peekRegisterDWord(PWM_2);
	if (FIELD_GET(pwmStatus, PWM_2, INTERRUPT_STATUS) == PWM_2_INTERRUPT_STATUS_PENDING)
	{
		pokeRegisterDWord(PWM_2, pwmStatus);
		if (FIELD_GET(pwmStatus, PWM_2, STATUS) == PWM_2_STATUS_ENABLE)
		{
			SetEvent(m_PWMInfo[VGXPWM2].hIntEvent);
		}
	}
}


///////////////////////////////////////////////////////////////////////////////
// PWM Interrupt Handler Entry.

VOID pwmIntHandlerEntry(SMI* pSMI)
{
	pSMI->pwmIntHandler();
}


///////////////////////////////////////////////////////////////////////////////
// Initialization routine, called once during start up.

VOID SMI::InitPulseWidthModulation()
{
	// Init done flag
	static BOOL bInitDone = FALSE;

	if (!bInitDone)
	{
		MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::InitPulseWidthModulation\r\n")));

		// Init the info array
		ZeroMemory(&m_PWMInfo, sizeof(m_PWMInfo));

		// Init PWM address
		m_PWMInfo[VGXPWM0].PWMAddress = PWM_0;
		m_PWMInfo[VGXPWM1].PWMAddress = PWM_1;
		m_PWMInfo[VGXPWM2].PWMAddress = PWM_2;

		// Init event names
		m_PWMInfo[VGXPWM0].lpszIntEventName = PWM0_INT_EVENT_NAME;
		m_PWMInfo[VGXPWM1].lpszIntEventName = PWM1_INT_EVENT_NAME;
		m_PWMInfo[VGXPWM2].lpszIntEventName = PWM2_INT_EVENT_NAME;

		bInitDone = TRUE;
	}

	MESSAGE(MESSAGE_ZONE, (TEXT("-SMI::InitPulseWidthModulation\r\n")));
}


///////////////////////////////////////////////////////////////////////////////
// Initializes the selected PWM module.

ULONG SMI::pwmInit(
	VGXPWM_INDEX PWMIndex,	// PWM Index
	WORD wLowCounter,		// Low counter
	WORD wHighCounter,		// High counter
	BYTE byClockDivider,	// Clock divider
	BOOL bIntEnable)		// Interrupt enable
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::pwmInit\r\n")));
	ULONG nResult = VGXPWM_SUCCESS;

	// Perform the generic init
	InitPulseWidthModulation();

	// Make sure we're within range
	if ((PWMIndex < VGXPWM0) || (PWMIndex >= VGXPWMCOUNT))
	{
		MESSAGE(MESSAGE_ZONE,
			(TEXT("SMI::pwmInit: invalid PWM has been specified\r\n")));
		nResult = VGXPWM_INVALID_PARAMETER;
	}
	else
	{
#ifdef DISABLE_INTERRUPT_MANAGEMENT
		if (bIntEnable)
		{
			nResult = VGXPWM_INT_NOT_SUPPORTED;
		}
		else
		{
			// Close event handle
			if (m_PWMInfo[PWMIndex].hIntEvent)
			{
				CloseHandle(m_PWMInfo[PWMIndex].hIntEvent);
				m_PWMInfo[PWMIndex].hIntEvent = NULL;
			}

			// Init vars
			m_PWMInfo[PWMIndex].wLowCounter    = wLowCounter;
			m_PWMInfo[PWMIndex].wHighCounter   = wHighCounter;
			m_PWMInfo[PWMIndex].byClockDivider = byClockDivider;
			m_PWMInfo[PWMIndex].bIntEnable     = bIntEnable;
		}
#else
		// Close event handle
		if (m_PWMInfo[PWMIndex].hIntEvent)
		{
			CloseHandle(m_PWMInfo[PWMIndex].hIntEvent);
			m_PWMInfo[PWMIndex].hIntEvent = NULL;
		}

		// Init vars
		m_PWMInfo[PWMIndex].wLowCounter    = wLowCounter;
		m_PWMInfo[PWMIndex].wHighCounter   = wHighCounter;
		m_PWMInfo[PWMIndex].byClockDivider = byClockDivider;
		m_PWMInfo[PWMIndex].bIntEnable     = bIntEnable;
#endif
	}

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


///////////////////////////////////////////////////////////////////////////////
// Creates a PWM interrupt event if needed.

BOOL SMI::CreatePWMEvent(PWM_STRUCT& PWMInfo)
{
	BOOL bResult = TRUE;

	if (PWMInfo.hIntEvent)
	{
		if (!PWMInfo.bIntEnable)
		{
			CloseHandle(PWMInfo.hIntEvent);
			PWMInfo.hIntEvent = NULL;
		}
	}
	else
	{
		if (PWMInfo.bIntEnable)
		{
			PWMInfo.hIntEvent = CreateEvent(
				NULL, FALSE, FALSE, PWMInfo.lpszIntEventName);
			if (PWMInfo.hIntEvent == NULL)
			{
				MESSAGE(MESSAGE_ZONE,
					(TEXT("SMI::pwmStart: failed to create an event (%d)\r\n"),
						GetLastError()));
				bResult = FALSE;
			}
		}
	}

	return bResult;
}


///////////////////////////////////////////////////////////////////////////////
// Enables the selected PWM module.

ULONG SMI::pwmStart(
	VGXPWM_INDEX PWMIndex)	// PWM number
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::pwmStart\r\n")));
	ULONG nResult = VGXPWM_SUCCESS;

	// Make sure we're within range
	if ((PWMIndex < VGXPWM0) || (PWMIndex >= VGXPWMCOUNT))
	{
		MESSAGE(MESSAGE_ZONE,
			(TEXT("SMI::pwmStart: invalid PWM has been specified\r\n")));
		nResult = VGXPWM_INVALID_PARAMETER;
	}
	else
	{
		// Make sure PWM is inactive
		pwmStop(PWMIndex);

#ifndef DISABLE_INTERRUPT_MANAGEMENT
		// Register PWM interrupt handler
		RegisterHandler(pwmIntHandlerEntry, _F_MASK(INT_MASK_PWM));
#endif

		// Enable PWM gate register
		setGate(
			_F_MASK(CURRENT_POWER_GATE_GPIO_PWM_I2C),
			FIELD_SET(0, CURRENT_POWER_GATE, GPIO_PWM_I2C, ENABLE));

		// Create an event
		if (!CreatePWMEvent(m_PWMInfo[PWMIndex]))
		{
			nResult = VGXPWM_EVENT_FAILED;
		}
		else
		{
			// Determine init value
			DWORD dwPWMInit =
				FIELD_SET  (0, PWM_0, STATUS, ENABLE) |
				FIELD_VALUE(0, PWM_0, HIGH_COUNTER,
					(m_PWMInfo[PWMIndex].wHighCounter   & FIELD_MASK(PWM_0_HIGH_COUNTER))) |
				FIELD_VALUE(0, PWM_0, LOW_COUNTER,
					(m_PWMInfo[PWMIndex].wLowCounter    & FIELD_MASK(PWM_0_LOW_COUNTER)))  |
				FIELD_VALUE(0, PWM_0, CLOCK_DIVIDE,
					(m_PWMInfo[PWMIndex].byClockDivider & FIELD_MASK(PWM_0_CLOCK_DIVIDE))) |
				FIELD_VALUE(0, PWM_0, INTERRUPT,
					(m_PWMInfo[PWMIndex].bIntEnable? PWM_0_INTERRUPT_ENABLE : PWM_0_INTERRUPT_DISABLE));

			// Program init value
			pokeRegisterDWord(m_PWMInfo[PWMIndex].PWMAddress,
				dwPWMInit);

			// Set flags
			m_PWMInfo[PWMIndex].bPWMEnabled = TRUE;
			m_bPWMEnabled = TRUE;
		}
	}

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


///////////////////////////////////////////////////////////////////////////////
// Stops the selected PWM module.

BOOL SMI::pwmStop(
	VGXPWM_INDEX PWMIndex)	// PWM number
{
	MESSAGE(MESSAGE_ZONE, (TEXT("+SMI::pwmStop\r\n")));
	ULONG nResult = VGXPWM_SUCCESS;

	// Make sure we're within range
	if ((PWMIndex < VGXPWM0) || (PWMIndex >= VGXPWMCOUNT))
	{
		MESSAGE(MESSAGE_ZONE,
			(TEXT("SMI::pwmStop: invalid PWM has been specified\r\n")));
		nResult = VGXPWM_INVALID_PARAMETER;
	}
	else
	{
		if (m_PWMInfo[PWMIndex].bPWMEnabled)
		{
			// Reset the flags
			m_PWMInfo[PWMIndex].bPWMEnabled = FALSE;

			BOOL bAtleastOneEnabled = FALSE;
			BOOL bAtleastOneNeedsInts = FALSE;
			for (INT i = 0; i < VGXPWMCOUNT; i++)
			{
				if (m_PWMInfo[i].bPWMEnabled)
				{
					bAtleastOneEnabled = TRUE;
					if (m_PWMInfo[i].bIntEnable)
						bAtleastOneNeedsInts = TRUE;
				}
			}

			m_bPWMEnabled = bAtleastOneEnabled;

#ifndef DISABLE_INTERRUPT_MANAGEMENT
			// Delete the PWM interrupt handler
			if (!bAtleastOneNeedsInts)
				DisableHandler(_F_MASK(INT_MASK_PWM));
#endif

			// Stop PWM
			DWORD dwPWM = peekRegisterDWord(m_PWMInfo[PWMIndex].PWMAddress);
			dwPWM = FIELD_SET(dwPWM, PWM_0, STATUS, DISABLE);
			dwPWM = FIELD_SET(dwPWM, PWM_0, INTERRUPT, DISABLE);
			pokeRegisterDWord(m_PWMInfo[PWMIndex].PWMAddress, dwPWM);

			// Close the event handle
			if (m_PWMInfo[PWMIndex].hIntEvent)
			{
				CloseHandle(m_PWMInfo[PWMIndex].hIntEvent);
				m_PWMInfo[PWMIndex].hIntEvent = NULL;
			}

			// Disable PWM gate register
			setGate(
				_F_MASK(CURRENT_POWER_GATE_GPIO_PWM_I2C),
				FIELD_SET(0, CURRENT_POWER_GATE, GPIO_PWM_I2C, DISABLE));
		}
	}

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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本高清不卡视频| 日韩免费性生活视频播放| 日韩不卡一二三区| 国产精品色眯眯| 日韩色视频在线观看| 色综合色综合色综合| 国产露脸91国语对白| 日韩福利视频导航| 亚洲国产精品久久人人爱| 成人免费一区二区三区视频| 久久综合色一综合色88| 欧美一区二区三区免费在线看 | 亚洲精品免费在线观看| 久久久久久久久久久久电影| 6080国产精品一区二区| 91久久精品网| 色婷婷激情一区二区三区| 国产传媒久久文化传媒| 精品一区二区三区在线播放视频 | 青青草精品视频| 亚洲一区二区免费视频| 国产精品久久久久久久久免费丝袜| 日韩精品一区二区三区在线观看| 欧美日韩情趣电影| 在线观看网站黄不卡| 91丨porny丨中文| 成人app网站| 国产高清精品在线| 国产精品一区二区无线| 久久91精品久久久久久秒播| 日韩电影一二三区| 午夜精品一区在线观看| 偷拍一区二区三区| 秋霞av亚洲一区二区三| 奇米精品一区二区三区在线观看| 香蕉成人啪国产精品视频综合网| 午夜精品一区二区三区电影天堂 | 亚洲丝袜美腿综合| 日韩一区有码在线| 亚洲色图制服丝袜| 亚洲猫色日本管| 亚洲人亚洲人成电影网站色| 综合久久久久久久| 亚洲美女视频一区| 亚洲一区免费观看| 日本欧美一区二区三区乱码| 青青草国产成人av片免费| 久久99精品久久久久久| 韩国三级电影一区二区| 国产成人自拍高清视频在线免费播放| 国产九色sp调教91| jizzjizzjizz欧美| 欧美性xxxxxx少妇| 欧美一区午夜视频在线观看| 精品国产人成亚洲区| 国产性天天综合网| 一区二区在线看| 肉色丝袜一区二区| 国产精品综合网| 99久久国产综合色|国产精品| 日本精品一区二区三区高清 | 成人亚洲一区二区一| 91在线云播放| 欧美一级专区免费大片| 久久久精品人体av艺术| 亚洲免费毛片网站| 日韩制服丝袜先锋影音| 国产精品99久久久久久似苏梦涵 | 亚洲精品成人在线| 五月天激情小说综合| 国产自产v一区二区三区c| www.成人在线| 欧美一区二区三区在线观看| 国产免费成人在线视频| 亚洲一区二三区| 国产精品77777| 欧美色涩在线第一页| 久久久久99精品一区| 一区二区三区四区在线| 精品影院一区二区久久久| 99久久精品一区| 日韩美女视频在线| 亚洲人快播电影网| 国产一区二区三区综合| 欧洲av一区二区嗯嗯嗯啊| 久久亚洲综合色一区二区三区| 亚洲少妇最新在线视频| 国产一区二区免费看| 欧美性猛交一区二区三区精品| 久久久久9999亚洲精品| 日韩精品亚洲专区| 91蝌蚪porny| 国产丝袜美腿一区二区三区| 亚洲第一成年网| youjizz久久| 26uuu另类欧美| 午夜精品123| 色婷婷国产精品| 国产日韩欧美麻豆| 免费xxxx性欧美18vr| 在线观看网站黄不卡| 国产精品沙发午睡系列990531| 美女视频一区二区| 欧美蜜桃一区二区三区| 成人免费在线播放视频| 国产成人av电影在线播放| 欧美一级艳片视频免费观看| 亚洲自拍偷拍图区| 91亚洲精品久久久蜜桃网站| 久久久久久久久一| 精品一区二区三区免费毛片爱| 欧美日韩在线综合| 亚洲蜜臀av乱码久久精品| 东方aⅴ免费观看久久av| www欧美成人18+| 久久成人免费电影| 欧美一区二区三区在线电影| 亚洲mv大片欧洲mv大片精品| 在线免费观看视频一区| 国产精品成人在线观看| 国产成人午夜精品5599| 26uuu国产一区二区三区| 极品美女销魂一区二区三区| 日韩午夜激情视频| 日韩中文字幕亚洲一区二区va在线| 欧美午夜宅男影院| 亚洲成人中文在线| 欧美人与z0zoxxxx视频| 亚洲18色成人| 在线播放欧美女士性生活| 五月天精品一区二区三区| 欧美女孩性生活视频| 日本一不卡视频| 日韩欧美不卡一区| 久久99久久精品欧美| 精品久久久久久久久久久久久久久久久| 三级欧美在线一区| 欧美电影免费观看高清完整版在| 免费精品视频在线| 欧美成人精品1314www| 国产一区二区三区免费播放| 久久奇米777| 成人av在线资源| 亚洲精品少妇30p| 欧美日韩精品免费观看视频| 蜜臀av性久久久久蜜臀av麻豆| 欧美mv日韩mv国产网站| 国产伦精品一区二区三区免费迷 | 欧美日韩亚洲不卡| 免费观看日韩av| 久久综合国产精品| 国产成人日日夜夜| 日韩美女视频19| 欧美卡1卡2卡| 另类小说欧美激情| 国产清纯在线一区二区www| 99久久久精品| 天天综合天天做天天综合| 精品蜜桃在线看| 99久久综合国产精品| 亚洲成人免费影院| 精品国产乱码久久久久久牛牛| 国产69精品久久777的优势| 亚洲免费av网站| 日韩精品一区二区三区三区免费 | 欧美电影精品一区二区| 风间由美一区二区三区在线观看| 亚洲人成影院在线观看| 欧美一区二区精美| 成人a免费在线看| 日韩一区精品字幕| 国产欧美精品区一区二区三区| 在线中文字幕一区| 国产一区二区三区日韩| 亚洲狠狠丁香婷婷综合久久久| 欧美一区二区二区| 不卡一区二区在线| 蜜桃av一区二区在线观看| 成人免费视频在线观看| 欧美mv和日韩mv国产网站| 色婷婷亚洲婷婷| 国产精品18久久久久久久久久久久| 亚洲精品日韩专区silk | 午夜精品福利一区二区三区蜜桃| www激情久久| 欧美日韩高清不卡| 成人黄色综合网站| 久久成人综合网| 亚洲国产一区二区在线播放| 中文字幕av一区 二区| 555www色欧美视频| 一本色道久久综合亚洲aⅴ蜜桃| 久久精品国产77777蜜臀| 一区二区三区免费观看| 国产欧美精品一区二区色综合朱莉| 欧美日韩精品一区二区在线播放| 成人免费视频一区二区| 美美哒免费高清在线观看视频一区二区| 中文字幕一区二区三区四区| 欧美成人艳星乳罩|