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 = <<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:nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelo= gin.co" = class=3D"">nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@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 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.<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""> = | /<br class=3D""> = |/<br class=3D""> /<br = class=3D""> /<br class=3D""> = +-o o--------+<br = class=3D""> | | = |<br class=3D""> | = [R] 100 =CE=A9 |<br class=3D""> = | | |<br = class=3D""> o o = o<br class=3D""> 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 = 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""> 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 shutdd.c -lgpio -s -o /usr/local/bin/shutdd<br = class=3D""><br class=3D""> shutdd [-p file] [-f] [-n] [-b] [-g] = [-h] <br class=3D""> -p file the path to the = pid file [default: /var/run/shutdd.pid] <br class=3D""> -f = foreground mode, don't fork off as a daemon. = <br class=3D""> -n no console, = don't fork off as a daemon. <br class=3D""> -b = GPIO bank id [default: 0]. <br class=3D""> -g = GPIO line id [default: 27]. <br = class=3D""> -h shows these usage = instructions. <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. 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.<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 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>