Linux
系统定义了一切皆文件的原则,甚至于硬件:磁盘
,软盘
,等……,这样的好处是,在不一样的平台和硬件上都能造成统一的调用方式。shell
这里,咱们从树莓派
,探讨下GPIO
的操做原理(非内核原理):经过 sysfs 方式控制 GPIO。学习
接触过 Linux 的,应该都了解
echo "0" > test.txt
是将一个字符串0
输入到当前目录的test.txt
文件中,那么下面全部的操做,均基于这个操做形式。.net
自 Linux 2.6.21
起,GPIO
做为一个基础组件包含到Linux 内,咱们能够根据 GPIO
规范直接使用。code
首先,进入 /sys/class/gpio
向目录下, 咱们能够看到如下文件:orm
# 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
目录功能具体以下:blog
引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数接口
举个栗子(具体 GPIO 须要参考数据手册),若是使想用 GPIO1_20,那么引脚编号就可能等于 1 x 32 + 20 = 54ip
咱们操做在
树莓派2B
下,其中 寄存器基数为 0 ,因此引脚编号=引脚寄存器位数;记操做几号,引脚号即为几。字符串
向文件 /sys/class/gpio/export
写入引脚编号,便可激活引脚。get
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
的值对应着,上面的 high
和 low
时的 1
/ 0
当控制完成时,须要释放掉端口的控制,此时如导出引脚时同样,将引脚编号输出到 /sys/class/gpio/unexport
便可。
echo 18 > /sys/class/gpio/unexport
上面的讲解中,即时经过 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