九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 3420|回复: 0
打印 上一主题 下一主题

x4412&ibox项目实战65-GPIO驱动调用

[复制链接]
跳转到指定楼层
楼主
发表于 2014-12-15 19:00:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
相关源码路径如下:
  1. kernel/drivers/gpio/gpiolib.c
  2. kernel/arch/arm/plat-samsung/gpio.c
  3. kernel/arch/arm/plat-samsung/gpio-config.c
  4. kernel/arch/arm/mach-exynos/include/mach/gpio-exynos4.h
复制代码

        内核中已经将GPIO的相关操作都封装成了函数库,我们只需要调用即可。这里只给出几种常用的操作函数的使用方法,具体实现过程可以琢磨源码。
        设置GPIO上下拉属性的函数清单如下:
  1. int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull)
  2. {
  3.         struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
  4.         unsigned long flags;
  5.         int offset, ret;

  6.         if (!chip)
  7.                 return -EINVAL;

  8.         offset = pin - chip->chip.base;

  9.         s3c_gpio_lock(chip, flags);
  10.         ret = s3c_gpio_do_setpull(chip, offset, pull);
  11.         s3c_gpio_unlock(chip, flags);

  12.         return ret;
  13. }
  14. EXPORT_SYMBOL(s3c_gpio_setpull);
复制代码

        第一个传入参数表示需要设置的管脚编号,第二个传入参数表示上下拉的属性。每一个GPIO的管脚编号都可以通过宏来指定,这些宏都在gpio-exynos4.h中定义。按照4412芯片手册的寄存器介绍,GPIO可以配置成禁止上下拉,上拉或下拉三种状态,对应宏定义如下:
  1. #define S3C_GPIO_PULL_NONE        ((__force s3c_gpio_pull_t)0x00)
  2. #define S3C_GPIO_PULL_DOWN        ((__force s3c_gpio_pull_t)0x01)
  3. #define S3C_GPIO_PULL_UP                ((__force s3c_gpio_pull_t)0x02)
复制代码

        以设置GPD0(1)为例,如我们需要将它设置为带上拉功能,执行如下程序即可:
s3c_gpio_setpull(EXYNOS4_GPD0(1), S3C_GPIO_PULL_UP);
        设置GPIO功能属性的函数清单如下:
  1. int s3c_gpio_cfgpin(unsigned int pin, unsigned int config)
  2. {
  3.         struct s3c_gpio_chip *chip = s3c_gpiolib_getchip(pin);
  4.         unsigned long flags;
  5.         int offset;
  6.         int ret;

  7.         if (!chip)
  8.                 return -EINVAL;

  9.         offset = pin - chip->chip.base;

  10.         s3c_gpio_lock(chip, flags);
  11.         ret = s3c_gpio_do_setcfg(chip, offset, config);
  12.         s3c_gpio_unlock(chip, flags);

  13.         return ret;
  14. }
  15. EXPORT_SYMBOL(s3c_gpio_cfgpin);
复制代码

        同样,第一个传入参数表示管脚编号,第二个传入参数表示配置信息,如下宏可以表述管脚的配置状态:
  1. #define S3C_GPIO_SPECIAL_MARK        (0xfffffff0)
  2. #define S3C_GPIO_SPECIAL(x)        (S3C_GPIO_SPECIAL_MARK | (x))
  3. #define S3C_GPIO_INPUT                (S3C_GPIO_SPECIAL(0))
  4. #define S3C_GPIO_OUTPUT        (S3C_GPIO_SPECIAL(1))
  5. #define S3C_GPIO_SFN(x)                (S3C_GPIO_SPECIAL(x))
复制代码

        S3C_GPIO_SFN(0)或S3C_GPIO_INPUT表示将管脚设置为输入,S3C_GPIO_SFN(1)或S3C_GPIO_OUTPUT表示将管脚设置为输出,将管脚设置为其他复合的功能时,需参考4412芯片用户手册的寄存器参数表,结合S3C_GPIO_SFN宏使用。
        以下程序表示将GPD0(1)管脚设置为输出:
        s3c_gpio_cfgpin(EXYNOS4_GPD0(1), S3C_GPIO_SFN(1));
        当GPIO被设置为输出时,设置其电平状态属性的函数清单如下:
  1. #define gpio_set_value        __gpio_set_value
  2. void __gpio_set_value(unsigned gpio, int value)//设置GPIO电平
  3. {
  4.         struct gpio_chip        *chip;

  5.         chip = gpio_to_chip(gpio);
  6.         WARN_ON(chip->can_sleep);
  7.         trace_gpio_value(gpio, 0, value);
  8.         chip->set(chip, gpio - chip->base, value);
  9. }
  10. EXPORT_SYMBOL_GPL(__gpio_set_value);
复制代码

        gpio表示管脚编号,value表示电平状态,0表示低电平,1表示高电平。如下程序表示将GPD0(1)管脚设置为低电平:
  1. gpio_set_value(EXYNOS4_GPD0(1), 0);
复制代码

        gpio_request和gpio_free函数分别用于申请GPIO和释放GPIO,强烈建议在使用GPIO时,首先申请GPIO,用完后释放,避免IO口冲突。申请GPD0(1)作为GPIO口的程序清单如下:
gpio_request(EXYNOS4_GPD0(1), "GPD0(1)");
        这里第一个传入参数为IO口的管脚编号,第二个为IO口的名称,可自定义。释放GPD0(1)的程序清单如下:
  1. gpio_free(EXYNOS4_GPD0(1));
复制代码

        通常在配置一个GPIO口时,首先通过gpio_request函数申请GPIO口,再通过s3c_gpio_setpull、s3c_gpio_cfgpin、gpio_set_value函数配置GPIO口,在不用时通过gpio_free
函数释放GPIO口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-5-5 21:37 , Processed in 0.018662 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表