⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pmp_key_task_new.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*-------------------------------------------------*
* $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 + -