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

📄 smdk6410_button.c

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 C
字号:
#include <windows.h>
#include <bsp_cfg.h>
#include <s3c6410.h>
#include "smdk6410_button.h"

#ifdef	REMOVE_BEFORE_RELEASE
#define BTN_MSG(x)
#define BTN_INF(x)
#define BTN_ERR(x)	RETAILMSG(TRUE, x)
#else
//#define BTN_MSG(x)	RETAILMSG(TRUE, x)
#define BTN_MSG(x)
#define BTN_INF(x)	RETAILMSG(TRUE, x)
//#define BTN_INF(...)
#define BTN_ERR(x)	RETAILMSG(TRUE, x)
//#define BTN_ERR(x)
#endif

static volatile S3C6410_GPIO_REG *g_pGPIOReg = NULL;

BOOL Button_initialize_register_address(void *pGPIOReg)
{
	BTN_MSG((_T("[BTN]++Button_initialize_register_address(0x%08x)\n\r"), pGPIOReg));

	if (pGPIOReg == NULL)
	{
		BTN_ERR((_T("[BTN:ERR] Button_initialize_register_address() : NULL pointer parameter\n\r")));
		return FALSE;
	}
	else
	{
		g_pGPIOReg = (S3C6410_GPIO_REG *)pGPIOReg;
		BTN_INF((_T("[BTN:INF] g_pGPIOReg    = 0x%08x\n\r"), g_pGPIOReg));
	}

	BTN_MSG((_T("[BTN]--Button_initialize_register_address()\n\r")));

	return TRUE;
}

void Button_port_initialize(void)
{
	BTN_MSG((_T("[BTN] Button_port_initialize()\n\r")));

	// Power Button -> GPN[11] : EINT11
	// Reset Button -> GPN[9] : EINT9 / ADDR_CF[1]

	g_pGPIOReg->GPNCON = (g_pGPIOReg->GPNCON & ~((0x3<<18)|(0x3<<22))) | ((0x2<<18)|(0x2<<22));	// GPN[9] to EINT9, GPN[11] to EINT11
	g_pGPIOReg->GPNPUD = (g_pGPIOReg->GPNPUD & ~((0x3<<18)|(0x3<<22))) | ((0x2<<18)|(0x2<<22));	// GPN[9], GPN[11] set Pull-up Enable
}

BOOL Button_pwrbtn_set_interrupt_method(EINT_SIGNAL_METHOD eMethod)
{
	BOOL bRet =TRUE;

	BTN_MSG((_T("[BTN] Button_pwrbtn_set_interrupt_method(%d)\n\r"), eMethod));

	// Power Button -> GPN[11] : EINT11

	switch(eMethod)
	{
	case EINT_SIGNAL_LOW_LEVEL:
		g_pGPIOReg->EINT0CON0 &= ~(0x7<<20);
		break;
	case EINT_SIGNAL_HIGH_LEVEL:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<20)) | (0x1<<20);
		break;
	case EINT_SIGNAL_FALL_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<20)) | (0x2<<20);
		break;
	case EINT_SIGNAL_RISE_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<20)) | (0x4<<20);
		break;
	case EINT_SIGNAL_BOTH_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<20)) | (0x6<<20);
		break;
	default:
		BTN_ERR((_T("[BTN:ERR] Button_pwrbtn_set_interrupt_method() : Unknown Method = %d\n\r"), eMethod));
		bRet = FALSE;
		break;
	}

	BTN_MSG((_T("[BTN] --Button_pwrbtn_set_interrupt_method() = %d\n\r"), bRet));

	return bRet;
}

BOOL Button_pwrbtn_set_filter_method(EINT_FILTER_METHOD eMethod, unsigned int uiFilterWidth)
{
	BOOL bRet =TRUE;

	BTN_MSG((_T("[BTN] Button_pwrbtn_set_filter_method(%d, %d)\n\r"), eMethod, uiFilterWidth));

	// Power Button -> GPN[11] : EINT11

	switch(eMethod)
	{
	case EINT_FILTER_DISABLE:
		g_pGPIOReg->EINT0FLTCON1 &= ~(0x1<<15);
		break;
	case EINT_FILTER_DELAY:
		g_pGPIOReg->EINT0FLTCON1 = (g_pGPIOReg->EINT0FLTCON1 & ~(0x3<<14)) | (0x1<<15);
		break;
	case EINT_FILTER_DIGITAL:
		g_pGPIOReg->EINT0FLTCON1 = (g_pGPIOReg->EINT0FLTCON1 & ~(0xff<<8)) | ((0x3<<14) | ((uiFilterWidth&0x3f)<<8));
		break;
	default:
		BTN_ERR((_T("[BTN:ERR] Button_pwrbtn_set_filter_method() : Unknown Method = %d\n\r"), eMethod));
		bRet = FALSE;
		break;
	}

	BTN_MSG((_T("[BTN] --Button_pwrbtn_set_filter_method() = %d\n\r"), bRet));

	return bRet;
}

void Button_pwrbtn_enable_interrupt(void)
{
	//BTN_MSG((_T("[BTN] Button_pwrbtn_enable_interrupt()\n\r")));
	// Power Button -> GPN[11] : EINT11

	g_pGPIOReg->EINT0MASK &= ~(0x1<<11);	// Unmask EINT11
}

void Button_pwrbtn_disable_interrupt(void)
{
	//BTN_MSG((_T("[BTN] Button_pwrbtn_disable_interrupt()\n\r")));
	// Power Button -> GPN[11] : EINT11

	g_pGPIOReg->EINT0MASK |= (0x1<<11);	// Mask EINT11
}

void Button_pwrbtn_clear_interrupt_pending(void)
{
	//BTN_MSG((_T("[BTN] Button_pwrbtn_clear_interrupt_pending()\n\r")));
	// Power Button -> GPN[11] : EINT11

	g_pGPIOReg->EINT0PEND = (0x1<<11);		// Clear pending EINT11
}

BOOL Button_pwrbtn_is_pushed(void)
{
	//BTN_MSG((_T("[BTN] Button_pwrbtn_is_pushed()\n\r")));

	// Power Button -> GPN[11] : EINT11

	if (g_pGPIOReg->GPNDAT & (0x1<<11))		// We can read GPDAT pin level when configured as EINT
	{
		return FALSE;	// Low Active Switch (Pull-up switch)
	}
	else
	{
		return TRUE;
	}
}

BOOL Button_rstbtn_set_interrupt_method(EINT_SIGNAL_METHOD eMethod)
{
	BOOL bRet =TRUE;

	BTN_MSG((_T("[BTN] Button_rstbtn_set_interrupt_method(%d)\n\r"), eMethod));

	// Reset Button -> GPN[9] : EINT9

	switch(eMethod)
	{
	case EINT_SIGNAL_LOW_LEVEL:
		g_pGPIOReg->EINT0CON0 &= ~(0x7<<16);
		break;
	case EINT_SIGNAL_HIGH_LEVEL:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<16)) | (0x1<<16);
		break;
	case EINT_SIGNAL_FALL_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<16)) | (0x2<<16);
		break;
	case EINT_SIGNAL_RISE_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<16)) | (0x4<<16);
		break;
	case EINT_SIGNAL_BOTH_EDGE:
		g_pGPIOReg->EINT0CON0 = (g_pGPIOReg->EINT0CON0 & ~(0x7<<16)) | (0x6<<16);
		break;
	default:
		BTN_ERR((_T("[BTN:ERR] Button_rstbtn_set_interrupt_method() : Unknown Method = %d\n\r"), eMethod));
		bRet = FALSE;
		break;
	}

	BTN_MSG((_T("[BTN] --Button_rstbtn_set_interrupt_method() = %d\n\r"), bRet));

	return bRet;
}

BOOL Button_rstbtn_set_filter_method(EINT_FILTER_METHOD eMethod, unsigned int uiFilterWidth)
{
	BOOL bRet =TRUE;

	BTN_MSG((_T("[BTN] Button_rstbtn_set_filter_method(%d, %d)\n\r"), eMethod, uiFilterWidth));

	// Reset Button -> GPN[9] : EINT9

	switch(eMethod)
	{
	case EINT_FILTER_DISABLE:
		g_pGPIOReg->EINT0FLTCON1 &= ~(0x1<<6);
		break;
	case EINT_FILTER_DELAY:
		g_pGPIOReg->EINT0FLTCON1 = (g_pGPIOReg->EINT0FLTCON1 & ~(0x3<<6)) | (0x1<<7);
		break;
	case EINT_FILTER_DIGITAL:
		g_pGPIOReg->EINT0FLTCON1 = (g_pGPIOReg->EINT0FLTCON1 & ~0xff) | ((0x3<<6) | (uiFilterWidth&0x3f));
		break;
	default:
		BTN_ERR((_T("[BTN:ERR] Button_rstbtn_set_filter_method() : Unknown Method = %d\n\r"), eMethod));
		bRet = FALSE;
		break;
	}

	BTN_MSG((_T("[BTN] --Button_rstbtn_set_filter_method() = %d\n\r"), bRet));

	return bRet;
}

void Button_rstbtn_enable_interrupt(void)
{
	//BTN_MSG((_T("[BTN] Button_rstbtn_enable_interrupt()\n\r")));
	// Reset Button -> GPN[9] : EINT9

	g_pGPIOReg->EINT0MASK &= ~(0x1<<9);	// Unmask EINT9
}

void Button_rstbtn_disable_interrupt(void)
{
	//BTN_MSG((_T("[BTN] Button_rstbtn_disable_interrupt()\n\r")));
	// Reset Button -> GPN[9] : EINT9

	g_pGPIOReg->EINT0MASK |= (0x1<<9);		// Mask EINT9
}

void Button_rstbtn_clear_interrupt_pending(void)
{
	//BTN_MSG((_T("[BTN] Button_rstbtn_clear_interrupt_pending()\n\r")));
	// Reset Button -> GPN[9] : EINT9

	g_pGPIOReg->EINT0PEND = (0x1<<9);		// Clear pending EINT9
}

BOOL Button_rstbtn_is_pushed(void)
{
	//BTN_MSG((_T("[BTN] Button_rstbtn_is_pushed()\n\r")));
	// Reset Button -> GPN[9] : EINT9

	if (g_pGPIOReg->GPNDAT & (0x1<<9))		// We can read GPDAT pin level when configured as EINT
	{
		return FALSE;	// Low Active Switch (Pull-up switch)
	}
	else
	{
		return TRUE;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -