📄 pmp_io_function.c
字号:
// 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 + -