📄 gpio.c
字号:
/*******************************************************************************
* Copyright: Copyright (c) 2007. Hisilicon Technologies, CO., LTD.
* Version: V300R001B01
* Filename: hisi_gpio.c
* Description: Interface to OAL gpio services.
* History:
1.Created by SunShaojie on 2007/08/31
*******************************************************************************/
#include "sys.h"
#include "Register.h"
#include "DbgLog.h"
#include "Gpio.h"
#include "GpioReg.h"
//------------------------------------------------------------------------------
// External Functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// External Variables
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Defines
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Types
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Local Variables
//------------------------------------------------------------------------------
volatile USP_GPIO_REG *g_pGPIO[GPIO_GROUP_MAX] = {NULL};
//------------------------------------------------------------------------------
// Local Functions
//------------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//
// Function: GetGpioBaseAdrr
//
// This function get GPIO group address.
//
// Parameters:
// ucId
// [in] The GPIO Group ID.
//
// Returns:
// The GPIO group address.
//
//-----------------------------------------------------------------------------
UINT32 GetGpioBaseAdrr (UINT8 ucId)
{
switch(ucId & GPIO_GROUP_MASK)
{
case GPIO_GROUP0:
return (GPIO_ADDR_GROUP0 + 0x3FC);
case GPIO_GROUP1:
return (GPIO_ADDR_GROUP1 + 0x3FC);
case GPIO_GROUP2:
return (GPIO_ADDR_GROUP2 + 0x3FC);
case GPIO_GROUP3:
return (GPIO_ADDR_GROUP3 + 0x3FC);
case GPIO_GROUP4:
return (GPIO_ADDR_GROUP4 + 0x3FC);
case GPIO_GROUP5:
return (GPIO_ADDR_GROUP5 + 0x3FC);
case GPIO_GROUP6:
return (GPIO_ADDR_GROUP6 + 0x3FC);
case GPIO_GROUP7:
return (GPIO_ADDR_GROUP7 + 0x3FC);
case GPIO_GROUP8:
return (GPIO_ADDR_GROUP8 + 0x3FC);
case GPIO_GROUP9:
return (GPIO_ADDR_GROUP9 + 0x3FC);
case GPIO_GROUP10:
return (GPIO_ADDR_GROUP10 + 0x3FC);
case GPIO_GROUP11:
return (GPIO_ADDR_GROUP11 + 0x3FC);
case GPIO_GROUP12:
return (GPIO_ADDR_GROUP12 + 0x3FC);
case GPIO_GROUP13:
return (GPIO_ADDR_GROUP13 + 0x3FC);
default:
return 0;
}
}
//-----------------------------------------------------------------------------
//
// Function: SetupGpioRegValue
//
// This function get the register value, change the relative bit and set back to
// the register.
//
// Parameters:
// addr
// [in] The register address.
//
// bit
// [in] The bit of register.
//
// data
// [in] The data to be set to the register.
//
// Returns:
// Returns the modified value of register.
//
//-----------------------------------------------------------------------------
UINT32 SetupGpioRegValue (UINT32 dwAddr, UINT32 bit, UINT32 data)
{
UINT32 ucReg;
ucReg = INREG32(dwAddr);
ucReg = (ucReg & (~(1U << bit))) | ((data&0x1) << bit);
OUTREG32(dwAddr, ucReg);
return ucReg;
}
//-----------------------------------------------------------------------------
//
// Function: GetGpioRegValue
//
// This function get the bit value of register.
//
// Parameters:
// addr
// [in] The register address.
//
// bit
// [in] The bit of register.
//
// Returns:
// Returns the bit value of register.
//
//-----------------------------------------------------------------------------
UINT32 GetGpioRegValue (UINT32 dwAddr, UINT32 bit)
{
UINT32 dwValue;
dwValue = INREG32(dwAddr);
dwValue = (dwValue >> bit) & 0x01;
return dwValue;
}
//-----------------------------------------------------------------------------
//
// Function: GpioGetDirection
//
// This function get the direction of GPIO ID.
//
// Parameters:
// gpioID
// [in] The GPIO ID
//
// Returns:
// Returns the direction of GPIO ID.
//
//-----------------------------------------------------------------------------
EGPIO_DIR GpioGetDirection(UINT8 gpioID)
{
EGPIO_DIR value = EGPIO_DIR_NUM;
UINT8 gpioGroup = (gpioID & GPIO_GROUP_MASK) >> GPIO_GROUP_BIT_POS;
UINT8 gpioNum = gpioID & GPIO_ID_MASK;
USP_GPIO_REG *pGPIO = 0;
DEBUGMSG(ZONE_FUNCTION, (TEXT("+GpioGetDirection: GPIO Group is %d, GPIO ID is %d \r\n"), gpioGroup, gpioNum));
if((gpioNum >= GPIO_MAXIMUM)||(gpioGroup >= GPIO_GROUP_MAX))
{
DEBUGMSG(ZONE_ERROR,
(TEXT("ERROR: GPIOGetDirection: Parameter gpioID 0x%x is error! \r\n"), gpioID ));
return value;
}
pGPIO = (USP_GPIO_REG *)GetGpioBaseAdrr(gpioID);
value = (EGPIO_DIR)GetGpioRegValue((UINT32)&pGPIO->DIR, gpioNum);
DEBUGMSG(ZONE_FUNCTION, (TEXT("-GpioGetDirection: %s \r\n"), (value==EGPIO_DIR_INPUT)?"Input":"Output"));
return value;
}
//-----------------------------------------------------------------------------
//
// Function: GpioSetDirection
//
// This function set the direction of GPIO ID.
//
// Parameters:
// gpioID
// [in] The GPIO ID
//
// dir
// [in] The direction of GPIO ID
//
// Returns:
// TRUE indicates success, FALSE indicates failure.
//
//-----------------------------------------------------------------------------
BOOL GpioSetDirection(UINT8 gpioID, EGPIO_DIR dir)
{
UINT32 value = 0;
UINT8 gpioGroup = (gpioID & GPIO_GROUP_MASK) >> GPIO_GROUP_BIT_POS;
UINT8 gpioNum = gpioID & GPIO_ID_MASK;
USP_GPIO_REG *pGPIO = 0;
DEBUGMSG(ZONE_FUNCTION, (TEXT("+GpioSetDirection: GPIO Group is %d, GPIO ID is %d \r\n"), gpioGroup, gpioNum));
if((gpioNum >= GPIO_MAXIMUM)||(gpioGroup >= GPIO_GROUP_MAX)||(dir >= EGPIO_DIR_NUM))
{
DEBUGMSG(ZONE_ERROR, (TEXT("ERROR: GpioSetDirection: Parameter gpioID 0x%x or Dir %d is error!"), gpioID, dir ));
return FALSE;
}
pGPIO = (USP_GPIO_REG *)GetGpioBaseAdrr(gpioID);
value = SetupGpioRegValue((UINT32)&pGPIO->DIR, gpioNum, (UINT32)dir);
DEBUGMSG(ZONE_FUNCTION, (TEXT("-GpioSetDirection: %s \r\n"), (((value>>gpioNum)&0x1)==EGPIO_DIR_INPUT)?"Input":"Output"));
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: GpioSetValue
//
// This function set the value of GPIO ID.
//
// Parameters:
// gpioID
// [in] The GPIO ID
//
// data
// [in] The value of GPIO ID
//
// Returns:
// TRUE indicates success, FALSE indicates failure.
//
//-----------------------------------------------------------------------------
BOOL GpioSetValue(UINT8 gpioID, EGPIO_DATA data)
{
UINT32 value = 0;
UINT8 gpioGroup = (gpioID & GPIO_GROUP_MASK) >> GPIO_GROUP_BIT_POS;
UINT8 gpioNum = gpioID & GPIO_ID_MASK;
USP_GPIO_REG *pGPIO = 0;
DEBUGMSG(ZONE_FUNCTION, (TEXT("+GpioSetValue: GPIO Group is %d, GPIO ID is %d \r\n"), gpioGroup, gpioNum));
if((gpioNum >= GPIO_MAXIMUM)||(gpioGroup >= GPIO_GROUP_MAX)||(data >= EGPIO_DATA_NUM))
{
DEBUGMSG(ZONE_ERROR, (TEXT("ERROR: GpioSetValue: Parameter gpioID 0x%x or Data %d is error!"), gpioID, data ));
return FALSE;
}
pGPIO = (USP_GPIO_REG *)GetGpioBaseAdrr(gpioID);
value = SetupGpioRegValue((UINT32)&pGPIO->DATA, gpioNum, (UINT32)data);
DEBUGMSG(ZONE_FUNCTION, (TEXT("-GpioSetValue: %s \r\n"), (((value>>gpioNum)&0x1)==EGPIO_DATA_LOW)?"Low":"High"));
return TRUE;
}
//-----------------------------------------------------------------------------
//
// Function: GpioGetValue
//
// This function get the value of GPIO ID.
//
// Parameters:
// gpioID
// [in] The GPIO ID
//
// Returns:
// Returns the direction of GPIO ID.
//
//-----------------------------------------------------------------------------
EGPIO_DATA GpioGetValue(UINT8 gpioID)
{
EGPIO_DATA value = EGPIO_DATA_NUM;
UINT8 gpioGroup = (gpioID & GPIO_GROUP_MASK) >> GPIO_GROUP_BIT_POS;
UINT8 gpioNum = gpioID & GPIO_ID_MASK;
USP_GPIO_REG *pGPIO = 0;
DEBUGMSG(ZONE_FUNCTION, (TEXT("+GpioGetValue: GPIO Group is %d, GPIO ID is %d \r\n"), gpioGroup, gpioNum));
if((gpioNum >= GPIO_MAXIMUM)||(gpioGroup >= GPIO_GROUP_MAX))
{
DEBUGMSG(ZONE_ERROR, (TEXT("ERROR: GpioGetValue: Parameter gpioID 0x%x is error!"), gpioID ));
return value;
}
pGPIO = (USP_GPIO_REG *)GetGpioBaseAdrr(gpioID);
value = (EGPIO_DATA)GetGpioRegValue((UINT32)&pGPIO->DATA, gpioNum);
DEBUGMSG(ZONE_FUNCTION, (TEXT("-GpioGetDirection: %s \r\n"), (value==EGPIO_DATA_LOW)?"Low":"High"));
return value;
}
//-----------------------------------------------------------------------------
//
// Function: GpioInitialize
//
// This function set the value of GPIO ID. And set the direction of GPIO ID
//
// Parameters:
// gpioID
// [in] The GPIO ID
//
// dir
// [in] The direction of GPIO ID
//
// data
// [in] The value of GPIO ID
//
// Returns:
// TRUE indicates success, FALSE indicates failure.
//
//-----------------------------------------------------------------------------
BOOL GpioInitialize(UINT8 gpioID, EGPIO_DIR dir, EGPIO_DATA data)
{
BOOL ret = FALSE;
if(GpioSetDirection(gpioID, dir))
{
if(EGPIO_DIR_OUTPUT == dir)
{
ret = GpioSetValue(gpioID, data);
}
else
{
ret = TRUE;
}
}
return ret;
}
//-----------------------------------------------------------------------------
//
// Function: GpioSetIntrMode
//
// This function set the interrupt triggered mode of GPIO ID.
//
// Parameters:
// intrMode
// [in] The struct of GPIO interrupt mode.
//
// Returns:
// TRUE indicates success, FALSE indicates failure.
//
//-----------------------------------------------------------------------------
BOOL GpioSetIntrMode(const USP_GPIO_INT_MODE *intrMode)
{
UINT32 value = 0;
UINT8 gpioGroup = (intrMode->gpioID & GPIO_GROUP_MASK) >> GPIO_GROUP_BIT_POS;
UINT8 gpioNum = intrMode->gpioID & GPIO_ID_MASK;
USP_GPIO_REG *pGPIO = 0;
DEBUGMSG(ZONE_FUNCTION, (TEXT("+GpioSetIntrMode: GPIO Group is %d, GPIO ID is %d \r\n"), gpioGroup, gpioNum));
if((gpioNum >= GPIO_MAXIMUM)||(gpioGroup >= GPIO_GROUP_MAX)
||(intrMode->sense >= EGPIO_INT_SENSE_NUM)||(intrMode->edge >= EGPIO_INT_SELEDGE_NUM)
||(intrMode->event >= EGPIO_INT_EVENT_NUM))
{
DEBUGMSG(ZONE_ERROR,
(TEXT("ERROR: GpioSetIntrMode: Parameter gpioID 0x%x, Sense %d, edge %d or event %d is error!"),
intrMode->gpioID, intrMode->sense, intrMode->edge, intrMode->event ));
return FALSE;
}
pGPIO = (USP_GPIO_REG *)GetGpioBaseAdrr(intrMode->gpioID);
value = SetupGpioRegValue((UINT32)&pGPIO->INTSENSE, gpioNum, (UINT32)(intrMode->sense));
DEBUGMSG(ZONE_FUNCTION, (TEXT("GpioSetIntrMode: INTSENSE value = %x \r\n"), value));
value = SetupGpioRegValue((UINT32)&pGPIO->INTEDGE, gpioNum, (UINT32)(intrMode->edge));
DEBUGMSG(ZONE_FUNCTION, (TEXT("GpioSetIntrMode: INTEDGE value = %x \r\n"), value));
value = SetupGpioRegValue((UINT32)&pGPIO->INTEVENT, gpioNum, (UINT32)(intrMode->event));
DEBUGMSG(ZONE_FUNCTION, (TEXT("-GpioSetIntrMode: INTEVENT value = %x \r\n"), value));
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -