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
*********************************************************************************************************/