From nobody Thu Jul 14 14:45:24 2022 X-Original-To: freebsd-arm@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4LkHNF599fz2pJ05 for ; Thu, 14 Jul 2022 14:45:33 +0000 (UTC) (envelope-from freebsd-rj@cyclaero.com) Received: from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de [81.169.146.221]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "*.smtp.rzone.de", Issuer "TeleSec ServerPass Class 2 CA" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LkHNB65kXz468p for ; Thu, 14 Jul 2022 14:45:30 +0000 (UTC) (envelope-from freebsd-rj@cyclaero.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1657809927; s=strato-dkim-0002; d=cyclaero.com; h=Message-Id:In-Reply-To:To:References:Date:Subject:From:Cc:Date:From: Subject:Sender; bh=psC6PSOGQbIBFAYksfciXl2AQJUZxF/w6VygRsFU5e4=; b=eNph6rQ0BaGIP6wH3obQ2reOFrVQeFbd6OkYnbb03FP58VLJqKbyq4/1RnqCzJm09G +biVJQzgVpNfMyDYmwo+N6OrisxA4uOk3o7CRR53CXAi9zccEhGx2+YIQA4PRgLWScw4 mID0DGoeBdTI5Ocq4oJCg+t4UjiBE4kVqHjsIX82B8+lkUpqSqW8AMTxWgv9Vba6ksFD ANUmiMQNID+CF1Cp4MpcZJPSiaANzNJTCz5rXt9I2IWjy1HS10oi0UKGf0Wk23JUb8ir fQJzm7AhhSZULN5eCjOna8vegNLNdW7Mp1vFKH2/hL9se9RvqRNwtAv0pj0V6vn57P7C 5nxQ== X-RZG-AUTH: ":O2kGeEG7b/pS1F2rRHW2isrKl4DV03XBEi+I6ZuztdvN9wS3wFGySS4Lw+ldTBio08NTPnK5bNCibgxfnBg=" X-RZG-CLASS-ID: mo00 Received: from mail.obsigna.com by smtp.strato.de (RZmta 47.47.0 AUTH) with ESMTPSA id 5bc9a3y6EEjR7kg (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits)) (Client did not present a certificate) for ; Thu, 14 Jul 2022 16:45:27 +0200 (CEST) Received: from rolf-mini.obsigna.com (unknown [177.95.254.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.obsigna.com (Postfix) with ESMTPSA id EE19562EB5 for ; Thu, 14 Jul 2022 16:45:26 +0200 (CEST) From: "Dr. Rolf Jansen" Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable List-Id: Porting FreeBSD to ARM processors List-Archive: https://lists.freebsd.org/archives/freebsd-arm List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-freebsd-arm@freebsd.org Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.15\)) Subject: Re: Startup-/Shutdown Button for the Raspberry Pi 4 Date: Thu, 14 Jul 2022 11:45:24 -0300 References: <165780521135.7.10590681011079085662.51797902@qoruscant.com> To: freebsd-arm In-Reply-To: <165780521135.7.10590681011079085662.51797902@qoruscant.com> Message-Id: <3F174C46-A377-4D90-92CA-55BF242A6017@cyclaero.com> X-Mailer: Apple Mail (2.3445.104.15) X-Rspamd-Queue-Id: 4LkHNB65kXz468p X-Spamd-Bar: - Authentication-Results: mx1.freebsd.org; dkim=pass header.d=cyclaero.com header.s=strato-dkim-0002 header.b=eNph6rQ0; dmarc=none; spf=pass (mx1.freebsd.org: domain of freebsd-rj@cyclaero.com designates 81.169.146.221 as permitted sender) smtp.mailfrom=freebsd-rj@cyclaero.com X-Spamd-Result: default: False [-2.00 / 15.00]; FROM_NAME_HAS_TITLE(1.00)[dr]; NEURAL_HAM_LONG(-1.00)[-1.000]; NEURAL_HAM_SHORT(-1.00)[-0.999]; NEURAL_HAM_MEDIUM(-1.00)[-0.999]; MV_CASE(0.50)[]; R_SPF_ALLOW(-0.20)[+ip4:81.169.146.128/25]; R_DKIM_ALLOW(-0.20)[cyclaero.com:s=strato-dkim-0002]; MIME_GOOD(-0.10)[text/plain]; TO_MATCH_ENVRCPT_ALL(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[freebsd-arm@freebsd.org]; RCPT_COUNT_ONE(0.00)[1]; BLOCKLISTDE_FAIL(0.00)[81.169.146.221:server fail,177.95.254.116:server fail]; DMARC_NA(0.00)[cyclaero.com]; RCVD_IN_DNSWL_NONE(0.00)[81.169.146.221:from]; FROM_HAS_DN(0.00)[]; RCVD_VIA_SMTP_AUTH(0.00)[]; ARC_NA(0.00)[]; DKIM_TRACE(0.00)[cyclaero.com:+]; TO_DN_ALL(0.00)[]; RCVD_COUNT_THREE(0.00)[3]; MLMMJ_DEST(0.00)[freebsd-arm]; FROM_EQ_ENVFROM(0.00)[]; ASN(0.00)[asn:6724, ipnet:81.169.144.0/22, country:DE]; MIME_TRACE(0.00)[0:+]; MID_RHS_MATCH_FROM(0.00)[]; RCVD_TLS_ALL(0.00)[] X-ThisMailContainsUnwantedMimeParts: N > Am 14.07.2022 um 10:26 schrieb Jedi Tek'Unum = : >=20 > On Jul 13, 2022, at 7:36 PM, Dr. Rolf Jansen - freebsd-rj at = cyclaero.com = = wrote: >> =EF=BB=BF >>> Am 13.07.2022 um 20:19 schrieb Jedi Tek'Unum = : >>>=20 >>>> On Jul 12, 2022, at 8:17 PM, Dr. Rolf Jansen - freebsd-rj at = cyclaero.com = = 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.