pwmconfig: write fan dependency to config file

fancontrol: monitor fan speed;
		trap signal and restore fans on trap;
		check read/write results and abort if fail;
		support 2.6 kernels;
		remove DEBUG=1


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2188 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Mark D. Studebaker committed 2003-12-20 22:35:23 +00:00
1 parent ba972d7b0a
commit 8de677db34
2 files changed
+130 -12

No files matched your search

+118 -10
View File
@@ -2,7 +2,7 @@
#
# Simple script implementing a temperature dependent fan speed control
#
# Version 0.61
# Version 0.62
#
# Usage: fancontrol [CONFIGFILE]
#
@@ -39,7 +39,8 @@
#
#
DEBUG=1
#DEBUG=1
MAX=255
echo $$ > /var/run/fancontrol.pid
@@ -48,6 +49,7 @@ function LoadConfig {
# grep configuration from file
INTERVAL=`egrep '^INTERVAL=.*$' $1 | sed -e 's/INTERVAL=//g'`
FCTEMPS=`egrep '^FCTEMPS=.*$' $1 | sed -e 's/FCTEMPS=//g'`
FCFANS=`egrep '^FCFANS=.*$' $1 | sed -e 's/FCFANS=//g'`
MINTEMP=`egrep '^MINTEMP=.*$' $1 | sed -e 's/MINTEMP=//g'`
MAXTEMP=`egrep '^MAXTEMP=.*$' $1 | sed -e 's/MAXTEMP=//g'`
MINSTART=`egrep '^MINSTART=.*$' $1 | sed -e 's/MINSTART=//g'`
@@ -71,6 +73,7 @@ function LoadConfig {
do
AFCPWM[$fcvcount]=`echo $fcv |cut -d'=' -f1`
AFCTEMP[$fcvcount]=`echo $fcv |cut -d'=' -f2`
AFCFAN[$fcvcount]=`echo $FCFANS |sed -s 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2`
AFCMINTEMP[$fcvcount]=`echo $MINTEMP |sed -s 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2`
AFCMAXTEMP[$fcvcount]=`echo $MAXTEMP |sed -s 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2`
AFCMINSTART[$fcvcount]=`echo $MINSTART |sed -s 's/ /\n/g' |egrep "${AFCPWM[$fcvcount]}" |cut -d'=' -f2`
@@ -78,6 +81,7 @@ function LoadConfig {
echo
echo "Settings for ${AFCPWM[$fcvcount]}:"
echo " Depends on ${AFCTEMP[$fcvcount]}"
echo " Controls ${AFCFAN[$fcvcount]}"
echo " MINTEMP=${AFCMINTEMP[$fcvcount]}"
echo " MAXTEMP=${AFCMAXTEMP[$fcvcount]}"
echo " MINSTART=${AFCMINSTART[$fcvcount]}"
@@ -94,12 +98,67 @@ else
LoadConfig /etc/fancontrol
fi
cd /proc/sys/dev/sensors/
if (( $? != 0 )) ; then
echo "Directory /proc/sys/dev/sensors/ does not exist, did you load the necessary kernel modules?"
exit 1
DIR=/proc/sys/dev/sensors
SDIR=/sys/bus/i2c/devices
if [ ! -d $DIR ]
then
if [ ! -d $SDIR ]
then
echo $0: 'No sensors found! (did you load the necessary modules?)'
exit 1
else
SYSFS=1
DIR=$SDIR
fi
fi
cd $DIR
# $1 = pwm file name
function pwmdisable()
{
if [ "$SYSFS" = "1" ]
then
echo $MAX > $1
ENABLE=${1/pwm/pwm_enable}
if [ -f $ENABLE ]
then
echo 0 > $ENABLE
fi
else
echo $MAX 0 > $1
fi
}
# $1 = pwm file name
function pwmenable()
{
if [ "$SYSFS" = "1" ]
then
ENABLE=${1/pwm/pwm_enable}
if [ -f $ENABLE ]
then
echo 1 > $ENABLE
fi
else
echo $MAX 1 > $1
fi
}
function restorefans()
{
echo 'Aborting, restoring fans...'
let fcvcount=0
while (( $fcvcount < ${#AFCPWM[@]} )) # go through all pwm outputs
do
pwmo=${AFCPWM[$fcvcount]}
pwmdisable $pwmo
fcvcount=$fcvcount+1
done
echo 'Verify fans have returned to full speed'
exit 1
}
trap restorefans SIGHUP SIGINT SIGQUIT
# function doing all the math
function calc () {
@@ -114,25 +173,53 @@ function UpdateFanSpeeds {
#hopefully shorter vars will improve readability:
pwmo=${AFCPWM[$fcvcount]}
tsens=${AFCTEMP[$fcvcount]}
fan=${AFCFAN[$fcvcount]}
mint=${AFCMINTEMP[$fcvcount]}
maxt=${AFCMAXTEMP[$fcvcount]}
minsa=${AFCMINSTART[$fcvcount]}
minso=${AFCMINSTOP[$fcvcount]}
tval=`cat ${tsens} |cut -d' ' -f3 |cut -d'.' -f1`
pwmpval=`cat ${pwmo} | cut -d' ' -f1`
tval=`cat ${tsens}`
if [ $? -ne 0 ]
then
echo "Error reading temperature from $DIR/$tsens"
restorefans
fi
tval=`echo ${tval} |cut -d' ' -f3 |cut -d'.' -f1`
if [ "$SYSFS" = "1" ]
then
let tval="$tval / 1000"
fi
pwmpval=`cat ${pwmo}`
if [ $? -ne 0 ]
then
echo "Error reading PWM value from $DIR/$pwmo"
restorefans
fi
pwmpval=`echo ${pwmpval} | cut -d' ' -f1`
fanval=`cat ${fan}`
if [ $? -ne 0 ]
then
echo "Error reading Fan value from $DIR/$fan"
restorefans
fi
fanval=`echo ${fanval} | cut -d' ' -f2`
# debug info
if [ "$DEBUG" != "" ]
then
echo "pwmo=$pwmo"
echo "tsens=$tsens"
echo "fan=$fan"
echo "mint=$mint"
echo "maxt=$maxt"
echo "minsa=$minsa"
echo "minso=$minso"
echo "tval=$tval"
echo "pwmpval=$pwmpval"
echo "fanval=$fanval"
fi
if (( $tval <= $mint ))
@@ -142,13 +229,18 @@ function UpdateFanSpeeds {
else
# calculate the new value from temperature and settings
pwmval=`calc "(((${tval}-${mint})/(${maxt}-${mint}))^2*(255-${minso})+${minso})" |cut -d'.' -f1`
if [ $pwmpval -eq 0 ]
if [ $pwmpval -eq 0 -o $fanval -eq 0 ]
then # if fan was stopped start it using a safe value
echo $minsa > $pwmo
sleep 1
fi
fi
echo $pwmval > $pwmo # write new value to pwm output
if [ $? -ne 0 ]
then
echo "Error writing PWM value to $DIR/$pwmo"
restorefans
fi
if [ "$DEBUG" != "" ]
then
echo "new pwmval=$pwmval"
@@ -157,6 +249,22 @@ function UpdateFanSpeeds {
done
}
echo 'Enabling PWM on fans...'
let fcvcount=0
while (( $fcvcount < ${#AFCPWM[@]} )) # go through all pwm outputs
do
pwmo=${AFCPWM[$fcvcount]}
pwmenable $pwmo
if [ $? -ne 0 ]
then
echo "Error enabling PWM on $DIR/$pwmo"
restorefans
fi
fcvcount=$fcvcount+1
done
echo 'Starting automatic fan control...'
# main loop calling the main function at specified intervals
while true
do
+12 -2
View File
@@ -83,6 +83,7 @@ then
exit 1
fi
# $1 = pwm file name
function pwmdisable()
{
if [ "$SYSFS" = "1" ]
@@ -98,6 +99,7 @@ function pwmdisable()
fi
}
# $1 = pwm file name
function pwmenable()
{
if [ "$SYSFS" = "1" ]
@@ -112,6 +114,7 @@ function pwmenable()
fi
}
# $1 = pwm file name; $2 = pwm value 0-255
function pwmset()
{
echo $2 > $1
@@ -290,6 +293,9 @@ do
then
let pwmactivecount=1
pwmactive="$i ${pwmactive}"
fanactive="$j ${fanactive}"
else
fanactive="$j+${fanactive}" #not supported yet by fancontrol
fi
sleep $DELAY
if [ $? -ne 0 ]
@@ -394,6 +400,7 @@ function LoadConfig {
echo "Loading configuration from $1 ..."
INTERVAL=`egrep '^INTERVAL=.*$' $1 | sed -e 's/INTERVAL=//g'`
FCTEMPS=`egrep '^FCTEMPS=.*$' $1 | sed -e 's/FCTEMPS=//g'`
FCFANS=`egrep '^FCFANS=.*$' $1 | sed -e 's/FCFANS=//g'`
MINTEMP=`egrep '^MINTEMP=.*$' $1 | sed -e 's/MINTEMP=//g'`
MAXTEMP=`egrep '^MAXTEMP=.*$' $1 | sed -e 's/MAXTEMP=//g'`
MINSTART=`egrep '^MINSTART=.*$' $1 | sed -e 's/MINSTART=//g'`
@@ -451,8 +458,8 @@ function TestMinStop {
function SaveConfig {
echo
echo "Saving configuration to $FCCONFIG..."
egrep -v '(INTERVAL|FCTEMPS|MAXTEMP|MINTEMP|MINSTART|MINSTOP)' /etc/fancontrol >/tmp/fancontrol
echo -e "INTERVAL=$INTERVAL\nFCTEMPS=$FCTEMPS\nMINTEMP=$MINTEMP\nMAXTEMP=$MAXTEMP\nMINSTART=$MINSTART\nMINSTOP=$MINSTOP" >>/tmp/fancontrol
egrep -v '(INTERVAL|FCTEMPS|FCFANS|MAXTEMP|MINTEMP|MINSTART|MINSTOP)' /etc/fancontrol >/tmp/fancontrol
echo -e "INTERVAL=$INTERVAL\nFCTEMPS=$FCTEMPS\nFCFANS=$FCFANS\nMINTEMP=$MINTEMP\nMAXTEMP=$MAXTEMP\nMINSTART=$MINSTART\nMINSTOP=$MINSTOP" >>/tmp/fancontrol
mv /tmp/fancontrol /etc/fancontrol
#check if file was written correctly
echo 'Configuration saved'
@@ -492,6 +499,7 @@ select pwms in $pwmactive "Change INTERVAL" "Just quit" "Save and quit" "Show co
echo
echo "Settings of ${pwmo}:"
echo " Depends on `echo $FCTEMPS |sed -e 's/ /\n/g' |egrep \"${pwmo}\" |sed -e 's/.*=//g'`"
echo " Controls `echo $FCFANS |sed -e 's/ /\n/g' |egrep \"${pwmo}\" |sed -e 's/.*=//g'`"
echo " MINTEMP=`echo $MINTEMP |sed -e \"s/ /\n/g\" |egrep \"${pwmo}\" |sed -e \"s/.*=//g\"`"
echo " MAXTEMP=`echo $MAXTEMP |sed -e \"s/ /\n/g\" |egrep \"${pwmo}\" |sed -e \"s/.*=//g\"`"
echo " MINSTART=`echo $MINSTART |sed -e \"s/ /\n/g\" |egrep \"${pwmo}\" |sed -e \"s/.*=//g\"`"
@@ -513,6 +521,8 @@ select pwms in $pwmactive "Change INTERVAL" "Just quit" "Save and quit" "Show co
fi
echo "$j $S"
done
FAN=`echo $fanactive|cut -d' ' -f$REPLY`
FCFANS="`echo $FCFANS | sed -e "s/${pwmsed}[^ ]* *//g\"` ${pwms}=$FAN"
echo
echo "Select a temperature sensor as source for ${pwms}:"
select tempss in $TEMPS "None (Do not affect this PWM output)"; do