打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
s3c2410_gpio_cfgpin等内核导出函数

s3c2410_gpio_cfgpin等内核导出函数  

2011-06-29 23:45:34|  分类: 嵌入式驱动 |  标签: |字号 订阅

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

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/io.h>

#include <mach/hardware.h>
#include <mach/gpio-fns.h>
#include <asm/irq.h>

#include <mach/regs-gpio.h>

//设置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);

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xie376450483/archive/2010/07/11/5727374.aspx

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【转】__raw_readl和__raw_writel
GPIO及中断API函数
RK3568外部IO中断示例
按键中断
Lindus Embedded / GPIO (General Purpose Input/Output) interfaces in Linux
Linux kernel的中断子系统之(二):IRQ Domain介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服