recipes-bsp: Add support for gpio-shutdown

- Feature is enabled with ENABLE_GPIO_SHUTDOWN variable
- Include the gpio-shutdown overlay
- If using SysV init include the additional keymap and inittab entries
  to bind the KEY_POWER event
- Systemd init does not require any additional bindings

Signed-off-by: Otto Esko <otto.esko@gmail.com>
This commit is contained in:
Otto Esko 2021-12-04 18:51:54 +02:00 committed by Andrei Gherzan
parent 58cc662539
commit bf2d2eae4e
5 changed files with 66 additions and 0 deletions

View File

@ -23,6 +23,7 @@ RPI_KERNEL_DEVICETREE_OVERLAYS ?= " \
overlays/gpio-ir-tx.dtbo \
overlays/gpio-key.dtbo \
overlays/gpio-poweroff.dtbo \
overlays/gpio-shutdown.dtbo \
overlays/hifiberry-amp.dtbo \
overlays/hifiberry-dac.dtbo \
overlays/hifiberry-dacplus.dtbo \
@ -97,6 +98,7 @@ MACHINE_FEATURES_BACKFILL_CONSIDERED = "rtc"
MACHINE_EXTRA_RRECOMMENDS += "kernel-modules udev-rules-rpi"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "${@oe.utils.conditional('ENABLE_I2C', '1', 'kernel-module-i2c-dev kernel-module-i2c-bcm2708', '', d)}"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "${@oe.utils.conditional('ENABLE_IR', '1', 'kernel-module-gpio-ir kernel-module-gpio-ir-tx', '', d)}"
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "${@oe.utils.conditional('ENABLE_GPIO_SHUTDOWN', '1', 'gpio-shutdown kernel-module-gpio-keys', '', d)}"
SERIAL_CONSOLES_CHECK ??= "${SERIAL_CONSOLES}"

View File

@ -34,6 +34,8 @@ ENABLE_UART ??= ""
WM8960="${@bb.utils.contains("MACHINE_FEATURES", "wm8960", "1", "0", d)}"
GPIO_SHUTDOWN_PIN ??= ""
inherit deploy nopackages
do_deploy() {
@ -253,6 +255,22 @@ do_deploy() {
echo "dtoverlay=mcp2515-can0,oscillator=${CAN_OSCILLATOR},interrupt=25" >>$CONFIG
fi
if [ "${ENABLE_GPIO_SHUTDOWN}" = "1" ]; then
if ([ "${ENABLE_I2C}" = "1" ] || [ "${PITFT}" = "1" ]) && [ -z "${GPIO_SHUTDOWN_PIN}" ]; then
# By default GPIO shutdown uses the same pin as the (master) I2C SCL.
# If I2C is configured and an alternative pin is not configured for
# gpio-shutdown, there is a configuration conflict.
bbfatal "I2C and gpio-shutdown are both enabled and using the same pins!"
fi
echo "# Enable gpio-shutdown" >> $CONFIG
if [ -z "${GPIO_SHUTDOWN_PIN}" ]; then
echo "dtoverlay=gpio-shutdown" >> $CONFIG
else
echo "dtoverlay=gpio-shutdown,gpio_pin=${GPIO_SHUTDOWN_PIN}" >> $CONFIG
fi
fi
# Append extra config if the user has provided any
printf "${RPI_EXTRA_CONFIG}\n" >> $CONFIG

View File

@ -0,0 +1,2 @@
# Action on special keypress (Key Power)
kb::kbrequest:/sbin/shutdown -t1 -a -h -P now

View File

@ -0,0 +1,13 @@
#!/bin/sh
##
# Bind the gpio-shutdown keycode as Keyboard signal and load it to the
# keymap during startup.
##
case "$1" in
start)
# Inject the gpio keycode to keymap
echo "keycode 116 = KeyboardSignal" | loadkeys
;;
*)
;;
esac

View File

@ -0,0 +1,31 @@
SUMMARY = "GPIO shutdown bindings for SysV init"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-2.0-only;md5=801f80980d171dd6425610833a22dbe6"
SRC_URI = "file://bind_gpio_shutdown.tab \
file://gpio-shutdown-keymap.sh \
"
inherit update-rc.d
INITSCRIPT_NAME = "gpio-shutdown-keymap.sh"
# Run only once during startup
INITSCRIPT_PARAMS = "start 99 S ."
do_install() {
# The files are only needed if using SysV init.
if ${@bb.utils.contains('DISTRO_FEATURES', 'sysvinit', 'true', 'false', d)}; then
install -d ${D}${sysconfdir} \
${D}${sysconfdir}/inittab.d \
${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/gpio-shutdown-keymap.sh ${D}${sysconfdir}/init.d/
install -m 0755 ${WORKDIR}/bind_gpio_shutdown.tab ${D}${sysconfdir}/inittab.d/
elif ${@bb.utils.contains('DISTRO_FEATURES', 'systemd', 'true', 'false', d)}; then
# Systemd init does not require any configuration.
# Note: cannot have an empty branch, hence the redundant dir install.
install -d ${D}${sysconfdir}
else
bbwarn "Not using sysvinit or systemd. The gpio-shutdown may require additional configuration."
fi
}