commit 4409955bd7814ce2d450634520155c2883c66513
parent 536f725ba8024f96701256a325b423fe21665c16
Author: Lukas F. Hartmann <lukas@mnt.mn>
Date: Mon, 29 Oct 2018 17:00:38 +0100
reformd: Daemon for Battery, Lid and Fan Control
Diffstat:
A | reformd/reformd.sh | | | 136 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 136 insertions(+), 0 deletions(-)
diff --git a/reformd/reformd.sh b/reformd/reformd.sh
@@ -0,0 +1,136 @@
+#!/bin/bash
+#
+# MNT Reform 0.3+ Daemon for Battery, Lid and Fan Control
+# Copyright 2018 MNT Media and Technology UG, Berlin
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+
+set_fan_speed () {
+ set +e; echo 0 > /sys/class/pwm/pwmchip1/export 2>/dev/null ; set -e
+ echo 10000 > /sys/class/pwm/pwmchip1/pwm0/period
+ echo "$1" > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
+ echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
+}
+
+function setup_serial {
+ # 2400 baud 8N1, raw
+ # cargoculted by exporting parameters with stty after using screen
+ stty 406:0:8bb:8a30:3:1c:7f:15:4:2:64:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 -F /dev/ttymxc1
+}
+
+function disable_echo {
+ setup_serial
+ exec 99<>/dev/ttymxc1
+ :<&99
+ printf "0e\r" >&99
+ exec 99>&-
+ set +e; timeout 2 head /dev/ttymxc1; set -e
+}
+
+function get_battery_state {
+ setup_serial
+ exec 99<>/dev/ttymxc1
+ :<&99
+ printf "p\r" >&99
+ IFS=$':\t\r'
+ read -r -t 1 msg bat_capacity bat_volts bat_amps <&99
+ exec 99>&-
+}
+
+function get_soc_temperature {
+ read soc_temperature < /sys/class/thermal/thermal_zone0/temp
+}
+
+function get_lid_state {
+ setup_serial
+ exec 99<>/dev/ttymxc1
+ :<&99
+ printf "l\r" >&99
+ IFS=$':\t\r'
+ read -r -t 1 msg lid_state <&99
+ lid_state=$(echo "$lid_state" | tr -dc '0-9')
+
+ exec 99>&-
+}
+
+function reset_bat_capacity {
+ setup_serial
+ exec 99<>/dev/ttymxc1
+ :<&99
+ printf "0600b\r" >&99
+ exec 99>&-
+}
+
+function system_suspend {
+ setup_serial
+
+ # wake up on serial port 2 traffic
+ echo enabled > /sys/devices/soc0/soc/2100000.aips-bus/21e8000.serial/tty/ttymxc1/power/wakeup
+
+ # drain serial port
+ set +e; timeout 1 head /dev/ttymxc1; set -e
+
+ # zzZzzZ
+ systemctl suspend
+}
+
+function regulate_fan {
+ get_soc_temperature
+
+ if [ "$soc_temperature" -lt 65000 ]
+ then
+ set_fan_speed 5000
+ fi
+
+ if [ "$soc_temperature" -gt 70000 ]
+ then
+ set_fan_speed 10000
+ fi
+}
+
+voltage_alert=0
+function regulate_voltage {
+ # TODO low voltage/capacity alert
+ echo "not yet implemented"
+}
+
+function main {
+ # 1. if the system is getting too hot, we want to cool it with the fan
+ regulate_fan
+
+ # 2. log all stats, especially battery stats, to a TSV file
+ # so it can be graphed and we can estimate remaining running time
+ # TODO actually append to log and rotate it out
+ # TODO interval?
+ timestamp=$(date +%Y-%m-%dT%H:%M:%S)
+ get_soc_temperature
+ get_battery_state
+ get_lid_state
+
+ if [ "$bat_amps" == "0.00A" ]
+ then
+ reset_bat_capacity
+ fi
+
+ printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$timestamp" "$soc_temperature" "$bat_capacity" "$bat_volts" "$bat_amps" "$voltage_alert" "$lid_state"
+ printf '%s,%s,%s,%s,%s,%s,%s\n' "$timestamp" "$soc_temperature" "$bat_capacity" "$bat_volts" "$bat_amps" "$voltage_alert" "$lid_state" > /var/log/reformd
+
+ # 3. if the lid is closed, we want to suspend the system
+ # important: this works only if the kernel option no_console_suspend=1 is set!
+ # also, requires kernel patch when using PCIe cards: https://github.com/sakaki-/novena-kernel-patches/blob/master/0017-pci-fix-suspend-on-i.MX6.patch
+ # (workaround for erratum "PCIe does not support L2 Power Down")
+ if [ "$lid_state" ] && [ "$lid_state" -eq "1" ]
+ then
+ system_suspend
+ exit
+ fi
+}
+
+brightnessctl s 5
+disable_echo
+
+while true; do
+ main
+ sleep 1
+done
+