Das Kommando raspi-gpio

Heute bin ich über ein Kommando gestolpert, das mir bisher nicht aufgefallen ist und das tatsächlich relativ neu ist: raspi-gpio. Dieses Kommando erfüllt eine ähnliche Aufgabe wie das gpio-Kommando von WiringPi: Es ermöglicht es, den Zustand der GPIOs auszulesen bzw. zu verändern. Darüber hinaus kann es eine Menge Details über die möglichen alternativen Funktionen von GPIOs ermitteln.

Basics

Das Kommando ist Teil des Pakets raspi-gpio. Dieses Paket ist unter Raspbian Jessie sowie unter Ubuntu MATE 15.10 standardmäßig installiert. Laut dem Changelog (siehe /usr/share/doc/raspi-gpio/changelog) wurde die erste Version des Kommandos am 13.5.2015 freigegeben.

Das Kommando funktioniert auf aktuellen Raspbian-Versionen ohne root-Rechte. Es gibt keine man-Seite, aber einen relativ ausführlichen help-Text, den ich am Ende dieses Beitrags hinzugefügt habe.

Die GPIOs werden mit den Nummern gemäß der Dokumentation des Raspberry-Pi-SoC-Herstellers Broadcom angesprochen. Beispielsweise bezieht sich raspi-gpio get 23 auf den GPIO 23, der auf dem Raspberry Pi mit Pin 16 des J8-Headers verbunden ist. (Die Nummerierung entspricht der des WiringPi-Kommandos gpio mit der Option -g.)

  • raspi-gpio help zeigt die Dokumentation zu dem Kommando an.

  • raspi-gpio get [gpionr] ermittelt den aktuellen Status aller GPIOs bzw. des angegebenen GPIOs.

  • raspi-gpio funcs [gpionr] ermittelt, welche alternative Funktionen der angegebene GPIO bzw. alle GPIOs erfüllen können.

  • raspi-gpio set gpionr status1 status2 status3 verändert den Status des angegeben GPIOs. Mögliche Schlüsselwörter anstelle von status1, status2 etc. sind: ip = Input, op = Output, dl = Zustand Low (Drive Low), dh = Zustand High (Drive High), pu = Pull-up-Widerstand aktiv, pd = Pull-down-Widerstand aktiv, pn = keine Pull-up/down-Funktion, a0 bis a5 = alternative Funktion n aktivieren. Soweit sich sinnvolle Kombinationen ergeben, dürfen mehrere der obigen Schlüsselwörter auf einmal genannt werden, jeweils getrennt durch Leerzeichen. Welche alternative Funktionen ein GPIO unterstützt und wie diese nummeriert sind, geht aus raspi-gpio func hervor.

Beispiel

Das erste Kommando ermittelt, welche Funktionen der GPIO mit der Nummer 23 unterstützt. Auf dem Raspberry Pi ist dieser GPIO mit Pin 16 des J8-Headers verbunden. Das zweite Kommando nutzt diesen GPIO als simplen Signalausgang, wobei der Pegel auf High gesetzt wird (3,3~V). Eine mit Pin 16 verbunden LED würde nun leuchten. Das dritte Kommando verifiziert den Zustand von GPIO 23.

pi$ raspi-gpio funcs 23
  GPIO, DEFAULT PULL, ALT0,    ALT1, ALT2,    ALT3,    ALT4,     ALT5
  23,   DOWN,         SD0_CMD, SD15, DPI_D19, SD1_CMD, ARM_RTCK, -

pi$ raspi-gpio set 23 op dh

pi$ raspi-gpio get 23
  GPIO 23: level=1 fsel=1 func=OUTPUT

Help-Text

raspi-gpio help

WARNING! raspi-gpio set writes directly to the GPIO control registers
ignoring whatever else may be using them (such as Linux drivers) -
it is designed as a debug tool, only use it if you know what you
are doing and at your own risk!

The raspi-gpio tool is designed to help hack / debug BCM283x GPIO.
Running raspi-gpio with the help argument prints this help.
raspi-gpio can get and print the state of a GPIO (or all GPIOs)
and can be used to set the function, pulls and value of a GPIO.
raspi-gpio must be run as root.
Use:
  raspi-gpio get [GPIO]
OR
  raspi-gpio set <GPIO> [options]
OR
  raspi-gpio funcs [GPIO]
Note that omitting [GPIO] from raspi-gpio get prints all GPIOs.
raspi-gpio funcs will dump all the possible GPIO alt funcions in CSV format
or if [GPIO] is specified the alternate funcs just for that specific GPIO.
Valid [options] for raspi-gpio set are:
  ip      set GPIO as input
  op      set GPIO as output
  a0-a5   set GPIO to alternate function alt0-alt5
  pu      set GPIO in-pad pull up
  pd      set GPIO pin-pad pull down
  pn      set GPIO pull none (no pull)
  dh      set GPIO to drive to high (1) level (only valid if set to be an output)
  dl      set GPIO to drive low (0) level (only valid if set to be an output)
Examples:
  raspi-gpio get              Prints state of all GPIOs one per line
  raspi-gpio get 20           Prints state of GPIO20
  raspi-gpio set 20 a5        Set GPIO20 to ALT5 function (GPCLK0)
  raspi-gpio set 20 pu        Enable GPIO20 ~50k in-pad pull up
  raspi-gpio set 20 pd        Enable GPIO20 ~50k in-pad pull down
  raspi-gpio set 20 op        Set GPIO20 to be an output
  raspi-gpio set 20 dl        Set GPIO20 to output low/zero (must already be set as an output)
  raspi-gpio set 20 ip pd     Set GPIO20 to input with pull down
  raspi-gpio set 35 a0 pu     Set GPIO35 to ALT0 function (SPI_CE1_N) with pull up
  raspi-gpio set 20 op pn dh  Set GPIO20 to ouput with no pull and drving high