Service GPIO = low kurz vor dem Ausschalten

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hi,

    ich wollte mir ein Service/Unit schreiben, die mir einen GPIO pin auf low zieht kurz bevor mein System sich abschaltet. Der Pin soll erst gesetzt werden, wenn die SD Karte nicht mehr beschrieben wird. Wenn der Pin auf low geht schaltet sich alles ab, auch die Spannung vom Raspberry wird weggeschaltet.

    Das wäre der Ablauf den ich gerne erreichen würde:
    1. shutdown Befehl wurde ausgeführt
    2. SD Karte wird unmounted / nur noch lesbar

    3. Python Script, wo pin auf low gezogen wird, wird ausgeführt


    Kann ich den pin überhaupt noch auf low ziehen, wenn die SD Karte nur noch lesbar bzw. unmounted ist?

    Also das Script, um den Pin auf low zuschalten habe ich schon geschrieben und das funktioniert auch. Also wenn ich das Script manuell starte im Terminal.

    Meine weitere Vorgehensweise wäre:
    Datei anlegen

    Code
    sudo nano /etc/systemd/system/disableDevice.service


    mit diesem Inhalt

    Service einschalten

    Code
    sudo systemctl enable disableDevice.service

    Kann man das mit unmount-fs.target so lassen? Geht das so?
    ExecStop bedeutet doch, dass der Befehl ausgeführt wird, wenn das Betriebssystem herunter gefahren wird?

    Code
    WantedBy=poweroff.target

    bedeutet, dass dieser Service erst ausgeführt wird, wenn sich das System im Runlevel 0 befindet?

    Ich hoffe ihr könnt mir weiter helfen.

    Gruß,

    Dirk

  • Hi,

    wenn ich diesen Pin auf low ziehe wird die Spannung vom RaspberryPi weggeschaltet. Das ganze Gerät ist dann spannungslos. Ich will bloß sicherstellen, dass nicht mehr auf die SD Karte geschrieben wird. Ich könnte anstatt einen shutdown Befehl auch einfach diesen Pin auf low schalten und alles würde ausgehen. Aber dann kann ich nicht garantieren, dass die SD Karte das überlebt.

    Gruß,

    Dirk

    • Offizieller Beitrag

    Verstehe...
    Eine Idee wäre z.B.:
    - Schalte zum Systemstart einen GPIO auf High.
    - Beim Shutdown würde dieser Stromlos werden, worauf ein Relais auch öffnen würde.
    - Dann noch eine leichte Verzögerung evtl. mit Kondensator.

    Zu beachten wäre noch den richtigen GPIO zu finden, also einer der standardmäßig auf low steht.
    Soweit die Theorie, in der Praxis könnte ich Dir unvorbereitet leider nicht helfen, da gibts hier Profis. ;)

    //Edit: Denkfehler! Wie könnte dann Strom für den RPi wieder eingeschaltet werden? :huh: :blush:


  • wenn ich diesen Pin auf low ziehe

    das war nach den ersten Worten klar geworden und du bist nicht der erste mit dem Gedanken!

    Da bietet sich ein "magic word" an welches man in ein HC Schieberegister taktet und die 8 Ausgänge auf einen 8-input multiplexer 74HC151 gibt welcher einen 555 Timer trigert.
    Das "magic word" kann per DIP switch festgelegt werden.

    Mit zusätzlichen RS FlipFlops und dem enable kann man dann zusätzlich wilde "Umschaltungen" während des hoch- runterfahrens verhindern.
    Die Timerzeit sollte man so wählen das der PI sicher runterfährt, es gab auch mal andere Lösungsvorschläge wo die Aktivität LEDs angezapft wurden.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hi,

    danke für eure Antworten. Kann ich daraus schliesen, dass es mit einem Script, wie von mir beschrieben nicht funktioniert?
    Also aktuell hängt der Pin mit einem Pullup an 3,3V und daran ist ein FET angeschlossen, der wiederum ein Relais steuert.

    Wenn das mit einem Script funktionieren würde wäre mir das am liebsten. Ich würde die Hardware ungern nochmal ändern wollen.

  • Hallo Dirk,

    herzlich Willkommen in unserem Forum!

    Ich lasse mich gern eines Besseren belehren, aber ich kann mir nicht vorstellen, dass zu einem Zeitpunkt des Shutdown:
    - zu dem wahrscheinlich keine Dateistruktur mehr bekannt ist,
    - (fast) sämtliche Prozesse abgeschaltet sind
    - die letzten Zuckungen des Raspberry Pi darin bestehen, über den Broadcom-Chip irgendwelche Pins auf High oder Low zu pegeln
    - alles darauf vorzubereiten, dass demnächst der Strom ausfällt
    dann noch eben mal der Python-Interpreter erwacht, ein Skript abarbeitet, das bei dem Bitbanging mitmischt und dem - ich wage es nicht mehr so zu nennen - Betriebssystem mitzuteilen, "Hallo Herr Oberwachtl, i hob nu' ausg'piselt - konnst nu' weitermachen!"

    Ich kenne einige Beiträge aus englischsprachigen Foren, in denen derartiges auch versucht wurde - aber letztlich hatte meines Wissens niemand Erfolg damit. Zumindest nicht mit Python.

    Mit C oder Assembler könnte ich mir das eher vorstellen, da man sich hier mehr auf Augenhöhe begegnet.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • Verstehe...
    Eine Idee wäre z.B.:
    - Schalte zum Systemstart einen GPIO auf High.
    - Beim Shutdown würde dieser Stromlos werden, worauf ein Relais auch öffnen würde.
    - Dann noch eine leichte Verzögerung evtl. mit Kondensator.

    Zu beachten wäre noch den richtigen GPIO zu finden, also einer der standardmäßig auf low steht.

    Das mache ich auch zum Systemstart. Ich schalte den Pin auf High Pegel. Macht so erstmal keinen Unterschied, weil er über den Pullup schon auf high Pegel ist.

    Wie finde ich den raus, ob der Pin standardmäßig auf low liegt? Ok messen. Aber es gibt diese Pins, die standardmäßig low sind? Ich hätte gedacht die haben alle einen unbestimmten Zustand.

  • Servus,
    meines Wissens gibt es keine Möglichkeit über den Zustand der I/Os herauszufinden, ob der RPi jetzt im Zustand "kurz vor Poweroff" ist ...
    Was Du nicht vergessen solltest ... bevor Du diesen Zustand abfragen kannst, hat Dir der letzte, laufende Prozess (init) bereits einen SIGTERM bzw. SIGKILL geschickt und Dich damit aus dem Rennen befürdert ... da läuft nämlich auch kein Scheduler mehr ...

    Die einzige, mir bekannte Möglichkeit ist ein Kernel-hook am init-Prozess, der ausgeführt wird, bevor die ACT-LED zyklisch 3x im Sekundentakt blinkt. Hier könnte man eine (vorgegebene/konfigurierbare) Anzahl I/Os auf einen bestimmten Status setzen ( so ähnlich, wie jar das mit dem "magic word" beschrieben hat).

    Ansonsten sehe ich keine Chance, das sicher zu erkennen.

    cu,
    -ds-

  • Eigentlich geht es doch nur darum, per GPIO zu signalisieren, ob die Partitionen auf der SD-Karte eingehaengt sind oder nicht. Ohne ein Root-Verzeichnis laeuft nur noch der Kernel (und der Boot-manager/loader). Es gaeber also nur die Möglichkeiten, das root-Verzeichnis auf eine Ram-Disk auszulagern, oder das Feature direkt im kernel einzukompilieren. Ich meine auch, dass das CPU-HLT-Signal an einem Beinchen der CPU abgreifbar ist, kann mich aber irren. Das mit der Ramdisk waere vielleicht was...

    Weitere Möglichkeiten:
    1. Overlay-FS:
    https://wiki.ubuntuusers.de/Nur-Lesen_Root-Dateisystem/
    2. Root Filesystem auf read-only umschalten (dann kann nicht geschrieben werdne, wenn der Strom weg geht).
    http://www.linuxquestions.org/questions/linu…ad-only-547908/
    und
    http://unix.stackexchange.com/questions/1950…-read-only-mode

    Einmal editiert, zuletzt von wend (15. März 2017 um 10:17)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!