Date: Thu, 14 Jul 2022 11:45:24 -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: <3F174C46-A377-4D90-92CA-55BF242A6017@cyclaero.com> In-Reply-To: <165780521135.7.10590681011079085662.51797902@qoruscant.com> References: <DECE250D-E0D4-4064-9BF9-AA39754CB2C0@cyclaero.com> <165780521135.7.10590681011079085662.51797902@qoruscant.com>
next in thread | previous in thread | raw e-mail | index | archive | help
> Am 14.07.2022 um 10:26 schrieb Jedi Tek'Unum = <freebsd-arm-list-2022-fea3@qoruscant.com>: >=20 > On Jul 13, 2022, at 7:36 PM, Dr. Rolf Jansen - freebsd-rj at = cyclaero.com = <nxtzmchnyjrirskcrisaafakxcekosgmhdcricnnjyxomsvwpn@simplelogin.co> = wrote: >> =EF=BB=BF >>> 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 >>=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. >>=20 >> 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. >>=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 = 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. >>=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 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. >>=20 >> 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. >>=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 anymore, since the RPi goes down anyway. >>=20 >> 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. >=20 > Clever solution. Thanks for the explanation. >=20 > I should have looked before I typed. The Rock64 has a button. Your = solution is likely very specific to the Rpi chip. In the course of the work on the double-push feature for shutdd, which = causes the RPi to restart instead of to shutdown, I figured that heavy = bouncing of the button may affect the interval between multiple pushes. = I could reduce the bouncing of my button significantly by adding a 1 =C2=B5= F tantalum capacitor in parallel to the 100 =CE=A9 resistor. Depending = on the mechanics of the button this is not absolutely necessary, though. I finished the work on shutdd by now and the updated version can be find = on GitHub: https://github.com/cyclaero/shutdd Perhaps in the future I will add triple and quadruple push features, for = example to cause the RPi to go into Single User Mode, and/or to start a = user defined executable. For now I need to do other things.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3F174C46-A377-4D90-92CA-55BF242A6017>