linux内核中都有s3c2410_gpio_cfgpin,s3c2410_gpio_cfgpin等内核导出函数

s3c2410_gpio_cfgpin等内核导出函数 收藏

//这里面的函数都是内核导出函数/plat-s3c24XX/gpio.c中

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//设置gpio的工作模式,是输入,输出还是其他的

//s3c2410_gpio_cfgpin(S3C2410_GPB(5),S3C2410_GPIO_INPUT),就是设置GPB5为输入模式

void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long mask;

unsigned long con;

unsigned long flags;

if (pin < S3C2410_GPIO_BANKB) {

mask = 1 << S3C2410_GPIO_OFFSET(pin);

} else {

mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;

}

switch (function) {

case S3C2410_GPIO_LEAVE:

mask = 0;

function = 0;

break;

case S3C2410_GPIO_INPUT:

case S3C2410_GPIO_OUTPUT:

case S3C2410_GPIO_SFN2:

case S3C2410_GPIO_SFN3:

if (pin < S3C2410_GPIO_BANKB) {

function -= 1;

function &= 1;

function <<= S3C2410_GPIO_OFFSET(pin);

} else {

function &= 3;

function <<= S3C2410_GPIO_OFFSET(pin)*2;

}

}

/* modify the specified register wwith IRQs off */

local_irq_save(flags);

con  = __raw_readl(base + 0x00);

con &= ~mask;

con |= function;

__raw_writel(con, base + 0x00);

local_irq_restore(flags);

}

EXPORT_SYMBOL(s3c2410_gpio_cfgpin);

//作用:返回对应的GPIO的配置情况,例如pin=s3c2410_GPB5,则

unsigned int s3c2410_gpio_getcfg(unsigned int pin)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long val = __raw_readl(base);

if (pin < S3C2410_GPIO_BANKB) {

val >>= S3C2410_GPIO_OFFSET(pin);

val &= 1;

val += 1;

} else {

val >>= S3C2410_GPIO_OFFSET(pin)*2;

val &= 3;

}

return val | S3C2410_GPIO_INPUT;

}

EXPORT_SYMBOL(s3c2410_gpio_getcfg);

//设置相应的GPIO的上拉电阻,当to为1时候,相应的pin引脚设置为1,表示该GPIO要上拉电阻,to为0时候,相应的pin引脚配置为0,表示不要上拉电阻

void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long offs = S3C2410_GPIO_OFFSET(pin);

unsigned long flags;

unsigned long up;

if (pin < S3C2410_GPIO_BANKB)

return;

local_irq_save(flags);

up = __raw_readl(base + 0x08);

up &= ~(1L << offs);

up |= to << offs;

__raw_writel(up, base + 0x08);

local_irq_restore(flags);

}

EXPORT_SYMBOL(s3c2410_gpio_pullup);

int s3c2410_gpio_getpull(unsigned int pin)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long offs = S3C2410_GPIO_OFFSET(pin);

if (pin < S3C2410_GPIO_BANKB)

return -EINVAL;

return (__raw_readl(base + 0x08) & (1L << offs)) ? 1 : 0;

}

EXPORT_SYMBOL(s3c2410_gpio_getpull);

//当GPIO的工作为输入时候,设置某个GPIO的值

//s3c2410_gpio_setpin(S3C2410_GPB(5),0),设置GPB5的输入值是0,就是低电平,to为1,表示该pin输出为1

void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long offs = S3C2410_GPIO_OFFSET(pin);

unsigned long flags;

unsigned long dat;

local_irq_save(flags);

dat = __raw_readl(base + 0x04);

dat &= ~(1 << offs);

dat |= to << offs;

__raw_writel(dat, base + 0x04);

local_irq_restore(flags);

}

EXPORT_SYMBOL(s3c2410_gpio_setpin);

//当GPIO为输出模式时候,获取GPIO的输出数值

//s3c2410_gpio_getpin(S3C2410_GPB(5)),获取GPB5的输出值

unsigned int s3c2410_gpio_getpin(unsigned int pin)

{

void __iomem *base = S3C24XX_GPIO_BASE(pin);

unsigned long offs = S3C2410_GPIO_OFFSET(pin);

return __raw_readl(base + 0x04) & (1<< offs);

}

EXPORT_SYMBOL(s3c2410_gpio_getpin);

unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change)

{

unsigned long flags;

unsigned long misccr;

local_irq_save(flags);

misccr = __raw_readl(S3C24XX_MISCCR);

misccr &= ~clear;

misccr ^= change;

__raw_writel(misccr, S3C24XX_MISCCR);

local_irq_restore(flags);

return misccr;

}

EXPORT_SYMBOL(s3c2410_modify_misccr);

int s3c2410_gpio_getirq(unsigned int pin)

{

if (pin < S3C2410_GPF(0) || pin > S3C2410_GPG(15))

return -EINVAL; /* not valid interrupts */

if (pin < S3C2410_GPG(0) && pin > S3C2410_GPF(7))

return -EINVAL; /* not valid pin */

if (pin < S3C2410_GPF(4))

return (pin - S3C2410_GPF(0)) + IRQ_EINT0;

if (pin < S3C2410_GPG(0))

return (pin - S3C2410_GPF(4)) + IRQ_EINT4;

return (pin - S3C2410_GPG(0)) + IRQ_EINT8;

}

EXPORT_SYMBOL(s3c2410_gpio_getirq);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值