📄 pmp_key_task.c
字号:
// 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);
// 检查该值是否合法, 不合法返回 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 )
{
UINT16 ret;
// 默认为 PMP PROG 状态
ret = STATUS_PMP_PROG;
// 如果对应 BIT 为 1
if ( gGameFlag & GAME_STATUS_MASK )
{
ret = STATUS_NES_GAME; // 已经进入游戏状态
}
return ret;
}
/************************************************************************/
/* 输入一个物理键值, 获得在 NES 中应该对应的键值
input:
key_value [in] UINT16 物理扫描值
output:
NES Game 中应该使用的键值
func:
输入一个物理键值, 在预先设定的表格中进行寻找
如果不能找到对应的
*/
/************************************************************************/
static UINT32 phy_2_nes_key( UINT16 phy_key )
{
UINT32 i,j;
j = 0x00;
for(i = 0x00; i<NES_KEY_NUM; i++ )
{
if ( phy_key == nes_game_key_table[i][0] )
{
j = nes_game_key_table[i][1];
break;
}
}
return j;
}
/************************************************************************/
/* nes_key_process
input:
key_value [in] UINT16 物理键
output:
0 成功, 非0值失败
func:
将键值转换为 NES 对应的SIGNAL, 发送给相应的任务
*/
/************************************************************************/
static UINT16 nes_key_process( UINT16 key_value )
{
UINT32 i;
MCATCH_GAME_EVENT_ATTR gameEvent;
// 判断是否处于游戏的状态, 不是游戏状态,直接返回
if ( !SPMP_Get_GameFlag() ){
return APP_DRV_OK; // 0 表示 有关机键被按下
}
memset(&gameEvent, 0x00, sizeof(MCATCH_GAME_EVENT_ATTR));
// 设定EVENT 的类型
gameEvent.ulType = MCATCH_KEYPRESS_EVENT;
// 获得 NES 键值
i = phy_2_nes_key( key_value );
// 如果是退出游戏
if ( PMP_NES_EXIT == i ) {
// 发送退出命令
SPMP_SendSignal_T(MCATCH_CMD_GAME_EXIT, (UINT8*)&gameEvent, sizeof(gameEvent));
SPMP_Set_GameFlag( STATUS_PMP_PROG ); // 设置回到 PMP 普通状态
return APP_DRV_OK; // 返回成功.
}
gameEvent.ulKey = i;
// 进行信号量的发送动作
SPMP_SendSignal_T(MCATCH_CMD_GAME_EVENTSEND, (UINT8*)&gameEvent, sizeof(gameEvent));
return APP_DRV_OK;
}
/************************************************************************/
/* gui_key_process
input:
LastKey [in] UINT16 上次的记录的上次键盘值
PhyKeyValue [in] UINT16 当前的物理键值
output:
0 成功进行处理.
非0值 不能获得 有效的GUI 消息
func:
在PMP 普通程序的状态下,进行键值的处理
*/
/************************************************************************/
static UINT16 gui_key_process( UINT16 LastKey, UINT16 PhyKeyValue )
{
UINT16 GUIKeyValue;
UINT32 GUIMsg;
if ( PhyKeyValue != DUMMY_KEY )
{
GUIKeyValue = phy2gui_value( PhyKeyValue );
if (GUIKeyValue == 0xffff)
{
return APP_DRV_ERR;
}
GUIMsg = MSG_KEYBOARD;
SPMP_KeyTone_Play( PhyKeyValue ); // play key tone @key down [12/30/2006]
}
else
{
// 发送 key up 消息
GUIKeyValue = phy2gui_value( LastKey );
GUIMsg = MSG_KEYBOARD_UP;
}
if ( judge_gui_msg( (UINT16) GUIMsg ) )
{
GUIMsg <<= 28;
GUIMsg |= GUIKeyValue;
osQuePost(aptask_q, (void*)GUIMsg); // 向GUI发送消息
}
// 返回成功
return APP_DRV_OK;
}
/************************************************************************/
/* 设置 POWER 键被按下的标志
input:
data [in] UINT16
0 表示没有按下
非0值表示按下
output:
void
func:
note:
使用全局变量 gGameFlag 中的 BIT1
*/
/************************************************************************/
static void set_power_key_status( UINT16 data )
{
gGameFlag &= ~GAME_POWER_KEY_MASK;
if (data ) {
gGameFlag |= GAME_POWER_KEY_MASK;
}
return;
}
/************************************************************************/
/* 获得POWER 键被按下的标志
input:
void
output:
0 power 键没有被按下
非0值 已经被按下
func:
note:
*/
/************************************************************************/
static UINT16 get_power_key_status( void )
{
return (gGameFlag & GAME_POWER_KEY_MASK);
}
/************************************************************************/
/* NES 游戏处理POWER 键
input:
data [in] UINT16
0 按键被释放
非0值 按键被按下
output:
func:
*/
/************************************************************************/
static void nes_power_process( UINT16 data )
{
UINT16 i;
// 如果当前是 PMP 程序状态, 直接返回
if ( STATUS_PMP_PROG == SPMP_Get_GameFlag() ) {
return;
}
// 获得上次 POWER 键的状态
i = get_power_key_status();
// 如果上次没有按下, 现在有按下
if ( !i && data ) {
set_power_key_status( data ); // 记住此次的状态!
nes_key_process( KEY_POWER );
}
// 只处理变化的状况
if ( i && !data ) {
set_power_key_status( data );
nes_key_process( DUMMY_KEY ); // 按键已经释放!
}
return;
}
/************************************************************************/
/* 定时对低电关机进行检测
input:
output:
func:
note:
*/
/************************************************************************/
static void process_lowpower_period( void )
{
if(0==SPMP_GetPwrStatus())
{
sio_printf("\n电量不足,关机!\n");
SPMP_LCM_LightCtrl( LCM_LIGHT_DISABLE );
SPMP_PowerControl( 0 ); // 关掉电源
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -