前言

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. 给想学python但还没有接触过的你,python代码的书写规则,小白入门

    Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...

  2. L2 Softmax与分类模型

    softmax和分类模型 内容包含: softmax回归的基本概念 如何获取Fashion-MNIST数据集和读取数据 softmax回归模型的从零开始实现,实现一个对Fashion-MNIST训练集 ...

  3. Gun N' Rose Team Review

    一看到这个项目就被他的功能给吸引了.回忆起以前看到一个东西很新奇想去网上查询它是什么,但是又不知道应该怎样去描述它,于是在搜索引擎的输入框中键入.删除.键入.删除的可笑经历的时候,我就越发感觉到这个a ...

  4. response没有实现跳转,而是提示浏览器下载文件

    问题简述: web项目中,response没能实现重定向跳转网页,而是通知浏览器下载文件. 代码如下: response.getWriter().write("<h1 style='c ...

  5. webpack之Loader

    我们知道webpack的优点之一就是专注于处理模块化的项目,能做到开箱即用,但同时这也是webpack的缺点,只能用于模块化开发的项目,例如:Vue,React,Angular.Webpack在进行打 ...

  6. c++指定输出小数的精度

    在c++中,有的时候要对输出的double型或float型保留几位小数,这时可以使用setflags(ios::fixed),不过要先包含有文件<iomainp>,具体如下 例: #inc ...

  7. Web中间件常见漏洞

    IIS Internet Information Services--windows 解析漏洞 IIS 6.x 基于文件名:该版本默认会将 *.asp;.jpg 此种格式的文件名,当成 Asp 解析, ...

  8. Openstack Swift 创建用户和 container

    openstack user create --domain default  --password-prompt [用户名];openstack role add --project admin - ...

  9. Java初学者最近三次作业的心得体会

    作为一个初学者,简单的谈一下自己的作业心得体会.如果你是完全没有接触过Java的学习,本篇博文可能会有些收获,如果你已经学习Java有一段时间了,那么可以放弃这篇文章了,因为这篇文章讲解的是基本的东西 ...

  10. HTML后台管理页面布局

    设计网页,让网页好看:网上找模板 搜 HTML模板 BootStrap 一.内容回顾: HTML 一大堆的标签:块级.行内 CSS position background text-align mar ...