📄 pmp_key_task_new.c
字号:
/*-------------------------------------------------*
* $RCSfile: pmp_key_task_new.c,v $
* $Date: 2007/01/28 07:53:06 $
* $Author: lanzhu $
* $Log: pmp_key_task_new.c,v $
* Revision 1.3 2007/01/28 07:53:06 lanzhu
* 添加了锁键盘的机制,和UP/DOWN 匹配检查机制
*
* Revision 1.2 2007/01/27 10:04:16 lanzhu
* 将低电压检测,添加进来
*
* Revision 1.1 2007/01/26 11:59:33 lanzhu
* 保存 01/26/2007 的工作
*
* Revision 1.2 2007/01/19 07:26:53 lanzhu
* 添加NES 游戏后, 对KEY DRIVER 的更新
*
* Revision 1.2 2007/01/18 11:17:36 lanzhu
* 使用于 NES GAME 运行的程序初步调试成功, 进行上传备份
*
* Revision 1.1 2007/01/17 13:18:16 lanzhu
* first add
*
* Revision 1.2 2007/01/17 12:02:39 lanzhu
* no message
*
* Revision 1.1 2007/01/11 05:50:08 zhangyan
* modified key task for nes game.
*
* Revision 1.8 2007/01/05 02:30:11 lanzhu
* 修改 按键音的处理/ 修改背光的控制. 如果处于熄灭的状态, 按键只是
* 点亮背光, 不发送消息
*
* Revision 1.7 2007/01/03 12:23:41 lanzhu
* no message
*
* Revision 1.6 2007/01/02 00:51:28 lanzhu
* 在用户按下时,进行按键音的发声
*
* Revision 1.5 2006/12/19 08:07:36 cuining
* 去掉warning
*
* Revision 1.4 2006/12/18 02:14:27 taiyun
* Modify include filename
*
* Revision 1.3 2006/12/12 00:36:09 lanzhu
* 去除 WARNING, 去掉不需要的程序
*
* Revision 1.2 2006/12/11 00:13:35 lanzhu
* 修改了 关机和自动关机的流程, 采用发送消息的方式,让AP进行处理
*
* Revision 1.1.1.1 2006/12/05 03:01:16 lanzhu
* no message
*
* Revision 1.1.1.1 2006/12/01 09:49:35 lanzhu
* no message
*
* Revision 1.30 2006/11/28 12:50:02 lanzhu
* 增加了是否处理 手动关机的控制函数
*
* Revision 1.29 2006/11/28 11:50:25 lanzhu
* 修改了手动关机时的顺序,等待按键松开后,在切断电源
*
* Revision 1.28 2006/11/28 03:06:50 lanzhu
* 增加自动关机的处理
*
* Revision 1.27 2006/11/28 00:08:09 lanzhu
* 修改了 关机键的作用模式, 原来按下"关机"键后进行关机. 现在修改为
* 长按下后,才进行关机.
*
* Revision 1.26 2006/11/27 13:21:45 lanzhu
* 进行 耳机的检测, 有耳机接入/拔出时,处理功放的控制
*
* Revision 1.25 2006/11/27 10:06:21 lanzhu
* 增加了 对背光的定时处理
*
* Revision 1.24 2006/11/24 05:11:52 cuining
* 加入对按键扫描始能的控制.
*
* Revision 1.23 2006/11/16 09:14:10 cuining
* 加入对产品板的支持
*
* Revision 1.22 2006/11/14 06:44:51 lanzhu
* 添加了喇叭功放的控制函数
*
* Revision 1.21 2006/11/13 03:28:31 cuining
* 调整3050EVB的按键
*
* Revision 1.20 2006/11/13 01:29:33 cuining
* 加入编辑开关,增加对SP3050EVB的支持
*
* Revision 1.19 2006/10/25 12:34:43 lanzhu
* 保存 25 日对KEY 的调整
*
* Revision 1.18 2006/10/16 02:00:15 lanzhu
* 添加 对 TELE WIDE 的处理。
*
* Revision 1.17 2006/10/14 10:05:26 cuining
* 加入对hold键的处理
*
* Revision 1.16 2006/10/14 07:23:19 lanzhu
* 增加 对关机键 的检测, 增加对系统电源的控制
*
* Revision 1.15 2006/10/09 03:30:10 lanzhu
* 发现在 TAIBEI EVB 上编译不成功, 原因没有 KEY_WIDE 的定义
*
* Revision 1.14 2006/10/08 06:44:06 lanzhu
* 去掉一个打印信息
*
* Revision 1.13 2006/09/30 06:11:54 lanzhu
* 增加了 TAB 键
*
* Revision 1.12 2006/09/25 01:35:55 lanzhu
* 对 EVB-SN4047B 程序进行了调整
*
* Revision 1.11 2006/09/24 13:47:17 lanzhu
* 对 TAIBEI EVB 进行了 修改
*
* Revision 1.10 2006/09/24 12:36:35 lanzhu
* 重新测试了EVB的键值, 修改了一个BUG, 接入电源时,有键值发出
*
* Revision 1.9 2006/09/18 08:52:19 lanzhu
* 修改消息,按照5K 的状态
*
* Revision 1.8 2006/09/18 07:58:43 lanzhu
* 修改 键值消息的定义 A->F1 B->F2 Reset->F3 Start->F4
*
* Revision 1.7 2006/09/18 03:28:54 lanzhu
* 增加 按键音 处理
*
* Revision 1.6 2006/09/13 08:02:05 lanzhu
* 增加对 SN EVB V1.0 的支持, 通过SPMP_define.h 中 EVB_SN_V10
* 的定义, 可以进行切换
*
* Revision 1.5 2006/09/05 11:57:54 lanzhu
* 使用电源供电时,会错误地收到按键消息
*
* Revision 1.4 2006/09/05 02:22:41 lanzhu
* 在主桌面不断收到键盘消息, 检查是driver 的bug, 修改了此bug
*
* Revision 1.3 2006/08/24 06:10:50 lanzhu反了的问题
* 修改了 left right
*
* Revision 1.2 2006/08/23 11:29:01 lanzhu
* 增加了对 重复按键的支持
*
* Revision 1.1 2006/08/23 03:30:14 lanzhu
* 在556 大开发板 添加 key driver
*
*
*--------------------------------------------------*/
#define SN_6047B
#define SUPPORT_REPEAT
#include "SPMP_define.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "spca_general.h"
#include "sig_api.h"
#include "os_api.h"
#include "hw_disp.h"
#include "system_api.h"
#include "timer.h"
#include "appdriver.h"
#include "SysUtility.h"
#include "pmp_auto_poweroff.h"
#include "Host_typedef.h"
#include "Mcatch_cmd.h"
/**************************************************************************
* G E N E R A L C O N S T A N T S *
**************************************************************************/
#define SPMP_POWER_ON (1)
#define SPMP_POWER_OFF (0)
#define LCM_GPIO_25 (25)
#define REPEAT_KEY_COUNT (0xffff)
#define KEY_SCAN_PERIOD (50)
//#define KEY_SCAN_PERIOD (50)
#define SECOND_COUNT (250/KEY_SCAN_PERIOD)
// 对关机按键时间的定义
#define ON_OFF_KEY_CNT (20)
// 关机键松开后的计数值
#define RELEASE_COUNT (8)
#define DUMMY_KEY (0xffff)
#define KEY_DRV_QUE_SIZE (4)
// 定义 NES 游戏中的 START 键
#define KEY_NES_START (0x5577)
#ifndef EVB_SN_V10
/* EVB TAIBEI key value */
enum{
KEY_UP = 3,
KEY_DOWN = 6,
KEY_LEFT = 5,
KEY_RIGHT = 4,
KEY_OK = 15,
KEY_ESC = 8,
KEY_RESET = 11,
KEY_START = 9,
KEY_MENU = 7,
KEY_A = 13,
KEY_B = 14,
KEY_WIDE = 55
};
#else
#ifndef PMP3050_EVB_SN_V10
#ifdef PMP3050_EVB_SN_PDT_V10
// SN-6057B STD2.4 V10 开发板对应的键值
enum{
KEY_UP = 0x07,
KEY_DOWN = 0x09,
KEY_LEFT = 0x08,
KEY_RIGHT = 0x0a,
KEY_OK = 0x0b,
KEY_ESC = 0x06,
KEY_RESET = 0x0d,
KEY_START = 0x14,
KEY_MENU = 0x12,
KEY_A = 0x0b,
KEY_B = 0x0a,
KEY_TELE = 0x05,
KEY_WIDE = 0x04,
KEY_M = 0x0c,
};
#else
// SN-6047B 开发板对应的键值 lanzhu @[9/24/2006]
enum{
KEY_UP = 0x0e,
KEY_DOWN = 0x11,
KEY_LEFT = 0x10,
KEY_RIGHT = 0x0F,
KEY_OK = 0x09,
KEY_ESC = 0x13,
KEY_RESET = 0x0d,
KEY_START = 0x14,
KEY_MENU = 0x12,
KEY_A = 0x0b,
KEY_B = 0x0a,
KEY_TELE = 0x05,
KEY_WIDE = 0x04,
KEY_M = 0x0c,
};
#endif
#else
// SN-SPCA3050 EVB V10 开发板对应的键值
enum{
KEY_UP = 0x04,
KEY_RIGHT = 0x05,
KEY_LEFT = 0x06,
KEY_DOWN = 0x07,
KEY_OK = 0x0a,
KEY_ESC = 0x09,
KEY_TELE = 0x08,
KEY_START = 0x00,
KEY_MENU = 0x00,
KEY_A = 0x00,
KEY_B = 0x00,
KEY_RESET = 0x00,
KEY_WIDE = 0x0b,
KEY_M = 0x00,
};
#endif
/*
// EVB SN V10 key value
enum{
KEY_UP = 0x0e,
KEY_DOWN = 0x13,
KEY_LEFT = 0x12,
KEY_RIGHT = 0x11,
KEY_OK = 0x09,
KEY_ESC = 0x15,
KEY_RESET = 0x0d,
KEY_START = 00, // 没有此键
KEY_MENU = 0x0c,
KEY_A = 0x0b,
KEY_B = 0x0a,
};
*/
#endif
/*
* 需要发送给GUI时的键值
*/
enum{
GUI_KEY_ESC = 0,
GUI_KEY_TAB = 1,
GUI_KEY_MENU = 2,
GUI_KEY_UP = 3,
GUI_KEY_LEFT = 4,
GUI_KEY_RIGHT = 5,
GUI_KEY_DOWN = 6,
GUI_KEY_F1 = 7,
GUI_KEY_F2 = 8,
GUI_KEY_OK = 9,
GUI_KEY_START = 11,
GUI_KEY_F4 = 12,
GUI_KEY_F3 = 13,
};
/*
* Host GPIO register map table
*/
enum
{
// host interface enable
// 默认为: Host interface有效, 作为GPIO 使用时,应该设置为"0"
REG_HOST_INTERFACE_ENABLE = 0x1000b320, // r/w
// 驱动能力的设置
REG_HGPIO_DRIVING_SET = 0x10000184, // R/W
// pull select: 0 pull down 1 pull high
REG_HGPIO_PULL_SELECT = 0x100001a8, // R/W
// pull enable: 0 disable 1 enable
REG_HGPIO_PULL_ENABLE = 0x100001cc, // R/W
// input enable: 0 disable 1 enable
REG_HGPIO_INPUT_ENABLE = 0x100001f0, // R/W
// output enable: 0 disable 1 enable
REG_HGPIO_OUTPUT_ENABLE = 0x1000b064, // R/W
// output value
REG_HGPIO_OUTPUT_VALUE = 0x1000b068, // R/W
// input value
REG_HGPIO_INPUT_VALUE = 0x1000b06c, // R
//REG_HGPIO_SELECT = 0x1000b0e2,
};
/*
* GPIO register map table
*/
enum
{
REG_GPIO_OUTPUT_VAL = 0x10001100,
REG_GPIO_FINT_EN = 0x10001130,
REG_GPIO_RINT_EN = 0x10001138,
REG_GPIO_OUTPUT_EN = 0x10001108,
REG_GPIO_PULL_SEL = 0x100001a4,
REG_GPIO_PULL_EN = 0x100001c8,
REG_GPIO_INPUT_EN = 0x100001ec,
REG_GPIO_INPUT_VAL = 0x10001110,
};
#ifdef PMP3050_EVB_SN_V10
/*
* Uart GPIO register map table
*/
enum
{
REG_UGPIO_15_8_DRV = 0x10000189, // driving select
REG_UGPIO_15_8_PULL_SELECT = 0x100001ad, // R/W
REG_UGPIO_15_8_PULL_ENABLE = 0x100001d1, // R/W
REG_UGPIO_15_8_INPUT_ENABLE = 0x100001f5, // R/W
REG_UGPIO_17_10_INPUT_VALUE = 0x1000188E,
REG_UGPIO_17_10_OUTPUT_ENABLE = 0x1000188c, // R/W
REG_UGPIO_17_10_OUTPUT_VALUE = 0x1000188a, // R/W
/******************sellect pin be used as Uart or gpio************************/
REG_UART2_UART_EN = 0x10001845, // R/W UART2 Enable
REG_UART2_UART_EN_BIT = 4, // R/W UART2 Enable
REG_EN_UART = 0x10001880, // R/W Enable UART
REG_EN_UART2_BIT = 2, // R/W Enable UART2
};
#endif
/*
* LCM GPIO register map table
*/
enum
{
REG_LCM_GPIO_DRV = 0x10000170, // driving select
REG_LCM_GPIO_PULL_SELECT = 0x10000194, // pull select
REG_LCM_GPIO_PULL_ENABLE = 0x100001b8, // pull enable
REG_LCM_GPIO_INPUT_ENABLE = 0x100001dc, // input enable
REG_LCM_GPIO_RINT_EVENT = 0x1000a0c1, // write 0 to clear
REG_LCM_GPIO_FINT_EVENT = 0x1000a0c4, // write 0 to clear
REG_LCM_GPIO_INPUT_VALUE = 0x1000a0c7, // LCM input value
REG_LCM_GPIO_OUTPUT_VALUE = 0x1000a1af, // LCM GPIO output value
REG_LCM_GPIO_OUTPUT_ENABLE = 0x1000a1b3, // LCM GPIO output enable
REG_LCM_GPIO_OUTPUT_SELECT = 0x1000a1b7, // LCM GPIO output selection
};
/*
*
*/
enum
{
// 在3050 EVB 上定义喇叭的输出
IO_SPEAKER_MUTE = 6, // GPIO6
// sunnorth EVB GPIO6 as power detect
IO_POWER_DETECT = 6, // GPIO6
// 热键寄存器中 power off 占用 BIT0
BIT_POWER_OFF = 0,
};
/**************************************************************************
* M A C R O S *
**************************************************************************/
/**************************************************************************
* D A T A T Y P E S *
**************************************************************************/
/**************************************************************************
* G L O B A L D A T A *
**************************************************************************/
void* keyDrvQ;
#define GAME_STATUS_MASK (1<<0)
#define GAME_POWER_KEY_MASK (1<<1)
// 用于判断是否为游戏状态的标志
static UINT16 gGameFlag = 0x00;
// bit0 用于表示是否为游戏状态
// 0 STATUS_PMP_PROG
// 1 STATUS_NES_GAME
// bit1 表示在游戏状态下, POWER 是否被按下
// 0 表示没有按下
// 1 表示按下
// [01/28/2007] lanzhu add 用于判断是否向GUI 发送消息的标志
#define BIT_LIGHT_MASK (1<<0)
#define BIT_UPDOWN_MASK (1<<1)
static UINT16 gGUIMsgFlag = 0x01;
// bit0 --- 用于背光判断
// 0 是 背光响应 ( 不进行GUI消息处理 )
// 1 不是背光响应 ( 正常的GUI消息处理 )
// bit1 --- 用于 DOWN/UP 的匹配判断
// 0 表示 UP 状态 (只能对 DOWN 进行响应)
// 1 表示 DOWN 状态 (只能对 UP 进行响应)
// 用于关机处理的标志
static UINT16 gPowerDown = 0x00;
// 是否扫描 POWER 键的标志
static UINT16 gScanPowerKey;
// 自动关机计数器的备份值
static UINT32 gBakAutoOffCount;
// 自动关机的当前值
static UINT32 gNowAutoOffCount;
static UINT16 gPowerOff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -