Linux内核驱动学习(七)应用层直接操作GPIO
简介
前面通过libgpio的方式介绍了内核空间对GPIO进行操作的接口,其做了较好的封装,同时Linux系统的sysfs机制已经在系统路径下/sys/class/gpio注册了相应的节点,通过读写该节点下的文件就能轻松的完成GPIO输入输出配置以及引脚状态的获取。
原理图
我使用的Rockchip的px30,引脚是GPIO3_D0,具体硬件肯定会不同,注意参考soc的datasheet和硬件原理图,先定位正确需要操作的GPIO,千里之行始于足下。

节点
在/sys/class/gpio路径下有export和unexport这两个文件;GPIO3_D0在这里是120,具体硬件和数字的对应关系后面会继续讲到;
echo 120 > /sys/class/gpio/export
执行以上这条指令后,会在/sys/class/gpio/下生成gpio120节点,简单看一下该路径下都有哪些文件;
$ /sys/class/gpio/gpio120
$ active_low device direction edge power subsystem uevent value
设置为输出
$ cd /sys/class/gpio/gpio120
$ echo 0 > active_low
$ echo out > direction
$ echo 1 > value #输出高
$ echo 0 > value #输出低
另一种情况,设置active_low为1,就会出现另一种情况;
$ cd /sys/class/gpio/gpio120
$ echo 1 > active_low
$ echo out > direction
$ echo 1 > value #输出低
$ echo 0 > value #输出高
由此看出,active_low的作用已经很明显了,后面没有特别指出的情况下,active_low的值默认为0;一表胜过千言万语,简单整理一个表格,如下所示;
| active_low | value | 实际GPIO输出 |
|---|---|---|
| 0 | 1 | high |
| 0 | 0 | low |
| 1 | 1 | low |
| 1 | 0 | high |
设置为输入
$ cd /sys/class/gpio/gpio120
$ echo int > direction
$ cat value #读取GPIO的电平状态
映射关系
Rockchip px30平台的GPIO总共分为GPIO0~GPIO3四组,每一组最多有32个GPIO,依次分为A,B,C,D四个小组,每组最多8个,对于硬件上实际没有达到8个的情况下,计算偏移的时候,也按照8来计算。RK平台可以参考dt-bindings/pinctrl/rockchip.h。其他平台的话,如果有源代码可以参考以下厂商给出的具体定义,并结合SOC的原理图和硬件原理图,来计算。
具体计算如下表所示;依次类推;
| 引脚 | 计算 |
|---|---|
| GPIO3_D0 | 3*32 + 3*8 + 0 = 120 |
| GPIO3_D1 | 3*32 + 3*8 + 1 = 121 |
| GPIO2_A1 | 2*32 + 0*8 + 1 = 65 |

debugfs
debugfs 是 Linux系统下为了方便驱动开发人员对驱动调试的文件系统。
$ cat /sys/kernel/debug/gpio
可以通过debugfs查看gpio-120硬件上的实际输出和软件上是否相符合;

pwm demo
强迫症的我简单写了一个模拟pwm的shell,虽然比较鸡肋,因为是占空比,频率都是不可调的,单纯是为了看一下控制的效果,前提是已经执行echo 120 > export这条指令并且成功生成相应的节点,代码简单如下;
#!/bin/bash
GPIO=120
i=0
value=0
while [ 1 -eq 1 ]
do
i=$(($i + 1))
if [ $(( $i % 2 )) -eq 0 ]
then
value=0
else
value=1
fi
echo "current i is $i"
echo "current value is $value"
echo $value > /sys/class/gpio/gpio$GPIO/value
usleep 1000
done
用示波器测量GPIO3_D0引脚的波形,和预期的一样;

Linux内核驱动学习(七)应用层直接操作GPIO的更多相关文章
- Linux内核驱动学习(八)GPIO驱动模拟输出PWM
文章目录 前言 原理图 IO模拟输出PWM 设备树 驱动端 调试信息 实验结果 附录 前言 上一篇的学习中介绍了如何在用户空间直接操作GPIO,并写了一个脚本可以产生PWM.本篇的学习会将写一个驱动操 ...
- Linux内核驱动学习(六)GPIO之概览
文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...
- linux内核驱动中对字符串的操作【转】
转自:http://www.360doc.com/content/12/1224/10/3478092_255969530.shtml Linux内核中关于字符串的相关操作,首先包含头文件: #inc ...
- linux内核驱动学习指南
1. 参考链接 小白的博客 ONE_Tech 你为什么看不懂Linux内核驱动源码? 求教怎么学习linux内核驱动
- Linux内核驱动学习(九)GPIO外部输入的处理
文章目录 前言 设备树 两个结构体 gpio_platform_data gpio_demo_device 两种方式 轮询 外部中断 总结 附录 前言 前面是如何操作GPIO进行输出,这里我重新实现了 ...
- Linux内核驱动学习(三)字符型设备驱动之初体验
Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验 前言 框架 字符型设备 程序实现 cdev kobj owner file_operations dev_t 设备注册过程 ...
- Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig
文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...
- Linux内核驱动学习(十)Input子系统详解
文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...
- Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld
文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...
随机推荐
- git flow配置问题
Mac使用 git flow 的时候,当 -m 进行换行有时消息会被截断,怎么解决? 原因: brew 上的 gnu-getopt 这个包未配置好 步骤: 1. 在 ~/.gitflow_export ...
- nignx location index的用法
来源:https://blog.csdn.net/qq_32331073/article/details/81945134#_10 index指令的作用 在前后端分离的基础上,通过Nginx配置,指定 ...
- python学习07列表
'''列表''''''列表:是可变的序列,也是一种可以存储各种数据类型的集合 用[]中括号表示列表的开始和结束:元素之间用,逗号隔开 '''l1=[] #空列表print(len(l1))l2=[&q ...
- docker commit理解构建镜像(7)
镜像是多层存储,每一层是在前一层的基础上进行的修改: 而容器同样也是多层存储是在以镜像为基础层,在基础层上加一层作为容器运行时的存储层. 当我们使用Docker Hub的镜像无法满足我们的需求时,我们 ...
- Libra教程之:Libra protocol的逻辑数据模型
文章目录 Libra protocol简介 逻辑数据模型 账本状态 交易 账本历史 Libra protocol简介 Libra区块链本质上是一个加密数据库,这个数据库是通过Libra protoco ...
- JAVA进程CPU高的解决方法
无限循环的while会导致CPU使用率飙升吗?经常使用Young GC会导致CPU占用率飙升吗?具有大量线程的应用程序的CPU使用率是否较高?CPU使用率高的应用程序的线程数是多少?处于BLOCKED ...
- 工具 在 Nuget 发布自己的包
MSDN : https://docs.microsoft.com/zh-cn/nuget/quickstart/create-and-publish-a-package-using-visual-s ...
- 暑期档追剧指南曝光 HUAWEI nova 2系列再放实用三大招
火辣辣的夏季来啦,每年这时火热的不只天气,还有暑期黄金档影视剧的激烈争夺战.今年有<择天记>收视率珠玉在前,<欢乐颂2>更是引发全民追剧热潮,"小花"赵丽颖 ...
- 网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
//非当前弧优化版 #include <iostream> #include <cstdio> #include <math.h> #include <cst ...
- 【K8S】K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本)
[K8S]K8S 1.18.2安装dashboard(基于kubernetes-dashboard 2.0.0版本) 写在前面 K8S集群部署成功了,如何对集群进行可视化管理呢?别着急,接下来,我们一 ...