点亮LED
遵循由易入难的原则,在介绍控制GPIO之前,我们先讲讲点亮LED的操作。下表是在Boot阶段四个LED灯的状态描述,在系统运行后,只有LED1是被占用的,其余的3个灯都可以使用,我们以LED4来说明。
LED | 状态 | 描述 |
---|---|---|
LED1 | Heartbeat | Processor watchdog heartbeat |
LED2 | eMMC | eMMC data transfer |
LED3 | SD | SD-card data transfer |
LED4 | Unused | N/A |
在Linux系统设备管理中,一个很重要的概念就是设备就是文件,对设备的操作就是对文件的操作,这一点与Windows设备管理有很大的不同。理解到这一层后,我们控制起来就简单多了。
# 切换到root用户 sudo su # 切换到led4目录 cd /sys/class/leds/apq8016-sbc:green:user4 # 点亮LED灯 echo 1 > brightness # 熄灭LED灯 echo 0 > brightness # 查看LED状态 cat brightness
控制GPIO
控制GPIO的结果不容易观察,需要借助面包板和LED灯(不是上面文章提到的LED,是需要额外购买),我这里没有这些设备,直接使用万用表测量电压,操作时也要慎重,防止短路。下图是Dragron Board 410c的物理引脚示意图,其中有12个GPIO引脚。
上图只能得到GPIO的物理引脚号,Linux内核为不同的开发板导出GPIO引脚,在使用过程中,我们用的是Linux内核下的GPIO引脚,下表是Dragron Board 410c物理引脚号与Linux导出引脚对应的关系。
名称 | 物理引脚 | Linux导出引脚 |
---|---|---|
GPIO-A | 23 | 36 |
GPIO-B | 24 | 12 |
GPIO-C | 25 | 13 |
GPIO-D | 26 | 69 |
GPIO-E | 26 | 115 |
GPIO-F | 28 | 4 |
GPIO-G | 29 | 24 |
GPIO-H | 30 | 25 |
GPIO-I | 31 | 35 |
GPIO-J | 32 | 34 |
GPIO-K | 33 | 28 |
GPIO-L | 34 | 33 |
得到Linux导出引脚号后,我们对GPIO-A进行操作,即导出引脚号为36,操作代码如下:
sudo su # 切换到gpio目录 cd /sys/class/gpio # 导出gpio,成功后会生成gpio36文件夹,这里的36就是对应的导出引脚号 echo 36 > export # 上一步执行成功后会在gpio文件夹下生成gpio36文件夹 cd gpio36 # 修改gpio的方向,是输入还是输出,本文章验证的是输入 echo in > direction # 闭合 echo 1 > value # 断开 echo 0 > value
测试闭合和断开的效果时,用万用表测量GPIO-A和Ground之间的电压,闭合时电压应该是±1.8V,断开时电压应该是0V。万用表探针较粗,测量引脚旁边的焊点即可,注意GPIO-A和GPIO-B的位置,别搞反了。
如果在执行“echo 36 > export”时报错“bash: echo: write error: Invalid argument”,这个说明36不合法。这个问题我也纠结了很久,也查不到相关的资料,后来尝试加390进行测试,意外的事情发生了,居然成功控制了GPIO-A。
sudo su # 切换到gpio目录 cd /sys/class/gpio # 导出gpio,成功后会生成gpio426文件夹 echo 426 > export # 上一步执行成功后会在gpio文件夹下生成gpio426文件夹 cd gpio426 # 修改gpio的方向,是输入还是输出,本文章验证的是输入 echo in > direction # 闭合 echo 1 > value # 断开 echo 0 > value
那么为何需要加390呢?我们看下面一段代码:
图中是获取/sys/class/gpio下所有的文件信息,发现有几个gpio开头的文件夹,并且数值比较大。我也是刚学Linux,对此不太了解,不敢妄下结论,所以如果你也遇到同样的问题,可以加那个最大的数值试试。
总结
这篇文章中讲述了使用Shell命令去点亮LED灯和控制GPIO,控制外设的基本原理就是操作对应的文件,注意要使用root权限。后面的文章会介绍使用代码控制GPIO,有了Shell控制基础后,相信使用代码也是一件非常简单的事情了。
文章评论