前言

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. Golang——详解Go语言代码规范

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Golang专题的第二篇,我们来看看Go的语言规范. 在我们继续今天的内容之前,先来回答一个问题. 有同学在后台问我,为什么说Gola ...

  2. react-devtools安装调试

    初学react,Chrome F12调试,需要一款插件react-devtools. 网上大多对于翻墙不利索的同学大多才用了git源码.npm本地手动打包Chrome拓展程序.如:https://ww ...

  3. 【转】动态规划之最长公共子序列(LCS)

    [原文链接]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套 ...

  4. 域名和服务器绑定及https协议更换

    服务器是之前已经购买了的 1.腾讯云产品中搜索域名注册(产品太多了懒得找,直接搜索来得快些) 2.进去之后可以选择各种后缀的域名,输入自己喜欢的,看看哪些后缀是没有被注册的.自己挑选一个就可以,按照指 ...

  5. SpringBoot系列(十一)拦截器与拦截器链的配置与使用详解,你知道多少?

    往期推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)web静 ...

  6. 杂园日记-获取URL参数

    function getUrlParams(name, url){ var locationUrl = window.location.search; if(url){ var s =url.inde ...

  7. PHP面向对象之重写与重载

    /*** ====笔记部分==== 重写/覆盖 override 指:子类重写了父类的同名方法 重载: overload 重载是指:存在多个同名方法,但参数类型/个数不同. 传不同的参数,调用不同的方 ...

  8. javascript-如何获取标签的内容

    <input>标签的: document.getElementById("id").value ; 其他文本标签的: document.getElementById(& ...

  9. An example shows several CIM-XML extension headers

    The example below shows several CIM-XML extension headers for a GetClass operation on the root/cimv2 ...

  10. Libra白皮书解读

    文章目录 Libra简介 Libra区块链 Libra货币和存储 Libra协会 Libra简介 Libra是facebook发起的一个区块链项目,其使命是建立一套简单的.无国界的货币和为数十亿人服务 ...