Benachrichtigung bei GPIO-Pin Änderung

Rund um die Hardware des Revolution Pi
Post Reply
Rumpelstilzchen
Posts: 5
Joined: 29 Aug 2024, 09:17

Benachrichtigung bei GPIO-Pin Änderung

Post by Rumpelstilzchen »

Hallo,

das Abfragen eines Eingabe GPIO-Pins am Chip 3 "max31913" funktioniert, z.B. mit diesem Python Skript:

Code: Select all

#!/usr/bin/env python3
import lgpio, time

handle = lgpio.gpiochip_open(3)

if handle < 0:
    print("Fehler beim Öffnen des RP1")
    exit()

led = 1

ret = lgpio.gpio_claim_input(handle, led)
if ret != 0:
    print(f"Fehler beim Allozieren von Pin {led}")
    exit()

while True:
    state = lgpio.gpio_read(handle, led)
    print(f"Pin={state}")
    time.sleep(1)

lgpio.gpio_free(handle, led)
lgpio.gpiochip_close(handle)
Da der Pin nur kurz seinen Zustand ändert, ist eine hohe Polling-Rate erforderlich.

Deshalb soll auf "Benachrichtigung bei Änderung" umgestellt werden, was die lgpio Bibliothek
unter https://abyz.me.uk/lg/index.html unterstützt.

Eine Registrierung auf Änderungen des Pin-Zustandes
schlägt fehl - dazu liefert lgpio das Beispielprogramm monitor.c mit:

./monitor 3:1
chip=3 gpio=1
GPIO in use 3:1 (bad event request)

Der Fehler "bad event request" bedeutet, daß der bei der Registrierung
ausgeführte ioctl-Aufruf fehlschlägt.

Registrierung auf z.B. GPIO Pin 0:4 funktioniert.

Hat jemand eine Idee, wie die Registrierung für den
GPIO-Chip 3 möglich wird?

Rumpelstilzchen

P.S. Hier ein Listing der GPIO-Chips, die Eingabe-PINs sind an Chip 3 - max31913 - angeschlossen.

Code: Select all

$ ls -l /dev/gp*
crw-rw---- 1 root gpio 254, 0 May 13  2023 /dev/gpiochip0
crw-rw---- 1 root gpio 254, 1 May 13  2023 /dev/gpiochip1
crw-rw---- 1 root gpio 254, 2 May 13  2023 /dev/gpiochip2
crw-rw---- 1 root gpio 254, 3 Sep 11 07:22 /dev/gpiochip3
crw-rw---- 1 root gpio 254, 4 Sep 11 07:22 /dev/gpiochip4
lrwxrwxrwx 1 root root      9 Sep 11 07:22 /dev/gpiochip_din -> gpiochip3
lrwxrwxrwx 1 root root      9 Sep 11 07:22 /dev/gpiochip_dout -> gpiochip4


$ sudo cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 0-53, parent: platform/3f200000.gpio, pinctrl-bcm2835:
 gpio-0   (GPIO0               )
 gpio-1   (GPIO1               )
 gpio-2   (GPIO2               )
 gpio-3   (GPIO3               )
 gpio-4   (GPIO4               )
 gpio-5   (GPIO5               )
 gpio-6   (GPIO6               |mux                 ) out lo 
 gpio-7   (GPIO7               |spi0 CS1            ) out hi ACTIVE LOW
 gpio-8   (GPIO8               |spi0 CS0            ) out hi ACTIVE LOW
 gpio-9   (GPIO9               )
 gpio-10  (GPIO10              )
 gpio-11  (GPIO11              )
 gpio-12  (GPIO12              |mux                 ) out lo 
 gpio-13  (GPIO13              |mux                 ) out lo 
 gpio-14  (GPIO14              )
 gpio-15  (GPIO15              )
 gpio-16  (GPIO16              |mux                 ) out lo 
 gpio-17  (GPIO17              |spi0 CS2            ) out hi ACTIVE LOW
 gpio-18  (GPIO18              )
 gpio-19  (GPIO19              |maxim,db0           ) out lo 
 gpio-20  (GPIO20              |maxim,db1           ) out lo 
 gpio-21  (GPIO21              )
 gpio-22  (GPIO22              )
 gpio-23  (GPIO23              )
 gpio-24  (GPIO24              )
 gpio-25  (GPIO25              )
 gpio-26  (GPIO26              |maxim,modesel       ) out lo 
 gpio-27  (GPIO27              )
 gpio-28  (GPIO28              |maxim,fault         ) in  lo ACTIVE LOW
 gpio-29  (GPIO29              )
 gpio-30  (GPIO30              )
 gpio-31  (GPIO31              )
 gpio-32  (GPIO32              )
 gpio-33  (GPIO33              )
 gpio-34  (GPIO34              )
 gpio-35  (GPIO35              )
 gpio-36  (GPIO36              |spi2 CS3            ) out hi ACTIVE LOW
 gpio-37  (GPIO37              )
 gpio-38  (GPIO38              )
 gpio-39  (GPIO39              )
 gpio-40  (GPIO40              )
 gpio-41  (GPIO41              )
 gpio-42  (GPIO42              )
 gpio-43  (GPIO43              |spi2 CS0            ) out hi ACTIVE LOW
 gpio-44  (GPIO44              |spi2 CS1            ) out hi ACTIVE LOW
 gpio-45  (GPIO45              |spi2 CS2            ) out hi ACTIVE LOW
 gpio-46  (SMPS_SCL            )
 gpio-47  (SMPS_SDA            )
 gpio-48  (SD_CLK_R            )
 gpio-49  (SD_CMD_R            )
 gpio-50  (SD_DATA0_R          )
 gpio-51  (SD_DATA1_R          )
 gpio-52  (SD_DATA2_R          )
 gpio-53  (SD_DATA3_R          )

gpiochip1: GPIOs 100-101, brcmvirt-gpio, can sleep:
 gpio-100 (                    |ACT                 ) out lo 

gpiochip4: GPIOs 488-495, parent: spi/spi2.2, 74hc595, can sleep:

gpiochip3: GPIOs 496-503, parent: spi/spi2.3, max31913, can sleep:

gpiochip2: GPIOs 504-511, parent: platform/soc:firmware:expgpio, raspberrypi-exp-gpio, can sleep:
 gpio-504 (HDMI_HPD_N          )
 gpio-505 (EMMC_EN_N           )
 gpio-506 (NC                  )
 gpio-507 (NC                  )
 gpio-508 (NC                  )
 gpio-509 (NC                  )
 gpio-510 (NC                  )
 gpio-511 (NC                  )
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by dirk »

Hi Rumpelstilzchen, wenn du ein RevPi DIO Modul benutzt, dann sind dort ja die betreffenden MAX31913 verbaut. Das kann man in den Schaltplänen sehen, die sich hier befinden:
https://revolutionpi.com/en/tutorials/d ... haltplaene

Aber ich wüsste jetzt nicht, wie du diese per GPIOs ansteuern kannst. Was benutzt du denn für Hardware?
Rumpelstilzchen
Posts: 5
Joined: 29 Aug 2024, 09:17

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by Rumpelstilzchen »

Hallo Dirk,

ich benutze die Eingabe-Pins eines Revopution Pi:
Revolution pi mit Eingang4.jpg
Zusätzlich habe ich mir die libgpiod Bibliothek angesehen, welche in der Anleitung https://revolutionpi.com/de/tutorials/e ... ol-compact unter „Digitale Ein-/Ausgänge steuern“ beschrieben ist.

Gleiches Ergebnis: das Auslesen eines Pins (hier mit gpiod_line_request_input() und gpiod_line_get_value())
funktioniert, das Registrieren auf einen Pin und Benachrichtigung bei Zustandsänderung
(mit gpiod_line_request_rising_edge_events() und gpiod_line_event_wait()) funktioniert nicht:

Code: Select all

$ ./gpio-event-mon -n gpiochip_din -o 1 -r
Failed to issue GPIO_GET_LINE_IOCTL (-6), No such device or address
Irgendwelche Ideen?
Rumpelstilzchen

P.S. gefunden werden die GPIO Pins:

Code: Select all

$ ./lsgpio
GPIO chip: gpiochip4, "max31913", 8 GPIO lines
        line  0: unnamed unused [input]
        line  1: unnamed unused [input]
        line  2: unnamed unused [input]
        line  3: unnamed unused [input]
        line  4: unnamed unused [input]
        line  5: unnamed unused [input]
        line  6: unnamed unused [input]
        line  7: unnamed unused [input]
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by dirk »

Hi Rumpelstilzchen, okay, das war eine wichtige Information, dass du einen RevPi Compact nutzt.
Hier wird alles beschrieben: "Ein-/Ausgänge steuern ohne piControl".

Edit: Ist das, was du suchst und beantwortet das deine Fragen?
Rumpelstilzchen
Posts: 5
Joined: 29 Aug 2024, 09:17

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by Rumpelstilzchen »

Hallo Dirk,

du findest den von dir genannten Link in meinem vorherigen Beitrag, und meine Frage bezieht sich darauf,
daß das, was in der Anleitung beschrieben ist, eben nicht funktioniert.

Ein Lösungsvorschlag würde sehr helfen!

Rumpelstilzchen
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by dirk »

Hallo Rumpelstilzchen,
sorry fürs Überlesen, das ist mir an der Stelle nicht aufgefallen.

Ich werde einen Testaufbau erstellen, um das Fehlerbild nachstellen zu können. Das wird allerdings im Laufe der nächsten Woche erst möglich sein.

Es wäre es klasse, wenn du uns derweil einen SOS-Report schicken könntest .
Rumpelstilzchen
Posts: 5
Joined: 29 Aug 2024, 09:17

Re: Benachrichtigung bei GPIO-Pin Änderung

Post by Rumpelstilzchen »

Hallo,
SOS-Report ist versendet.

Rumpelstilzchen
Post Reply