📄 hw_gpio.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : hw_gpio.c
Desc : GPIO接口函数的实现
Author : huangxinyu
Date : 2007-06-02
Notes :
$Log: hw_gpio.c,v $
Revision 1.8 2008/07/10 01:58:47 DDL
增加对camera模块的支持 由宏ROCK_CAMRA隔离
dengdl
Revision 1.7 2008/06/19 04:43:30 Administrator
代码整理!
Revision 1.6 2008/06/12 08:00:40 HXY
增加GPIO的中断跳转处理
Revision 1.5 2008/05/29 12:05:10 HXY
去掉GPIOMAXNUM_PIN,修正GPIO_PowerOnInit中的SD_DETECT_PIN
Revision 1.4 2008/05/27 02:26:10 HXY
PF问题口修正
Revision 1.3 2008/05/15 09:11:05 HXY
开机闪白屏的优化
Revision 1.2 2008/05/15 07:59:32 HXY
1.对输入有问题的口特殊处理
2.PE、PF口中断处理
3.Port设置去掉
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.2 2008/03/10 01:57:00 Hanjiang
no message
Revision 1.1.1.1 2008/03/06 13:29:05 Lingzhaojun
no message
Revision 1.7 2007/11/26 14:37:14 Huangxinyu
增加GPIO_PullUpDown接口
Revision 1.6 2007/11/01 01:45:49 Huangxinyu
增加RK2706的兼容性
Revision 1.5 2007/10/31 10:02:43 Lingzhaojun
no message
Revision 1.4 2007/10/31 07:35:19 Lingzhaojun
提交关机模块
Revision 1.3 2007/10/15 09:07:07 Huangxinyu
根据RK27提交修改driver
Revision 1.2 2007/10/08 02:38:42 Lingzhaojun
添加版本自动注释脚本
*********************************************************************/
#include "hw_include.h"
#include "hw_gpio.h"
#define GPIOPortC_Pin5_Bit (1<<5)
#define GPIOPortD_Pin0_Bit (1<<0)
#define GPIOPortD_Pin1_Bit (1<<1)
#define GPIOPortD_Pin2_Bit (1<<2)
#define GPIOPortD_Pin3_Bit (1<<3)
#define GPIOPortD_Pin5_Bit (1<<5)
#define GPIOPortD_Pin6_Bit (1<<6)
#define GPIOPortF_Pin0_Bit (1<<0)
UINT8 gGPIOPC5State = 0;
UINT8 gGPIOPortState[8] = {0, 0, 0, 0, 0, 0, 0, 0};
UINT8 gGPIOErrorPinState[8] = {GPIOPortC_Pin5_Bit, GPIOPortD_Pin0_Bit, GPIOPortD_Pin1_Bit, GPIOPortD_Pin2_Bit,
GPIOPortD_Pin3_Bit, GPIOPortD_Pin5_Bit, GPIOPortD_Pin6_Bit, GPIOPortF_Pin0_Bit
};
#define GPIOPullupReg (APB0_SCU_BASE + 0x38)
#define GPIOIntrPinNum 32
/* 数组内容为特定GPIO中断管脚处理函数名,处理函数定义要求没有传入参数没有返回值 */
INTR_HANDLER GPIO_INTR_TABLE[GPIOIntrPinNum] =
{
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // Port A
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // Port B
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, // Port E
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL // Port F
};
GPIOPortReg_t GPIOPortAReg =
{
APB0_GPIO1_BASE + 0x0000, /* GPIO PortA data register */
APB0_GPIO1_BASE + 0x0004, /* GPIO PortA direction register.*/
APB0_GPIO1_BASE + 0x0024, /* GPIO PortA interrupt mask register */
APB0_GPIO1_BASE + 0x0034, /* GPIO PortA interrupt sense register */
APB0_GPIO1_BASE + 0x0044, /* GPIO PortA interrupt both-edges register */
APB0_GPIO1_BASE + 0x0054, /* GPIO PortA interrupt event register */
APB0_GPIO1_BASE + 0x0064, /* GPIO PortA interrupt clear register */
};
GPIOPortReg_t GPIOPortBReg =
{
APB0_GPIO1_BASE + 0x0008, /* GPIO PortB data register */
APB0_GPIO1_BASE + 0x000C, /* GPIO PortB direction register.*/
APB0_GPIO1_BASE + 0x0028, /* GPIO PortB interrupt mask register */
APB0_GPIO1_BASE + 0x0038, /* GPIO PortB interrupt sense register */
APB0_GPIO1_BASE + 0x0048, /* GPIO PortB interrupt both-edges register */
APB0_GPIO1_BASE + 0x0058, /* GPIO PortB interrupt event register */
APB0_GPIO1_BASE + 0x0068, /* GPIO PortB interrupt clear register */
};
GPIOPortReg_t GPIOPortCReg =
{
APB0_GPIO1_BASE + 0x0010, /* GPIO PortC data register */
APB0_GPIO1_BASE + 0x0014, /* GPIO PortC direction register.*/
APB0_GPIO1_BASE + 0x002C, /* GPIO PortC interrupt mask register */
APB0_GPIO1_BASE + 0x003C, /* GPIO PortC interrupt sense register */
APB0_GPIO1_BASE + 0x004C, /* GPIO PortC interrupt both-edges register */
APB0_GPIO1_BASE + 0x005C, /* GPIO PortC interrupt event register */
APB0_GPIO1_BASE + 0x006C, /* GPIO PortC interrupt clear register */
};
GPIOPortReg_t GPIOPortDReg =
{
APB0_GPIO1_BASE + 0x0018, /* GPIO PortD data register */
APB0_GPIO1_BASE + 0x001C, /* GPIO PortD direction register.*/
APB0_GPIO1_BASE + 0x0030, /* GPIO PortD interrupt mask register */
APB0_GPIO1_BASE + 0x0040, /* GPIO PortD interrupt sense register */
APB0_GPIO1_BASE + 0x0050, /* GPIO PortD interrupt both-edges register */
APB0_GPIO1_BASE + 0x0060, /* GPIO PortD interrupt event register */
APB0_GPIO1_BASE + 0x0070, /* GPIO PortD interrupt clear register */
};
GPIOPortReg_t GPIOPortEReg =
{
APB0_GPIO2_BASE + 0x0000, /* GPIO PortE data register */
APB0_GPIO2_BASE + 0x0004, /* GPIO PortE direction register.*/
APB0_GPIO2_BASE + 0x0024, /* GPIO PortE interrupt mask register */
APB0_GPIO2_BASE + 0x0034, /* GPIO PortE interrupt sense register */
APB0_GPIO2_BASE + 0x0044, /* GPIO PortE interrupt both-edges register */
APB0_GPIO2_BASE + 0x0054, /* GPIO PortE interrupt event register */
APB0_GPIO2_BASE + 0x0064, /* GPIO PortE interrupt clear register */
};
GPIOPortReg_t GPIOPortFReg =
{
APB0_GPIO2_BASE + 0x0008, /* GPIO PortF data register */
APB0_GPIO2_BASE + 0x000C, /* GPIO PortF direction register.*/
APB0_GPIO2_BASE + 0x0028, /* GPIO PortF interrupt mask register */
APB0_GPIO2_BASE + 0x0038, /* GPIO PortF interrupt sense register */
APB0_GPIO2_BASE + 0x0048, /* GPIO PortF interrupt both-edges register */
APB0_GPIO2_BASE + 0x0058, /* GPIO PortF interrupt event register */
APB0_GPIO2_BASE + 0x0068, /* GPIO PortF interrupt clear register */
};
GPIOComReg_t GPIOCommonReg =
{
APB0_GPIO1_BASE + 0x0074, /* GPIO interrupt status register */
APB0_GPIO1_BASE + 0x0020, /* GPIO function test mode register */
};
GPIOComReg_t GPIOCommonRegEx =
{
APB0_GPIO2_BASE + 0x0074, /* GPIO interrupt status register */
APB0_GPIO2_BASE + 0x0020, /* GPIO function test mode register */
};
pGPIOPortReg_t GPIOGroup[6] = { &GPIOPortAReg , &GPIOPortBReg, &GPIOPortCReg, &GPIOPortDReg, &GPIOPortEReg, &GPIOPortFReg };
/**************************************************************************
* 函数描述: GPIO A/B口中断处理函数
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_AB_IntrHandler(void)
{
UINT32 GPIOPinIntrStatus;
GPIOPinIntrStatus = GPIO_GetIntrState();
GPIO_ClearIntr(GPIOPinIntrStatus);
if ((GPIOPinIntrStatus > GPIOPortB_Pin7) && (GPIOPinIntrStatus < GPIOPortE_Pin0))
return;
else if (GPIOPinIntrStatus >= GPIOPortE_Pin0)
GPIOPinIntrStatus = GPIOPinIntrStatus - 8;
if (GPIO_INTR_TABLE[GPIOPinIntrStatus].routine)
GPIO_INTR_TABLE[GPIOPinIntrStatus].routine();
}
/**************************************************************************
* 函数描述: GPIO E/F口中断处理函数
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_EF_IntrHandler(void)
{
UINT32 GPIOPinIntrStatus;
GPIOPinIntrStatus = GPIO_GetIntrState();
GPIO_ClearIntr(GPIOPinIntrStatus);
if ((GPIOPinIntrStatus > GPIOPortB_Pin7) && (GPIOPinIntrStatus < GPIOPortE_Pin0))
return;
else if (GPIOPinIntrStatus >= GPIOPortE_Pin0)
GPIOPinIntrStatus = GPIOPinIntrStatus - 8;
if (GPIO_INTR_TABLE[GPIOPinIntrStatus].routine)
GPIO_INTR_TABLE[GPIOPinIntrStatus].routine();
}
/**************************************************************************
* 函数描述: 初始化GPIO
* 入口参数: 无
* 出口参数: 无
* 返回值: 无
***************************************************************************/
void GPIO_PowerOnInit(void)
{
#if ( BOARDTYPE == RK2706_SDKDEMO )
GPIO_SetPinDirection(SD_DETECT_PIN, GPIO_IN); //PF2
GPIO_SetPinLevel(POWER_CONTROL_PIN, GPIO_HIGH); //PC0
GPIO_SetPinDirection(POWER_CONTROL_PIN, GPIO_OUT); //PC0
GPIO_SetPinLevel(KEY_PLAYON_PIN, GPIO_LOW); //PC1
GPIO_SetPinDirection(KEY_PLAYON_PIN, GPIO_OUT); //PC1
GPIO_SetPinLevel(CODEC_INITIAL_PIN, GPIO_LOW); //PC5
GPIO_SetPinDirection(CODEC_INITIAL_PIN, GPIO_OUT); //PC5
GPIO_SetPinLevel(BACKLIGHT_PIN, GPIO_LOW); //PD4
GPIO_SetPinDirection(BACKLIGHT_PIN, GPIO_OUT); //PD4
GPIO_SetPinDirection(GPIOPortD_Pin7, GPIO_IN); //PD7
//LCD使用的GPIO口初始化
#if(LCDPANEL == RGBIF_TPG121)
GPIO_SetPinLevel(SCL_PIN, GPIO_LOW); //PB6
GPIO_SetPinLevel(SDA_PIN, GPIO_LOW); //PB7
GPIO_SetPinLevel(SCEN_PIN, GPIO_LOW); //PE0
GPIO_SetPinDirection(SCL_PIN, GPIO_IN); //PB6
GPIO_SetPinDirection(SDA_PIN, GPIO_IN); //PB7
GPIO_SetPinDirection(SCEN_PIN, GPIO_IN); //PE0
#elif (LCDPANEL == RGBIF_A030FL01)
GPIO_SetPinLevel(SCL_PIN, GPIO_LOW); //PB6
GPIO_SetPinLevel(SDA_PIN, GPIO_LOW); //PB7
GPIO_SetPinLevel(CS_PIN, GPIO_LOW); //PF2
GPIO_SetPinDirection(SCL_PIN, GPIO_IN); //PB6
GPIO_SetPinDirection(SDA_PIN, GPIO_IN); //PB7
GPIO_SetPinDirection(CS_PIN, GPIO_IN); //PF2
#endif
//按键使用的GPIO口初始化
#if ( BOARDTYPE == RK2700_SDKDEMO )
GPIO_SetPinLevel(MatrixKey_COL_3, GPIO_LOW); //PC2
GPIO_SetPinLevel(MatrixKey_COL_2, GPIO_LOW); //PC3
GPIO_SetPinLevel(MatrixKey_COL_1, GPIO_LOW); //PC4
GPIO_SetPinLevel(MatrixKey_ROW_1, GPIO_LOW); //PC7
GPIO_SetPinLevel(MatrixKey_ROW_2, GPIO_LOW); //PC6
GPIO_SetPinLevel(MatrixKey_ROW_3, GPIO_LOW); //PC5
GPIO_SetPinDirection(MatrixKey_COL_3, GPIO_IN); //PC2
GPIO_SetPinDirection(MatrixKey_COL_2, GPIO_IN); //PC3
GPIO_SetPinDirection(MatrixKey_COL_1, GPIO_IN); //PC4
GPIO_SetPinDirection(MatrixKey_ROW_1, GPIO_OUT); //PC7
GPIO_SetPinDirection(MatrixKey_ROW_2, GPIO_OUT); //PC6
GPIO_SetPinDirection(MatrixKey_ROW_3, GPIO_OUT); //PC5
#elif( BOARDTYPE == RK2706_SDKDEMO )
GPIO_SetPinLevel(MatrixKey_COL_2, GPIO_LOW); //PC2
GPIO_SetPinLevel(MatrixKey_COL_1, GPIO_LOW); //PC3
GPIO_SetPinLevel(MatrixKey_ROW_1, GPIO_LOW); //PC4
GPIO_SetPinLevel(MatrixKey_ROW_2, GPIO_LOW); //PC5
GPIO_SetPinLevel(MatrixKey_ROW_3, GPIO_LOW); //PC6
GPIO_SetPinDirection(MatrixKey_COL_2, GPIO_IN); //PC2
GPIO_SetPinDirection(MatrixKey_COL_1, GPIO_IN); //PC3
GPIO_SetPinDirection(MatrixKey_ROW_1, GPIO_IN); //PC4
GPIO_SetPinDirection(MatrixKey_ROW_2, GPIO_IN); //PC5
GPIO_SetPinDirection(MatrixKey_ROW_3, GPIO_IN); //PC6
#elif( BOARDTYPE == RK2708_SDKDEMO )
GPIO_SetPinLevel(MatrixKey_COL_3,GPIO_LOW); //PC4
GPIO_SetPinLevel(MatrixKey_COL_2,GPIO_LOW); //PC3
GPIO_SetPinLevel(MatrixKey_COL_1,GPIO_LOW); //PC2
GPIO_SetPinLevel(MatrixKey_ROW_1,GPIO_LOW); //PC5
GPIO_SetPinLevel(MatrixKey_ROW_2,GPIO_LOW); //PC6
GPIO_SetPinDirection(MatrixKey_COL_3,GPIO_IN); //PC4
GPIO_SetPinDirection(MatrixKey_COL_2,GPIO_IN); //PC3
GPIO_SetPinDirection(MatrixKey_COL_1,GPIO_IN); //PC2
GPIO_SetPinDirection(MatrixKey_ROW_1,GPIO_IN); //PC5
GPIO_SetPinDirection(MatrixKey_ROW_2,GPIO_IN); //PC6
#endif
// 增加单独PC1口做PlayOn按键,设置为输入
GPIO_SetPinDirection(GPIOPortC_Pin1, GPIO_IN);
#if 0
Intr_RegISR(INTC_GPIO0, GPIO_AB_IntrHandler); // PA/PB interrupt
Intr_RegISR(INTC_GPIO1, GPIO_EF_IntrHandler); // PE/PF interrupt
#endif
#endif
}
/**************************************************************************
* 函数描述: 设置GPIO特定pin的电平
* 入口参数: GPIOPinNum -- GPIO pin编号
* level -- 高低电平
* 出口参数: 无
* 返回值: 无
***************************************************************************/
// GPIOPinNum 后面可根据实际需求用enum定义各个Pin的名称
void GPIO_SetPinLevel(eGPIOPinNum_t GPIOPinNum, eGPIOPinLevel_t level)
{
volatile UINT8 Group;
volatile UINT8 signal;
UINT8 i;
UINT32 GPIOPortCData;
UINT32 GPIOPortDData;
UINT32 GPIOPortFData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -