查看: 4383|回复: 1

【Khadas 试用】【UPDATED】5. 简易操作GPIO

[复制链接]
  • TA的每日心情
    开心
    2018-8-25 16:46
  • 签到天数: 28 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2018-2-2 14:45:56 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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资源主要参考这两个帖子,注意引脚编号由于内核更改并不正确,我们下文会讲到。:
    • GPIO export on Ubuntu is not working. What’s the problem?
    • How to access GPIO

    使用方法是简单的用户空间(userland)引出,然后直接操作。
    2.1 确定用户空间引脚号
    目前总共能看到三个编号:
    • 物理编号:板子40 Pin标的顺序
    • 功能编号:和SoC有关的编号,如40Pin中有的供电,有的接地,有的GPIO
    • 用户空间编号:这个不知道,但是是我们这次要用的,好在帖子1提供了换算方法

    参考贴1官方人员numbqq回复chrislin的内容,我们来到如下两个页面:
    • https://github.com/khadas/linux/blob/ubuntu-4.9/drivers/amlogic/pinctrl/pinctrl_gxl.c
    • https://github.com/khadas/linux/blob/ubuntu-4.9/include/dt-bindings/gpio/gxl.h

    注意:
    • 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)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2019-10-1 12:54
  • 签到天数: 313 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2018-2-3 19:24:28 | 显示全部楼层
    怎么都是这种灌水帖子
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则



    手机版|小黑屋|与非网

    GMT+8, 2024-4-23 22:04 , Processed in 0.129036 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.