summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSameer Nanda <snanda@chromium.org>2012-10-11 10:09:45 -0700
committerVic Yang <victoryang@chromium.org>2012-10-16 21:14:16 -0700
commit5c85a4fadf857d55532f4f854a403db8ed145fb4 (patch)
tree5cbf8d242a19d99a19ab928b5f908dbe179d63cc
parent935d12c6fc258f398f7b416d48559a16e782d98e (diff)
downloadchrome-ec-5c85a4fadf857d55532f4f854a403db8ed145fb4.tar.gz
temp_metrics: tmp006 calibration and fan loop updates
With the recent changes that have gone into the EC, the TMP006 calibration data is no longer present in the EC by default. Push it down to the EC via the newly added ectool tmp006cal command. Also added couple of changes to the fan loop: - hand back fan control loop to the EC if none of the TMP006 sensors report valid temperatures. - handle S0->S3->S0 transition where the EC sets the fan to 0 RPM. BUG=chrome-os-partner:9193 TEST=run "ectool tmp006cal" command for sensors 0, 1, 2 and 3 and ensure that they return non-zero calibration values. BRANCH=none Original-Change-Id: Iaf91216a4d3353f15489b39aba9acb34055551cf Signed-off-by: Sameer Nanda <snanda@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/35469 Reviewed-by: Vincent Palatin <vpalatin@chromium.org> Reviewed-by: Todd Broch <tbroch@chromium.org> (cherry picked from commit dd300b5baf1d6eff7f53b8a94c8574cfece52685) Change-Id: Ic514f98c5c77c26174bc7cc175a5f5091de79c0a Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/35799
-rw-r--r--util/temp_metrics.conf96
1 files changed, 74 insertions, 22 deletions
diff --git a/util/temp_metrics.conf b/util/temp_metrics.conf
index 303716ee79..5dba2c04bc 100644
--- a/util/temp_metrics.conf
+++ b/util/temp_metrics.conf
@@ -67,8 +67,11 @@ script
get_sensor_temp() {
s=$1
- tempk=$(ectool temps $s | sed 's/[^0-9]//g')
- tempc=$((tempk - $TEMP_OFFSET))
+ tempc=0
+ if out=$(ectool temps $s); then
+ tempk=$(echo $out | sed 's/[^0-9]//g')
+ tempc=$((tempk - $TEMP_OFFSET))
+ fi
echo $tempc
}
@@ -87,10 +90,33 @@ script
echo $usb_c_object $pch_d_object $charger_d_object
}
+ set_calibration_data() {
+ B0='-2.94e-5'
+ B1='-5.7e-7'
+ B2='4.63e-9'
+
+ USB_C_S0='3.648e-14'
+ PCH_D_S0='9.301e-14'
+ HINGE_C_S0='-11.000e-14'
+ CHARGER_D_S0='10.426e-14'
+
+ # Note that the sensor numbering is different between the ectool tmp006
+ # and temps/tempsinfo commands.
+ USB_C="0 $USB_C_S0 $B0 $B1 $B2"
+ PCH_D="1 $PCH_D_S0 $B0 $B1 $B2"
+ HINGE_C="2 $HINGE_C_S0 $B0 $B1 $B2"
+ CHARGER_D="3 $CHARGER_D_S0 $B0 $B1 $B2"
+
+ for i in "$USB_C" "$PCH_D" "$HINGE_C" "$CHARGER_D"; do
+ ectool tmp006cal $i
+ done
+ }
+
max_skin_temp=0
- sensor_temperatures=""
+ sensor_temperatures=
+
get_max_skin_temp() {
- sensor_temperatures=""
+ sensor_temperatures=
max_skin_temp=0
for i in $*; do
t=$(get_sensor_temp $i)
@@ -220,7 +246,15 @@ script
set_pkg_power_limit $pkg_power_limit
}
- fan_reset_thresholds() {
+ get_fan_rpm() {
+ echo $(ectool pwmgetfanrpm | sed 's/[^0-9]//g')
+ }
+
+ set_fan_rpm() {
+ ectool pwmsetfanrpm $1
+ }
+
+ reset_fan_thresholds() {
temp_low1=105
temp_low2=105
temp_low3=105
@@ -242,47 +276,60 @@ script
if [ $skin_temp -gt 48 ] || [ $skin_temp -gt $temp_low1 ]; then
rpm=9300
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low1=46
elif [ $skin_temp -gt 44 ] || [ $skin_temp -gt $temp_low2 ]; then
rpm=8000
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low2=43
elif [ $skin_temp -gt 42 ] || [ $skin_temp -gt $temp_low3 ]; then
rpm=7000
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low3=41
elif [ $skin_temp -gt 40 ] || [ $skin_temp -gt $temp_low4 ]; then
rpm=5500
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low4=39
elif [ $skin_temp -gt 38 ] || [ $skin_temp -gt $temp_low5 ]; then
rpm=4000
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low5=34
elif [ $skin_temp -gt 33 ] || [ $skin_temp -gt $temp_low6 ]; then
rpm=3000
- fan_reset_thresholds
+ reset_fan_thresholds
temp_low6=30
else
rpm=0
- fan_reset_thresholds
+ reset_fan_thresholds
fi
- if [ $last_rpm -eq $rpm ]; then
+ # During S0->S3->S0 transitions, the EC sets the fan RPM to 0. This script
+ # isn't aware of such transitions. Read the current fan RPM again to see
+ # if it got set to 0. Note that comparing the current fan RPM against last
+ # requested RPM won't suffice since the actual fan RPM may not be exactly
+ # what was requested.
+ cur_rpm=$(get_fan_rpm)
+ if ([ $cur_rpm -ne 0 ] && [ $last_rpm -eq $rpm ]) || \
+ ([ $cur_rpm -eq 0 ] && [ $rpm -eq 0 ]); then
+ last_rpm=$rpm
return
fi
log_message "Setting fan RPM (temps: $sensor_temperatures): $last_rpm -> $rpm"
last_rpm=$rpm
- ectool pwmsetfanrpm $rpm
+ set_fan_rpm $rpm
}
# Get list of sensors to monitor.
sensor_list=$(get_sensor_list)
+ # Set sensor calibration data.
+ set_calibration_data
+
loop_count=0
+ ec_fan_loop=0
+
while true; do
sleep 10
loop_count=$(($loop_count + 1))
@@ -291,15 +338,20 @@ script
get_max_skin_temp $sensor_list
if [ $max_skin_temp -eq 0 ]; then
- # TODO (snanda): use PECI temperature as a fallback.
- log_message "Invalid max skin temp"
- fi
-
- # Run the fan loop every 10 seconds.
- fan_loop $max_skin_temp
+ if [ $ec_fan_loop -eq 0 ]; then
+ log_message "Invalid max skin temp. Switching to EC fan loop."
+ ectool autofanctrl
+ ec_fan_loop=1
+ last_rpm=10
+ fi
+ else
+ # Run the fan loop.
+ fan_loop $max_skin_temp
+ ec_fan_loop=0
- # Run the thermal loop every 10 seconds.
- thermal_loop $max_skin_temp
+ # Run the thermal loop.
+ thermal_loop $max_skin_temp
+ fi
# Report the metrics once every 30 seconds.
if [ $loop_count -lt 3 ]; then