gpiolib及gpio操作

原创 2016年08月29日 21:40:29

gpiolib及gpio操作

在驱动工作时,有可能好几个驱动同时去操作一个gpio,这会造成混乱。所以内核提供了一些方法来管理gpio资源,这就是gpiolib。
在涉及到gpio的驱动程序的编写中,gpiolib并不是强制使用的,而是一种约束和规范,如果要让驱动程序规范、可靠,那么gpiolib是必须要使用的。

1.获知gpio号

内核通过gpio号来识别gpio

  • 对于一些经典的soc,比如s5pv210,可以用arch/arm/mach-s5pv210/include/mach/gpio.h 中的宏来获得gpio号
  • 而对于一些比较新的soc,比如imx6,则通常在设备树中以 reset-gpios = <&gpio1 15 1>;来表示gpio,而在驱动中使用gpio号 = of_get_named_gpio(xxxnode, "reset-gpios", 0);函数返回值来得到gpio号,详见设备树详解

2.gpiolib经典接口

gpiolib常用的接口通常有如下几个:

  • gpio_request:驱动中要想使用某一个gpio,就必须先调用gpio_request接口来向内核申请,得到允许后才可以去使用这个gpio
  • gpio_free: 对应gpio_request,用来释放申请后用完了的gpio
  • gpiochip_is_requested: 接口用来判断某一个gpio是否已经被申请了
  • gpio_direction_input/gpio_direction_output: 接口用来设置GPIO为输入/输出模式(不推荐直接设置寄存器)

典型应用:

/*之前先要完成驱动的注册工作*/
...


/*正式开始申请gpio资源,申请操作重复了两次,因为用了两个gpio*/
ret = gpio_request(S5PV210_GPJ0(3), "led1_gpj0_3");
if (ret){
        printk(KERN_INFO "gpio_request failed\n");
        goto out_err_1;
}
/*申请完后可以利用接口设置该gpio。也可以直接操作寄存器来设置*/
gpio_direction_output(S5PV210_GPJ0(3), 1);



/*在remove函数中别忘了对应的释放操作*/
gpio_free(S5PV210_GPJ0(3));
  • 一般来说,gpio的资源申请和释放操作应该放在驱动模块的加载与卸载函数内
  • gpio_request的第一个参数是需要申请的gpio号。第二个参数是我们给该gpio起个名字
  • 申请完了之后对这个gpio进行模式设置,我们这里用gpio_direction_output 设置成输出模式,并且默认输出1让led灭

3.gpiolib新接口

新接口使用非常简便,但是缺点是代码行数少,有时,需要堆砌代码行数就不太适用,呵呵

  • 该函数附带初始化电平功能,并且会在模块卸载时自动释放gpio,十分简便
/*申请并将gpio初始为高电平*/
ret = devm_gpio_request_one(dev, S5PV210_GPJ0(3),
        GPIOF_OUT_INIT_HIGH, "led1_gpj0_3");
if (ret < 0)
    printk(KERN_INFO "gpio_request failed\n");

4.读写gpio

在内核中,应避免使用寄存器操作gpio,而应使用内核的接口来操作gpio,下面这两个函数

int gpio_get_value(unsigned gpio) //读gpio
void gpio_set_value(unsigned gpio, int value)//写gpio

5.控制台中查看当前gpio占用情况的方法

内核中提供了虚拟文件系统debugfs,里面有一个gpio文件,提供了gpio的使用信息

  • 使用 mount -t debugfs debugfs /tmp 把debugfs挂接到/tmp下,再重新进入/tmp后就能看到一个名为gpio的文件
  • cat /tmp/gpio即可得到gpio的所有信息,使用完后umount /tmp卸载掉debugfs
版权声明:转载需注明出处,若有不足,欢迎指正。

gpiolib管理gpio过程

在linux2.6.38中提供了统一管理外部io的模块。本文的内容是跟踪这些模块,是如何关联起来的。 环境:龙芯1b开发板 一、重点关注的相关的结构体: gpiolib.c文件...

linux内核gpiolib

Linux内核中gpio是最简单、最常用的资源。linux有一个框架处理gpio,应用程序都能够通过相应的接口使用gpio。...

Device Tree GPIO引脚控制

第一次接触Devicetree,在调试IC驱动的时候居然发现Reset引脚一直无法控制,驱动调试被Block了,后来终于摸索出一个步骤。 这个是在高通MSM8976平台上控制GPIO的步骤: 1、从o...

GPIO中断使用小结

GPIO 中断使用小结 最近在开发一个跟GPIO中断相关的功能,发现还是有很多函数比较有意思,现在总结一下: 1. 调用gpio_is_valid(int gpio_num)判断该GPIO是否有效...

RK3288的gpio设置

转http://www.360doc.com/content/14/1227/18/14351252_436191812.shtml 目录  [隐藏]  1 简介2 使用 2.1 ...

gpio_request()函数

其原型为 int gpio_request(unsigned gpio, const char *label) 先说说其参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。其具体实...

gpio_request()函数

其原型为 int gpio_request(unsigned gpio, const char *label) 先说说其参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。其具体实...

gpio_request的使用

1、一般gpio_request封装了mem_request(),起保护作用,最后要调用mem_free之类的。主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错...

Android应用层操作GPIO

在嵌入式设备中对GPIO的操作是最基本的操作。一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是我要介绍的 “/sys/class/gp...
  • BENKG
  • BENKG
  • 2015年07月14日 18:50
  • 4778

Kernel 中的 GPIO 定义和控制

最近要深一步用到GPIO口控制,写个博客记录下Kernel层的GPIO学习过程! General Purpose Input Output (通用输入/输出)简称为GPIO,或 总线扩展器。...
  • jscese
  • jscese
  • 2013年11月23日 16:12
  • 7520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gpiolib及gpio操作
举报原因:
原因补充:

(最多只允许输入30个字)