105 lines
3.5 KiB
Bash
105 lines
3.5 KiB
Bash
#!/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=<unavailable>\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=<unavailable>\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=<unavailable>\n' "$field" >> "$OUTPUT/gpu.txt"
|
|
fi
|
|
fi
|
|
done
|
|
;;
|
|
esac
|
|
done
|
|
|
|
sync
|
|
echo "state captured at $OUTPUT"
|