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. ...
随机推荐
- python教程:使用 async 和 await 协程进行并发编程
python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程. 而近几个版本,python ...
- 今天探究的CSS属性是box-sizing;
首先BOX-SIZING属性是CSS3的属性: 语法: box-sizing : content-box || border-box || inherit 取值说明 1.content-box:此值为 ...
- element动态添加表头的正确姿势
1. 第一步循环 el-table-column <el-table-column v-if="item.show" v-for="(item, index) in ...
- [linux][nginx] 通过nginx扩展nginx-rtmp-module简单做了一个流媒体直播
做的过程出现很多问题,环境其实就需要nginx就可以,然后就是在播放的问题,m3u8的格式,mac直接访问就支持,苹果系统原生H5支持m3u8,还有就是手机直接访问也支持!但是其他其他系统PC端不支持 ...
- MySQL使用mysqldump+binlog完整恢复被删除的数据库
(一)概述 在日常的MySQL数据库运维过程中,可能会遇到用户误删除数据,常见的误删除数据操作有: 用户执行delete,因为条件不对,删除了不应该删除的数据(DML操作): 用户执行update,因 ...
- HTML+CSS教程(五)外联样式、组选择器、圆角边框、样式优先级、伪类、盒子模型、元素溢出
一.外联样式 通过link标签引入外部css文件夹中的xxx.css文件到head标签中 例: 二. 1.组选择器 选择器名称1,选择器名称2,选择器名称3,…{属性:属性值;属性;属性值} 例: & ...
- 牛客网机试题-求root(N,k)
题目描述 N<k时,root(N,k) = N,否则,root(N,k) = root(N',k).N'为N的k进制表示的各位数字之和.输入x,y,k,输出root(x^y,k)的值 ( ...
- java 8中构建无限的stream
目录 简介 基本使用 自定义类型 总结 java 8中构建无限的stream 简介 在java中,我们可以将特定的集合转换成为stream,那么在有些情况下,比如测试环境中,我们需要构造一定数量元素的 ...
- 深拷贝、浅拷贝与Cloneable接口
深拷贝与浅拷贝 浅拷贝 public class Student implements Cloneable{ Integer a; Integer b; @Override protected Obj ...
- Excel导入异常Cannot get a text value from a numeric cell解决及poi导入时注意事项
POI操作Excel时偶尔会出现Cannot get a text value from a numeric cell的异常错误. 异常原因:Excel数据Cell有不同的类型,当我们试图从一个数字类 ...