GPIO操作原理(Linux一切皆文件)

Linux 系统定义了一切皆文件的原则,甚至于硬件:磁盘软盘,等……,这样的好处是,在不同的平台和硬件上都能形成统一的调用方式。

这里,我们从树莓派,探讨下GPIO的操作原理(非内核原理):通过 sysfs 方式控制 GPIO。

接触过 Linux 的,应该都了解 echo "0" > test.txt 是将一个字符串 0 输入到当前目录的 test.txt 文件中,那么下面所有的操作,均基于这个操作形式。

GPIO端口

Linux 2.6.21 起,GPIO 作为一个基础组件包含到Linux 内,我们可以根据 GPIO 规范直接使用。

首先,进入 /sys/class/gpio 向目录下, 我们可以看到以下文件:

# cd /sys/class/gpio && ls -l
总用量 0
-rwxrwx--- 1 root gpio 4096 9月   8 01:37 export
lrwxrwxrwx 1 root gpio    0 8月   9 01:16 gpiochip0 -> ../../devices/platform/soc/3f200000.gpio/gpio/gpiochip0
-rwxrwx--- 1 root gpio 4096 9月   8 01:47 unexport

目录功能具体如下:

  1. gpio_operation 通过 /sys/ 文件接口操作 IO 端口 GPIO 到文件系统的映射。
  2. 控制 GPIO 的目录位于 /sys/class/gpio。
  3. /sys/class/gpio/export 文件用于通知系统需要导出控制的 GPIO 引脚编号。
  4. /sys/class/gpio/unexport 用于通知系统取消导出。
  5. /sys/class/gpio/gpiochipX 目录保存系统中 GPIO 寄存器的信息,包括每个寄存器控制引脚的起始编号 base,寄存器名称,引脚总数

计算引脚编号

引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数

举个栗子(具体 GPIO 需要参考数据手册),如果使想用 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54

我们操作在 树莓派2B 下,其中 寄存器基数为 0 ,所以引脚编号=引脚寄存器位数;记操作几号,引脚号即为几。

导出引脚

向文件 /sys/class/gpio/export 写入引脚编号,即可激活引脚。

echo 18 > /sys/class/gpio/export

命令执行成功后,目录下,便会出现 gpio18 文件夹,如果没有出现,则表示引脚不可导出。

控制方向

引脚导出成功后,即可通过写入 /sys/class/gpio/gpio18/direction 控制引脚 [输入] 或 [输出]。

# cd gpio18
# echo "out" > direction

命令无报错,即为操作成功;可输入值有以下几种:

in		引脚输入信号
out		输出控制到引脚
high 	输出一个高电平(`value`:`1`)
low 	输出一个低电平(`value`:`0`)

输入输出值

输入输出的值,通过 gpioX 下的 value 文件控制

当为输入时,请 echo /sys/class/gpio/gpio18/value 读出值; 当为输出时,请 echo 1 > /sys/class/gpio/gpio18/value 输入值;

这里 value 的值对应着,上面的 highlow 时的 1 / 0

取消引脚导出

当控制完成时,需要释放掉端口的控制,此时如导出引脚时一样,将引脚编号输出到 /sys/class/gpio/unexport 即可。

echo 18 > /sys/class/gpio/unexport

SHELL 控制

上面的讲解中,即时通过 shell 的方式控制 GPIO,这里将所有的命令集合下:

# 进入GPIO目录
cd /sys/class/gpio
# 使用ls查看gpio目录中的内容
ls
# export gpiochip0 unexport
# GPIO操作接口从内核空间暴露到用户空间
# 执行该操作之后,该目录下会增加一个gpio18文件目录
echo 18 > export
# 进入GPIO18目录,该目录由上一步操作产生
cd gpio18
#   查看gpio18目录
ls 
#   active_low direction edge power subsystem uevent value
# 设置GPIO18为输出方向
echo out > direction
# 输出逻辑高电平,LED点亮
echo 1 > value
# 输出逻辑低电平,LED熄灭
echo 0 > value
# 返回上级目录
cd ../
# 释放GPIO4接口
echo 18 > unexport

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AIUAI

VMware提示:此虚拟机似乎正在使用中,取得该虚拟机的所有权失败错误的解决方案

使用VMware的过程中,如果没有挂起和关闭虚拟机,实体机断电等直接关闭的话,会出现以下提示:

17330
来自专栏祥子的故事

双系统 | 在ubuntu下打不开windows下磁盘,并报错误

不知什么原因,在Ubuntu下却不能打开Windows的磁盘,之前还用的完好。 报错如下:

30620
来自专栏祥子的故事

Ubuntu | 双系统的windows启动项找不到修复

双系统windows10 、ubuntu 16.04 ,重装ubuntu后,开机找不到windows的启动项,在网上找到了解决方案:

38720
来自专栏米扑专栏

Linux curl 命令模拟 POST/GET 请求

curl 支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。

85080
来自专栏祥子的故事

ubuntu 使用总结

清华源: https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/

16920
来自专栏米扑专栏

CentOS 配置swap交换区的方法

CentOS 作为linux世界里最稳定的服务器版本,rhas5一直有很大的应用面,之前一直关注的是freebsd,因为应用的需要,特别在配合mysql和ora...

37240
来自专栏米扑专栏

PHP 获取 ping 时间

linux info :  Array ( [0] => PING 115.29.237.28 (115.29.237.28) 56(84) bytes of ...

17230
来自专栏AIUAI

Caffe - Clion 调试 C++ 源码简单使用

解决方案: 修改 caffe_root/cmake/Dependencies.cmake,添加 contrib:

45410
来自专栏AIUAI

Caffe2 - (一)Source 安装及问题解决

需要安装 NVIDIA CUDA 8 和 cuDNN v5.1 或 v6.0,官方推荐安装方式如下:

47560
来自专栏米扑专栏

Windows / Linux / MacOS 设置代理上网的方法汇总

本文汇总了 Windows / Linux / MacOS 设置代理上网的各种方法,总结如下:

32030

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励