文档章节

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

dingdayu
 dingdayu
发布于 2018/09/08 02:40
字数 1074
阅读 765
收藏 15

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

相关链接

  1. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
  2. 树莓派学习笔记——Shell脚本操作GPIO
  3. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
  4. 嵌入式 Linux 如何操作 GPIO ?

© 著作权归作者所有

上一篇: GPG 坑后记
下一篇: CentOS 6 安装 Docker
dingdayu

dingdayu

粉丝 34
博文 119
码字总数 59598
作品 3
海淀
后端工程师
私信 提问
加载中

评论(1)

luwenhua
luwenhua
��
RK3288开发板PopMetal上的GPIO驱动实例

楼主在这边给大家介绍下如何使用PopMetal的GPIO。先讲过程,再讲原理吧, 该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写。 第一步,添加DTS节点 在/kernel...

穿prada的008
2015/08/03
1K
0
今日小小的感悟(2009/04/09)

unix/linux基本哲学之:一切皆文件!这是一条真理,一切皆文件并不是什么神秘的事情,“文件”只是一个操作的接口,就如我们知道的那样的,可以读,写,创建,删除,追加等等,“一切皆”的意...

晨曦之光
2012/04/10
42
0
Linux中的gpio口使用方法

前言 Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体...

zjy900507
2018/05/11
0
0
迅为4412开发板Linux驱动教程之GPIO的初始化

视频下载地址:http://pan.baidu.com/s/1c06oiti GPIO的初始化 • 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpio-exynos4”被编译进了内核 – 生成.o文件代表最终被编译...

topeet
2015/08/25
1K
0
从访问控制的观点谈windows的多用户

前面从历史的角度简单谈了一下linux的多用户机制,主要了解到linux的多用户是与生俱来的的,而且unix的多用户也是历史促就的,也是生来就有的,但是如果从访问控制的角度来阐释多用户概念的话...

晨曦之光
2012/04/10
306
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
420
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
4
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
3
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
7
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部