summaryrefslogtreecommitdiff
path: root/board/osiris/fans.c
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2022-09-21 14:10:01 -0700
committerTom Hughes <tomhughes@chromium.org>2022-09-22 12:49:33 -0700
commit2bcf863b492fe7ed8105c853814dba6ed32ba719 (patch)
treefcf6ce5810f9ff9e3c8cce434812dd75492269ed /board/osiris/fans.c
parente5fb0b9ba488614b5684e640530f00821ab7b943 (diff)
parent28712dae9d7ed1e694f7622cc083afa71090d4d5 (diff)
downloadchrome-ec-2bcf863b492fe7ed8105c853814dba6ed32ba719.tar.gz
Merge remote-tracking branch cros/main into firmware-fpmcu-bloonchipper-releasefirmware-fpmcu-bloonchipper-release
Generated by: ./util/update_release_branch.py --board bloonchipper --relevant_paths_file ./util/fingerprint-relevant-paths.txt firmware- fpmcu-bloonchipper-release Relevant changes: git log --oneline e5fb0b9ba4..28712dae9d -- board/hatch_fp board/bloonchipper common/fpsensor docs/fingerprint driver/fingerprint util/getversion.sh ded9307b79 util/getversion.sh: Fix version when not in a git repo 956055e692 board: change Google USB vendor info 71b2ef709d Update license boilerplate text in source code files 33e11afda0 Revert "fpsensor: Build fpsensor source file with C++" c8d0360723 fpsensor: Build fpsensor source file with C++ bc113abd53 fpsensor: Fix g++ compiler error 150a58a0dc fpsensor: Fix fp_set_sensor_mode return type b33b5ce85b fpsensor: Remove nested designators for C++ compatibility 2e864b2539 tree-wide: const-ify argv for console commands 56d8b360f9 test: Add test for get ikm failure when seed not set 3a3d6c3690 test: Add test for fpsensor trivial key failure 233e6bbd08 fpsensor_crypto: Abstract calls to hmac_SHA256 0a041b285b docs/fingerprint: Typo correction c03fab67e2 docs/fingerprint: Fix the path of fputils.py 0b5d4baf5a util/getversion.sh: Fix empty file list handling 6e128fe760 FPMCU dev board environment with Satlab 3eb29b6aa5 builtin: Move ssize_t to sys/types.h 345d62ebd1 docs/fingerprint: Update power numbers for latest dartmonkey release c25ffdb316 common: Conditionally support printf %l and %i modifiers 9a3c514b45 test: Add a test to check if the debugger is connected 54e603413f Move standard library tests to their own file 43fa6b4bf8 docs/fingerprint: Update power numbers for latest bloonchipper release 25536f9a84 driver/fingerprint/fpc/bep/fpc_sensor_spi.c: Format with clang-format 4face99efd driver/fingerprint/fpc/libfp/fpc_sensor_pal.h: Format with clang-format 738de2b575 trng: Rename rand to trng_rand 14b8270edd docs/fingerprint: Update dragonclaw power numbers 0b268f93d1 driver/fingerprint/fpc/libfp/fpc_private.c: Format with clang-format f80da163f2 driver/fingerprint/fpc/libfp/fpc_private.h: Format with clang-format 5e9c85c9b1 driver/fingerprint/fpc/libfp/fpc_sensor_pal.c: Format with clang-format c1f9dd3cf8 driver/fingerprint/fpc/libfp/fpc_bio_algorithm.h: Format with clang-format eb1e1bed8d driver/fingerprint/fpc/libfp/fpc1145_private.h: Format with clang-format 6e7b611821 driver/fingerprint/fpc/bep/fpc_bio_algorithm.h: Format with clang-format e0589cd5e2 driver/fingerprint/fpc/bep/fpc1035_private.h: Format with clang-format 7905e556a0 common/fpsensor/fpsensor_crypto.c: Format with clang-format 21289d170c driver/fingerprint/fpc/bep/fpc1025_private.h: Format with clang-format 98a20f937e common/fpsensor/fpsensor_state.c: Format with clang-format a2d255d8af common/fpsensor/fpsensor.c: Format with clang-format 73055eeb3f driver/fingerprint/fpc/bep/fpc_private.c: Format with clang-format 0f7b5cb509 common/fpsensor/fpsensor_private.h: Format with clang-format 1ceade6e65 driver/fingerprint/fpc/bep/fpc_private.h: Format with clang-format dc3e9008b8 board/hatch_fp/board.h: Format with clang-format dca9d74321 Revert "trng: Rename rand to trng_rand" a6b0b3554f trng: Rename rand to trng_rand 28d0b75b70 third_party/boringssl: Remove unused header BRANCH=None BUG=b:246424843 b:234181908 b:244781166 b:234181908 b:244387210 BUG=b:242720240 chromium:1098010 b:180945056 b:236025198 b:234181908 BUG=b:234181908 b:237344361 b:131913998 b:236386294 b:234143158 BUG=b:234781655 b:215613183 b:242720910 TEST=`make -j buildall` TEST=./test/run_device_tests.py --board bloonchipper Test "aes": PASSED Test "cec": PASSED Test "cortexm_fpu": PASSED Test "crc": PASSED Test "flash_physical": PASSED Test "flash_write_protect": PASSED Test "fpsensor_hw": PASSED Test "fpsensor_spi_ro": PASSED Test "fpsensor_spi_rw": PASSED Test "fpsensor_uart_ro": PASSED Test "fpsensor_uart_rw": PASSED Test "mpu_ro": PASSED Test "mpu_rw": PASSED Test "mutex": PASSED Test "pingpong": PASSED Test "printf": PASSED Test "queue": PASSED Test "rollback_region0": PASSED Test "rollback_region1": PASSED Test "rollback_entropy": PASSED Test "rtc": PASSED Test "sha256": PASSED Test "sha256_unrolled": PASSED Test "static_if": PASSED Test "stdlib": PASSED Test "system_is_locked_wp_on": PASSED Test "system_is_locked_wp_off": PASSED Test "timer_dos": PASSED Test "utils": PASSED Test "utils_str": PASSED Test "stm32f_rtc": PASSED Test "panic_data_bloonchipper_v2.0.4277": PASSED Test "panic_data_bloonchipper_v2.0.5938": PASSED Force-Relevant-Builds: all Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I264ad0ffe7afcd507a1e483c6e934a9c4fea47c3
Diffstat (limited to 'board/osiris/fans.c')
-rw-r--r--board/osiris/fans.c177
1 files changed, 173 insertions, 4 deletions
diff --git a/board/osiris/fans.c b/board/osiris/fans.c
index fa5a8dc09a..5878d4c4c5 100644
--- a/board/osiris/fans.c
+++ b/board/osiris/fans.c
@@ -1,4 +1,4 @@
-/* Copyright 2022 The Chromium OS Authors. All rights reserved.
+/* Copyright 2022 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -12,6 +12,7 @@
#include "fan.h"
#include "hooks.h"
#include "pwm.h"
+#include "util.h"
/* MFT channels. These are logically separate from pwm_channels. */
const struct mft_t mft_channels[] = {
@@ -20,16 +21,28 @@ const struct mft_t mft_channels[] = {
.clk_src = TCKC_LFCLK,
.pwm_id = PWM_CH_FAN,
},
+ [MFT_CH_1] = {
+ .module = NPCX_MFT_MODULE_2,
+ .clk_src = TCKC_LFCLK,
+ .pwm_id = PWM_CH_FAN2,
+ },
};
BUILD_ASSERT(ARRAY_SIZE(mft_channels) == MFT_CH_COUNT);
static const struct fan_conf fan_conf_0 = {
.flags = FAN_USE_RPM_MODE,
- .ch = MFT_CH_0, /* Use MFT id to control fan */
+ .ch = MFT_CH_0, /* Use MFT id to control fan */
.pgood_gpio = -1,
.enable_gpio = GPIO_EN_PP5000_FAN,
};
+static const struct fan_conf fan_conf_1 = {
+ .flags = FAN_USE_RPM_MODE,
+ .ch = MFT_CH_1, /* Use MFT id to control fan */
+ .pgood_gpio = -1,
+ .enable_gpio = GPIO_EN_PP5000_FAN2,
+};
+
/*
* TODO(b/234545460): thermistor placement and calibration
*
@@ -38,8 +51,14 @@ static const struct fan_conf fan_conf_0 = {
* boards as well.
*/
static const struct fan_rpm fan_rpm_0 = {
- .rpm_min = 3000,
- .rpm_start = 3000,
+ .rpm_min = 2500,
+ .rpm_start = 2500,
+ .rpm_max = 6000,
+};
+
+static const struct fan_rpm fan_rpm_1 = {
+ .rpm_min = 2500,
+ .rpm_start = 2500,
.rpm_max = 6000,
};
@@ -48,4 +67,154 @@ const struct fan_t fans[FAN_CH_COUNT] = {
.conf = &fan_conf_0,
.rpm = &fan_rpm_0,
},
+ [FAN_CH_1] = {
+ .conf = &fan_conf_1,
+ .rpm = &fan_rpm_1,
+ },
+};
+
+/* fan control */
+
+struct fan_step {
+ int on;
+ int off;
+ int rpm;
+};
+
+struct fan_table_config {
+ /* number of control_table */
+ uint8_t step;
+ /* fan control table */
+ const struct fan_step *control_table;
+};
+
+const struct fan_step fan_table0[] = {
+ { .on = 25, .off = 0, .rpm = 0 },
+ { .on = 37, .off = 34, .rpm = 2500 },
+ { .on = 42, .off = 39, .rpm = 2800 },
+ { .on = 46, .off = 43, .rpm = 3000 },
+ { .on = 51, .off = 48, .rpm = 3200 },
+ { .on = 55, .off = 52, .rpm = 3600 },
+ { .on = 59, .off = 56, .rpm = 4000 },
+ { .on = 66, .off = 63, .rpm = 4600 },
+ { .on = 72, .off = 69, .rpm = 5000 },
+ { .on = 74, .off = 71, .rpm = 5500 },
+};
+const int fan_table0_count = ARRAY_SIZE(fan_table0);
+
+const struct fan_step fan_table1[] = {
+ { .on = 25, .off = 0, .rpm = 0 },
+ { .on = 51, .off = 48, .rpm = 3200 },
+ { .on = 55, .off = 52, .rpm = 3600 },
+ { .on = 59, .off = 56, .rpm = 4000 },
+ { .on = 66, .off = 63, .rpm = 4600 },
+ { .on = 72, .off = 69, .rpm = 5000 },
+ { .on = 74, .off = 71, .rpm = 5500 },
+};
+const int fan_table1_count = ARRAY_SIZE(fan_table1);
+
+/* Fan control configuration */
+static struct fan_table_config fan_tables[] = {
+ [FAN_CH_0] = {
+ .step = fan_table0_count,
+ .control_table = (const struct fan_step *) &fan_table0,
+ },
+ [FAN_CH_1] = {
+ .step = fan_table1_count,
+ .control_table = (const struct fan_step *) &fan_table1,
+ },
};
+BUILD_ASSERT(ARRAY_SIZE(fan_tables) == FAN_CH_COUNT);
+
+static int current_level[] = { 0, 0 };
+BUILD_ASSERT(ARRAY_SIZE(current_level) == FAN_CH_COUNT);
+
+static int previous_level[] = { 0, 0 };
+BUILD_ASSERT(ARRAY_SIZE(previous_level) == FAN_CH_COUNT);
+
+#undef BOARD_FAN_TEST
+
+#ifdef BOARD_FAN_TEST
+static int manual_temp = -1;
+#endif
+
+int fan_percent_to_rpm(int fan, int pct)
+{
+ static struct fan_table_config *fan_table;
+ static int previous_pct;
+ int i;
+
+ fan_table = &fan_tables[fan];
+
+#ifdef BOARD_FAN_TEST
+ if (manual_temp != -1)
+ pct = manual_temp;
+#endif
+
+ /*
+ * Compare the pct and previous pct, we have the three paths :
+ * 1. decreasing path. (check the off point)
+ * 2. increasing path. (check the on point)
+ * 3. invariant path. (return the current RPM)
+ */
+ if (pct < previous_pct) {
+ for (i = current_level[fan]; i >= 0; i--) {
+ if (pct <= fan_table->control_table[i].off)
+ current_level[fan] = i - 1;
+ else
+ break;
+ }
+ } else if (pct > previous_pct) {
+ for (i = current_level[fan] + 1; i < fan_table->step; i++) {
+ if (pct >= fan_table->control_table[i].on)
+ current_level[fan] = i;
+ else
+ break;
+ }
+ }
+
+ if (current_level[fan] < 0)
+ current_level[fan] = 0;
+
+ if (current_level[fan] != previous_level[fan])
+ cprints(CC_THERMAL, "Fan %d: Set fan RPM to %d", fan,
+ fan_table->control_table[current_level[fan]].rpm);
+
+ if (fan == (FAN_CH_COUNT - 1))
+ previous_pct = pct;
+
+#ifdef BOARD_FAN_TEST
+ if (manual_temp != -1)
+ ccprints("Fan%d: temps:%d curr:%d prev:%d rpm:%d", fan, pct,
+ current_level[fan], previous_level[fan],
+ fan_table->control_table[current_level[fan]].rpm);
+#endif
+
+ previous_level[fan] = current_level[fan];
+
+ return fan_table->control_table[current_level[fan]].rpm;
+}
+
+#ifdef BOARD_FAN_TEST
+static int command_fan_test(int argc, const char **argv)
+{
+ char *e;
+ int t;
+
+ if (argc > 1) {
+ t = strtoi(argv[1], &e, 0);
+ if (*e) {
+ ccprints("Invalid test temp");
+ return EC_ERROR_INVAL;
+ }
+ manual_temp = t;
+ ccprints("manual temp is %d", manual_temp);
+ return EC_SUCCESS;
+ }
+ manual_temp = -1;
+ ccprints("manual temp reset");
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(fan_test, command_fan_test, "[temperature]",
+ "set manual temperature for fan test");
+#endif