📄 hw_fr0605akey.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_vx979key.c
Desc : VX979按键消息\接口函数的实现
Author : huangxinyu
Date : 2007-07-09
Notes :
$Log: hw_Fr0605Akey.c,v $
Revision 1.1.1.1 2008/03/06 13:29:06 Lingzhaojun
no message
Revision 1.1 2007/11/26 14:31:30 Huangxinyu
增加vx979key目录
Revision 1.4 2007/10/15 09:16:37 Huangxinyu
根据RK27提交修改driver
Revision 1.3 2007/10/08 02:38:45 Lingzhaojun
添加版本自动注释脚本
*********************************************************************/
#include "include.h"
#include "hw_include.h"
#include "hw_gpio.h"
#include "hw_Fr0605Akey.h"
#include "keyglobal.h"
#include "hwapi_adc.h"
#include "hw_timer.h"
#if (KEY_TYPE == Fr0605AKEY)
static UINT16 gKeyPortState; /* 用于记录 按键 PIO 的状态,相应位为高表示按下,相应位为低表示没有按下或弹起 */
static UINT8 gKeyPioState; /* 用于记录GPIO口用作keyboard之前的状态,在反初始化时可恢复 */
#ifdef ADC_KEY_EN
extern INT16U gKeyScanCode;
extern INT16U gKeyDownMsgSend;
extern unsigned short AdcValue[4];
//extern unsigned char AdcCurrChn;
#endif
extern UINT16 gSysState;
void FieldRockKeySendMsg(UINT16 press , UINT16 KeyNo);
KEYEXT UINT16 gKeyIOMasks[] =
{PIO_MENU_MASK, PIO_FFW_MASK, PIO_FFD_MASK, PIO_UP_MASK, PIO_PLAY_MASK };
/**************************************************************************
* 函数描述: 导航键初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void RockKey_PowerOnInit(void)
{
gKeyPioState = GPIO_GetPortDirection(PIO_KEY);
//GPIO_PullUpDown(GPIOPortA_Pin7, GPIOPort_NoPull);
//GPIO_SetPinDirection(GPIOPortA_Pin7, GPIO_IN);
GPIO_SetPinDirection(GPIOPortC_Pin1, GPIO_IN);
GPIO_SetPinDirection(GPIOPortC_Pin2, GPIO_IN);
GPIO_SetPinDirection(GPIOPortC_Pin3, GPIO_IN);
GPIO_SetPinDirection(GPIOPortC_Pin4, GPIO_IN);
GPIO_SetPinDirection(GPIOPortC_Pin6, GPIO_IN);
GPIO_SetPinLevel(GPIOPortC_Pin1,GPIO_LOW);
GPIO_SetPinLevel(GPIOPortC_Pin2,GPIO_LOW);
GPIO_SetPinLevel(GPIOPortC_Pin3,GPIO_LOW);
GPIO_SetPinLevel(GPIOPortC_Pin4,GPIO_LOW);
GPIO_SetPinLevel(GPIOPortC_Pin6,GPIO_LOW);
#ifdef ADC_KEY_EN
//StartHWTimer(1/*timer1*/, 1/*mstick*/, ADC_KEY_TimerISR);
#endif
}
UINT16 TestadcValue;
/**************************************************************************
* 函数描述: 导航键硬件检测
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void RockKeyScanning( void )
{
UINT8 pioData;
UINT16 keys;
UINT16 tempADCValue;
//GPIO_SetPortDirection(PIO_KEY, 0x0); // set key port to input
pioData = GPIO_GetPortLevel(PIO_KEY);
for( keys = 0; keys < (UINT8)MAX_PIO_KEYS; keys++ )
{
if( (pioData & gKeyIOMasks[keys])==0 ) //为低,按键没有按下
{
if(gKeyPortState & (0x0001<<keys)) /* 原来是按下 状态 */
{
gKeyPortState &= ~(0x0001<<keys);
// RockStopTimer( TID_KEY_BASE-KEY_SCAN_MIN+keys );
FieldRockKeySendMsg( 0 , KEY_SCAN_MIN+keys );
}
}
else /* 按键按下 */
{
if((gKeyPortState & (0x0001<<keys))==0 ) /* 原来是 弹起 状态 */
{
gKeyPortState |= 0x0001<<keys;
FieldRockKeySendMsg( 1 , KEY_SCAN_MIN+keys );
}
}
}
#if 0
// GPIO_SetPinDirection(GPIOPortA_Pin7, GPIO_IN);
pioData = GPIO_GetPinLevel(GPIOPortA_Pin7);
if( pioData == 1) //
{
if((gKeyPortState & (0x0001<<MAX_PIO_KEYS))==0 ) // 原来是弹起状态
{
gKeyPortState |= 0x0001<<MAX_PIO_KEYS;
FieldRockKeySendMsg(1, MAX_PIO_KEYS);
}
}
else
{
if(gKeyPortState & (0x0001<<MAX_PIO_KEYS)) // 原来是按下状态
{
gKeyPortState &= ~(0x0001<<MAX_PIO_KEYS);
FieldRockKeySendMsg(0, MAX_PIO_KEYS);
}
}
#endif
#if 1
//ADC_Start(KEYBOARD_ADC, NULL); // KEYBOARD_ADC
//DelayMs_nops(5);
//ADC_ReadData(&tempADCValue);
//if( tempADCValue < 300 )
tempADCValue = AdcValue[KEYBOARD_ADC];
TestadcValue = tempADCValue;
if( AdcValue[KEYBOARD_ADC] > 300 )
{
if((gKeyPortState & (0x0001<<(MAX_PIO_KEYS+1)))==0 ) // 原来是弹起状态
{
gKeyPortState |= 0x0001<<(MAX_PIO_KEYS+1);
FieldRockKeySendMsg(1, (MAX_PIO_KEYS+1));
}
}
else
{
if(gKeyPortState & (0x0001<<(MAX_PIO_KEYS+1))) // 原来是按下状态
{
gKeyPortState &= ~(0x0001<<(MAX_PIO_KEYS+1));
FieldRockKeySendMsg(0, (MAX_PIO_KEYS+1));
}
}
#endif
}
/**************************************************************************
* 函数描述: 发送按键消息
*
* 入口参数: UINT16 press , UINT16 KeyNo
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void FieldRockKeySendMsg(UINT16 press , UINT16 KeyNo)
{
if(gSysState&SYS_LCD_OFF) //黑屏先唤醒
{
if(KeyNo == 7) //HOLD键另外处理
{
RockKeySendKeyMsg(press, KeyNo);
return;
}
if(press == 1)
return;
else
RockKeySendKeyMsg(press, 8); //发送无效消息
return;
}
else
{
RockKeySendKeyMsg(press, KeyNo);
return;
}
}
static unsigned char AdcCurrChn = 0;
/**************************************************************************
* 函数描述: 读取通道AB的值和AD键数值
*
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void ADC_KEYSCAN_READ(void)
{
unsigned short adctemp;
//********************AD键读入判断*******************************
if(ADC_ReadData(&adctemp))
AdcValue[AdcCurrChn] = adctemp;
AdcCurrChn++;
if(AdcCurrChn>=Adc_channel_max)
AdcCurrChn = Adc_channel0;
ADC_Start(AdcCurrChn,NULL);
}
/**************************************************************************
* 函数描述: 导航键反初始化
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void RockKey_PowerOffDeinit(void)
{
GPIO_SetPortDirection(PIO_KEY,gKeyPioState); // restore key port
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -