Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 13 Jul 2022 21:36:03 -0300
From:      "Dr. Rolf Jansen" <freebsd-rj@cyclaero.com>
To:        freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: Startup-/Shutdown Button for the Raspberry Pi 4
Message-ID:  <DECE250D-E0D4-4064-9BF9-AA39754CB2C0@cyclaero.com>
In-Reply-To: <165775440275.8.4265153478134935826.51718197@qoruscant.com>
References:  <E1F8EA20-D709-45FD-941F-DB28921601D1@cyclaero.com> <165775440275.8.4265153478134935826.51718197@qoruscant.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--Apple-Mail=_936E5512-84CF-4CAE-BADE-F9D8BE751C0F
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
	charset=utf-8



> Am 13.07.2022 um 20:19 schrieb Jedi Tek'Unum =
<freebsd-arm-list-2022-fea3@qoruscant.com>:
>=20
>> On Jul 12, 2022, at 8:17 PM, Dr. Rolf Jansen - freebsd-rj at =
cyclaero.com =
<nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co> =
wrote:
>>=20
>> =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.
>>=20
>> 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.
>>=20
>> I read a lot of howtos and blog posts (mostly for Linux) and nothing =
was 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 elaborate 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 =
can 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 =
button
>>  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

The power management of the RPis is quite non-sophisticated, and pin 5 =
(GPIO 3) of the Pis (3 or 4) happen to be the start-up-only 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 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 =
shutdd configures the given GPIO pin for exactly this purpose, and =
therefore I2C1 could not be used anymore.

In the Linux world it is common sense to simply assume, that you can't =
have your cake and eat it, and either I2C1 is either abandoned or =
double-switches or even more complex button assemblies with a n-channel =
analog multiplexer like the CMOS4053 are used.

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 =
internally 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 resistor. 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 configured GPIO's.

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 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, and without the 100 =CE=A9 resistor, starting up does work but =
shutting down does not.

I do know nothing about the Rock64, except that it exists. In case the =
power management is comparable to the one of RPis, this might work as =
well. In case it 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.

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 =
anymore, since the RPi goes down anyway.

BTW, right now I am working on implementing a double-push facility into =
shutdd. This would then restart the RPi instead of shutting it down.


--Apple-Mail=_936E5512-84CF-4CAE-BADE-F9D8BE751C0F
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html;
	charset=utf-8

<html><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: space; =
line-break: after-white-space;"><br class=3D""><br class=3D""><blockquote =
type=3D"cite" class=3D"">Am 13.07.2022 um 20:19 schrieb 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:nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelo=
gin.co" =
class=3D"">nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@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 really 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 elaborate =
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; =
&nbsp;|/<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; &nbsp; &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 =
class=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 of how it is wired, why use SCL1 which is pulsing? =
And how can any of this cause a boot?<br class=3D""><br class=3D"">Is =
this =E2=80=9Cmagic=E2=80=9D dependent 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 created 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 shutdd.c -lgpio -s -o /usr/local/bin/shutdd<br =
class=3D""><br class=3D"">&nbsp;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; &nbsp; &nbsp; no console, =
don't fork off as a daemon. &nbsp;<br class=3D"">&nbsp; -b &nbsp; &nbsp; =
&nbsp; &nbsp; GPIO bank id [default: 0]. &nbsp;<br class=3D"">&nbsp; -g =
&nbsp; &nbsp; &nbsp; &nbsp; GPIO line id [default: 27]. &nbsp;<br =
class=3D"">&nbsp; -h &nbsp; &nbsp; &nbsp; &nbsp; shows these usage =
instructions. &nbsp;<br class=3D""></blockquote></blockquote><div =
class=3D""><br class=3D"">The power management of the RPis is quite =
non-sophisticated, and pin 5 (GPIO 3) of the Pis (3 or 4) happen to be =
the start-up-only 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 shutdd configures the given GPIO =
pin for exactly this purpose, and therefore I2C1 could not be used =
anymore.<br class=3D""></div><div class=3D""><br class=3D""></div><div =
class=3D"">In the Linux world it is common sense to simply assume, that =
you can't have your cake and eat it, and either I2C1 is either 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 is internally pulled-up, pin 13 is internally 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 =
resistor. 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 configured GPIO's.</div><div class=3D""><br class=3D""></div><div =
class=3D"">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 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, and 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 know nothing about the Rock64, except that it exists. In =
case the power management is comparable to the one of RPis, this might =
work as well. In case it 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><div class=3D"">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 =
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 =
implementing a double-push facility into shutdd. This would then restart =
the RPi instead of shutting it down.</div><div class=3D""><br =
class=3D""></div></body></html>=

--Apple-Mail=_936E5512-84CF-4CAE-BADE-F9D8BE751C0F--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?DECE250D-E0D4-4064-9BF9-AA39754CB2C0>