diff options
author | Bill Richardson <wfrichar@chromium.org> | 2014-11-05 12:43:57 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-11-06 02:28:22 +0000 |
commit | 41cde665166da1aced2ece17f7b503c78cdb5c8f (patch) | |
tree | 6e95a130dadbd38846ad8cf32124ccdbb49ff353 /test/fan.c | |
parent | f0809a23997d66265e625d23ebef8dba1465732f (diff) | |
download | chrome-ec-41cde665166da1aced2ece17f7b503c78cdb5c8f.tar.gz |
Samus: Handle fan startup in the EC, not the fan controller
The fans on samus have a recommended minimum duty cycle of 20%
while running, but 30% in order to start. We've been using the
EC's built-in fan controller for the start requirement, but it
has a minimum fast-start duty cycle of 50%. It turns out that
that speed is noticeably noisy.
This change handles the startup with logic in the EC instead, so
that the fan only tries to spin at 30% initially (or if it drops
too much below the minimum turning speed).
BUG=chrome-os-partner:33429
BRANCH=ToT,samus
TEST=make buildall -j
Boot the system, let it idle with the browser windows closed, the
browse a bit, then idle. Listen for changes to the fans.
Before, I could hear the fans kick in and out as the AP load
changed. Now it's much quieter.
Change-Id: Id35215520c064eb6843686ec8bb5f3618dac6cf6
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/227658
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Diffstat (limited to 'test/fan.c')
-rw-r--r-- | test/fan.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/test/fan.c b/test/fan.c new file mode 100644 index 0000000000..9a0fa0d225 --- /dev/null +++ b/test/fan.c @@ -0,0 +1,108 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + * + * Test thermal engine. + */ + +#include "common.h" +#include "console.h" +#include "fan.h" +#include "hooks.h" +#include "host_command.h" +#include "printf.h" +#include "temp_sensor.h" +#include "test_util.h" +#include "thermal.h" +#include "timer.h" +#include "util.h" + + +/*****************************************************************************/ +/* Tests */ + +static int test_fan(void) +{ + /* "actual" fan speed from board/host/fan.c */ + extern int mock_rpm; + + sleep(2); + + /* With nothing else to do, fans default to full-on */ + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_max); + + /* + * fan_set_percent_needed() is normally called once a second by the + * thermal task, but we're not using a thermal test in this test so + * we can dink around with the fans without having to wait. The host + * implementation just sets mock_rpm to whatever it's asked for. + */ + + /* Off */ + fan_set_percent_needed(0, 0); + TEST_ASSERT(fan_get_rpm_actual(0) == 0); + fan_set_percent_needed(0, 0); + TEST_ASSERT(fan_get_rpm_actual(0) == 0); + + /* On, but just barely */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_start); + /* fan is above min speed now, so should be set to min */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + + /* Full speed */ + fan_set_percent_needed(0, 100); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_max); + fan_set_percent_needed(0, 100); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_max); + + /* Slow again */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + + /* Off */ + fan_set_percent_needed(0, 0); + TEST_ASSERT(fan_get_rpm_actual(0) == 0); + fan_set_percent_needed(0, 0); + TEST_ASSERT(fan_get_rpm_actual(0) == 0); + + /* On, but just barely */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_start); + /* Force the mock_rpm to be slow, to simulate dragging */ + mock_rpm = fans[0].rpm_min - 105; + /* It should keep trying for the start speed */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_start); + /* But we have to keep forcing the mock_rpm back down */ + mock_rpm = fans[0].rpm_min - 105; + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_start); + /* Now let it turn just under rpm_min. Should be okay there. */ + mock_rpm = fans[0].rpm_min - 10; + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + /* Let it go a little faster, still okay */ + mock_rpm = fans[0].rpm_min + 10; + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + /* But if it drops too low, it should go back to the start speed */ + mock_rpm = fans[0].rpm_min - 105; + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_start); + /* And then relax */ + fan_set_percent_needed(0, 1); + TEST_ASSERT(fan_get_rpm_actual(0) == fans[0].rpm_min); + + return EC_SUCCESS; +} + +void run_test(void) +{ + RUN_TEST(test_fan); + + test_print_result(); +} |