sylixos下S3C2440的GPIO驅動源碼

sylixos下S3C2440的GPIO驅動源碼

/*********************************************************************************************************
**
**                                    中國軟件開源組織
**
**                                   嵌入式實時操作系統
**
**                                SylixOS(TM)  LW : long wing
**
**                               Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: s3c2440_gpio.c
**
** 創   建   人: Jiao.JinXing (焦進星)
**
** 文件創建日期: 2014 年 05 月 17 日
**
** 描        述: S3C2440 GPIO 驅動.
*********************************************************************************************************/
#define  __SYLIXOS_KERNEL
#include "config.h"
#include "SylixOS.h"                                                    /*  操作系統                    */
#include "s3c2440_gpio.h"
/*********************************************************************************************************
** 函數名稱: s3c2440GpioGetDirection
** 功能描述: 獲得指定 GPIO 方向
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
** 輸  出  : 0: 輸入 1:輸出
*********************************************************************************************************/
static INT  s3c2440GpioGetDirection (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset)
{
    UINT32  uiTemp;

    if (uiOffset == 0) {
        uiTemp = (rGPBCON >> 2) & 0x3;
        if (uiTemp == 0) {
            return  (0);
        } else if (uiTemp == 1) {
            return  (1);
        } else {
            return  (-1);
        }
    } else if (uiOffset == 1) {
        return  (0);
    } else {
        return  (-1);
    }
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioDirectionInput
** 功能描述: 設置指定 GPIO 爲輸入模式
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
** 輸  出  : 0: 正確 -1:錯誤
*********************************************************************************************************/
static INT  s3c2440GpioDirectionInput (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset)
{
    UINT32  uiTemp;

    if (uiOffset == 0) {
        uiTemp = rGPBCON;
        uiTemp &= ~(3 << 2);
        rGPBCON = uiTemp;

        return  (0);
    } else if (uiOffset == 1) {
        return  (0);
    } else {
        return  (-1);
    }
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioGet
** 功能描述: 獲得指定 GPIO 電平
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
** 輸  出  : 0: 低電平 1:高電平
*********************************************************************************************************/
static INT  s3c2440GpioGet (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset)
{
    UINT32  uiValue;
    UINT32  uiTemp;

    if (uiOffset == 0) {
        uiTemp = rGPBDAT;
        uiValue = (uiTemp & (1 << 1));
        if (uiValue) {
            return  (1);
        } else {
            return  (0);
        }
    } else if (uiOffset == 1) {
        return  (0);
    } else {
        return  (-1);
    }
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioDirectionOutput
** 功能描述: 設置指定 GPIO 爲輸出模式
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
**           iValue      輸出電平
** 輸  出  : 0: 正確 -1:錯誤
*********************************************************************************************************/
static INT  s3c2440GpioDirectionOutput (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset, INT  iValue)
{
    UINT32  uiTemp;

    if (uiOffset == 0) {
        uiTemp = rGPBCON;
        uiTemp = (uiTemp & ~(3U << 2)) | (1U << 2);
        rGPBCON = uiTemp;

        uiTemp = rGPBDAT;
        if (iValue) {
            uiTemp |= (1 << 1);
        } else {
            uiTemp &= ~(1 << 1);
        }
        rGPBDAT = uiTemp;

        return  (0);
    } else if (uiOffset == 1) {
        return  (0);
    } else {
        return  (-1);
    }
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioSet
** 功能描述: 設置指定 GPIO 電平
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
**           iValue      輸出電平
** 輸  出  : 0: 正確 -1:錯誤
*********************************************************************************************************/
static VOID  s3c2440GpioSet (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset, INT  iValue)
{
    UINT32  uiTemp;

    if (uiOffset != 0) {
        return;
    }

    uiTemp = rGPBDAT;
    if (iValue) {
        uiTemp |= (1 << 1);
    } else {
        uiTemp &= ~(1 << 1);
    }
    rGPBDAT = uiTemp;
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioSetupIrq
** 功能描述: 設置指定 GPIO 爲外部中斷輸入管腳
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
**           bIsLevel    是否爲電平觸發
**           uiType      如果爲電平觸發, 1 表示高電平觸發, 0 表示低電平觸發
**                       如果爲邊沿觸發, 1 表示上升沿觸發, 0 表示下降沿觸發, 2 雙邊沿觸發
** 輸  出  : IRQ 向量號 -1:錯誤
*********************************************************************************************************/
static ULONG  s3c2440GpioSetupIrq (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset, BOOL  bIsLevel, UINT  uiType)
{
    UINT32  uiValue;

    if (uiOffset != 1) {
        return  (-1);
    }

    rGPFCON   = (rGPFCON & (~(0x03 << 14))) | (0x02 << 14);             /*  設置 GPF7 爲 EINT7          */

    rGPFUP    = rGPFUP | (1 << 7);                                      /*  關閉 GPF7 的上拉電阻        */

    if (bIsLevel) {
        if (uiType) {
            uiValue = 0x01;
        } else {
            uiValue = 0x00;
        }
    } else {
        if (uiType == 0) {
            uiValue = 0x02;
        } else if (uiType == 1) {
            uiValue = 0x04;
        } else {
            uiValue = 0x06;
        }
    }

    rEXTINT0  = (rEXTINT0 & (~(0x07 << 28))) | (uiValue << 28);         /*  設置 EINT7 中斷觸發方式     */

    rEINTMASK = rEINTMASK & (~(1 << 7));                                /*  使能 EINT7                  */

    return  (VIC_CHANNEL_EINT4_7);
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioClearIrq
** 功能描述: 清除指定 GPIO 中斷標誌
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
** 輸  出  : NONE
*********************************************************************************************************/
static VOID  s3c2440GpioClearIrq (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset)
{
    UINT32  uiTemp;

    if (uiOffset != 1) {
        return;
    }

    uiTemp = rEINTPEND;
    rEINTPEND = uiTemp;

    INTER_CLR_PNDING(BIT_EINT4_7);
}
/*********************************************************************************************************
** 函數名稱: s3c2440GpioSvrIrq
** 功能描述: 判斷 GPIO 中斷標誌
** 輸  入  : pGpioChip   GPIO 芯片
**           uiOffset    GPIO 針對 BASE 的偏移量
** 輸  出  : 中斷返回值
*********************************************************************************************************/
static irqreturn_t  s3c2440GpioSvrIrq (PLW_GPIO_CHIP  pGpioChip, UINT  uiOffset)
{
    UINT32  uiTemp;

    if (uiOffset != 1) {
        return  (LW_IRQ_NONE);
    }

    uiTemp = rEINTPEND;

    if (uiTemp & (1 << 7)) {
        return  (LW_IRQ_HANDLED);
    } else {
        return  (LW_IRQ_NONE);
    }
}
/*********************************************************************************************************
  GPIO 驅動程序
*********************************************************************************************************/
static LW_GPIO_CHIP  _G_s3c2440GpioChip = {
        .GC_pcLabel              = "S3C2440 GPIO",
        .GC_ulVerMagic           = LW_GPIO_VER_MAGIC,

        .GC_pfuncRequest         = LW_NULL,
        .GC_pfuncFree            = LW_NULL,

        .GC_pfuncGetDirection    = s3c2440GpioGetDirection,
        .GC_pfuncDirectionInput  = s3c2440GpioDirectionInput,
        .GC_pfuncGet             = s3c2440GpioGet,
        .GC_pfuncDirectionOutput = s3c2440GpioDirectionOutput,
        .GC_pfuncSetDebounce     = LW_NULL,
        .GC_pfuncSetPull         = LW_NULL,
        .GC_pfuncSet             = s3c2440GpioSet,
        .GC_pfuncSetupIrq        = s3c2440GpioSetupIrq,
        .GC_pfuncClearIrq        = s3c2440GpioClearIrq,
        .GC_pfuncSvrIrq          = s3c2440GpioSvrIrq,

        .GC_uiBase               = S3C2440_GPIO_BASE,
        .GC_uiNGpios             = 2,
};
/*********************************************************************************************************
** 函數名稱: s3c2440GpioDrv
** 功能描述: 創建 S3C2440 GPIO 驅動
** 輸  入  : NONE
** 輸  出  : NONE
** 全局變量:
** 調用模塊:
*********************************************************************************************************/
VOID  s3c2440GpioDrv (VOID)
{
    gpioChipAdd(&_G_s3c2440GpioChip);
}
/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章