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)
-
Erstellen Sie eine neue Gruppe
gpio
mit dem Befehlsudo groupadd gpio
-
Dann, um Berechtigungen für die "gpio"-Gruppe einzurichten, erstellen Sie eine Datei namens
90-gpio-access
im/etc/udev/rules.d/
-Verzeichnis 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*\ '"
-
Fügen Sie den UNIX Benutzer, der LinuxCNC anwendet, der UNIX Gruppe
gpio
hinzu mitsudo usermod -aG gpio <username>
8. Autor
Andy Pugh
9. Bekannte Probleme
Derzeit keine.