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

📄 pmp_key_task_new.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	UINT16 bitoff=6;
	set_reg_bit( REG_UGPIO_15_8_INPUT_ENABLE, bitoff, 1);	// enable input 
	set_reg_bit( REG_UGPIO_17_10_OUTPUT_ENABLE, bitoff, 0);// disbale output		
#endif
	return;
}

/************************************************************************/
/*				检测关机按键是否被按下
  input:
			void 		
  output:
			0 没有关机按键, 非0值 有关机键按下
  func:
  note:
			北阳EVB上使用GPIO6 作为关机检测的引脚
                                                                        */
/************************************************************************/
static UINT16 power_off_detect( void )
{
	UINT8	data;
	UINT32  flag;

	// 如果不需要进行 关机键的扫描, 直接返回 0x00
	if ( !SPMP_Get_ScanPowerKey() ){
		return  APP_DRV_OK;		
	}

#ifndef BIG_APPLE
	// 读取端口的状态
#ifndef PMP3050_EVB_SN_V10
	data = READ8( REG_GPIO_INPUT_VAL );
	if ( data & (1<<IO_POWER_DETECT) )
#else
	data = READ8( REG_UGPIO_17_10_INPUT_VALUE );
	//ugpio14 used as power detect ,so bitoff = 14-10=4
	if ( data & (1<<4) )
#endif
	{
		return APP_DRV_ERR;		// 高电平, 表示键被按下			
	}
	return APP_DRV_OK;			// 低电平 没有按键 
#else
		//get gpio value
		flag=hwGenGpioRead();
		//flag=READ8( 0x100001110);	
//		printf("flag00=%lx\r\n",flag);	
		if((flag&0x10))
		{
			//printf("APP_DRV_ERR\n");				
				return APP_DRV_ERR;		// 高电平, 表示键被按下			
			
		}
		return APP_DRV_OK;
#endif
}
/************************************************************************/
/*	初始化 键盘扫描端口 的设置
  input:
			void
  output:
			void 
  func:
			disable	GPIO 上升沿 中断
			disable GPIO 下降沿 中断
			disable GPIO  output 功能
			enable	pull-high 			
			enable	pull function 
			enable	GPIO input 

			  3   4	 5  6  7  8  9 10 GND		GPIO
			  ----------------------------								
			  ----------------------------		GPIO 
			  11 12 13 14 15 16 17 18

			3 ......... 18

										                               */
/************************************************************************/

#ifndef EVB_SN_V10

/*
 *	在台北大开发板上,使用 GPIO 作为 key port
 */
static void  key_port_initial( void )
{
	UINT8	Value;	
	UINT16	i;
	UINT32	RegAddr; 

#if 1
	// disable
	for(i=0x00; i<0x03; i++)
	{
		if(0 == i){
			RegAddr	= 0x10001130;			
		}
		else if (1 == i) {
			RegAddr	= 0x10001138;			
		}
		else{
			RegAddr = 0x10001108;			
		}
		
		// 3 - 7
		Value = READ8(RegAddr);
		Value &= 0x07;
		WRITE8(RegAddr++, Value);

		// 8 - 15
		WRITE8(RegAddr++, 0x00);

		// 16 - 18 
		Value = READ8(RegAddr);
		Value &= 0xF8;
		WRITE8(RegAddr++, Value);
	}		


	for(i=0x00; i<0x03; i++)
	{
		if(0 == i){
			RegAddr = 0x100001a4;	// pull select 			
		}
		else if (1 == i) {
			RegAddr = 0x100001c8;	// pull enable			
		}
		else{
			RegAddr = 0x100001ec;	// input enable 			
		}

		// 3 - 7
		Value = READ8(RegAddr);
		Value |= 0xf8;
		WRITE8(RegAddr++, Value);
		// 8 - 15
		WRITE8(RegAddr++, 0xff);	
		// 16 - 18 
		Value = READ8(RegAddr);
		Value |= 0x07;
		WRITE8(RegAddr++, Value);
	}		

#else


/*
 *	GPIO register map table 
 */

	// disable GPIO falling edge interrupt 
	Value	= 0x00;	
	RegAddr	= 0x10001130;
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	

	// disable GPIO rising edge interrupt 
	Value	= 0x00;	
	RegAddr	= 0x10001138;
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	

	// disable GPIO output 
	Value	= 0x00;
	RegAddr = 0x10001108;
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	

/*
 *	0x1A4 - 0x1A6  Cpugpio pull set  0 - pull down  1 - pull high 
 */
	// select pull high
	Value = 0xff;
	RegAddr = 0x100001a4;
	
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	
/*
 *	0x1c8 - 0x1ca Cpugpio pull enable  0 - disable 1 - enable 
 */
	// enable pull function
	Value = 0xff;
	RegAddr = 0x100001c8;
	
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	
/*
 *	0x1ec - 0x1ee Cpugpio input enable  0 - disable 1 - enable 
 */
	Value = 0xff;
	RegAddr = 0x100001ec;

	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);
	WRITE8(RegAddr++, Value);	

#endif

	return;	
}

#endif 


/************************************************************************/
/*	在 SN-6047B 开发板上 键盘端口使用 4 - 21 
                                                                        */
/************************************************************************/
static void  key_port_initial_sn6047b( void )	
{
	UINT8	Value;	
//	UINT16  i;
	UINT32	RegAddr; 

	// 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);	

#ifdef QLZ_DEBUG_00_X
	sio_printf("PhyVal = 0x%x  I = %d \r\n", tmp_key2, i);
#endif
	
	// 检查该值是否合法, 不合法返回 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 )
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -