From f68a197dcceb333de992e3a644259e3304335032 Mon Sep 17 00:00:00 2001 From: "Mark D. Studebaker" Date: Wed, 1 Jan 2003 23:55:20 +0000 Subject: [PATCH] simple PWM test shell script git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@1682 7894878c-1315-0410-8ee3-d5d059ff63e0 --- prog/pwm/pwmtest | 258 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100755 prog/pwm/pwmtest diff --git a/prog/pwm/pwmtest b/prog/pwm/pwmtest new file mode 100755 index 00000000..2b00096e --- /dev/null +++ b/prog/pwm/pwmtest @@ -0,0 +1,258 @@ +# +# pwmtest +# Tests the pwm outputs of sensors. +# +# Warning!!! This program will stop your fans, one at a time, +# for approximately 3 seconds each!!! +# This may cause your processor temperature to rise!!! +# Verify that all fans are running at normal speed after this +# program has exited!!! +# +# Copyright 2003 The lm_sensors project +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +# +echo 'This program will search your sensors for pulse width modulation (pwm)' +echo 'controls, and test each one to see if it controls a fan on' +echo 'your motherboard. Note that many motherboards do not have pwm' +echo 'circuitry installed, even if your sensor chip supports pwm.' +echo +echo 'We will attempt to briefly stop each fan using the pwm controls.' +echo 'The program will attempt to restore each fan to full speed' +echo 'after testing. However, it is ** very important ** that you' +echo 'physically verify that the fans have been to full speed' +echo 'after the program has completed.' +echo + +DELAY=3 + +DIR=/proc/sys/dev/sensors +if [ ! -d $DIR ] +then + echo $0: 'No sensors found! (modprobe sensor modules?)' + exit 1 +fi + +cd $DIR +DRIVERS=`echo *-*` +if [ "*-*" = "$DRIVERS" ] +then + echo $0: 'No sensors found! (modprobe sensor modules?)' + exit 1 +fi + +PWM=`echo */pwm*` +if [ "*/pwm*" = "$PWM" ] +then + echo $0: 'There are no pwm-capable sensor modules installed' + exit 1 +fi + +FAN=`echo */fan[1-9]` +if [ "*/fan[1-9]" = "$FAN" ] +then + echo $0: 'There are no fan-capable sensor modules installed' + exit 1 +fi + +echo 'Found the following PWM controls:' +for i in $PWM +do + echo " $i" + if [ -w $i ] + then + echo 255 0 > $i + else + NOTROOT=1 + fi +done + +echo +echo 'Found the following fan sensors:' +for i in $FAN +do + S=`cat $i | cut -d' ' -f2` + if [ "$S" = "0" -o "$S" = "-1" ] + then + echo " $i current speed: 0 ... skipping!" + else + echo " $i current speed: $S RPM" + if [ "$GOODFAN" = "" ] + then + GOODFAN=$i + SPEEDS=$S + else + GOODFAN="$GOODFAN $i" + SPEEDS="$SPEEDS $S" + fi + fi +done +echo + +if [ "$GOODFAN" = "" ] +then + echo 'There are no working fan sensors, all readings are 0.' + echo 'Make sure you have a 3-wire fan connected.' + echo 'You may also need to increase the fan divisors.' + echo 'See doc/fan-divisors for more information.' + exit 1 +fi + +if [ "$NOTROOT" = "1" ] +then + echo 'As you are not root, we cannot write the PWM settings.' + echo 'Please run as root to continue.' + exit 1 +fi + +echo 'Warning!!! This program will stop your fans, one at a time,' +echo "for approximately $DELAY seconds each!!!" +echo 'This may cause your processor temperature to rise!!!' +echo 'If you do not want to do this hit control-C now!!!' +echo -n 'Hit return to continue: ' +read X +echo + +PLOTTER=gnuplot +STEP=15 +PDELAY=2 + +function pwmdetail() +{ + P=$1 + F=$2 + PLOT= + + type gnuplot > /dev/null 2>&1 + if [ $? -eq 0 ] + then + echo -n " Would you like to generate a graphical plot using $PLOTTER (y) ? " + read X + if [ "$X" = "y" -o "$X" = "Y" -o "$X" = "" ] + then + PLOT=y + fi + fi + + if [ "$PLOT" = "y" ] + then + TMP1=/usr/tmp/pwmtest$$.1 + TMP2=/usr/tmp/pwmtest$$.2 + echo "set xlabel \"PWM: $P\"" > $TMP1 + echo "set ylabel \"FAN: $F (RPM)\"" >> $TMP1 + echo 'set nokey' >> $TMP1 + echo 'set xrange [0:255]' >> $TMP1 + echo "plot \"$TMP2\" with lines" >> $TMP1 + echo 'pause -1 " Hit return to continue..."' >> $TMP1 + > $TMP2 + fi + + let pwm=255 + while [ $pwm -ge 0 ] + do + echo $pwm 1 > $P + S=`cat $F | cut -d' ' -f2` + echo " PWM $pwm FAN $S" + if [ "$PLOT" = "y" ] + then + echo "$pwm $S" >> $TMP2 + fi + if [ "$S" = "0" -o "S" = "-1" ] + then + echo 255 0 > $P + echo " Fan Stopped at PWM = $pwm" + if [ $pwm -eq 255 ] + then + echo " This fan appears to stop when the PWM is enabled;" + echo " perhaps the fan input shares a pin with the PWM output" + echo " on the sensor chip." + rm -f $TMP1 $TMP2 + echo + return 0 + fi + break + fi + let pwm=$pwm-$STEP + sleep $PDELAY + if [ $? -ne 0 ] + then + echo 255 0 > $P + echo '^C received, aborting...' + rm -f $TMP1 $TMP2 + exit 1 + fi + done + echo 255 0 > $P + if [ "$PLOT" = "y" ] + then + $PLOTTER $TMP1 + rm -f $TMP1 $TMP2 + fi + echo +} + +for i in $PWM +do + echo Testing pwm control $i ... + echo 0 1 > $i + sleep $DELAY + if [ $? -ne 0 ] + then + echo 255 0 > $i + echo '^C received, restoring PWM and aborting...' + exit 1 + fi + let count=1 + for j in $GOODFAN + do + OS=`echo $SPEEDS | cut -d' ' -f$count` + S=`cat $j | cut -d' ' -f2` + echo " $j ... speed was $OS now $S" + echo 255 0 > $i + let threshold=2*$OS/3 + if [ $S -lt $threshold ] + then + echo " It appears that fan $j" + echo " is controlled by pwm $i" + sleep $DELAY + if [ $? -ne 0 ] + then + echo '^C received, aborting...' + exit 1 + fi + S=`cat $j | cut -d' ' -f2` + if [ $S -lt $threshold ] + then + echo " Fan $j has not returned to speed, please investigate!" + else + echo -n " Would you like to generate a detailed correlation (y) ? " + read X + if [ "$X" = "y" -o "$X" = "Y" -o "$X" = "" ] + then + pwmdetail $i $j + fi + fi + else + echo " no correlation" + fi + let count=count+1 + done + echo +done + + +echo 'Testing is complete.' +echo 'Please verify that all fans have returned to their normal speed.'