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