Anmerkung: Dieser Treiber wird nicht in disk images (Dateien, die auf eine Festplatte/USB-stick 1:1 kopiert werden können, um damit den Rechner zu starten) zusammengestellt, die auf nicht-ARM CPUS abzielen. Es ist nur wirklich beabsichtigt, mit dem Raspberry Pi zu arbeiten. Sie kann (oder auch nicht) an ähnlichen boards oder direkten Klonen arbeiten.

1. Zweck

Dieser Treiber ermöglicht die Verwendung der Rapberry Pi GPIO Pins in einer Weise analagous zum Parallelport-Treiber auf x86 PCs. Es kann die gleichen Schrittgeneratoren, Encoderzähler und ähnliche Komponenten verwenden.

2. Anwendung

loadrt hal_pi_gpio dir=0x13407 exclude=0x1F64BF8

Die "dir"-Maske (engl. dir mask) bestimmt, ob die Pins Eingänge oder Ausgänge sind, die Ausschluss-Maske (engl. exclude mask) verhindert, dass der Treiber die Pins verwendet (und ermöglicht so, dass sie für ihre normalen RPi-Zwecke wie SPI oder UART verwendet werden können).

Die Maske kann in Dezimal oder Hexadezimal (Hex kann einfacher sein da kein Übertrag von niederen zu höheren Ziffern stattfindet).

Um den Wert der Maskierungeen zu ermitteln, summieren Sie die (Hexa-)Dezimalwerte für alle Pins, die als Ausgabe konfiguriert werden sollen, und analog für alle Pins, die gemäß der folgenden Tabelle ausgeschlossen werden sollten.

Table 1. GPIO Maskierungen - Zuordnung (engl. mapping) von GPIO-Nummern (linkste Spalte) zu physikalischen Pin-Nummern, wie auf dem Raspberry Pi-Board (rechtsste Spalte) gedruckt und die Dezimal-/Hexadezimalwerte, die zum Wert der Maske beitragen.
GPIO Nummer Dezimal Hexadezimal Pin-Nummer

2

1

0x00000001

3

3

2

0x00000002

5

4

4

0x00000004

7

5

8

0x00000008

29

6

16

0x00000010

31

7

32

0x00000020

26

8

64

0x00000040

24

9

128

0x00000080

21

10

256

0x00000100

19

11

512

0x00000200

23

12

1024

0x00000400

32

13

2048

0x00000800

33

14

4096

0x00001000

8

15

8192

0x00002000

10

16

16384

0x00004000

36

17

32768

0x00008000

11

18

65536

0x00010000

12

19

131072

0x00020000

35

20

262144

0x00040000

38.

21

524288

0x00080000

40

22

1048576

0x00100000

15

23

2097152

0x00200000

16

24

4194304

0x00400000

18

25

8388608

0x00800000

22

26

16777216

0x01000000

37

27

33554432

0x02000000

13

Note: Bei der Berechnung der Masken werden GPIO-Nummern verwendet, der individuelle Maskenwert eines Pins ergibt sich hierbei als 2^(GPIO number - 2), während bei der Benennung der HAL Pins es die Raspberry Pi Header Pin Zahlen sind.

So, wenn Sie zum Beispiel GPIO 17 als Ausgang aktivieren (dir=0x8000), dann wird dieser Ausgang von dem HAL Pin hal_pi_gpio.pin-11-out gesteuert.

3. Pins

  • hal_pi_gpio.pin-NN-out

  • hal_pi_gpio.pin-NN-in

Abhängig von den "dir" und Ausschluss (engl. exclude) Maskierungen.

4. Parameter

Es existieren nur die Standard-Takt (engl. timing)-Parameter, die für alle Komponenten erstellt werden.

*hal_pi_gpio.read.tmax *hal_pi_gpio.read.tmax-increased *hal_pi_gpio.write.tmax *hal_pi_gpio.write.tmax-increased

Aus unbekannten Gründen erstellt der Treiber auch HAL pins, um Timing anzuzeigen

*hal_pi_gpio.read.time *hal_pi_gpio.write.time

5. Funktionen

  • hal_pi_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.

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-Nummerierung

Der GPIO-Steckverbinder und der Pinout sind seit rund 2015 konsistent. Diese ältere Pi-Modelle sind wahrscheinlich ohnehin eine schlechte Wahl für LinuxCNC. Dieser Treiber ist jedoch dazu ausgelegt, mit diesen zu arbeiten, wird die beiden alternativen Pinouts entsprechend erkennen und korrekt konfigurieren.

Die aktuelle Pinout-Mapping zwischen GPIO-Nummern und Pin-Nummern ist in der obigen Tabelle beschrieben.

Beachten Sie, dass die config string GPIO-Nummern verwendet, aber sobald der Treiber geladen ist, beziehen sich die HAL-Pin-Namen auf Stecker-Pin-Nummern.

Dies kann logischer sein, als es zunächst erscheint. Bei der Einrichtung müssen Sie genug Pins jeden Typs konfigurieren, während Sie vermeiden wollen, andere Funktionen zu überschreiben, die Ihr System benötigt. Dann, wenn der Treiber geladen wird, in der HAL-Schicht, wollen Sie nur wissen, womit Sie die Drähte für jeden HAL-Pin verbinden.

7. Bekannte Probleme

Derzeit (2023-07-16) scheint dieser Treiber nur auf Raspbian zu arbeiten, da das generische Debian-Image die richtigen Schnittstellen in /dev/gpiomem nicht einrichtet und den Zugriff auf die /sys/mem-Schnittstelle einschränkt.