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

📄 pmp_io_function.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-------------------------------------------------*
* $RCSfile: pmp_io_function.c,v $
* $Date: 2007/01/27 10:03:18 $
* $Author: lanzhu $
* $Log: pmp_io_function.c,v $
* Revision 1.5  2007/01/27 10:03:18  lanzhu
* 新耳机检测函数,测试OK!
*
* Revision 1.4  2007/01/26 11:59:59  lanzhu
* 保存 01/26/2007 的工作
*
* Revision 1.3  2007/01/25 14:24:39  lanzhu
* 保存 1/26 晚的工作 23:09
*
* Revision 1.2  2007/01/25 13:25:57  lanzhu
* 保存 1/26 晚的工作
*
* Revision 1.1.1.1  2007/01/17 12:28:43  lanzhu
* 齐兰柱 准备一个新的代码分支
*
* Revision 1.3  2006/12/18 10:24:17  lanzhu
* 保存能 12/18 的工作
*
*--------------------------------------------------*/

#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 "appdriver.h"

#include "pmp_io.h"

UINT16 SPMP_IO_DirConfig(UINT16 PortType, UINT32 PinMask,UINT32 DirValue);
UINT16 SPMP_IO_Read( UINT16 PortType, UINT32 PinMask, UINT32 *pValue );
UINT16 SPMP_IO_Write( UINT16 PortType, UINT32 PinMask, UINT32 Value );

/**************************************************************************
 *                   G E N E R A L    C O N S T A N T S                   *
 **************************************************************************/


enum
{
		PHY_KEY_UP	 = 0x00,
		PHY_KEY_DOWN = 0x01,
		
		KEY_NUM_MAX = 8,

		/* --- LOG KEY  */	
		LOG_KEY_00 = 0,
		LOG_KEY_01 = 1,
		LOG_KEY_02 = 2,
		LOG_KEY_03 = 3,
		LOG_KEY_04 = 4,
		LOG_KEY_05 = 5,
		LOG_KEY_06 = 6,
		LOG_KEY_07 = 7,
		LOG_KEY_08 = 8,
		LOG_KEY_09 = 9,
		LOG_KEY_10 = 10,
		LOG_KEY_11 = 11,
		LOG_KEY_12 = 12,

		/* ---	RET VALUE ----- */
		RET_OK	= 0x00,
		RET_ERR	= (-1),

		DIR_INPUT	= 0x00,
		DIR_OUTPUT	= 0x01,

		/* ---- PORT TYPE ----- */
		PORT_TYPE_GPIO			= 0x10,		// 端口类型的定义
		PORT_TYPE_HGPIO,
		PORT_TYPE_LCMGPIO,
		PORT_TYPE_UGPIO09,
		PORT_TYPE_UGPIO1019,
		
		/* ---- offset in array --- */
		OFFSET_OUTPUT_EN	= 0,		// 各寄存器所在数组的偏移量
		OFFSET_INPUT_EN,
		OFFSET_OUTPUT_VAL,
		OFFSET_INPUT_VAL,
		OFFSET_PULL_EN,
		OFFSET_PULL_SEL,
		OFFSET_NUMBER,
		
		OFFSET_FINT_EN,
		OFFSET_RINT_EN,
		
		/* ---- GPIO ------ */
		REG_GPIO_OUTPUT_EN	= 0x10001108,	// direction control 
		REG_GPIO_INPUT_EN	= 0x100001ec,
		
		REG_GPIO_OUTPUT_VAL = 0x10001100,		
		REG_GPIO_INPUT_VAL	= 0x10001110,	// input output value 
		
		REG_GPIO_PULL_EN	= 0x100001c8,	// pull select 		
		REG_GPIO_PULL_SEL	= 0x100001a4,
		
		PIN_NUMBER_GPIO		= 21,			// GPIO 的数量
		
		REG_GPIO_FINT_EN	= 0x10001130,	// interrupt control 
		REG_GPIO_RINT_EN	= 0x10001138,
		
		/*		---- HOST GPIO */
		REG_HGPIO_OUTPUT_EN		= 0x1000b064,
		REG_HGPIO_INPUT_EN		= 0x100001f0,
		
		REG_HGPIO_OUTPUT_VAL	= 0x1000b068,
		REG_HGPIO_INPUT_VAL		= 0x1000b06c,
		
		REG_HGPIO_PULL_EN		= 0x100001cc,		
		REG_HGPIO_PULL_SEL		= 0x100001a8,
		
		PIN_NUMBER_HGPIO		= 25,
		
		REG_HOST_INTERFACE_EN	= 0x1000b320, 
		REG_HGPIO_DRIVING_SET	= 0x10000184,
		
		/*		---- LCM GPIO  */
		REG_LCM_GPIO_OUTPUT_EN		= 0x1000a1b3,	// LCM GPIO output enable 
		REG_LCM_GPIO_INPUT_EN		= 0x100001dc,	// input enable
		
		REG_LCM_GPIO_OUTPUT_VAL		= 0x1000a1af,		
		REG_LCM_GPIO_INPUT_VAL		= 0x1000a0c7,
		
		REG_LCM_GPIO_PULL_EN		= 0x100001b8,
		REG_LCM_GPIO_PULL_SEL		= 0x10000194,
		
		PIN_NUMBER_LCMGPIO			= 26,
		
		REG_LCM_GPIO_OUTPUT_SEL		= 0x1000a1b7,	// LCM GPIO output selection
		
		/*		--- UART GPIO  0-9 */
		REG_UGPIO_OUTPUT_09EN		= 0x10001884,
		REG_UGPIO_INPUT_EN			= 0x100001f4,
		
		REG_UGPIO_OUTPUT_09VAL		= 0x10001882,
		REG_UGPIO_INPUT_09VAL		= 0x10001886,
		
		REG_UGPIO_PULL_EN			= 0x100001d0,				
		REG_UGPIO_PULL_SEL			= 0x100001ac,
		
		PIN_NUMBER_UGPIO09			= 10,
		
		/*		--- UART GPIO 10 -19 */
		REG_UGPIO_OUTPUT_1019EN		= 0x1000188c,
		REG_UGPIO_INPUT_EN			= 0x100001f4,
		
		REG_UGPIO_OUTPUT_1019VAL	= 0x1000188a,
		REG_UGPIO_INPUT_1019VAL		= 0x1000188e,
		
		REG_UGPIO_PULL_EN			= 0x100001d0,				
		REG_UGPIO_PULL_SEL			= 0x100001ac,
		
		REG_UART_EN					= 0x10001880,	// uart enable 	
		
		PIN_NUMBER_UGPIO1019		= 10,
		
		REG_UGPIO_PULL_EN			= 0x100001d0,		
};

 /**************************************************************************
 *                             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                           *
 **************************************************************************/
 static UINT32 SPMP3050_RegTab[5][7] = 
 {
	 // GPIO register 
	 {	
		REG_GPIO_OUTPUT_EN,
		REG_GPIO_INPUT_EN,
		REG_GPIO_OUTPUT_VAL,
		REG_GPIO_INPUT_VAL,
		REG_GPIO_PULL_EN,
		REG_GPIO_PULL_SEL,
			 
		PIN_NUMBER_GPIO,
	 },
	 
	 // HGPIO
	 {
		 REG_HGPIO_OUTPUT_EN,	
		 REG_HGPIO_INPUT_EN,		
		 REG_HGPIO_OUTPUT_VAL,
		 REG_HGPIO_INPUT_VAL,
		 REG_HGPIO_PULL_EN,
		 REG_HGPIO_PULL_SEL,
				 
		 PIN_NUMBER_HGPIO,		
	},
		 
	 // LCM GPIO
	 {
		 REG_LCM_GPIO_OUTPUT_EN,
		 REG_LCM_GPIO_INPUT_EN,
		 REG_LCM_GPIO_OUTPUT_VAL,
		 REG_LCM_GPIO_INPUT_VAL,
		 REG_LCM_GPIO_PULL_EN,
		 REG_LCM_GPIO_PULL_SEL, 
		 PIN_NUMBER_LCMGPIO,				
	 },
			 
	 // UGPIO0-9
	 {
		 REG_UGPIO_OUTPUT_09EN,
		 REG_UGPIO_INPUT_EN,
		 REG_UGPIO_OUTPUT_09VAL,
		 REG_UGPIO_INPUT_09VAL,
		 REG_UGPIO_PULL_EN,				
		 REG_UGPIO_PULL_SEL,
		 PIN_NUMBER_UGPIO09,
	 },
			 
	 // UGPIO 10 - 19
	 {
		 REG_UGPIO_OUTPUT_1019EN,
		 REG_UGPIO_INPUT_EN,
							 
		 REG_UGPIO_OUTPUT_1019VAL,
		 REG_UGPIO_INPUT_1019VAL,
							 
		 REG_UGPIO_PULL_EN,				
		 REG_UGPIO_PULL_SEL,	
							 
		 PIN_NUMBER_UGPIO1019,				
	 },
					 
 };

 
 /**************************************************************************
 *                 E X T E R N A L   R E F E R E N C E S                  *
 **************************************************************************/

/**************************************************************************
 *               F U N C T I O N   D E C L A R A T I O N S                *
 **************************************************************************/

/*
------------------------------------------------------
  功能				3050EVB			556样机
------------------------------------------------------				
  PWR_DETECT		UGPIO14			GPIO6
------------------------------------------------------
  PWR_ENABLE		HGPIO1          LCMGPIO25
------------------------------------------------------
  lcm_light			GPIO5			GPIO1           
------------------------------------------------------  
  SPEAKER_MUTE		GPIO6           AUGPIO5
------------------------------------------------------
  PHONE_DETECT		GPIO7			AUGPIO1
------------------------------------------------------
  KEY_HOLD			GPIO8			GPIO8
------------------------------------------------------
  RTC_SCL			HGPIO2          HGPIO2
------------------------------------------------------
  RTC_SDA			HGPIO3          HGPIO3
------------------------------------------------------
  KEY 1-8			HGPIO4 - 11		HGPIO4 - 11
------------------------------------------------------  
 */
 
/*  SPMP3050 EVB IO config */
struct evb_io_config {
	UINT16 power_detect;
	UINT16 power_enable;
	UINT16 lcm_light;
	UINT16 speaker_mute;
	UINT16 earphone_detect;
	UINT16 key_hold;
};

/*
 *	3050 EVB 所使用的 I/O 	
 */
#ifdef BIG_APPLE
struct evb_io_config  PMP3050IOConfig = 
{
	//(PORT_TYPE_UGPIO1019 << 8 ) | 4,	// UGPIO14	power detect 
	(PORT_TYPE_GPIO	<<8) | 4,			// GPIO4	power detect  	
	(PORT_TYPE_HGPIO <<8) | 1,			//HGPIO1	power enable 
	(PORT_TYPE_GPIO	<<8) | 3,			// GPIO5	black light 	
	(PORT_TYPE_GPIO <<8) | 6,			// GPIO6	speaker mute 
	(PORT_TYPE_GPIO <<8) | 5,			// GPIO7	ear phone detect
	(PORT_TYPE_GPIO <<8) | 8,			// GPIO8	key hold	
};
#else
struct evb_io_config  PMP3050IOConfig = 
{
	(PORT_TYPE_GPIO	<<8) |  4,			//GPIO4	power detect 
	(PORT_TYPE_HGPIO <<8) | 1,			// GPIO1	power enable 
	(PORT_TYPE_GPIO	<<8) | 5,			// GPIO5	black light 	
	(PORT_TYPE_GPIO <<8) | 6,			// GPIO6	speaker mute 
	(PORT_TYPE_GPIO <<8) | 7,			// GPIO7	ear phone detect
	(PORT_TYPE_GPIO <<8) | 8,			// GPIO8	key hold	
};
#endif

/*
 *
 */
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,
};

/*
 *		I/O 与 逻辑键的对应关系
 */
static const UINT16 KeyIOConfigTable[KEY_NUM_MAX][2] = 
{
	//   I/O PIN TYPE					LOG KEY										
	{	( PORT_TYPE_HGPIO<<8)|4	,		LOG_KEY_00},
	{	( PORT_TYPE_HGPIO<<8)|5	,		LOG_KEY_01},
	{	( PORT_TYPE_HGPIO<<8)|6	,		LOG_KEY_02},
	{	( PORT_TYPE_HGPIO<<8)|7	,		LOG_KEY_03},
	{	( PORT_TYPE_HGPIO<<8)|8	,		LOG_KEY_04},
	{	( PORT_TYPE_HGPIO<<8)|9	,		LOG_KEY_05},
	{	( PORT_TYPE_HGPIO<<8)|10,		LOG_KEY_06},
	{	( PORT_TYPE_HGPIO<<8)|11,		LOG_KEY_07},
};



/*
 *   逻辑键值 和 GUI NSG的对应列表 
 */
#ifdef BIG_APPLE
static const UINT16  GUIKeyValue[KEY_NUM_MAX] = 
{
	GUI_KEY_UP,			//	LOG_KEY_00	
	GUI_KEY_DOWN ,		//	LOG_KEY_01
	GUI_KEY_LEFT,		//	LOG_KEY_02
	GUI_KEY_RIGHT,       //  LOG_KEY_03
	#if 0	
	GUI_KEY_MENU,		//	LOG_KEY_04
	GUI_KEY_ESC,		//	LOG_KEY_05	
	GUI_KEY_OK,
	#else	
	GUI_KEY_ESC,		//	LOG_KEY_05
	GUI_KEY_OK,
	GUI_KEY_TAB,		//	LOG_KEY_04
	#endif
	GUI_KEY_MENU,       //  LOG_KEY_07
};
#else


static const UINT16  GUIKeyValue[KEY_NUM_MAX] = 
{
#if 0
	GUI_KEY_UP,			//	LOG_KEY_00
	GUI_KEY_RIGHT,		//	LOG_KEY_01	
	GUI_KEY_LEFT,		//	LOG_KEY_02
	GUI_KEY_DOWN,       //  LOG_KEY_03

	GUI_KEY_MENU,		//	LOG_KEY_04
	GUI_KEY_ESC,		//	LOG_KEY_05	
	GUI_KEY_OK,			//	LOG_KEY_06
	GUI_KEY_TAB,       //  LOG_KEY_07
	#else
	GUI_KEY_MENU,
	GUI_KEY_TAB,
	GUI_KEY_OK,
	GUI_KEY_ESC,
	GUI_KEY_UP,
	GUI_KEY_LEFT,
	GUI_KEY_DOWN,
	GUI_KEY_RIGHT,
	#endif
}; 
#if	0
{
	GUI_KEY_UP,			//	LOG_KEY_00
	GUI_KEY_RIGHT,		//	LOG_KEY_01	
	GUI_KEY_LEFT,		//	LOG_KEY_02
	GUI_KEY_DOWN,       //  LOG_KEY_03

	GUI_KEY_MENU,		//	LOG_KEY_04
	GUI_KEY_ESC,		//	LOG_KEY_05	
	GUI_KEY_OK,			//	LOG_KEY_06
	GUI_KEY_TAB,       //  LOG_KEY_07
};
#endif
#endif
// set mcu register 
static void set_mcu_reg( UINT32 RegAddr, UINT8 MaskBit, UINT8 Data );

// qlz_debugging
// [03/07/2007] lanzhu add   for speaker
static UINT16 gEarPhoneDetectCnt = 0X00;
/************************************************************************/
/*			输入一个逻辑键盘值
  input:
			log_key	[in]	UINT16		逻辑键值
			pGUI	[out]	UINT16 *	获得的GUI键值	
  output:
			0 成功, 非0值失败
  func:
  note:
                                                                        */
/************************************************************************/
#ifdef BIG_APPLE
UINT16 SPMP_KEY_GetGUIKey( UINT16 log_key, UINT16 *pGUI )
{
	if ( (log_key&0xff) >= KEY_NUM_MAX) 
	{
		return RET_ERR;
	}
	*pGUI = GUIKeyValue[log_key&0x0f];	// 获得GUI 消息值
	log_key = log_key>>8;
	if((*pGUI==GUI_KEY_DOWN)&&(log_key&0x10))
	{//repeat down  
		*pGUI = 0x0E;
	}	
	if((*pGUI == GUI_KEY_TAB)&&(log_key&0x20))
	{
		*pGUI = GUI_KEY_MENU;
	}else{
		*pGUI |=  (log_key&0x30);
	}	

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n GET GUI key 0x%x  0x%x\r\n", log_key, *pGUI);
#endif
	
	return RET_OK;
}
#else
UINT16 SPMP_KEY_GetGUIKey( UINT16 log_key, UINT16 *pGUI )
{
	if ( log_key >= KEY_NUM_MAX) 
	{
		return RET_ERR;
	}


	*pGUI = GUIKeyValue[log_key];	// 获得GUI 消息值

#ifdef QLZ_DEBUG_00
	sio_printf("\r\n GET GUI key 0x%x  0x%x\r\n", log_key, *pGUI);
#endif
	
	return RET_OK;
}
#endif

/************************************************************************/
/*
  input:
			pdtaa	[out]	UINT32 *	存放当前键盘状态的指针
  output:
			0 成功, 非0值失败
  func:
			根据KEY I/O 的配置表, 进行逐个键盘的扫描, 获取该键值当前的状态
			
			获得 按键状态的 bitmap table 

  note:
			使用用于记录KEY I/O 的数组
			
			对于 bitmap 来说, "0" 表示无键按下, "1" 表示有键按下

	                                                                    */
/************************************************************************/
UINT16 SPMP_KEY_PhyScan( UINT32 * pdata )
{
	UINT16 i,j,k;
	UINT16 port_type, pin_num;
	UINT32 value,mask,temp;

	temp = 0x00;
	k = 0x01;

	for(i=0x00; i<KEY_NUM_MAX; i++, k <<= 0x01)
	{
		j = KeyIOConfigTable[i][0x00];	// 获得 配置信息

		port_type = (j>>8) & 0xff;
		pin_num = j & 0xff;
		mask = 1<<pin_num;

		SPMP_IO_Read(port_type, mask, &value);

		if ( value & mask ) { continue; }	// 读到为高电平, 继续进行执行
		
		temp |= k;
	}
	
	*pdata = temp;
	
	return RET_OK;	// 返回成功.
}
/************************************************************************/
/*			初始化 EVB 的相关I/O 的状态
  input:
			void 
  output:
			void 
  func:
			进行相关I/O的初始化
  note:
			使用全局数组变量
                                                                        */
/************************************************************************/
void SPMP_EVBIO_Initial( void )
{
//	UINT16 i;
	UINT16 port_type, pin_num;

	// initial power detect
	port_type	= PMP3050IOConfig.power_detect >> 8;
	pin_num		= PMP3050IOConfig.power_detect & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_INPUT<<pin_num));

	// initial power enable 
	port_type	= PMP3050IOConfig.power_enable >> 8;
	pin_num		= PMP3050IOConfig.power_enable & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_OUTPUT<<pin_num));
	// output high level 
	SPMP_IO_Write( port_type, (UINT32)(1<<pin_num), (UINT32)(1<<pin_num));

	// initial black light 
	port_type	= PMP3050IOConfig.lcm_light >> 8;
	pin_num		= PMP3050IOConfig.lcm_light & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_OUTPUT<<pin_num));
	// output high level 
	SPMP_IO_Write( port_type, (UINT32)(1<<pin_num), (UINT32) 0x00);

	// initial speaker mute 
	port_type	= PMP3050IOConfig.speaker_mute >> 8;
	pin_num		= PMP3050IOConfig.speaker_mute & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_OUTPUT<<pin_num));
	// output low level 
	SPMP_IO_Write( port_type, (UINT32)(1<<pin_num), (UINT32) 0x00);

	// initial ear phone detect
	port_type	= PMP3050IOConfig.earphone_detect >> 8;
	pin_num		= PMP3050IOConfig.earphone_detect & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_INPUT<<pin_num));

⌨️ 快捷键说明

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