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

📄 pmp_key_task.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 4 页
字号:

	// 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 + -