Dieser Treiber wurde auf dem Raspberry Pi getestet und sollte auch an Banana Pi, BeagleBone, Pine64 (u.a.) und andere single board computer und potenziell auf anderen Plattformen arbeiten.

1. Zweck

Dieser Treiber ermöglicht die Verwendung von GPIO-Pins irgendwie ähnlich zum Parallelport-Treiber auf x86 PCs. Es kann die gleichen Schrittgeneratoren, Encoderzähler und ähnliche Komponenten verwenden.

2. Anwendung

loadrt hal_gpio inputs=GPIO5,GPIO6,GPIO12,GPIO13,GPIO16,GPIO17,GPIO18,GPIO19 \
                                outputs=GPIO20,GPIO21,GPIO22,GPIO23,GPIO24,GPIO25,GPIO26,GPIO27 \
                                invert=GPIO20,GPIO27 \
                                reset=GPIO21,GPIO22

Dieser Treiber basiert auf der libgpiod-dev-Bibliothek und dem gpiod-Paket, das eine Reihe von Diensten zur Konfiguration und Abfrage von GPIO enthält. Die GPIO-Pin-Namen in der oben angegebenen Zeile "loadrt" des HAL sollten die Namen des gpioinfo-Befehls sein.

Beispiel Ausgabe (gekürzt):

$ gpioinfo
gpiochip0 - 54 lines:
        line   0:     "ID_SDA"       unused   input  active-high
        line   1:     "ID_SCL"       unused   input  active-high
        line   2:       "SDA1"       unused   input  active-high
        line   3:       "SCL1"       unused   input  active-high
        line   4:  "GPIO_GCLK"       unused   input  active-high
        line   5:      "GPIO5"       unused   input  active-high
        line   6:      "GPIO6"       unused   input  active-high
        line   7:  "SPI_CE1_N"       unused   input  active-high
        line   8:  "SPI_CE0_N"       unused   input  active-high
        line   9:   "SPI_MISO"       unused   input  active-high
        line  10:   "SPI_MOSI"       unused   input  active-high
        line  11:   "SPI_SCLK"       unused   input  active-high
        line  12:     "GPIO12"       unused   input  active-high
        line  13:     "GPIO13"       unused   input  active-high
        line  14:       "TXD1"       unused   input  active-high
        line  15:       "RXD1"       unused   input  active-high
        line  16:     "GPIO16"       unused   input  active-high
        line  17:     "GPIO17"       unused   input  active-high
        line  18:     "GPIO18"       unused   input  active-high
        line  19:     "GPIO19"       unused   input  active-high
        line  20:     "GPIO20"       unused  output  active-high
...

Eine Liste von Eingangs- und/oder Ausgangspins ist wie in der obigen Probe dargestellt anzugeben. Das \-Zeichen wird für die Linienfortführung in HAL verwendet und dient zur Verbesserung der Lesbarkeit. Die Pin-Namen sind case-sensitive und es darf keine Leerzeichen in den Strings geben, auch nicht zwischen den Komma-getrennten Pin-Listen der "=" Zeichen.

Weitere Modifikatoren sind
invert

(nur für Ausgänge gültig). Invertiert den Sinn (engl. sense) des physikalischen Pins relativ zum Wert in HAL.

reset

(nur für Ausgänge gültig). Werden der Liste "reset" beliebige Pins zugeordnet als ein HAL-Parameter hal_gpio.reset_ns wird erstellt. Dies hat keinen Effekt, wenn die Funktion hal_gpio.reset einem Echtzeit-Gewinde hinzugefügt wird. Dies sollte nach der Funktion hal_gpio.write platziert werden und muss im gleichen thread ausgeführt werden. Das Verhalten dieser Funktion entspricht der gleichen Funktion im hal_parport-Treiber und ermöglicht einen Schrittimpuls jeden Thread-Zyklus. Wird die hal_gpio.reset_ns-Zeit länger als 1/4 der Periodendauer des Threads eingestellt, dem sie hinzugefügt wird, so wird der Wert auf 1/4 der Threadperiode reduziert. Es gibt eine untere Grenze, wie lange der Puls sein kann. Bei 8 Pins in der Ausgabeliste kann die Pulsbreite beispielsweise auf einem RPi4 nicht weniger als 5000 ns reduzieren.

Die folgenden Funktionen werden in allen Versionen akzeptiert, sind jedoch nur wirksam, wenn eine Version von libgpiod_dev >= 1.6 installiert ist. Sie sollten in gleicher Weise wie die oben beschriebenen Parameter verwendet werden und die elektrischen Parameter der GPIO-Pins ändern, wenn dies durch die Hardware unterstützt wird.

opendrain

opensource

biasdisable

pulldown

pullup

Die Version von libgpiod-dev installiert kann durch den Befehl gpioinfo -v bestimmt werden

3. Pins

  • hal_gpio.NAME-in - HAL_OUT Der Wert eines Eingangspins, der in HAL dargestellt ist

  • hal_gpio.NAME-in-not - HAL_OUT Eine invertierte Version von oben, für Komfort

  • hal_gpio.NAME-out - HAL_IN verwendet diesen Pin, um einen HAL-Bitwert auf eine physikalische Ausgabe zu übertragen

4. Parameter

  • hal_gpio.reset_ns - HAL_RW - "setp" diesen Parameter, um die Pulslänge von Pins zu steuern, die der "Reset"-Liste hinzugefügt wurden. Der Wert wird zwischen 0 und Thread-Periode / 4 begrenzt.

5. Funktionen

  • hal_gpio_gpio.read - Fügen Sie dies dem base thread hinzu, um die HAL-Pin-Werte zu aktualisieren und physikalische Eingangswerte anzupassen.

  • hal_pi_gpio.write - Fügen Sie dies dem base thread hinzu, um die physikalischen Pins zu aktualisieren indem sie sich den HAL-Werten anpassen.

  • hal_gpio.reset - Nur exportiert, wenn in der Reset-Liste Pins definiert sind. Dies sollte nach der Funktion "write" platziert werden und sollte im gleichen thread sein.

Typischerweise wird die read Funktion früh in der Callliste (engl. call list) stehen, vor irgendwelchen Encoder-Zählern, und die write Funktion nachfolgend in der call list, wohl auch nach stepgen.make-pulses.

6. Pin Identifizierung

Verwenden Sie die Pin-Namen, die vom Dienstprogramm gpioinfo zurückgegeben wurden. Dies verwendet die Daten aus dem Geräteverzeichnis-Baum (engl. device tree). Wenn das installierte Betriebssystem keine Gerätebaum-Datenbank hat, werden die Pins alle als "unnamed" (oder ähnlich) bezeichnet und dieser Treiber kann nicht verwendet werden.

Ein weiteres Update dieses Treibers könnte den Zugriff durch Indexnummer ermöglichen, aber dies wird derzeit nicht unterstützt.

7. Fehlerfindung bei Problemen mit Zugriffsberechtigungen.

Wenn beim Laden des Treibers Zugriffsfehler (engl. "access denied") zurückgegeben werden, versuchen Sie folgendes Rezept: (Sollte für Raspbian nicht benötigt werden und ist für aktuelle GPIO-Chipnamen auf Nicht-Pi-Plattformen anzupassen)

  1. Erstellen Sie eine neue Gruppe gpio mit dem Befehl

    sudo groupadd gpio
  2. Erstellen Sie eine Datei namens 90-gpio-access mit den folgenden Inhalten (dies wird von der Raspbian-Installation kopiert)

    SUBSYSTEM=="bcm2835-gpiomem", GROUP="gpio", MODE="0660"
    SUBSYSTEM=="gpio", GROUP="gpio", MODE="0660"
    SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c '\
            chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio;\
            chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio;\
            chown -R root:gpio /sys$devpath && chmod -R 770 /sys$devpath\
    '"
    
    SUBSYSTEM=="pwm*", PROGRAM="/bin/sh -c '\
            chown -R root:gpio /sys/class/pwm && chmod -R 770 /sys/class/pwm;\
            chown -R root:gpio /sys/devices/platform/soc/*.pwm/pwm/pwmchip* && chmod -R 770 /sys/devices/platform/soc/*.pwm/pwm/pwmchip*\
    '"
  3. Fügen Sie den UNIX Benutzer, der LinuxCNC anwendet, der UNIX Gruppe gpio hinzu mit

    sudo usermod -aG gpio <username>

8. Autor

Andy Pugh

9. Bekannte Probleme

Derzeit keine.