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

📄 pmp_io_function.c

📁 嵌入式系统下的文件管理处理,和基本图片jpg格式处理原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	// initial key hold
	port_type	= PMP3050IOConfig.key_hold >> 8;
	pin_num		= PMP3050IOConfig.key_hold & 0xff;
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_INPUT<<pin_num));

	return;
}
/************************************************************************/
/*			配置I/O 的输入输出

  input:
			PortType	[in]	UINT16	端口类型的定义
			PinMask		[in]	UINT32	需要屏蔽的引脚
								0 表示不需要操作此PIN
								1 表示操作此PPPIN
			DirValue	[in]	UINT32	设置的方向值
								0 表示输入
								1 表示输出	
  output:
			0 成功, 非0值失败
  func:
			配置I/O 的输入/输出状态
                                                                        */
/************************************************************************/
UINT16 SPMP_IO_DirConfig(	
							UINT16 PortType, 
							UINT32 PinMask,
							UINT32 DirValue 
							)
{
	UINT16	i,j,num;	
	UINT32 input_enable;
	UINT32 output_enable;

	i = PortType - PORT_TYPE_GPIO;					// get offset

	output_enable	= SPMP3050_RegTab[i][ OFFSET_OUTPUT_EN ];
	input_enable	= SPMP3050_RegTab[i][ OFFSET_INPUT_EN ];
	num = SPMP3050_RegTab[i][ OFFSET_NUMBER ];

	j = (num + 7)/8;				// 计算需要操作的次数 

	for( i=0x00; i<j; i++ )
	{
		// 设定输出使能寄存器
		set_mcu_reg( output_enable, (UINT8)(PinMask&0xff), (UINT8)(DirValue&0xff));	

		// 设定输入使能寄存器
		set_mcu_reg( input_enable, (UINT8)((~PinMask) &0xff), (UINT8)((~DirValue)&0xff));

		// 进行数据的移位
		PinMask >>= 0x08;
		DirValue >>= 0x08;

		// 修改寄存器地址
		output_enable ++;
		input_enable ++;
	}

	return RET_OK;	// 返回成功
}

/************************************************************************/
/*			使能/无效 I/O 的PULL
  input:
			PortType	[in]	UINT16	端口类型的定义
			PinMask		[in]	UINT32	需要屏蔽的引脚
								0 表示不需要操作此PIN
								1 表示操作此PPPIN
			DirValue	[in]	UINT32	设置的方向值
								0 表示输入
								1 表示输出	
  output:
			0 成功, 非0值失败
  func:
			使能/无效端口的上拉电阻
                                                                        */
/************************************************************************/
UINT16 SPMP_IO_PullConfig( UINT16 PortType, UINT32 PinMask,UINT32 Value )
{
	UINT16	i,j,num;	
	UINT32	reg_addr;

	i = PortType - PORT_TYPE_GPIO;						// get offset
	reg_addr = SPMP3050_RegTab[i][ OFFSET_PULL_EN];	// get register begin addr

	num = SPMP3050_RegTab[i][ OFFSET_NUMBER ];	// get pin count
	j = (num + 7)/8;				// 计算需要操作的次数 

	for( i=0x00; i<j; i++, reg_addr++ )
	{
		// 设定输出使能寄存器
		set_mcu_reg( reg_addr, (UINT8)(PinMask&0xff), (UINT8)(Value&0xff));
		// 进行数据的移位
		PinMask >>= 0x08;
		Value >>= 0x08;
	}
	return RET_OK;	// 返回成功
}

/************************************************************************/
/*			进行PULL的选择
  input:
			PortType	[in]	UINT16	端口类型的定义
			PinMask		[in]	UINT32	需要屏蔽的引脚
								0 表示不需要操作此PIN
								1 表示操作此PPPIN
			DirValue	[in]	UINT32	设置的方向值
								0 表示输入
								1 表示输出	
  output:
			0 成功, 非0值失败
  func:
			选择端口的上拉/下拉电阻
                                                                        */
/************************************************************************/
UINT16 SPMP_IO_PullSelect(UINT16 PortType, UINT32 PinMask, UINT32 Value )
{
	UINT16	i,j,num;	
	UINT32	reg_addr;

	i = PortType - PORT_TYPE_GPIO;					// get offset

	reg_addr = SPMP3050_RegTab[i][ OFFSET_PULL_SEL ];	// get register begin addr
	num = SPMP3050_RegTab[i][ OFFSET_NUMBER];			// get pin count

	j = (num + 7)/8;					// 计算需要操作的次数 

	for( i=0x00; i<j; i++, reg_addr++ )
	{
		// 设定输出使能寄存器
		set_mcu_reg( reg_addr, (UINT8)(PinMask&0xff), (UINT8)(Value&0xff));
		// 进行数据的移位
		PinMask >>= 0x08;
		Value >>= 0x08;
	}

	return RET_OK;	// 返回成功
}

/************************************************************************/
/*		
  input:
			PortType	[in]	UINT16	端口类型的定义
			PinMask		[in]	UINT32	需要屏蔽的引脚
										0 表示不需要操作此PIN
										1 表示操作此PPPIN
			pValue		[out]	UINT32 *
 output:
			0 成功, 非0值失败
  func:
			配置I/O 的输入/输出状态
                                                                        */
/************************************************************************/
UINT16 SPMP_IO_Read( UINT16 PortType, UINT32 PinMask, UINT32 *pValue )
{
	UINT16	i,j,num;	
	UINT32	reg_addr;	
	UINT8	buf[0x10];
	UINT32	temp;

	i = PortType - PORT_TYPE_GPIO;
	reg_addr = SPMP3050_RegTab[i][ OFFSET_INPUT_VAL ];
	num = SPMP3050_RegTab[i][ OFFSET_NUMBER];
	j = (num + 7)/8;				// 计算需要操作的次数 

	for( i=0x00; i<j; i++, reg_addr++ )
	{
		// 进行数据的读动作		
		buf[i] = READ8( reg_addr );
#ifdef QLZ_DEBUG_00_X
	sio_printf("\r\n reg = 0x%x data = 0x%x\r\n", reg_addr, buf[i]);	
#endif		
	}

	temp = 0x00;

	for( i=j-1; i--; temp <<= 0x08) {// 进行数据的移位组合		
		temp |= buf[i];
		if (!i) {
			break;
		}
	}

#ifdef QLZ_DEBUG_00_X
	sio_printf(" TOTAL = 0x%x\r\n", temp);	
#endif		

	*pValue = temp & PinMask;	// 进行数据的或操作	

	return RET_OK;	// 返回成功
}

/************************************************************************/
/*	
  status:
			OK!		lanzhu@[01/26/2007]
  input:
			PortType	[in]	UINT16	端口类型的定义
			PinMask		[in]	UINT32	需要屏蔽的引脚
										0 表示不需要操作此PIN
										1 表示操作此PPPIN
  output:
			0 成功, 非0值失败
  func:
			配置I/O 的输入/输出状态
                                                                        */
/************************************************************************/
UINT16 SPMP_IO_Write( UINT16 PortType, UINT32 PinMask, UINT32 Value )
{
	UINT16	i,j,num;	
	UINT32	reg_addr;	

	i = PortType - PORT_TYPE_GPIO;
	reg_addr = SPMP3050_RegTab[i][ OFFSET_OUTPUT_VAL ];
	num = SPMP3050_RegTab[i][ OFFSET_NUMBER];

	j = (num + 7)/8;				// 计算需要操作的次数 

	// 进行数据的写动作
	for(i=0x00; i<j; i++, PinMask >>= 0x08, Value >>= 0x08)
	{
#ifdef QLZ_DEBUG_00_X
	sio_printf("reg = 0x%x Mask = 0x%x Value =0x%x \r\n", reg_addr, (UINT8)(PinMask&0xff), (UINT8)(Value&0xff));
#endif
		set_mcu_reg(reg_addr, (UINT8)(PinMask&0xff), (UINT8)(Value&0xff));
		reg_addr ++;
	}

	return RET_OK;	// 返回成功
}

/************************************************************************/
/*			对一个寄存器的进行数据操作
  input:
			RegAddr		[in]	UINT32	寄存器的地址值 
			MaskBit		[in]	UINT8	屏蔽值
			Data		[in]	UINT8	需要设定的值	
  output:
			0 成功, 非0值失败
  func:	
                                                                        */
/************************************************************************/
static void set_mcu_reg( UINT32 RegAddr, UINT8 MaskBit, UINT8 Data )
{
	UINT8 i,j;


	i = READ8( RegAddr );	// 获得寄存器的当前值

#ifdef QLZ_DEBUG_00_X
	sio_printf("Reg = 0x%x  ORGValue =0x%x\r\n", RegAddr, i);
#endif

	i &= ~MaskBit;			// 将需要处理的 BIT 设置为 '0'
	j = Data & MaskBit;		// 将数据中不需要处理的数据位 设置为 '0'	
	i |= j;					// 进行数据的"或"操作

#ifdef QLZ_DEBUG_00_X
	sio_printf(" WR DATA =0x%x\r\n",i);
#endif
	
	WRITE8( RegAddr, i );	// 将数据"回写" 寄存器
	
	return;	
}

/************************************************************************/
/*					背光的控制函数
  status:
			test OK!	lanzhu@[01/25/2007] 19:02
  input:
			flag	[in]	UINT16 
							LCM_LIGHT_ENABLE					
							LCM_LIGHT_DISABLE		
  output:
			void 
  func:
  note:
                                                                        */
/************************************************************************/

#ifdef NEW_IO_DEBUG


void SPMP_LCM_LightCtrl( UINT16 flag )
{
	UINT32 i;
	UINT16 port_type;
	UINT16 pin_num;

	port_type	= PMP3050IOConfig.lcm_light >> 8;
	pin_num		= PMP3050IOConfig.lcm_light & 0xff;

	i = 0x00;
	if ( LCM_LIGHT_ENABLE == flag ) {
		i = 0x01;
	}

#ifdef QLZ_DEBUG_00_X
	sio_printf("\r\n ---> 新LCM 控制 flag = 0x%x Port = 0x%x Pin = 0x%x\r\n", 
					flag, 
					port_type,
					pin_num);	
#endif

	SPMP_IO_Write(port_type, (UINT32)(1<<pin_num), (UINT32)(i<<pin_num));

	if( LCM_LIGHT_ENABLE == flag)
	{
#ifdef QLZ_DEBUG_00_X
		sio_printf(" ---  进行LCM的设置!\r\n");	
#endif
		hwDispPnl_HX8312_Supply();
	}

#ifdef QLZ_DEBUG_00_X
	sio_printf("\r\n --- LCM 控制 返回!!!\r\n");				
#endif

	return;
}

#endif

/************************************************************************/
/*			读取耳机检测引脚的状态
  status:
			OK!
  input:
			void 
  output:
			HEADPHONE_IN		耳机已经接入
			HEADPHONE_OUT		耳机已经拔出
  func:
  note:
  	[03/07/2007] lanzhu 修改耳机检测函数
  
			如果是"1", 表示 "耳机" 接入	
			如果是"0", 表示"耳机" 拔出			
                                                                        */
/************************************************************************/

#ifdef NEW_IO_DEBUG

UINT16 SPMP_Get_HPStatus( void )
{
	UINT32 i;
	UINT16 port_type;
	UINT16 pin_num;
	UINT16 j;
	
	port_type	= PMP3050IOConfig.earphone_detect >> 8;
	pin_num		= PMP3050IOConfig.earphone_detect & 0xff;

	for(j=0x00; j<0x03; j++)
	{
	// 读取耳机端口的状态值
	SPMP_IO_Read((UINT16)port_type, (UINT32)(1<<pin_num), &i);

		if ( !(i & (1<<pin_num)) )
		{
			gEarPhoneDetectCnt = 0x00;
			return HEADPHONE_OUT;		// 耳机没有接入
		}			
	}
	
	gEarPhoneDetectCnt ++;

	if(gEarPhoneDetectCnt > 0x02 )
	{		
		gEarPhoneDetectCnt --;
		return HEADPHONE_OUT;//HEADPHONE_IN;		
	}

	return HEADPHONE_OUT;		// 耳机没有接入
} 
#endif

/************************************************************************/
/*			设定 SPEAKER MUTE
  input:
			flag	[in]	UINT16 
								0  静音
								1  有声
  output:
			0 成功, 非0值失败
  func:
                                                                        */
/************************************************************************/
#ifdef NEW_IO_DEBUG
#define IO_SPEAKER_MUTE		(6)

UINT16 SPMP_Speaker_Set( UINT16 flag )
{	
	UINT32 i;
	UINT16 port_type;
	UINT16 pin_num;

	// !!! 需要将 初始化 拿出去
	SPMP_SetRegBit ( REG_GPIO_FINT_EN, IO_SPEAKER_MUTE, 0 );
	SPMP_SetRegBit( REG_GPIO_RINT_EN, IO_SPEAKER_MUTE, 0 );		// disable interrupt 	
	SPMP_SetRegBit( REG_GPIO_PULL_EN, IO_SPEAKER_MUTE, 1);		// enable pull 
	SPMP_SetRegBit( REG_GPIO_OUTPUT_EN, IO_SPEAKER_MUTE, 1);	// enable output 

	port_type	= PMP3050IOConfig.speaker_mute >> 8;
	pin_num		= PMP3050IOConfig.speaker_mute & 0xff;

	i = flag;

	// 设定 SPEKAER 功放是否打开
	SPMP_IO_Write((UINT16)port_type, (UINT32)(1<<pin_num), (UINT32)(i<<pin_num));
	
	return 0;
}

#endif

/************************************************************************/
/*			对POWER键进行检查
  status:
			test OK!
  input:
			void 
  output:
			0 POWER 键没有按下, 非0值 POWER 键被按下
  func:
  note:
                                                                        */
/************************************************************************/
#ifdef NEW_IO_DEBUG

UINT16 SPMP_Power_Detect( void  )
{
	UINT32 i,ret;
	UINT16 port_type;
	UINT16 pin_num;

	// 获得端口类型和引脚值
	port_type	= (PMP3050IOConfig.power_detect >> 8) & 0xff;
	pin_num		= PMP3050IOConfig.power_detect & 0xff;

	// 读取端口的状态
	SPMP_IO_Read(port_type, (UINT32)(1<<pin_num), &i);

	ret = 0x00;
	if ( i & (1<<pin_num)) 
	{
#ifdef QLZ_DEBUG_00_X
	sio_printf("\r\n -- 关机键按下!!!\r\n");
#endif
		return POWER_KEY_DOWN;
	}

	// 返回 POWER 键的状态
	return POWER_KEY_UP;
}

#endif

/************************************************************************/
/*			控制EVB 电路的电源开关

  status:
			OK!!!	还需要进行初始化的动作!!!
  input:
			flag	[in]	UINT16  
							SPMP_POWER_OFF
							SPMP_POWER_ON
  output:	void 	
  func:
  note:
			如果是关闭系统电源, 程序不返回
										                                */
/************************************************************************/

#ifdef NEW_IO_DEBUG

void SPMP_PowerControl ( UINT16 flag )
{
	UINT32 i;
	UINT16 port_type;
	UINT16 pin_num;


	port_type	= (PMP3050IOConfig.power_enable >> 8) & 0xff;
	pin_num		= PMP3050IOConfig.power_enable & 0xff;

	i = 0x00;
	if ( SPMP_POWER_ON == flag) 
	{
#ifdef QLZ_DEBUG_00
	sio_printf("\r\n ------- 电源使能!!! \r\n");
#endif
		i = 0x01;
	}

	SPMP_SetRegBit(REG_HOST_INTERFACE_EN,pin_num,0);  //HGPIO1 disable
	{
		SPMP_SetRegBit(REG_HGPIO_INPUT_EN, pin_num, 0);
		SPMP_SetRegBit(REG_HGPIO_OUTPUT_EN, pin_num, 1);		
	}

	SPMP_IO_Write(port_type, (UINT32)(1<<pin_num), (UINT32)(i<<pin_num));

	if ( SPMP_POWER_OFF == flag ) 
	{

		SPMP_SetRegBit(REG_HGPIO_PULL_EN, pin_num, 0);

#ifdef QLZ_DEBUG_00
		sio_printf("\r\n ------- 关闭电源!!! \r\n");
#endif
		if(0==flag)
				{
			dispReg_t  *pdispReg;
			pdispReg = (dispReg_t *)(0x1000a000);
			//pdispReg->lcmgpiosel[3] = pdispReg->lcmgpiosel[3] | 0x01 ;  //将该IO设置为普通IO口
			pdispReg->lcmgpiosel[3] |= 0xfe; //0:output enable ; 1:output disable ;
			pdispReg->lcmgpioo[3] = pdispReg->lcmgpioo[3] &0xfe;   //该IO输出低电平	
			sio_printf("yyy++++++\r\n");
				}
		while (1); 
	}

	return;
}

#endif

/************************************************************************/
/*				获取 HOLD 键的状态
  status:
			test OK!
  input:
			void 
  output:
			0: unhold	1: hold  
  func:
			获得HOLD 键的状态
  note:
                                                                        */
/************************************************************************/

#ifdef NEW_IO_DEBUG

UINT32 SPMP_GetHoldKeyStatus( void )
{
	UINT32 i,ret;
	UINT16 port_type;
	UINT16 pin_num;

	port_type	= (PMP3050IOConfig.key_hold >> 8) & 0xff;
	pin_num		= PMP3050IOConfig.key_hold & 0xff;
	
	SPMP_IO_DirConfig(port_type, (UINT32)(1<<pin_num), (UINT32)(DIR_INPUT));

	SPMP_IO_Read(port_type, (UINT32)(1<<pin_num), &i );

	ret = 0x00;
	if (i & (1<<pin_num)) 
	{
		ret = 0x01;
	}

#ifdef QLZ_DEBUG_00_X
	sio_printf("\r\n HOLD ret = 0x%x\r\n", ret);
#endif

	return ret;
}

#endif

⌨️ 快捷键说明

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