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

📄 gpio.c

📁 windows mobile 6.13 dnldr下载源码
💻 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 + -