Skip site navigation (1)Skip section navigation (2)
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 =
&lt;nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co&gt; 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 &lt;<a href=3D"mailto:freebsd-arm-list-2022-fea3@qoruscant.=
com" class=3D"">freebsd-arm-list-2022-fea3@qoruscant.com</a>&gt;:<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> &lt;<a href=3D"mailto:nxtzmchnyjrirskcrisaafak=
xcekosgmhdcricnnjyxomsvwpn@simplelogin.co" class=3D"">nxtzmchnyjrirskcrisaa=
fakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co</a>&gt; 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&nbsp;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"">&nbsp;=
 &nbsp; &nbsp; &nbsp; &nbsp; ___&nbsp;<br class=3D"">&nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp; &nbsp;| /<br class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nb=
sp;|/<br class=3D"">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/<br class=3D"=
">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; /<br class=3D"">&nbsp; &nbsp; &nbsp; &=
nbsp;+-o &nbsp; &nbsp; &nbsp;o--------+<br class=3D"">&nbsp; &nbsp; &nbsp; =
&nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;|<br class=
=3D"">&nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; [R] 100 =CE=A9 |<br=
 class=3D"">&nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp=
; &nbsp; &nbsp; &nbsp;|<br class=3D"">&nbsp; &nbsp; &nbsp; &nbsp;o &nbsp; &=
nbsp; &nbsp; &nbsp;o &nbsp; &nbsp; &nbsp; &nbsp;o<br class=3D"">&nbsp; &nbs=
p; &nbsp;Pin 5 &nbsp; &nbsp;Pin 6 &nbsp; &nbsp;Pin 13<br class=3D"">&nbsp; =
&nbsp; (SCL 1) &nbsp; (GND) &nbsp; (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""=
>&nbsp;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"">&nbsp;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] &nbsp;<br class=3D"">&nbsp; -p =
file &nbsp; &nbsp;the path to the pid file [default: /var/run/shutdd.pid] &=
nbsp;<br class=3D"">&nbsp; -f &nbsp; &nbsp; &nbsp; &nbsp; foreground mode, =
don't fork off as a daemon. &nbsp;<br class=3D"">&nbsp; -n &nbsp; &nbsp; &n=
bsp; &nbsp; no console, don't fork off as a daemon. &nbsp;<br class=3D"">&n=
bsp; -b &nbsp; &nbsp; &nbsp; &nbsp; GPIO bank id [default: 0]. &nbsp;<br cl=
ass=3D"">&nbsp; -g &nbsp; &nbsp; &nbsp; &nbsp; GPIO line id [default: 27]. =
&nbsp;<br class=3D"">&nbsp; -h &nbsp; &nbsp; &nbsp; &nbsp; shows these usag=
e instructions. &nbsp;<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.&nbsp;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&nbsp;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>