📄 pmp_key_task_new.c
字号:
UINT16 bitoff=6;
set_reg_bit( REG_UGPIO_15_8_INPUT_ENABLE, bitoff, 1); // enable input
set_reg_bit( REG_UGPIO_17_10_OUTPUT_ENABLE, bitoff, 0);// disbale output
#endif
return;
}
/************************************************************************/
/* 检测关机按键是否被按下
input:
void
output:
0 没有关机按键, 非0值 有关机键按下
func:
note:
北阳EVB上使用GPIO6 作为关机检测的引脚
*/
/************************************************************************/
static UINT16 power_off_detect( void )
{
UINT8 data;
UINT32 flag;
// 如果不需要进行 关机键的扫描, 直接返回 0x00
if ( !SPMP_Get_ScanPowerKey() ){
return APP_DRV_OK;
}
#ifndef BIG_APPLE
// 读取端口的状态
#ifndef PMP3050_EVB_SN_V10
data = READ8( REG_GPIO_INPUT_VAL );
if ( data & (1<<IO_POWER_DETECT) )
#else
data = READ8( REG_UGPIO_17_10_INPUT_VALUE );
//ugpio14 used as power detect ,so bitoff = 14-10=4
if ( data & (1<<4) )
#endif
{
return APP_DRV_ERR; // 高电平, 表示键被按下
}
return APP_DRV_OK; // 低电平 没有按键
#else
//get gpio value
flag=hwGenGpioRead();
//flag=READ8( 0x100001110);
// printf("flag00=%lx\r\n",flag);
if((flag&0x10))
{
//printf("APP_DRV_ERR\n");
return APP_DRV_ERR; // 高电平, 表示键被按下
}
return APP_DRV_OK;
#endif
}
/************************************************************************/
/* 初始化 键盘扫描端口 的设置
input:
void
output:
void
func:
disable GPIO 上升沿 中断
disable GPIO 下降沿 中断
disable GPIO output 功能
enable pull-high
enable pull function
enable GPIO input
3 4 5 6 7 8 9 10 GND GPIO
----------------------------
---------------------------- GPIO
11 12 13 14 15 16 17 18
3 ......... 18
*/
/************************************************************************/
#ifndef EVB_SN_V10
/*
* 在台北大开发板上,使用 GPIO 作为 key port
*/
static void key_port_initial( void )
{
UINT8 Value;
UINT16 i;
UINT32 RegAddr;
#if 1
// disable
for(i=0x00; i<0x03; i++)
{
if(0 == i){
RegAddr = 0x10001130;
}
else if (1 == i) {
RegAddr = 0x10001138;
}
else{
RegAddr = 0x10001108;
}
// 3 - 7
Value = READ8(RegAddr);
Value &= 0x07;
WRITE8(RegAddr++, Value);
// 8 - 15
WRITE8(RegAddr++, 0x00);
// 16 - 18
Value = READ8(RegAddr);
Value &= 0xF8;
WRITE8(RegAddr++, Value);
}
for(i=0x00; i<0x03; i++)
{
if(0 == i){
RegAddr = 0x100001a4; // pull select
}
else if (1 == i) {
RegAddr = 0x100001c8; // pull enable
}
else{
RegAddr = 0x100001ec; // input enable
}
// 3 - 7
Value = READ8(RegAddr);
Value |= 0xf8;
WRITE8(RegAddr++, Value);
// 8 - 15
WRITE8(RegAddr++, 0xff);
// 16 - 18
Value = READ8(RegAddr);
Value |= 0x07;
WRITE8(RegAddr++, Value);
}
#else
/*
* GPIO register map table
*/
// disable GPIO falling edge interrupt
Value = 0x00;
RegAddr = 0x10001130;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
// disable GPIO rising edge interrupt
Value = 0x00;
RegAddr = 0x10001138;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
// disable GPIO output
Value = 0x00;
RegAddr = 0x10001108;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
/*
* 0x1A4 - 0x1A6 Cpugpio pull set 0 - pull down 1 - pull high
*/
// select pull high
Value = 0xff;
RegAddr = 0x100001a4;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
/*
* 0x1c8 - 0x1ca Cpugpio pull enable 0 - disable 1 - enable
*/
// enable pull function
Value = 0xff;
RegAddr = 0x100001c8;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
/*
* 0x1ec - 0x1ee Cpugpio input enable 0 - disable 1 - enable
*/
Value = 0xff;
RegAddr = 0x100001ec;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
#endif
return;
}
#endif
/************************************************************************/
/* 在 SN-6047B 开发板上 键盘端口使用 4 - 21
*/
/************************************************************************/
static void key_port_initial_sn6047b( void )
{
UINT8 Value;
// UINT16 i;
UINT32 RegAddr;
// disable Host GPIO interface
Value = 0x00;
RegAddr = REG_HOST_INTERFACE_ENABLE;
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr++, Value);
WRITE8(RegAddr, Value);
/*
* disable output
*/
RegAddr = REG_HGPIO_OUTPUT_ENABLE;
Value = READ8( RegAddr );
Value &= 0x0f;
WRITE8(RegAddr++, Value); // 4 -7
WRITE8(RegAddr++, 0x00); // 8 -15
Value = READ8( RegAddr );
Value &= 0xc0;
WRITE8(RegAddr++,Value); // 16 - 21
{
UINT16 i;
for(i=0x00; i<0x02; i++)
{
if (!i){
RegAddr = REG_HGPIO_PULL_SELECT;
}
else{
RegAddr = REG_HGPIO_PULL_ENABLE;
}
Value = READ8( RegAddr );
Value |= 0xf0;
WRITE8(RegAddr++, Value); // 4 -7
WRITE8(RegAddr++, 0xff); // 8 -15
Value = READ8( RegAddr );
Value |= 0x3f;
WRITE8(RegAddr++, Value); // 16 - 21
}
}
return;
}
/************************************************************************/
/* 键盘端口扫描程序 ( SN EVB v1.0 )
input:
void
output:
-1 表示没有按键, 有键按下,则返回有效的键值
func:
读取键盘端口的状态,获得输入的键值, 不支持多个键同时按下
SN EVB V10 Host GPIO 连线示意图
13 12 11 10 9 8 7 6 5 4
---------------------------------
20 19 18 17 16 15 14 13 12 11
引脚序号
1 2 3 4 5 6 7 8 9 10
---------------------------------
14 17 18 19 20 21 22 23 VCC GND
UP -------- 0xFFBFFF
Down -------- 0xF7FFFF
left -------- 0xFBFFFF
right -------- 0xFDFFFF
tele -------- 0xFFFF9F
wide -------- 0xFFFFEF
menu -------- 0xEFFFFF
esc -------- 0xDFFFFF
reset -------- 0xFFDFFF
start -------- 0xBFFFFF
M -------- 0xFFEFFF
OK -------- 0xFFFDFF
A -------- 0xFFF7FF
B -------- 0xFFFBFF
*/
/************************************************************************/
static UINT16 get_key_value_snv10( void )
{
UINT16 i;
UINT32 RegAddr;
UINT8 buf[0x04];
UINT32 tmp_key1, tmp_key2;
// clr data buffer
memset(buf, 0xff, sizeof(buf));
// read Cpugpio input value
RegAddr = REG_HGPIO_INPUT_VALUE;
buf[0] = READ8( RegAddr++ );
buf[1] = READ8( RegAddr++ );
#ifndef PMP3050_EVB_SN_V10
buf[2] = READ8( RegAddr++ );
tmp_key1 = ((UINT32)buf[2]<<16) | ((UINT16)buf[1]<<8) | buf[0];
tmp_key1 &= 0x3ffff0;
tmp_key1 |= 0xc0000f;
#else
//masked by guanzhi
//buf[2] = READ8( RegAddr++ );
//tmp_key1 = ((UINT32)buf[2]<<16) | ((UINT16)buf[1]<<8) | buf[0];
tmp_key1 = ((UINT16)buf[1]<<8) | buf[0];
tmp_key1 &= 0x000ff0;
tmp_key1 |= 0xfff00f;
#endif
// 如果没有键按下,直接返回
if( tmp_key1 == 0xffffff) {
return DUMMY_KEY;
}
// 判断是否有多个按键,同时按下
i = get_zero_bits(tmp_key1, 22);
// 如果同时有多个键按下, 返回失败
if ( i > 1 ){
return DUMMY_KEY;
}
// 延迟等待一段时间
osTimeDly(1);
// read Cpugpio input value
RegAddr = REG_HGPIO_INPUT_VALUE;
buf[0] = READ8( RegAddr++ );
buf[1] = READ8( RegAddr++ );
#ifndef PMP3050_EVB_SN_V10
buf[2] = READ8( RegAddr++ );
tmp_key2 = ((UINT32)buf[2]<<16) | ((UINT16)buf[1]<<8) | buf[0];
tmp_key2 &= 0x3ffff0;
tmp_key2 |= 0xc0000f;
#else
//masked by guanzhi
//buf[2] = READ8( RegAddr++ );
//tmp_key2 = ((UINT32)buf[2]<<16) | ((UINT16)buf[1]<<8) | buf[0];
tmp_key2 = ((UINT16)buf[1]<<8) | buf[0];
tmp_key2 &= 0x000ff0;
tmp_key2 |= 0xfff00f;
#endif
// 数值不相等, 返回失败
if (tmp_key2 != tmp_key1 ) {
return DUMMY_KEY;
}
// 获得在该数值中 第一个"0"的位置
i = get_zero_position(tmp_key2, 22);
#ifdef QLZ_DEBUG_00_X
sio_printf("PhyVal = 0x%x I = %d \r\n", tmp_key2, i);
#endif
// 检查该值是否合法, 不合法返回 DUMMY_KEY
return i;
}
/**************************************************************************************************
*Func: 始能键扫描
*In: none
*Out: none
*Return: SUCCESS
*Date: 2006.11.23
*Author: cuining
****************************************************************************************************/
UINT32 SPMP_KeyScan_Enable(void)
{
SPMP_KeyScan_Enable_Flag = 1;
return SUCCESS;
}
/**************************************************************************************************
*Func: 关闭键扫描
*In: none
*Out: none
*Return: SUCCESS
*Date: 2006.11.23
*Author: cuining
****************************************************************************************************/
UINT32 SPMP_KeyScan_Disable(void)
{
SPMP_KeyScan_Enable_Flag = 0;
return SUCCESS;
}
/**************************************************************************************************
*Func: 获取键扫描开启/关闭状态
*In: none
*Out: none
*Return: 0:关闭
1:开启
*Date: 2006.11.23
*Author: cuining
****************************************************************************************************/
UINT32 SPMP_KeyScan_EnableStatusGet(void)
{
if(SPMP_KeyScan_Enable_Flag == 1)
return 1;
else
return 0;
}
/*
*
*/
static void clr_PowerDown( void )
{
gPowerDown = 0x00;
}
static UINT16 get_PowerDown( void )
{
return gPowerDown;
}
static void increase_PowerDown( void )
{
gPowerDown++;
return;
}
/************************************************************************/
/* SPMP_Set_GameFlag
input:
data [in] UINT16
0 PMP 程序运行状态
非0值 NES 游戏状态, 此时不需要向GUI发送消息
output:
void
func:
通过设定该标准,决定了键盘扫描后的处理方式
默认状态下,向GUI 发送消息
NES Game 状态下, 向游戏任务发送 SIGNAL
*/
/************************************************************************/
void SPMP_Set_GameFlag( UINT16 data )
{
// 首先将状态复位
gGameFlag &= ~GAME_STATUS_MASK;
if ( data != STATUS_PMP_PROG)
{
gGameFlag |= GAME_STATUS_MASK; // 设置为游戏状态
}
return;
}
/************************************************************************/
/* SPMP_Get_GameFlag
input:
void
output:
UINT16 0 处于PMP 正常的程序状态
非0值 NES game 状态
*/
/************************************************************************/
UINT16 SPMP_Get_GameFlag( void )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -