本帖最后由 sjqlwy 于 2018-2-6 15:06 编辑
前言原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正。 本文环境:Windows 7 x64;Khadas VIM_Ubuntu-mate-16.04_Linux-4.9_V170831;USB2TTL串口模块;DFRobot 按钮和LED模块;Xshell 5;Power via Type-C;杜邦线若干。 接触过树莓派的都会对GPIO (通用输入/输出, General Purpose Input Output)有一个形象的概念,这东西几乎成了创客开发板的必备,有了这些GPIO引脚,我们就能连接物理设备,通过软件和物理世界进行通信交互。拿到Khadas,也会优先想到如何使用GPIO引脚,但是翻遍论坛和官方文档,很是失望,也有可能是小弟我才疏学浅理解错了。 1. GPIO引脚资源前文讲过,官方提供了引脚图和原理图,共引出40 Pin非树莓派兼容引脚。 用的过程中才发现,原来不是所有都可用,GPIO只有寥寥几个,还被占用了。。。 2. 使用GPIO资源使用Khadas的GPIO资源主要参考这两个帖子,注意引脚编号由于内核更改并不正确,我们下文会讲到。: 使用方法是简单的用户空间(userland)引出,然后直接操作。 2.1 确定用户空间引脚号目前总共能看到三个编号: 参考贴1官方人员numbqq回复chrislin的内容,我们来到如下两个页面: 注意: GXBB:S905 GXL:S905X GXM:S912
numqq举了个例子:
PIN33 --> GPIOAO_6 --> MESON_PIN(GPIOAO_6, 0),
GPIOAO_6-- > 6, so PIN33--> (6 + 0)=6我们来看看咋回事,物理编号33 --> 功能引脚 GPIOAO_6 --> 查表1知计算方法是GPIOAO6初始编号+0;查表2知GPIOAO_6 --> 初始编号6,所以物理编号33的用户空间编号是6。 举一反三: 那么PIN37/GPIOH_5的用户空间编号是多少呢?查表1,计算方法:MESON_PIN(GPIOH_5, EE_OFF), #define EE_OFF 11 查表2,#define GPIOH_5 21 所以GPIOH_5的用户空间编号为21+11=32
另外本文使用的是官方ubuntu-4.9内核,如果使用其他内核请在github页面选择正确的Branch。balbes150的Armbian内核引脚顺序好像又不同。 2.2 小试牛刀用户空间操作gpio的方法见贴2,简述如下(需要root权限):
# 切换root用户
sudo su
# 引出相应GPIO引脚,这里是Pin37,GPIOH_5
echo 32 > /sys/class/gpio/export
# 设置读取in还是输出out
echo out > /sys/class/gpio/gpio32/direction
# 设置高低电平1/0
echo 1 > /sys/class/gpio/gpio32/value
# 获取引脚高低电平值
cat /sys/class/gpio/gpio32/value
# 释放引脚资源
echo 32 > /sys/class/gpio/unexport这里我们把DFRobot的LED模块接在Khadas上,分别接在3.3v/GND/Pin37上,即可采用上述命令控制LED点亮与熄灭。 2.3 Blink我们参考Geek Till It Hertz的视频《Khadas Vim AMlogic S905x Linux Kernel 4.9 and Sysfs GPIO》写一个小程序:
#!/bin/bash
if [ ! -d /sys/class/gpio/gpio32 ]
then
echo 32 > /sys/class/gpio/export
sleep 1
fi
echo out > /sys/class/gpio/gpio32/direction
while [ 1 ]
do
echo 0 > /sys/class/gpio/gpio32/value
echo "off"
sleep 1
echo 1 > /sys/class/gpio/gpio32/value
echo "on"
sleep 1
done看不懂的可以先阅读《Shell编程极简入门实践》。以root权限运行sudo bash ./blink.sh则可以看到LED模块间隔一秒闪烁,不会放视频就不演示了。 2.4 Onboard LED With Button改进了以下,演示GPIO读取功能,接DFRobot Button按钮到 Pin33,当按下时板载LED点亮,悬空时LED熄灭。 我们这里使用Khadas板载电源指示LED,使用方法参考cnx-software的文章,查看下支持的事件: 默认是none即熄灭,这里没有default-on,我们可以选择breathe或heartbeat替代,代码如下:
#!/bin/bash
if [ ! -d /sys/class/gpio/gpio6 ]
then
echo 6 > /sys/class/gpio/export
sleep 1
fi
echo in > /sys/class/gpio/gpio6/direction
while [ 1 ]
do
VALUE=$(cat /sys/class/gpio/gpio6/value)
if [ ${VALUE} -eq 1 ]
then
echo heartbeat > /sys/class/leds/red/trigger
echo "on"
else
echo none > /sys/class/leds/red/trigger
echo "off"
fi
sleep 1
done至此,执行sudo bash ./blink-on-btn.sh,我们就可以看到效果了,缺点是每1s检查一次按钮状态。 当然你也可以用Python来配合os库运行,后续会讨论。 2.5 开发板还是多媒体盒子?实际使用过程中,我们发现,除去非GPIO接口,还有很多不能用,阅读贴1,发现以下原因: For current firmware, the following PINs can’t use as GPIO.
PIN10 --> ADC_CH0
PIN12 --> ADC_CH2
PIN15 --> UART_RX_AO_B
PIN16 --> UART_TX_AO_B
PIN19 --> Linux_TX
以及: GPIOH_6/7/8/9 are default configured as JTAG. So if you want to use them as GPIO you have to disable JTAG function.
另外板载的另外一个USB串口默认也不能用。。。所剩没几个了。。。 那么如何配置特定GPIO接口用途以及进行接口复用呢?我们可以参考Use Fenix scripts to build your own ubuntu image进行自定义,这里不再展开。 3. 小结用了一番下来,发现Khadas可用资源少得可怜,而且官方人员可能还没开始在这块发力,缺少方便的GPIO操作库。像采用amlogic S905的Odroid C2,官方就给移植了WringPi。所以后续我会探讨移植维护常见GPIO操作库的相关内容.
khadas-gpio-demo.pdf
(1.83 MB, 下载次数: 7)
|