146 lines
3.9 KiB
Bash
Executable File
146 lines
3.9 KiB
Bash
Executable File
#!/bin/sh
|
|
# author: jjm2473
|
|
|
|
SAVE=/tmp/run/fanTP
|
|
ACTION=${1}
|
|
shift
|
|
|
|
# print: zone trip_point current_target_temp [max_target_temp]
|
|
# ex. thermal_zone0 0 50000 60000
|
|
function getFanTP() {
|
|
local zone cdev trip temp mintemp mintrip minzone maxtemp
|
|
[[ -d /sys/class/thermal ]] || return 1
|
|
cd /sys/class/thermal
|
|
for zone in thermal_zone* ; do
|
|
cd "$zone"
|
|
for cdev in `ls | grep 'cdev[0-9]\+$'`; do
|
|
[[ -d "$cdev" ]] || continue
|
|
grep -Fiq fan "$cdev/type" || continue
|
|
trip=`cat ${cdev}_trip_point`
|
|
grep -Fwq active trip_point_${trip}_type || continue
|
|
[[ "`stat -c '%#a' trip_point_${trip}_temp || echo 0444`" = "0644" ]] || continue
|
|
temp=`cat trip_point_${trip}_temp`
|
|
if [[ -z "$mintemp" ]] || [[ "$temp" -lt "$mintemp" ]]; then
|
|
if [[ -n "$mintemp" ]]; then
|
|
if [[ "$zone" = "$minzone" ]]; then
|
|
maxtemp=$mintemp
|
|
else
|
|
maxtemp=
|
|
fi
|
|
fi
|
|
mintemp=$temp
|
|
mintrip=$trip
|
|
minzone=$zone
|
|
elif [[ -z "$maxtemp" ]] || [[ "$temp" -lt "$maxtemp" ]]; then
|
|
maxtemp=$temp
|
|
fi
|
|
done
|
|
cd /sys/class/thermal
|
|
done
|
|
if [[ -n "$mintemp" ]]; then
|
|
echo "$minzone" "$mintrip" "$mintemp" $maxtemp
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function getFanTP_C() {
|
|
if [[ -f "$SAVE" ]]; then
|
|
if [[ -s "$SAVE" ]]; then
|
|
cat "$SAVE"
|
|
return 0
|
|
else
|
|
return 1
|
|
fi
|
|
fi
|
|
( getFanTP ) | tee "$SAVE"
|
|
[[ -s "$SAVE" ]]
|
|
}
|
|
|
|
function getFanTP_U() {
|
|
set $(getFanTP_C)
|
|
[[ -n "$1" && -n "$2" ]] || return 1
|
|
local onTemp=`cat "/sys/class/thermal/${1}/trip_point_${2}_temp"`
|
|
echo "$1" "$2" "$onTemp" $4
|
|
return 0
|
|
}
|
|
|
|
function initFanTP() {
|
|
[[ -f "$SAVE" ]] || ( getFanTP >"$SAVE" )
|
|
}
|
|
|
|
# param: ON_TEMP [OFF_TEMP]
|
|
# OFF_TEMP = ON_TEMP - 5000 if not set
|
|
# ex. 60000 55000
|
|
function setFanTP() {
|
|
local ON_TEMP=$1
|
|
local OFF_TEMP=$2
|
|
[[ -n "$ON_TEMP" ]] || {
|
|
echo "ON_TEMP must be present" >&2
|
|
return 1
|
|
}
|
|
if [[ -z "$OFF_TEMP" ]]; then
|
|
[[ "$ON_TEMP" -gt 5000 ]] || {
|
|
echo "ON_TEMP must greater than 5000 when OFF_TEMP not present" >&2
|
|
return 1
|
|
}
|
|
OFF_TEMP=$(( $ON_TEMP - 5000 ))
|
|
fi
|
|
[[ "$ON_TEMP" -gt "$OFF_TEMP" ]] || {
|
|
echo "ON_TEMP must greater than OFF_TEMP" >&2
|
|
return 1
|
|
}
|
|
local HYST=$(( $ON_TEMP - $OFF_TEMP ))
|
|
|
|
set $(getFanTP_C)
|
|
[[ -n "$1" && -n "$2" ]] || return 1
|
|
[[ -d "/sys/class/thermal/${1}" ]] || return 1
|
|
|
|
[[ -n "$4" ]] && [[ "$ON_TEMP" -ge "$4" ]] && {
|
|
ON_TEMP=$(( $4 - 5000 ))
|
|
echo "WARN: ON_TEMP greater than next TP $4, fixed to $ON_TEMP" >&2
|
|
}
|
|
echo "$ON_TEMP" > "/sys/class/thermal/${1}/trip_point_${2}_temp"
|
|
echo "$HYST" > "/sys/class/thermal/${1}/trip_point_${2}_hyst"
|
|
}
|
|
|
|
# print: current thermal sensor value and fan on temp
|
|
function getTemp() {
|
|
set $(getFanTP_C)
|
|
[[ -n "$1" && -n "$2" ]] || return 1
|
|
[[ -f "/sys/class/thermal/$1/temp" ]] || return 1
|
|
local temp=`cat "/sys/class/thermal/$1/temp"`
|
|
local tpt=`cat "/sys/class/thermal/$1/trip_point_${2}_temp"`
|
|
echo "$temp $tpt"
|
|
}
|
|
|
|
usage() {
|
|
echo "usage: $0 sub-command"
|
|
echo "where sub-command is one of:"
|
|
echo " get Get Fan setting"
|
|
echo " set ON_TEMP [OFF_TEMP] Set Fan setting"
|
|
echo " temp Get current thermal temp and Fan on temp"
|
|
echo " init init, internal used"
|
|
}
|
|
|
|
case ${ACTION} in
|
|
"get")
|
|
getFanTP_U
|
|
;;
|
|
"set")
|
|
setFanTP "$@"
|
|
;;
|
|
"temp")
|
|
getTemp
|
|
;;
|
|
"init")
|
|
initFanTP
|
|
;;
|
|
*)
|
|
usage
|
|
exit 1
|
|
;;
|
|
esac
|
|
|