Date: Thu, 14 Jul 2022 08:26:38 -0500 From: Jedi Tek'Unum <freebsd-arm-list-2022-fea3@qoruscant.com> To: freebsd-arm <freebsd-arm@freebsd.org> Subject: Re: Startup-/Shutdown Button for the Raspberry Pi 4 Message-ID: <165780521135.7.10590681011079085662.51797902@qoruscant.com> In-Reply-To: <DECE250D-E0D4-4064-9BF9-AA39754CB2C0@cyclaero.com> References: <DECE250D-E0D4-4064-9BF9-AA39754CB2C0@cyclaero.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--Apple-Mail-A247728D-319B-4FEE-B8DD-9328EB68D6BC Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On Jul 13, 2022, at 7:36 PM, Dr. Rolf Jansen - freebsd-rj at cyclaero.com <= nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co> wrote: >=20 > =EF=BB=BF >=20 >>> Am 13.07.2022 um 20:19 schrieb Jedi Tek'Unum <freebsd-arm-list-2022-fea= 3@qoruscant.com>: >>>=20 >>> On Jul 12, 2022, at 8:17 PM, Dr. Rolf Jansen - freebsd-rj at cyclaero.c= om <nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co> wrot= e: >>>=20 >>> =EF=BB=BFOne week ago I started with exploring the Raspberry Pi 4 B, wh= ich might be a substitute for the aging BeagleBone Blacks for my future pro= jects. >>>=20 >>> I very much like the built-in power button facility of the BBB, and unf= ortunately the RPi 4 has nothing comparable - the one button to rule it all= . >>>=20 >>> I read a lot of howtos and blog posts (mostly for Linux) and nothing wa= s really worth to give it even a try, compared to live without the button. = Well, this is not becoming an elaborated question, but here I am going to e= laborate my solution for FreeBSD. >>>=20 >>> 1. I Prepared a momentary push button for connecting it to the RPi: >>> ___=20 >>> | / >>> |/ >>> / >>> / >>> +-o o--------+ >>> | | | >>> | [R] 100 =CE=A9 | >>> | | | >>> o o o >>> Pin 5 Pin 6 Pin 13 >>> (SCL 1) (GND) (GPIO 27) >>=20 >> Ok, I=E2=80=99ll bite. I=E2=80=99m not understanding this. >>=20 >> I imagine that the resistor is a current limit for the gpio pin and not = the pullup. >>=20 >> Regardless of how it is wired, why use SCL1 which is pulsing? And how ca= n any of this cause a boot? >>=20 >> Is this =E2=80=9Cmagic=E2=80=9D dependent on some quirk(s) of RPi? Will = it work with others, like Rock64? >>=20 >>> 2. I created a shutdown daemon in C for FreeBSD, lurking for push butto= n >>> events on a GPIO port: https://github.com/cyclaero/shutdd >>>=20 >>> clang -g0 -O3 -fsigned-char -Wno-empty-body -Wno-parentheses shutdd.c = -lgpio -s -o /usr/local/bin/shutdd >>>=20 >>> shutdd [-p file] [-f] [-n] [-b] [-g] [-h] =20 >>> -p file the path to the pid file [default: /var/run/shutdd.pid] =20 >>> -f foreground mode, don't fork off as a daemon. =20 >>> -n no console, don't fork off as a daemon. =20 >>> -b GPIO bank id [default: 0]. =20 >>> -g GPIO line id [default: 27]. =20 >>> -h shows these usage instructions. =20 >=20 > The power management of the RPis is quite non-sophisticated, and pin 5 (G= PIO 3) of the Pis (3 or 4) happen to be the start-up-only pin when pulled d= own to ground. Now, the SCL line of the default I2C bus 1 is also routed to= pin 5, and that cannot be changed. In case we don't need I2C1 otherwise, t= hen we are done with connecting a simple momentary push button without resi= stor, and we would start shutdd with the flag -g 3. In this case pushing th= e button would start up the Pi when it is down, and it would stop the Pi by= the way of the daemon when it is up. Only shutdd configures the given GPIO= pin for exactly this purpose, and therefore I2C1 could not be used anymore= . >=20 > In the Linux world it is common sense to simply assume, that you can't ha= ve your cake and eat it, and either I2C1 is either abandoned or double-swit= ches or even more complex button assemblies with a n-channel analog multipl= exer like the CMOS4053 are used. >=20 > The 100 =CE=A9 resistor together with the auxiliary GPIO line lets us do = this in a more simple way. Pin 5 is internally pulled-up, pin 13 is interna= lly pulled down. Now pushing the button would do a fractional pull-down of = pin 3 and a fractional pull up of pin 13. The fraction is determined by the= values of the internal pull up/down resisters compared to the 100 =CE=A9 r= esistor. The point is, that shutdd does not depend on accurate logic levels= are reached, but instead reacts on rising and/or falling edges on the conf= igured GPIO's. >=20 > Now by experiment, for my RPi 4B, the 100 =CE=A9 resistor is sufficiently= large for the pulled up fraction of the level on GPIO 27 (pin 13) produces= edges which can be recognized and yet it is sufficiently low, so that star= ting up the RPi by pulling down GPIO 3 (=3D SCL 1, pin 5) does work as well= . For example a resistor of 1 k=CE=A9 (and above) does not work for startin= g up, while shutting down does work, and without the 100 =CE=A9 resistor, s= tarting up does work but shutting down does not. >=20 > I do know nothing about the Rock64, except that it exists. In case the po= wer management is comparable to the one of RPis, this might work as well. I= n case it is comparable to the sophisticated one of the BeagleBone Black, a= ll this is not needed, you even don't need the shutdown daemon shutdd for t= hat. In case Rock64's power management is completely different, then you wo= uld start with reading the specs. >=20 > As long as nobody pushes the button, SCL 1 and with it I2C1 does working = normally, and once somebody pushes the button, it is not that important any= more, since the RPi goes down anyway. >=20 > BTW, right now I am working on implementing a double-push facility into s= hutdd. This would then restart the RPi instead of shutting it down. Clever solution. Thanks for the explanation. I should have looked before I typed. The Rock64 has a button. Your solution= is likely very specific to the Rpi chip. --Apple-Mail-A247728D-319B-4FEE-B8DD-9328EB68D6BC Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable <html><head><meta http-equiv=3D"content-type" content=3D"text/html; charset= =3Dutf-8"></head><body dir=3D"auto"><div dir=3D"ltr"></div><div dir=3D"ltr"= >On Jul 13, 2022, at 7:36 PM, Dr. Rolf Jansen - freebsd-rj at cyclaero.com = <nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co> w= rote:</div><div dir=3D"ltr"><blockquote type=3D"cite"><br></blockquote></di= v><blockquote type=3D"cite"><div dir=3D"ltr">=EF=BB=BF<br class=3D""><br cl= ass=3D""><blockquote type=3D"cite" class=3D"">Am 13.07.2022 um 20:19 schrie= b Jedi Tek'Unum <<a href=3D"mailto:freebsd-arm-list-2022-fea3@qoruscant.= com" class=3D"">freebsd-arm-list-2022-fea3@qoruscant.com</a>>:<br class= =3D""><br class=3D""><blockquote type=3D"cite" class=3D"">On Jul 12, 2022, = at 8:17 PM, Dr. Rolf Jansen - freebsd-rj at <a href=3D"http://cyclaero.com"= class=3D"">cyclaero.com</a> <<a href=3D"mailto:nxtzmchnyjrirskcrisaafak= xcekosgmhdcricnnjyxomsvwpn@simplelogin.co" class=3D"">nxtzmchnyjrirskcrisaa= fakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co</a>> wrote:<br class=3D""><= br class=3D"">=EF=BB=BFOne week ago I started with exploring the Raspberry = Pi 4 B, which might be a substitute for the aging BeagleBone Blacks for my = future projects.<br class=3D""><br class=3D"">I very much like the built-in= power button facility of the BBB, and unfortunately the RPi 4 has nothing = comparable - the one button to rule it all.<br class=3D""><br class=3D"">I = read a lot of howtos and blog posts (mostly for Linux) and nothing was real= ly worth to give it even a try, compared to live without the button. Well, = this is not becoming an elaborated question, but here I am going to el= aborate my solution for FreeBSD.<br class=3D""><br class=3D"">1. I Prepared= a momentary push button for connecting it to the RPi:<br class=3D""> = ___ <br class=3D""> &= nbsp; | /<br class=3D""> &nb= sp;|/<br class=3D""> /<br class=3D"= "> /<br class=3D""> &= nbsp;+-o o--------+<br class=3D""> = | | |<br class= =3D""> | [R] 100 =CE=A9 |<br= class=3D""> | |  = ; |<br class=3D""> o &= nbsp; o o<br class=3D""> &nbs= p; Pin 5 Pin 6 Pin 13<br class=3D""> = (SCL 1) (GND) (GPIO 27)<br class=3D""></blockquote><br= class=3D"">Ok, I=E2=80=99ll bite. I=E2=80=99m not understanding this.<br c= lass=3D""><br class=3D"">I imagine that the resistor is a current limit for= the gpio pin and not the pullup.<br class=3D""><br class=3D"">Regardless o= f how it is wired, why use SCL1 which is pulsing? And how can any of this c= ause a boot?<br class=3D""><br class=3D"">Is this =E2=80=9Cmagic=E2=80=9D d= ependent on some quirk(s) of RPi? Will it work with others, like Rock64?<br= class=3D""><br class=3D""><blockquote type=3D"cite" class=3D"">2. I create= d a shutdown daemon in C for FreeBSD, lurking for push button<br class=3D""= > events on a GPIO port: <a href=3D"https://github.com/cyclaero/shutdd= " class=3D"">https://github.com/cyclaero/shutdd</a><br class=3D""><br class= =3D""> clang -g0 -O3 -fsigned-char -Wno-empty-body -Wno-parentheses sh= utdd.c -lgpio -s -o /usr/local/bin/shutdd<br class=3D""><br class=3D"">&nbs= p;shutdd [-p file] [-f] [-n] [-b] [-g] [-h] <br class=3D""> -p = file the path to the pid file [default: /var/run/shutdd.pid] &= nbsp;<br class=3D""> -f foreground mode, = don't fork off as a daemon. <br class=3D""> -n &n= bsp; no console, don't fork off as a daemon. <br class=3D"">&n= bsp; -b GPIO bank id [default: 0]. <br cl= ass=3D""> -g GPIO line id [default: 27]. = <br class=3D""> -h shows these usag= e instructions. <br class=3D""></blockquote></blockquote><div class= =3D""><br class=3D"">The power management of the RPis is quite non-sophisti= cated, and pin 5 (GPIO 3) of the Pis (3 or 4) happen to be the start-up-onl= y pin when pulled down to ground. Now, the SCL line of the default I2C= bus 1 is also routed to pin 5, and that cannot be changed. In case we don'= t need I2C1 otherwise, then we are done with connecting a simple momentary&= nbsp;push button without resistor, and we would start shutdd with the flag = -g 3. In this case pushing the button would start up the Pi when it is down= , and it would stop the Pi by the way of the daemon when it is up. Only shu= tdd configures the given GPIO pin for exactly this purpose, and therefore I= 2C1 could not be used anymore.<br class=3D""></div><div class=3D""><br clas= s=3D""></div><div class=3D"">In the Linux world it is common sense to simpl= y assume, that you can't have your cake and eat it, and either I2C1 is eith= er abandoned or double-switches or even more complex button assemblies with= a n-channel analog multiplexer like the CMOS4053 are used.</div><div class= =3D""><br class=3D""></div><div class=3D"">The 100 =CE=A9 resistor together= with the auxiliary GPIO line lets us do this in a more simple way. Pin 5 i= s internally pulled-up, pin 13 is internally pulled down. Now pushing the b= utton would do a fractional pull-down of pin 3 and a fractional pull up of = pin 13. The fraction is determined by the values of the internal pull up/do= wn resisters compared to the 100 =CE=A9 resistor. The point is, that shutdd= does not depend on accurate logic levels are reached, but instead reacts o= n rising and/or falling edges on the configured GPIO's.</div><div class=3D"= "><br class=3D""></div><div class=3D"">Now by experiment, for my RPi 4B, th= e 100 =CE=A9 resistor is sufficiently large for the pulled up fraction of t= he level on GPIO 27 (pin 13) produces edges which can be recognized and yet= it is sufficiently low, so that starting up the RPi by pulling down GPIO 3= (=3D SCL 1, pin 5) does work as well. For example a resistor of 1 k=CE=A9 = (and above) does not work for starting up, while shutting down does work, a= nd without the 100 =CE=A9 resistor, starting up does work but shutting down= does not.</div><div class=3D""><br class=3D""></div><div class=3D"">I do k= now nothing about the Rock64, except that it exists. In case the power mana= gement is comparable to the one of RPis, this might work as well. In case i= t is comparable to the sophisticated one of the BeagleBone Black, all this = is not needed, you even don't need the shutdown daemon shutdd for that. In = case Rock64's power management is completely different, then you would= start with reading the specs.</div><div class=3D""><br class=3D""></div><d= iv class=3D"">As long as nobody pushes the button, SCL 1 and with it I2C1 d= oes working normally, and once somebody pushes the button, it is not that i= mportant anymore, since the RPi goes down anyway.</div><div class=3D""><br = class=3D""></div><div class=3D"">BTW, right now I am working on implementin= g a double-push facility into shutdd. This would then restart the RPi inste= ad of shutting it down.</div></div></blockquote><br><div>Clever solution. T= hanks for the explanation.</div><div><br></div><div>I should have looked be= fore I typed. The Rock64 has a button. Your solution is likely very specifi= c to the Rpi chip.</div><div><br></div></body></html> --Apple-Mail-A247728D-319B-4FEE-B8DD-9328EB68D6BC--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?165780521135.7.10590681011079085662.51797902>