#!/bin/sh set -eu OUTPUT= while [ "$#" -gt 0 ]; do case "$1" in --output) OUTPUT=$2; shift 2 ;; *) echo "unknown argument: $1" >&2; exit 2 ;; esac done if [ "$(id -u)" -ne 0 ]; then echo "state capture must run as root" >&2 exit 1 fi if [ -z "$OUTPUT" ]; then echo "usage: capture_axp313a_state.sh --output NEW_DIR" >&2 exit 2 fi parent=$(dirname -- "$OUTPUT") mkdir -p -- "$parent" parent=$(CDPATH= cd -- "$parent" && pwd) OUTPUT=$parent/$(basename -- "$OUTPUT") case "$OUTPUT" in /|/boot|/opt|/var|/var/lib|/var/lib/matrix-screen-controller|/run|/etc) echo "unsafe state output directory: $OUTPUT" >&2 exit 1 ;; esac if [ -e "$OUTPUT" ]; then echo "state output directory must not exist: $OUTPUT" >&2 exit 1 fi install -d -m 0700 -- "$OUTPUT" uname -a > "$OUTPUT/uname.txt" cat /proc/cmdline > "$OUTPUT/cmdline.txt" (cd /boot && find . -maxdepth 1 -type f -print0 | sort -z | xargs -0 sha256sum) \ > "$OUTPUT/boot.sha256" (cd /var/lib && find matrix-screen-controller -type f -print0 | sort -z | xargs -0 sha256sum) \ > "$OUTPUT/persistent.sha256" if [ -d /sys/kernel/debug/regmap ]; then for registers in /sys/kernel/debug/regmap/*-0036/registers; do [ -f "$registers" ] || continue regmap_name=$(basename -- "$(dirname -- "$registers")") cp -- "$registers" "$OUTPUT/pmic-$regmap_name-registers.txt" done fi : > "$OUTPUT/regulators.txt" for regulator in /sys/class/regulator/regulator.*; do [ -d "$regulator" ] || continue printf '[%s]\n' "$(basename -- "$regulator")" >> "$OUTPUT/regulators.txt" for field in name microvolts state status; do if [ -r "$regulator/$field" ]; then if value=$(cat "$regulator/$field" 2>/dev/null); then printf '%s=%s\n' "$field" "$value" >> "$OUTPUT/regulators.txt" else printf '%s=\n' "$field" >> "$OUTPUT/regulators.txt" fi fi done done : > "$OUTPUT/cpufreq.txt" for policy in /sys/devices/system/cpu/cpufreq/policy*; do [ -d "$policy" ] || continue printf '[%s]\n' "$(basename -- "$policy")" >> "$OUTPUT/cpufreq.txt" for field in affected_cpus related_cpus scaling_available_frequencies \ scaling_available_governors scaling_cur_freq scaling_governor; do if [ -r "$policy/$field" ]; then if value=$(cat "$policy/$field" 2>/dev/null); then printf '%s=%s\n' "$field" "$value" >> "$OUTPUT/cpufreq.txt" else printf '%s=\n' "$field" >> "$OUTPUT/cpufreq.txt" fi fi done done if [ -r /sys/kernel/debug/devices_deferred ]; then cp -- /sys/kernel/debug/devices_deferred "$OUTPUT/devices_deferred.txt" fi : > "$OUTPUT/gpu.txt" for devfreq in /sys/class/devfreq/*; do [ -d "$devfreq" ] || continue case "$(basename -- "$devfreq")" in *gpu*|*mali*) printf '[%s]\n' "$(basename -- "$devfreq")" >> "$OUTPUT/gpu.txt" for field in available_frequencies cur_freq governor min_freq max_freq; do if [ -r "$devfreq/$field" ]; then if value=$(cat "$devfreq/$field" 2>/dev/null); then printf '%s=%s\n' "$field" "$value" >> "$OUTPUT/gpu.txt" else printf '%s=\n' "$field" >> "$OUTPUT/gpu.txt" fi fi done ;; esac done sync echo "state captured at $OUTPUT"