From 8de677db34f9b318fabd779595f0f69a119d8a72 Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Sat, 20 Dec 2003 22:35:23 +0000 Subject: [PATCH] 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 --- prog/pwm/fancontrol | 128 ++++++++++++++++++++++++++++++++++++++++---- prog/pwm/pwmconfig | 14 ++++- 2 files changed, 130 insertions(+), 12 deletions(-) diff --git a/prog/pwm/fancontrol b/prog/pwm/fancontrol index fcd542f0..58c1ac93 100755 --- a/prog/pwm/fancontrol +++ b/prog/pwm/fancontrol @@ -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 diff --git a/prog/pwm/pwmconfig b/prog/pwm/pwmconfig index 440aa6d4..c65ff7af 100755 --- a/prog/pwm/pwmconfig +++ b/prog/pwm/pwmconfig @@ -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