📄 pmp_key_task_new.c
字号:
// 秒计数器
static UINT16 gSecondCount;
// 用于检测是否长时间按下的计数器
static UINT16 gLongPushCount = ON_OFF_KEY_CNT;
// 保存热键状态的寄存器
static UINT16 gHotKeyStatus = 0;
/*
BIT0 -- 1 power off 被按下
BIT1 -- BIT7 reserved
*/
// 保存上次的物理键值
static UINT16 LastKey;
// key TASK 的序列
static UINT32 keyDrvQueBuf[KEY_DRV_QUE_SIZE];
// 定时器进行按键的处理
static void process_powersave_period( void );
// 按键对节电模式的处理
static void process_powersave_key( void );
static UINT32 SPMP_KeyScan_Enable_Flag=1;
extern UINT32 g_uiStartFlag; //add for nes game
static UINT16 gkeycount = 0;
static UINT16 gkeyconfirm = 0;
static UINT16 gPwrStatus = 0;
/*
* 物理按键 和 GUI 消息的对应表 (用户可以修改)
*/
static const UINT8 key_map_table[13][2] =
{
// 物理扫描值 GUI 按键值
{KEY_UP, GUI_KEY_UP},
{KEY_DOWN, GUI_KEY_DOWN},
{KEY_LEFT, GUI_KEY_LEFT},
{KEY_RIGHT, GUI_KEY_RIGHT},
{KEY_OK, GUI_KEY_OK},
{KEY_ESC, GUI_KEY_ESC},
{KEY_A, GUI_KEY_F1},
{KEY_B, GUI_KEY_F2},
// 【10/25/2006】 17:27 lanzhu 根据 5K 键盘对应关系进行整理
{KEY_TELE, GUI_KEY_MENU},
{KEY_WIDE, GUI_KEY_TAB},
{KEY_M, GUI_KEY_F3},
{KEY_RESET, GUI_KEY_F4},
{KEY_START, GUI_KEY_START},
};
/*
* 按键与按键音转换表 (用户可以修改)
*/
static const UINT8 key_tone_table[8][2] =
{
// 物理键值 在配置表中的偏移
{KEY_UP, 0},
{KEY_DOWN, 1},
{KEY_LEFT, 2},
{KEY_RIGHT, 3},
{KEY_ESC, 4},
{KEY_OK, 5},
{KEY_WIDE, 6},
{KEY_TELE, 7},
};
/*
* 物理按键 和 NES GAME 内在键值的对应表格 (用户可以修改)
*/
#define KEY_POWER (0x1111)
#define PMP_NES_EXIT (0x1112)
#define NES_KEY_NUM (10)
static const UINT32 nes_game_key_table[10][2] =
{
// 物理键值 NES GAME 键值
{DUMMY_KEY, 0x00 }, // 按键的释放动作, 用户不能改动
{KEY_UP, MCATCH_EVENT_KEY_UP },
{KEY_DOWN, MCATCH_EVENT_KEY_DOWN },
{KEY_LEFT, MCATCH_EVENT_KEY_LEFT },
{KEY_RIGHT, MCATCH_EVENT_KEY_RIGHT },
{KEY_OK, MCATCH_EVENT_KEY_START },
{KEY_ESC, MCATCH_EVENT_KEY_SELECT },
{KEY_TELE, MCATCH_EVENT_KEY_A },
{KEY_WIDE, MCATCH_EVENT_KEY_B },
{KEY_POWER, PMP_NES_EXIT },
};
static const UINT32 log_nes_game_key[9] =
{
#if 1
/* MCATCH_EVENT_KEY_UP, // 0x00//*/MCATCH_EVENT_KEY_A,
/* MCATCH_EVENT_KEY_RIGHT, // 0x01 */MCATCH_EVENT_KEY_B,
/*MCATCH_EVENT_KEY_LEFT, // 0x02 */MCATCH_EVENT_KEY_START ,
/* MCATCH_EVENT_KEY_DOWN, // 0x03*/MCATCH_EVENT_KEY_SELECT,
/*MCATCH_EVENT_KEY_A, */MCATCH_EVENT_KEY_UP,
/* MCATCH_EVENT_KEY_SELECT, // 0x05 */ MCATCH_EVENT_KEY_LEFT,
/*MCATCH_EVENT_KEY_START, // 0x06 */MCATCH_EVENT_KEY_DOWN,
/* MCATCH_EVENT_KEY_B, // 0x07 */ MCATCH_EVENT_KEY_RIGHT,
#else
MCATCH_EVENT_KEY_A,
MCATCH_EVENT_KEY_B,
MCATCH_EVENT_KEY_SELECT,
MCATCH_EVENT_KEY_START,
MCATCH_EVENT_KEY_RIGHT,
MCATCH_EVENT_KEY_DOWN,
MCATCH_EVENT_KEY_LEFT,
MCATCH_EVENT_KEY_UP,
#endif
};
/*
* 逻辑按键 和 NES 内在键值的对应表格 ( 用户可以修改 )
*/
#if 0
static const UINT32 log_nes_game_key[9] =
{
MCATCH_EVENT_KEY_UP, // 0x00
MCATCH_EVENT_KEY_RIGHT, // 0x01
MCATCH_EVENT_KEY_LEFT, // 0x02
MCATCH_EVENT_KEY_DOWN, // 0x03
MCATCH_EVENT_KEY_A, // 0x04
MCATCH_EVENT_KEY_SELECT, // 0x05
MCATCH_EVENT_KEY_START, // 0x06
MCATCH_EVENT_KEY_B, // 0x07
};
#endif
/**************************************************************************
* E X T E R N A L R E F E R E N C E S *
**************************************************************************/
extern void* aptask_q;
extern UINT32 SPMP_GetHoldKeyStatus(void);
/**************************************************************************
* F U N C T I O N D E C L A R A T I O N S *
**************************************************************************/
static void clr_PowerDown( void ); // set gPowerDown 0x00;
static UINT16 get_PowerDown( void ); // get gPowerDown
static void increase_PowerDown( void ); // gPowerDown ++
// 定时器对自动关机的处理
static void process_autooff_period( void );
// 按键对自动关机的处理
static void process_autooff_key( void );
// 检测 关机键是否被按下
static UINT16 power_off_detect( void );
// 初始化 功能端口
static void function_port_initial( void );
#ifndef EVB_SN_V10
static void key_port_initial( void );// 初始化 键盘端口的 硬件设置 ( S+MM开发板)
static UINT16 get_key_value( void ); // 获得键盘端口的值 (S+MM EVB )
#endif
// 初始化 键盘端口的 硬件设置 ( 北阳 开发板 V10 )
//static void key_port_initial_snv10( void );
// 北阳 SN-6047B 开发板的初始化程序
static void key_port_initial_sn6047b( void );
// 扫描端口的值( SN EVB V10)
static UINT16 get_key_value_snv10( void );
// 检查一个数据中 "0" 的个数
static UINT16 get_zero_bits( UINT32 data, UINT16 len );
// 输入一个数值和需要检查的位数, 返回第一个0的在该数值中的偏移值
static UINT16 get_zero_position( UINT32 data, UINT16 len );
// 将键盘扫描码 转换为 GUI 能够识别的键值编码
static UINT16 phy2gui_value( UINT16 physical_value);
// 启动键盘任务的程序
void SPMP_KeyDriverTimerFunc( void );
static void set_reg_bit(UINT32 RegAddr, UINT16 BitOffset, UINT16 Flag);
//获取键扫描开启/关闭状态
UINT32 SPMP_KeyScan_EnableStatusGet(void);
// 关掉系统电源
//void SPMP_PowerControl ( UINT16 flag );
// 设定和获得 是否需要进行POWER 键的扫描
extern void SPMP_Set_ScanPowerKey( UINT16 value );
extern UINT16 SPMP_Get_ScanPowerKey( void );
// 判断是否需要进行GUI 消息的发送
static UINT16 judge_gui_msg( UINT16 msg );
// 内部函数 NES 键盘的处理
//static UINT16 nes_key_process( UINT16 key_value );
// 内部函数 GUI 键盘的处理
//static UINT16 gui_key_process( UINT16 LastKey, UINT16 PhyKeyValue );
// 获得 POWER 是否被按下的状况
static UINT16 get_power_key_status( void );
// 设置 POWER 是否被按下的状况
static void set_power_key_status( UINT16 data );
// 在 NES状态下对 POWER 键的处理
static void nes_power_process( UINT16 data );
// 将一个物理键值转换为NES 键值
static UINT32 phy_2_nes_key( UINT16 phy_key );
// 处理逻辑键盘值的状态
static UINT16 key_status_process (UINT32 LastBitMap,
UINT32 NowBitMap,
UINT16 *pLogKey );
extern UINT16 SPMP_Power_Detect( void );
// 输入一个逻辑键值获得一个GUI键值
extern UINT16 SPMP_KEY_GetGUIKey( UINT16 log_key, UINT16 *pGUI );
// 新的 GUI 键值处理程序
static UINT16 new_gui_key_process( UINT16 logkey );
// 新的 NES 键值处理程序
static UINT16 new_nes_key_process( UINT16 key_cnt, UINT16 *pkey );
extern UINT32 SPMP_GetPwrStatus( void);
static void process_lowpower_period( void );
/************************************************************************/
/* 输入一个按键值, 得到按键音的位置索引值
input:
key_value [in] UINT16
output:
按键音的位置索引值
func:
*/
/************************************************************************/
UINT16 SPMP_KeyTone_GetIndex( UINT16 key_value )
{
#ifdef NEW_IO_DEBUG
return key_value;
#else
UINT16 i;
for(i=0x00; i<0x08; i++)
{
if ( key_tone_table[i][0] == key_value )
{
return key_tone_table[i][1];
}
}
return (-1);
#endif
}
/************************************************************************/
/* 设定是否需要进行开关机键的扫描
input:
value 0 不需要扫描
非0值需要进行扫描
output:
void
*/
/************************************************************************/
void SPMP_Set_ScanPowerKey( UINT16 value )
{
gScanPowerKey = value;
return;
}
UINT16 SPMP_Get_ScanPowerKey( void )
{
return gScanPowerKey;
}
/************************************************************************/
/* 设定自动关机计数器的值
input:
value [in] UINT32
output:
void
func:
*/
/************************************************************************/
void SPMP_Set_AutoOffCnt(UINT32 value)
{
gBakAutoOffCount = value; // 备份值
gNowAutoOffCount = value; // 当前值
return;
}
/************************************************************************/
/* 键盘对节电的处理
input:
output:
func: 按键对节电模式的处理
note:
*/
/************************************************************************/
static void process_powersave_key( void )
{
// 如果是 不需要进行节电,直接返回
if ( DISABLE_POWER_SAVE == SPMP_Get_PowerSaveFlag() ) {
return;
}
// 如果当前计数值为0, 说明已经熄灭掉了
if( !SPMP_Get_PowerSaveCount() )
{
SPMP_LCM_LightCtrl( LCM_LIGHT_ENABLE ); // 点亮屏幕的背光
}
SPMP_Reset_PowerSaveCount(); // 将当前的节电值进行复位
return;
}
/************************************************************************/
/* 定时对自动关机进行检测
input:
output:
func:
note:
*/
/************************************************************************/
static void process_autooff_period( void )
{
// 如果是禁止自动关机, 返回不用处理
if( SPMP_AUTO_POWER_OFF_DISABLE == SPMP_Get_AutoPowerOff()){
return;
}
if ( gNowAutoOffCount ) {
gNowAutoOffCount --; // 计数值减一
}
else
{
increase_PowerDown();
// 点亮屏幕的背光
SPMP_LCM_LightCtrl( LCM_LIGHT_ENABLE );
// 启动关机流程
SPMP_SendGUIMessage((UINT8)MSG_OTHER,(UINT32)POWER_DOWN_PREPARE, (UINT8)NULL);
}
return;
}
/*
* 按键对自动关机的处理, 每次收到自动关机后, 复位计数值
*/
static void process_autooff_key( void )
{
gNowAutoOffCount = gBakAutoOffCount; // 使用备份值
return;
}
/************************************************************************/
/* 定时对进行节电的处理
input:
output:
func:
*/
/************************************************************************/
static void process_powersave_period( void )
{
UINT16 i;
// 如果是 不需要进行节电,直接返回成功
if ( DISABLE_POWER_SAVE == SPMP_Get_PowerSaveFlag() ) {
return;
}
// 获取当前的计数值
i = SPMP_Get_PowerSaveCount();
if(!i){ // 如果已经是 0 了,直接返回, 不需要继续处理
return;
}
// 计数值减一
SPMP_Dec_PowerSaveCount();
if ( 1 == i )
{
SPMP_LCM_LightCtrl( LCM_LIGHT_DISABLE ); // 关掉系统的背光.
}
return;
}
/************************************************************************/
/* 控制EVB 电路的电源开关
input:
flag [in] UINT16
SPMP_POWER_OFF
SPMP_POWER_ON
output: void
func:
note:
如果是关闭系统电源, 程序不返回
*/
/************************************************************************/
#ifndef NEW_IO_DEBUG
void SPMP_PowerControl ( UINT16 flag )
{
UINT16 i;
i = 0;
if ( SPMP_POWER_OFF != flag) {
i ++;
}
#ifndef PMP3050_EVB_SN_V10
// set LCM GPIO 25 OUTPUT VALUE
set_reg_bit( REG_LCM_GPIO_OUTPUT_VALUE + LCM_GPIO_25/8, LCM_GPIO_25%8, i);
// set output enable
set_reg_bit( REG_LCM_GPIO_OUTPUT_ENABLE + LCM_GPIO_25/8, LCM_GPIO_25%8, 1);
// set LCM OUTPUT SELECT 1
set_reg_bit( REG_LCM_GPIO_OUTPUT_SELECT + LCM_GPIO_25/8, LCM_GPIO_25%8, 1);
if ( SPMP_POWER_OFF == flag) {
// disable pull high
set_reg_bit( REG_LCM_GPIO_PULL_ENABLE + LCM_GPIO_25/8, LCM_GPIO_25%8, 0);
}
#else
/*PMP3050_EVB_SN_V10 used HGPIO1 as Power_EN*/
//disable HGPIO1 input
set_reg_bit( REG_HGPIO_INPUT_ENABLE, 1, 0);
//enable HGPIO1 output
set_reg_bit( REG_HGPIO_OUTPUT_ENABLE, 1, 1);
//set HGPIO1 output value
set_reg_bit( REG_HGPIO_OUTPUT_VALUE, 1, i);
if ( SPMP_POWER_OFF == flag) {
// disable pull enable
set_reg_bit( REG_HGPIO_PULL_ENABLE, 1, 0);
}
#endif
while (1);
return;
}
#endif
/************************************************************************/
/* 获得当前热键的状态的数据
input:
void
output:
0 没有关机键 按下
非0值 关机键 按下
func:
获得当前热键的状态信息
*/
/************************************************************************/
UINT16 SPMP_Get_PowerStatus( void )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -