?? pmp_key_task.c
字號(hào):
/*-------------------------------------------------*
* $RCSfile: pmp_key_task.c,v $
* $Date: 2007/01/26 08:36:23 $
* $Author: cuining $
* $Log: pmp_key_task.c,v $
* Revision 1.3 2007/01/26 08:36:23 cuining
* 加入低電處理.
*
* Revision 1.2 2007/01/19 07:26:53 lanzhu
* 添加NES 游戲后, 對(duì)KEY DRIVER 的更新
*
* Revision 1.2 2007/01/18 11:17:36 lanzhu
* 使用于 NES GAME 運(yùn)行的程序初步調(diào)試成功, 進(jìn)行上傳備份
*
* 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
* 修改 按鍵音的處理/ 修改背光的控制. 如果處于熄滅的狀態(tài), 按鍵只是
* 點(diǎn)亮背光, 不發(fā)送消息
*
* Revision 1.7 2007/01/03 12:23:41 lanzhu
* no message
*
* Revision 1.6 2007/01/02 00:51:28 lanzhu
* 在用戶按下時(shí),進(jìn)行按鍵音的發(fā)聲
*
* 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
* 修改了 關(guān)機(jī)和自動(dòng)關(guān)機(jī)的流程, 采用發(fā)送消息的方式,讓AP進(jìn)行處理
*
* 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
* 增加了是否處理 手動(dòng)關(guān)機(jī)的控制函數(shù)
*
* Revision 1.29 2006/11/28 11:50:25 lanzhu
* 修改了手動(dòng)關(guān)機(jī)時(shí)的順序,等待按鍵松開(kāi)后,在切斷電源
*
* Revision 1.28 2006/11/28 03:06:50 lanzhu
* 增加自動(dòng)關(guān)機(jī)的處理
*
* Revision 1.27 2006/11/28 00:08:09 lanzhu
* 修改了 關(guān)機(jī)鍵的作用模式, 原來(lái)按下"關(guān)機(jī)"鍵后進(jìn)行關(guān)機(jī). 現(xiàn)在修改為
* 長(zhǎng)按下后,才進(jìn)行關(guān)機(jī).
*
* Revision 1.26 2006/11/27 13:21:45 lanzhu
* 進(jìn)行 耳機(jī)的檢測(cè), 有耳機(jī)接入/拔出時(shí),處理功放的控制
*
* Revision 1.25 2006/11/27 10:06:21 lanzhu
* 增加了 對(duì)背光的定時(shí)處理
*
* Revision 1.24 2006/11/24 05:11:52 cuining
* 加入對(duì)按鍵掃描始能的控制.
*
* Revision 1.23 2006/11/16 09:14:10 cuining
* 加入對(duì)產(chǎn)品板的支持
*
* Revision 1.22 2006/11/14 06:44:51 lanzhu
* 添加了喇叭功放的控制函數(shù)
*
* Revision 1.21 2006/11/13 03:28:31 cuining
* 調(diào)整3050EVB的按鍵
*
* Revision 1.20 2006/11/13 01:29:33 cuining
* 加入編輯開(kāi)關(guān),增加對(duì)SP3050EVB的支持
*
* Revision 1.19 2006/10/25 12:34:43 lanzhu
* 保存 25 日對(duì)KEY 的調(diào)整
*
* Revision 1.18 2006/10/16 02:00:15 lanzhu
* 添加 對(duì) TELE WIDE 的處理。
*
* Revision 1.17 2006/10/14 10:05:26 cuining
* 加入對(duì)hold鍵的處理
*
* Revision 1.16 2006/10/14 07:23:19 lanzhu
* 增加 對(duì)關(guān)機(jī)鍵 的檢測(cè), 增加對(duì)系統(tǒng)電源的控制
*
* Revision 1.15 2006/10/09 03:30:10 lanzhu
* 發(fā)現(xiàn)在 TAIBEI EVB 上編譯不成功, 原因沒(méi)有 KEY_WIDE 的定義
*
* Revision 1.14 2006/10/08 06:44:06 lanzhu
* 去掉一個(gè)打印信息
*
* Revision 1.13 2006/09/30 06:11:54 lanzhu
* 增加了 TAB 鍵
*
* Revision 1.12 2006/09/25 01:35:55 lanzhu
* 對(duì) EVB-SN4047B 程序進(jìn)行了調(diào)整
*
* Revision 1.11 2006/09/24 13:47:17 lanzhu
* 對(duì) TAIBEI EVB 進(jìn)行了 修改
*
* Revision 1.10 2006/09/24 12:36:35 lanzhu
* 重新測(cè)試了EVB的鍵值, 修改了一個(gè)BUG, 接入電源時(shí),有鍵值發(fā)出
*
* Revision 1.9 2006/09/18 08:52:19 lanzhu
* 修改消息,按照5K 的狀態(tài)
*
* 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
* 增加對(duì) SN EVB V1.0 的支持, 通過(guò)SPMP_define.h 中 EVB_SN_V10
* 的定義, 可以進(jìn)行切換
*
* Revision 1.5 2006/09/05 11:57:54 lanzhu
* 使用電源供電時(shí),會(huì)錯(cuò)誤地收到按鍵消息
*
* Revision 1.4 2006/09/05 02:22:41 lanzhu
* 在主桌面不斷收到鍵盤(pán)消息, 檢查是driver 的bug, 修改了此bug
*
* Revision 1.3 2006/08/24 06:10:50 lanzhu反了的問(wèn)題
* 修改了 left right
*
* Revision 1.2 2006/08/23 11:29:01 lanzhu
* 增加了對(duì) 重復(fù)按鍵的支持
*
* Revision 1.1 2006/08/23 03:30:14 lanzhu
* 在556 大開(kāi)發(fā)板 添加 key driver
*
*
*--------------------------------------------------*/
#define QLZ_DEBUG_NES
//#define KEY_DEBUG_0117
/*
1. 對(duì)按鍵音的發(fā)生時(shí)間點(diǎn)進(jìn)行調(diào)整.
*/
//#define KEY_DEBUG_1211
#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)
// 對(duì)關(guān)機(jī)按鍵時(shí)間的定義
#define ON_OFF_KEY_CNT (20)
// 關(guān)機(jī)鍵松開(kāi)后的計(jì)數(shù)值
#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 開(kāi)發(fā)板對(duì)應(yīng)的鍵值
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 開(kāi)發(fā)板對(duì)應(yīng)的鍵值 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 開(kāi)發(fā)板對(duì)應(yīng)的鍵值
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, // 沒(méi)有此鍵
KEY_MENU = 0x0c,
KEY_A = 0x0b,
KEY_B = 0x0a,
};
*/
#endif
/*
* 需要發(fā)送給GUI時(shí)的鍵值
*/
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
// 默認(rèn)為: Host interface有效, 作為GPIO 使用時(shí),應(yīng)該設(shè)置為"0"
REG_HOST_INTERFACE_ENABLE = 0x1000b320, // r/w
// 驅(qū)動(dòng)能力的設(shè)置
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)
// 用于判斷是否為游戲狀態(tài)的標(biāo)志
static UINT16 gGameFlag = 0x00;
// bit0 用于表示是否為游戲狀態(tài)
// 0 STATUS_PMP_PROG
// 1 STATUS_NES_GAME
// bit1 表示在游戲狀態(tài)下, POWER 是否被按下
// 0 表示沒(méi)有按下
// 1 表示按下
// 用于判斷是否需要向GUI發(fā)送消息
static UINT16 gGUIMsgFlag = 0x01;
// 用于關(guān)機(jī)處理的標(biāo)志
static UINT16 gPowerDown = 0x00;
// 是否掃描 POWER 鍵的標(biāo)志
static UINT16 gScanPowerKey;
// 自動(dòng)關(guān)機(jī)計(jì)數(shù)器的備份值
static UINT32 gBakAutoOffCount;
// 自動(dòng)關(guān)機(jī)的當(dāng)前值
static UINT32 gNowAutoOffCount;
// 秒計(jì)數(shù)器
static UINT16 gSecondCount;
// 用于檢測(cè)是否長(zhǎng)時(shí)間按下的計(jì)數(shù)器
static UINT16 gLongPushCount = ON_OFF_KEY_CNT;
// 保存熱鍵狀態(tài)的寄存器
static UINT16 gHotKeyStatus = 0;
/*
BIT0 -- 1 power off 被按下
BIT1 -- BIT7 reserved
*/
// 保存上次的物理鍵值
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -