mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-07 16:01:34 +00:00
This script puts the vt1211 in automatic PWM mode and fools the chip into believing that there is a temp change to force the PWM outputs to specified values. This is necessary since the standard manual mode of the vt1211 doesn't seem to work. Patch from Juerg Haeflinger. git-svn-id: http://lm-sensors.org/svn/lm-sensors/branches/lm-sensors-3.0.0@5338 7894878c-1315-0410-8ee3-d5d059ff63e0
180 lines
4.4 KiB
Bash
Executable File
180 lines
4.4 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# vt1211_pwm - Manually control the PWM outputs of the VIA vt1211 Super-I/O
|
|
#
|
|
# Copyright (C) 2008 Juerg Haefliger (juergh at gmail.com>
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
function usage
|
|
{
|
|
echo "Usage: vt1211_pwm -i <pwm> | -r <pwm> | -s <pwm>,<val>"
|
|
echo
|
|
echo "DESCRIPTION"
|
|
echo " This tool provides manual control of the PWM outputs of the VIA "
|
|
echo " vt1211 Super-I/O."
|
|
echo
|
|
echo "OPTIONS"
|
|
echo " -d Display the current PWM settings of the vt1211."
|
|
echo " -i <pwm> Initialize the PWM output for manual control."
|
|
echo " -r <pwm> Restore the PWM output to the original settings."
|
|
echo " -s <pwm>,<val> Set the PWM output duty-cycle. "
|
|
echo
|
|
echo "WITH"
|
|
echo " <pwm> PWM output (1-2)."
|
|
echo " <val> PWM duty-cycle (0-255)."
|
|
echo
|
|
exit 2
|
|
}
|
|
|
|
function set_attr
|
|
{
|
|
local tmp
|
|
read tmp < $1
|
|
echo "echo $tmp > $1"
|
|
echo $2 > $1
|
|
}
|
|
|
|
# check if we have the right permissions to run
|
|
if [ `whoami` != "root" ] ; then
|
|
echo "You must be root to run this script."
|
|
exit 1
|
|
fi
|
|
|
|
# parse the command line options
|
|
action=
|
|
nr=1
|
|
val=0
|
|
while getopts di:r:s: opt ; do
|
|
[ -z "$action" ] || usage
|
|
case $opt in
|
|
d) action="display"
|
|
;;
|
|
i) action="init"
|
|
nr=$OPTARG
|
|
;;
|
|
r) action="restore"
|
|
nr=$OPTARG
|
|
;;
|
|
s) action="set"
|
|
nr=${OPTARG%,*}
|
|
val=${OPTARG#*,}
|
|
;;
|
|
?) usage
|
|
;;
|
|
esac
|
|
done
|
|
|
|
[ -z "$action" ] && usage
|
|
[ $nr -lt 1 -o $nr -gt 2 ] && usage
|
|
[ $val -lt 0 -o $val -gt 255 ] && usage
|
|
|
|
# check hwmon device
|
|
dev=`ls -d /sys/devices/platform/vt1211.*`
|
|
if [ -z "$dev" ] ; then
|
|
echo "Platform device vt1211 not found. Did you load the vt1211 module?"
|
|
exit 1
|
|
fi
|
|
|
|
# init file
|
|
initfile="/root/.vt1211_pwm${nr}"
|
|
|
|
# ACTION: display
|
|
if [ $action = "display" ] ; then
|
|
for nr in 1 2 ; do
|
|
read mode < ${dev}/pwm${nr}_enable
|
|
if [ $mode -eq 0 ] ; then
|
|
mode_txt="(disabled)"
|
|
elif [ $mode -eq 2 ] ; then
|
|
mode_txt="(auto) "
|
|
else
|
|
mode_txt="(unknown) "
|
|
fi
|
|
read val < ${dev}/pwm${nr}
|
|
dc=$((val * 100 / 255))
|
|
echo "pwm${nr}: mode = ${mode} ${mode_txt}, val = ${val} (${dc}%)"
|
|
done
|
|
fi
|
|
|
|
# ACTION: init
|
|
if [ $action = "init" ] ; then
|
|
# check for an init file
|
|
if [ -e $initfile ] ; then
|
|
echo " $initfile exists. Did you already initialize this PWM?"
|
|
exit 1
|
|
fi
|
|
|
|
(
|
|
# set the pwm-to-temp mapping
|
|
# use the internal temp as a reference
|
|
set_attr ${dev}/pwm${nr}_auto_channels_temp 2
|
|
|
|
# enable the pwm auto controller
|
|
set_attr ${dev}/pwm${nr}_enable 2
|
|
|
|
# set the PWM duty-cycle
|
|
set_attr ${dev}/pwm${nr}_auto_point2_pwm 0
|
|
set_attr ${dev}/pwm${nr}_auto_point3_pwm 255
|
|
|
|
# set the temp boundaries to extrem values
|
|
set_attr ${dev}/pwm1_auto_point1_temp 0
|
|
set_attr ${dev}/pwm1_auto_point2_temp 0
|
|
set_attr ${dev}/pwm1_auto_point3_temp 1000000
|
|
set_attr ${dev}/pwm1_auto_point4_temp 1000000
|
|
|
|
) > $initfile
|
|
|
|
exit 0
|
|
fi
|
|
|
|
# ACTION: restore
|
|
if [ $action = "restore" ] ; then
|
|
# check for an init file
|
|
if [ ! -e $initfile ] ; then
|
|
echo " $initfile not found. Nothing to restore."
|
|
exit 1
|
|
fi
|
|
|
|
sh $initfile
|
|
rm $initfile
|
|
|
|
exit 0
|
|
fi
|
|
|
|
# ACTION: set
|
|
if [ $action = "set" ] ; then
|
|
# check for an init file
|
|
if [ ! -e $initfile ] ; then
|
|
echo "$initfile not found. Did you initialize this PWM?"
|
|
exit 1
|
|
fi
|
|
|
|
# set the PWM duty-cycle
|
|
echo $val > ${dev}/pwm${nr}_auto_point3_pwm
|
|
|
|
# fool the vt1211 into believing there is a temp change
|
|
# otherwise the new PWM duty-cycle doesn't take effect
|
|
echo 0 > ${dev}/pwm1_auto_point3_temp
|
|
echo 1000000 > ${dev}/pwm1_auto_point3_temp
|
|
|
|
# read the new PWM duty-cycle back and print it
|
|
read val < ${dev}/pwm${nr}
|
|
dc=$((val * 100 / 255))
|
|
echo "pwm${nr} is now at ${val} (${dc}%)."
|
|
|
|
exit 0
|
|
fi
|