User Tools

Site Tools


zh-cn:doc:hardware:port.gpio

GPIO

例子

如果你具备 Arduino 或者其他平台的 GPIO 基本知识,此对于使用 OpenWrt 的 GPIO 将是个好消息。以下我们将以 GPIO29 作为一个开关应用例子。

第一步 在 Linux 中 使 GPIO 有效:

echo "29" > /sys/class/gpio/export
然后你需要决定让 GPIO 作为输入(input)或者输出(output), 本例我们将其作为一个开关使用,所以我们需要输出(ouput)
echo "out" > /sys/class/gpio/gpio29/direction
最后一行,使用 1 或 0 来表示 GPIO 打开(on)或关闭(off):
echo "1" > /sys/class/gpio/gpio29/value

硬件

在路由器设备中 GPIO 通常作为作为按钮和指示灯应用,其无论上拉或下拉(下拉到地)都非常安全,其最大电流近似为 4mA 左右,激活时电压通常为 3V。只有两种可能状态:高或低。此取决于设备定义如何被 GPIO 激活:高激活或者低激活.

  • 高激活: 当 GPIO 为高时,设备被激活
  • 低激活: 当 GPIO 为低时,设备被激活

以下图例你可以看到一个 GPIO 连线到一个开关或者 LED 时,其工作状态为低激活或者高激活



数字电源输出的 5V 信号可以通过使用电压分压器得到一个 3.3V 左右的信号。从路由器的 5V 电源连接至地并且连接到数字电源,数字电源信号输出为 5V 左右,通过电压分压器连接!







GPIOs 也可能用于一些复杂的任务:

内核模块 详细描述
1-wire kmod-w1-master-gpio 1-wire bus master
PWM kmod-pwm-gpio pulse width modulator
SPI kmod-spi-gpio bitbanging Serial Peripheral Interface
kmod-mmc-over-gpio MMC/SD card over GPIO
I2C kmod-i2c-gpio bitbanging I2C
LIRC no module yet Linux Infrared Remote Control
Rotary encoder kmod-input-gpio-encoder GPIO rotary encoder

GPIO 中断

如你需要管理一些高信号频次应用中,使用 GPIO 作为输入,那么 GPIO 中断是非常有用的。如果没有中断,GPIO 输入必须使用轮询方法,轮询方法是无法用作来处理高信号频次输入应用。

并非所有板载 GPIO 都有中断. 例如 bcm63xx SoCs 没有 GPIO 中断,此为其设备按钮采用轮询的原因。作为这样的结果,上述列表中的一些输入驱动(input drivers)在其应用板上并不能工作。

软件

Linux 中 GPIOs 可以通过 GPIO SYSFS 接口:/sys/class/gpio/ 来访问

为了控制 GPIOs, 你可以使用 gpioctl-sysfs, 在不使用手动按钮或者 LED 指示的情况下,你也可以键入简单的脚本来控制 GPIOs.

#!/bin/sh
 
show_usage()
{
    printf "\ngpio.sh <gpio pin number> [in|out [<value>]]\n"
}
 
if [ \( $# -eq 0 \) -o \( $# -gt 3 \) ] ; then
    show_usage
    printf "\n\nERROR: incorrect number of parameters\n"
    exit 255
fi
 
#doesn't hurt to export a gpio more than once
(echo $1 > /sys/class/gpio/export) >& /dev/null
 
if [  $# -eq 1 ] ; then
   cat /sys/class/gpio/gpio$1/value
   exit 0
fi
 
if [ \( "$2" != "in" \) -a  \( "$2" != "out" \) ] ; then
    show_usage
    printf "\n\nERROR: second parameter must be 'in' or 'out'\n"
    exit 255
fi
 
echo $2 > /sys/class/gpio/gpio$1/direction
 
if [  $# -eq 2 ] ; then
   cat /sys/class/gpio/gpio$1/value
   exit 0
fi
 
 
VAL=$3
 
if [ $VAL -ne 0 ] ; then
    VAL=1
fi
 
echo $VAL > /sys/class/gpio/gpio$1/value 

找到 PCB 上的 GPIO 引脚

有时你并不知道你的设备 PCB 上在哪儿有物理 GPIO 引脚,在这样的情况下,你可以使用以下小小脚本和一个万用表来找到。

#!/bin/sh
cd /sys/class/gpio
for i in `seq $1 $2`; do
echo $i > export; echo out >gpio$i/direction
done
nums=`seq $1 $2`
while true; do
  for i in $nums; do
     echo 0 > gpio$i/value
 done
  sleep 1
  for i in $nums; do
     echo 1 > gpio$i/value
  done
  sleep 1
done

  1. 执行 ./gpio 0 30, 其意思为 pin 0 to 30
  2. 键入 ctrl-c 可以停止脚本, 然后检查已经已创建的 GPIO: find /sys/class/gpio/gpio*
  3. 重新开始执行脚本,使用万用表测量哪个引脚"闪烁".
  4. 当你发现一个 GPIO 引脚时,然后从上面 0-30 范围切除一半来继续查找;
  5. 重复直至你可以确定 gpio 引脚号
zh-cn/doc/hardware/port.gpio.txt · Last modified: 2017/05/30 15:08 by tmomas