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

📄 hw_gpio.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************/
/*   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 + -