#include <stdint.h>
#include <unistd.h> // usleep(), execlp()
#include <fcntl.h>
#include <sys/mman.h>
/*
Einschaltknopf an GPIO3 = Pin 5 = I²C SCL auch zum Herunterfahren nutzen.
Datenblatt BCM2835: Auch während GPIO3 auf I²C umprogrammiert ist,
lässt sich der Pinzustand abfragen.
Aber nicht in Python.
Mit den eingebauten Pausen (usleep()) ist die CPU-Last akzeptabel
und der Prozess ist mit ^C abbrechbar.
Nebeneffekt: I²C-Slaves mit Fehlverhalten (zu langes Clock-Stretch)
können den Raspberry herunterfahren. Kann aber auch zweckmäßig sein.
180910 erstellt
-230425 Abhängigkeit von libbcm2835.a entfernt, alles Marke Eigenbau
*230510 umbenannt
*/
int main() {
int f=open("/dev/gpiomem",O_RDWR|O_SYNC);
if (f<0) return 1;
volatile uint32_t*regs=(volatile uint32_t*)mmap(0,0xB4,PROT_READ|PROT_WRITE,MAP_SHARED,f,0);
if (!regs) return -2;
for(;;) {
if (!(regs[13]&1<<3)) { // wenn LOW
for (int i=0;i<1000;i++) { // 300 ms permanent LOW abfragen
usleep(300);
if (regs[13]&1<<3) goto skip; // wenn HIGH
}
// system("shutdown -h now");
execlp("systemctl","systemctl","poweroff",0);
// erspart das Duplizieren des Prozesses
skip:;
}
usleep(100000); // alle 100 ms abfragen
}
}
Detected encoding: UTF-8 | 0
|