前言

GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SOC也非常依赖GPIO,在实际应用中几乎都能看到它的影子,在Linux内核驱动的学习中,这部分相对来说也是比较基础的,但是涉及的东西其实相对来说也比较多,感觉还是很有必要学习和总结一下。

功能

正如之前所说,GPIO是通用输入输出接口,所以,相应的内核驱动中GPIO的基本功能总体可以总结为以下几点:

  • 输出设定电平:可以根据用户的需要,向驱动写入相应的值(比如1或0)然后GPIO输出高低电平(高=1;低=0);
  • 读取输入电平:可以读取GPIO上输入的高低电平;实际的应用比如按键或者其他一些传感器的信号;
  • 触发外部中断:输入信号可以作为中断信号,包括边沿触发,高电平触发,低电平触发等等;

如何使用

关于如何使用GPIO,从 Linux 2.6.3x以后就开始有gpiolib库了,大大简化了操作GPIO的流程,如何在内核中添加gpiolib的支持呢?可以参考下面的做法;

make menuconfig
Device Drivers  --->
-*- GPIO Support --->
[*] /sys/class/gpio/... (sysfs interface)

究其原理的话,追本溯源可能篇幅会很长,后面再现学现卖,对于单纯使用GPIO,感觉应该有以下几个步骤:

  • 在你的设备节点里添加gpios属性;例如:

    gpios = <0 0 GPIO_ACTIVE_LOW>;
  • 在驱动中解析设备树中的节点gpios
  • 调用gpiolib的接口可以在驱动中对gpio进行操作;
  • 设置具体的gpio的功能:
    • 设置为输出引脚;
    • 设置为输入引脚;
    • 设置为外部中断;

设备树

相应的设备树可以写成

gpio_keys {
compatible = “gpio-keys”;
...
button@1 {
wakeup-source;
linux,code = <KEY_ESC>;
label = “ESC”;
gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
};
};

API

函数 功能
bool gpio_is_valid(int number) 判断当前gpio是否有效
int gpio_request(unsigned gpio, const char *label) 申请gpio的资源
void gpio_free(unsigned gpio) 释放已经申请的gpio资源
int gpio_direction_input(unsigned gpio) 设置为输入
int gpio_direction_output(unsigned gpio, int value) 设置为输出
int gpio_get_value(unsigned gpio) 获取输入值
void gpio_set_value(unsigned gpio, int value) 设置输出值
int gpio_to_irq(unsigned gpio) 获取gpio上的中断号
int irq_to_gpio(unsigned int irq) 获取中断号对应的gpio
int devm_gpio_request_one(struct device *dev, unsigned gpio,unsigned long flags, const char *label) gpio分配外部中断资源
void devm_gpio_free(struct device *dev, unsigned int gpio) 释放已经申请的中断资源

这里先大致介绍一下一般会用到的接口,还有一些遗漏,以后会慢慢补充。

总结

这里我简单介绍了gpio,罗列了一下Linux操作gpio可能会涉及到的知识点,包括需要对在设备树里注册节点,一些gpiolib的常用接口,这里还没有给出详细的实现代码,后面会对每一个部分的使用单独进行介绍,包括输入输出,中断唤醒,Input设备等等,篇幅和能力有限,如有错误,不吝赐教。

Linux内核驱动学习(六)GPIO之概览的更多相关文章

  1. Linux内核驱动学习(八)GPIO驱动模拟输出PWM

    文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...

  2. linux内核驱动学习指南

    1. 参考链接 小白的博客 ONE_Tech 你为什么看不懂Linux内核驱动源码? 求教怎么学习linux内核驱动

  3. Linux内核驱动学习(三)字符型设备驱动之初体验

    Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...

  4. Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig

    文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...

  5. Linux内核驱动学习(九)GPIO外部输入的处理

    文章目录 前言 设备树 两个结构体 gpio_platform_data gpio_demo_device 两种方式 轮询 外部中断 总结 附录 前言 前面是如何操作GPIO进行输出,这里我重新实现了 ...

  6. Linux内核驱动学习(七)应用层直接操作GPIO

    文章目录 简介 原理图 节点 设置为输出 设置为输入 映射关系 debugfs pwm demo 简介 前面通过libgpio的方式介绍了内核空间对GPIO进行操作的接口,其做了较好的封装,同时Lin ...

  7. Linux内核驱动学习(十)Input子系统详解

    文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...

  8. Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld

    文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...

  9. Linux内核驱动学习(四)Platform设备驱动模型

    Linux platform设备驱动模型 文章目录 Linux platform设备驱动模型 前言 框架 设备与驱动的分离 设备(device) 驱动(driver) 匹配(match) 参考 前言 ...

随机推荐

  1. @ModelAttribute 的使用

    @ModelAttribute注解可被应用在 方法 或 方法参数 上. 对方法使用 @ModelAttribute 注解: 注解在方法上的@ModelAttribute说明了方法的作用是用于添加一个或 ...

  2. 【Jenkins】插件更改国内源

    最近调试脚本,本机安装了Jenkins,但是安装插件时一直失败.更改升级站点也不生效,究其原因是因为default.json中插件下载地址还https://updates.jenkins.io,升级站 ...

  3. E - Sum of gcd of Tuples (Hard) Atcoder 162 E(容斥)

    题解:这个题目看着挺吓人的,如果仔细想想的话,应该能想出来.题解还是挺好的理解的. 首先设gcd(a1,a2,a3...an)=i,那么a1~an一定是i的倍数,所以ai一共有k/i种取值.有n个数, ...

  4. shiro:集成Spring(四)

    基于[加密及密码比对器(三)]项目改造 引入相关依赖环境 shiro-spring已经包含 shiro-core和shiro-web 所以这两个依赖可以删掉 <!--shiro继承spring依 ...

  5. 必须先理解的RocketMQ入门手册,才能再次深入解读

    RocketMQ入门手册 RocketMQ是一个分布式.队列模型的开源消息中间件,前身是MetaQ,是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具 ...

  6. 推荐一个小而美的Python代码格式化工具

    代码可读性是评判代码质量的标准之一,有一个衡量代码质量的标准是 Martin 提出的 “WFT” 定律,即每分钟爆出 “WTF” 的次数.你在读别人代码或者做 Code Review 的时候有没有 “ ...

  7. react: typescript import images alias

    1.webpack.config.js resolve: { extensions: ["ts", "tsx", "js", "j ...

  8. bm25算法和tfidf

  9. CSS中“~”(波浪号)、“,”(逗号)、“+”(加号)、“>”(大于号)、“ ”(空格)详解

    “~”:$('pre ~ brother')表示获取pre节点的后面的所有兄弟节点,相当于nextAll()方法: “+”:$('pre + nextbrother')表示获得pre节点的下一个兄弟节 ...

  10. PE文件学习(2)导入表导出表

    转自:evil.eagle https://blog.csdn.net/evileagle/article/details/12176797 导出表是用来描述模块中的导出函数的结构,如果一个模块导出了 ...