summaryrefslogtreecommitdiff
path: root/driver/temp_sensor/thermistor.c
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2021-11-04 12:11:58 -0600
committerCommit Bot <commit-bot@chromium.org>2021-11-05 04:22:34 +0000
commit252457d4b21f46889eebad61d4c0a65331919cec (patch)
tree01856c4d31d710b20e85a74c8d7b5836e35c3b98 /driver/temp_sensor/thermistor.c
parent08f5a1e6fc2c9467230444ac9b582dcf4d9f0068 (diff)
downloadchrome-ec-release-R98-14388.B-ish.tar.gz
In the interest of making long-term branch maintenance incur as little technical debt on us as possible, we should not maintain any files on the branch we are not actually using. This has the added effect of making it extremely clear when merging CLs from the main branch when changes have the possibility to affect us. The follow-on CL adds a convenience script to actually pull updates from the main branch and generate a CL for the update. BUG=b:204206272 BRANCH=ish TEST=make BOARD=arcada_ish && make BOARD=drallion_ish Signed-off-by: Jack Rosenthal <jrosenth@chromium.org> Change-Id: I17e4694c38219b5a0823e0a3e55a28d1348f4b18 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3262038 Reviewed-by: Jett Rink <jettrink@chromium.org> Reviewed-by: Tom Hughes <tomhughes@chromium.org>
Diffstat (limited to 'driver/temp_sensor/thermistor.c')
-rw-r--r--driver/temp_sensor/thermistor.c273
1 files changed, 0 insertions, 273 deletions
diff --git a/driver/temp_sensor/thermistor.c b/driver/temp_sensor/thermistor.c
deleted file mode 100644
index ffa780cb07..0000000000
--- a/driver/temp_sensor/thermistor.c
+++ /dev/null
@@ -1,273 +0,0 @@
-/* Copyright 2018 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.
- */
-
-/*
- * Common thermistor code for Chrome EC. See ./thermistor.md for table of
- * resistance of a 47kΩ B4050 thermistor
- */
-
-#include "adc.h"
-#include "common.h"
-#include "gpio.h"
-#include "temp_sensor/thermistor.h"
-#include "util.h"
-
-int thermistor_linear_interpolate(uint16_t mv,
- const struct thermistor_info *info)
-{
- const struct thermistor_data_pair *data = info->data;
- int v_high = 0, v_low = 0, t_low, t_high, num_steps;
- int head, tail, mid = 0;
-
- /* We need at least two points to form a line. */
- ASSERT(info->num_pairs >= 2);
-
- /*
- * If input value is out of bounds return the lowest or highest
- * value in the data sets provided.
- */
- if (mv > data[0].mv * info->scaling_factor)
- return data[0].temp;
- else if (mv < data[info->num_pairs - 1].mv * info->scaling_factor)
- return data[info->num_pairs - 1].temp;
-
- head = 0;
- tail = info->num_pairs - 1;
- while (head != tail) {
- mid = (head + tail) / 2;
- v_high = data[mid].mv * info->scaling_factor;
- v_low = data[mid + 1].mv * info->scaling_factor;
-
- if ((mv <= v_high) && (mv >= v_low))
- break;
- else if (mv > v_high)
- tail = mid;
- else if (mv < v_low)
- head = mid + 1;
- }
-
- t_low = data[mid].temp;
- t_high = data[mid + 1].temp;
-
- /*
- * The obvious way of doing this is to figure out how many mV per
- * degree are in between the two points (mv_per_deg_c), and then how
- * many of those exist between the input voltage and voltage of
- * lower temperature :
- * 1. mv_per_deg_c = (v_high - v_low) / (t_high - t_low)
- * 2. num_steps = (v_high - mv) / mv_per_deg_c
- * 3. result = t_low + num_steps
- *
- * Combine #1 and #2 to mitigate precision loss due to integer division.
- */
- num_steps = ((v_high - mv) * (t_high - t_low)) / (v_high - v_low);
- return t_low + num_steps;
-}
-
-#if defined(CONFIG_STEINHART_HART_3V3_51K1_47K_4050B) || \
- defined(CONFIG_STEINHART_HART_3V3_13K7_47K_4050B) || \
- defined(CONFIG_STEINHART_HART_6V0_51K1_47K_4050B) || \
- defined(CONFIG_STEINHART_HART_3V0_22K6_47K_4050B) || \
- defined(CONFIG_STEINHART_HART_3V3_30K9_47K_4050B) || \
- defined(CONFIG_ZEPHYR)
-int thermistor_get_temperature(int idx_adc, int *temp_ptr,
- const struct thermistor_info *info)
-{
- int mv;
-
-#ifdef CONFIG_TEMP_SENSOR_POWER_GPIO
- /*
- * If the power rail for the thermistor circuit is not enabled, then
- * need to ignore any ADC measurments.
- */
- if (!gpio_get_level(CONFIG_TEMP_SENSOR_POWER_GPIO))
- return EC_ERROR_NOT_POWERED;
-#endif /* CONFIG_TEMP_SENSOR_POWER_GPIO */
- mv = adc_read_channel(idx_adc);
- if (mv < 0)
- return EC_ERROR_UNKNOWN;
-
- *temp_ptr = thermistor_linear_interpolate(mv, info);
- *temp_ptr = C_TO_K(*temp_ptr);
- return EC_SUCCESS;
-}
-#endif
-
-#ifdef CONFIG_STEINHART_HART_3V3_51K1_47K_4050B
-/*
- * Data derived from Steinhart-Hart equation in a resistor divider circuit with
- * Vdd=3300mV, R = 51.1Kohm, and thermistor (B = 4050, T0 = 298.15 K, nominal
- * resistance (R0) = 47Kohm).
- */
-#define THERMISTOR_SCALING_FACTOR_51_47 11
-static const struct thermistor_data_pair thermistor_data_51_47[] = {
- { 2484 / THERMISTOR_SCALING_FACTOR_51_47, 0 },
- { 2142 / THERMISTOR_SCALING_FACTOR_51_47, 10 },
- { 1767 / THERMISTOR_SCALING_FACTOR_51_47, 20 },
- { 1400 / THERMISTOR_SCALING_FACTOR_51_47, 30 },
- { 1072 / THERMISTOR_SCALING_FACTOR_51_47, 40 },
- { 802 / THERMISTOR_SCALING_FACTOR_51_47, 50 },
- { 593 / THERMISTOR_SCALING_FACTOR_51_47, 60 },
- { 436 / THERMISTOR_SCALING_FACTOR_51_47, 70 },
- { 321 / THERMISTOR_SCALING_FACTOR_51_47, 80 },
- { 276 / THERMISTOR_SCALING_FACTOR_51_47, 85 },
- { 237 / THERMISTOR_SCALING_FACTOR_51_47, 90 },
- { 204 / THERMISTOR_SCALING_FACTOR_51_47, 95 },
- { 177 / THERMISTOR_SCALING_FACTOR_51_47, 100 },
-};
-
-static const struct thermistor_info thermistor_info_51_47 = {
- .scaling_factor = THERMISTOR_SCALING_FACTOR_51_47,
- .num_pairs = ARRAY_SIZE(thermistor_data_51_47),
- .data = thermistor_data_51_47,
-};
-
-int get_temp_3v3_51k1_47k_4050b(int idx_adc, int *temp_ptr)
-{
- return thermistor_get_temperature(idx_adc, temp_ptr,
- &thermistor_info_51_47);
-}
-#endif /* CONFIG_STEINHART_HART_3V3_51K1_47K_4050B */
-
-#ifdef CONFIG_STEINHART_HART_3V3_13K7_47K_4050B
-/*
- * Data derived from Steinhart-Hart equation in a resistor divider circuit with
- * Vdd=3300mV, R = 13.7Kohm, and thermistor (B = 4050, T0 = 298.15 K, nominal
- * resistance (R0) = 47Kohm).
- */
-#define THERMISTOR_SCALING_FACTOR_13_47 13
-static const struct thermistor_data_pair thermistor_data_13_47[] = {
- { 3033 / THERMISTOR_SCALING_FACTOR_13_47, 0 },
- { 2882 / THERMISTOR_SCALING_FACTOR_13_47, 10 },
- { 2677 / THERMISTOR_SCALING_FACTOR_13_47, 20 },
- { 2420 / THERMISTOR_SCALING_FACTOR_13_47, 30 },
- { 2119 / THERMISTOR_SCALING_FACTOR_13_47, 40 },
- { 1799 / THERMISTOR_SCALING_FACTOR_13_47, 50 },
- { 1485 / THERMISTOR_SCALING_FACTOR_13_47, 60 },
- { 1197 / THERMISTOR_SCALING_FACTOR_13_47, 70 },
- { 947 / THERMISTOR_SCALING_FACTOR_13_47, 80 },
- { 839 / THERMISTOR_SCALING_FACTOR_13_47, 85 },
- { 741 / THERMISTOR_SCALING_FACTOR_13_47, 90 },
- { 653 / THERMISTOR_SCALING_FACTOR_13_47, 95 },
- { 576 / THERMISTOR_SCALING_FACTOR_13_47, 100 },
-};
-
-static const struct thermistor_info thermistor_info_13_47 = {
- .scaling_factor = THERMISTOR_SCALING_FACTOR_13_47,
- .num_pairs = ARRAY_SIZE(thermistor_data_13_47),
- .data = thermistor_data_13_47,
-};
-
-int get_temp_3v3_13k7_47k_4050b(int idx_adc, int *temp_ptr)
-{
- return thermistor_get_temperature(idx_adc, temp_ptr,
- &thermistor_info_13_47);
-}
-#endif /* CONFIG_STEINHART_HART_3V3_13K7_47K_4050B */
-
-#ifdef CONFIG_STEINHART_HART_6V0_51K1_47K_4050B
-/*
- * Data derived from Steinhart-Hart equation in a resistor divider circuit with
- * Vdd=6000mV, R = 51.1Kohm, and thermistor (B = 4050, T0 = 298.15 K, nominal
- * resistance (R0) = 47Kohm).
- */
-#define THERMISTOR_SCALING_FACTOR_6V0_51_47 18
-static const struct thermistor_data_pair thermistor_data_6v0_51_47[] = {
- { 4517 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 0 },
- { 3895 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 10 },
- { 3214 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 20 },
- { 2546 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 30 },
- { 1950 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 40 },
- { 1459 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 50 },
- { 1079 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 60 },
- { 794 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 70 },
- { 584 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 80 },
- { 502 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 85 },
- { 432 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 90 },
- { 372 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 95 },
- { 322 / THERMISTOR_SCALING_FACTOR_6V0_51_47, 100 },
-};
-
-static const struct thermistor_info thermistor_info_6v0_51_47 = {
- .scaling_factor = THERMISTOR_SCALING_FACTOR_6V0_51_47,
- .num_pairs = ARRAY_SIZE(thermistor_data_6v0_51_47),
- .data = thermistor_data_6v0_51_47,
-};
-
-int get_temp_6v0_51k1_47k_4050b(int idx_adc, int *temp_ptr)
-{
- return thermistor_get_temperature(idx_adc, temp_ptr,
- &thermistor_info_6v0_51_47);
-}
-#endif /* CONFIG_STEINHART_HART_6V0_51K1_47K_4050B */
-
-#ifdef CONFIG_STEINHART_HART_3V0_22K6_47K_4050B
-/*
- * Data derived from Steinhart-Hart equation in a resistor divider circuit with
- * Vdd=3000mV, R = 22.6Kohm, and thermistor (B = 4050, T0 = 298.15 K, nominal
- * resistance (R0) = 47Kohm).
- */
-#define THERMISTOR_SCALING_FACTOR_22_47 11
-static const struct thermistor_data_pair thermistor_data_22_47[] = {
- { 2619 / THERMISTOR_SCALING_FACTOR_22_47, 0 },
- { 2421 / THERMISTOR_SCALING_FACTOR_22_47, 10 },
- { 2168 / THERMISTOR_SCALING_FACTOR_22_47, 20 },
- { 1875 / THERMISTOR_SCALING_FACTOR_22_47, 30 },
- { 1563 / THERMISTOR_SCALING_FACTOR_22_47, 40 },
- { 1262 / THERMISTOR_SCALING_FACTOR_22_47, 50 },
- { 994 / THERMISTOR_SCALING_FACTOR_22_47, 60 },
- { 769 / THERMISTOR_SCALING_FACTOR_22_47, 70 },
- { 588 / THERMISTOR_SCALING_FACTOR_22_47, 80 },
- { 513 / THERMISTOR_SCALING_FACTOR_22_47, 85 },
- { 448 / THERMISTOR_SCALING_FACTOR_22_47, 90 },
- { 390 / THERMISTOR_SCALING_FACTOR_22_47, 95 },
- { 340 / THERMISTOR_SCALING_FACTOR_22_47, 100 },
-};
-
-static const struct thermistor_info thermistor_info_22_47 = {
- .scaling_factor = THERMISTOR_SCALING_FACTOR_22_47,
- .num_pairs = ARRAY_SIZE(thermistor_data_22_47),
- .data = thermistor_data_22_47,
-};
-
-int get_temp_3v0_22k6_47k_4050b(int idx_adc, int *temp_ptr)
-{
- return thermistor_get_temperature(idx_adc, temp_ptr,
- &thermistor_info_22_47);
-}
-#endif /* CONFIG_STEINHART_HART_3V0_22K6_47K_4050B */
-
-#ifdef CONFIG_STEINHART_HART_3V3_30K9_47K_4050B
-/*
- * Data derived from Steinhart-Hart equation in a resistor divider circuit with
- * Vdd=3300mV, R = 30.9Kohm, and thermistor (B = 4050, T0 = 298.15 K, nominal
- * resistance (R0) = 47Kohm).
- */
-#define THERMISTOR_SCALING_FACTOR_31_47 11
-static const struct thermistor_data_pair thermistor_data_31_47[] = {
- { 2753 / THERMISTOR_SCALING_FACTOR_31_47, 0 },
- { 2487 / THERMISTOR_SCALING_FACTOR_31_47, 10 },
- { 2165 / THERMISTOR_SCALING_FACTOR_31_47, 20 },
- { 1813 / THERMISTOR_SCALING_FACTOR_31_47, 30 },
- { 1145 / THERMISTOR_SCALING_FACTOR_31_47, 50 },
- { 878 / THERMISTOR_SCALING_FACTOR_31_47, 60 },
- { 665 / THERMISTOR_SCALING_FACTOR_31_47, 70 },
- { 500 / THERMISTOR_SCALING_FACTOR_31_47, 80 },
- { 375 / THERMISTOR_SCALING_FACTOR_31_47, 90 },
- { 282 / THERMISTOR_SCALING_FACTOR_31_47, 100 },
-};
-
-static const struct thermistor_info thermistor_info_31_47 = {
- .scaling_factor = THERMISTOR_SCALING_FACTOR_31_47,
- .num_pairs = ARRAY_SIZE(thermistor_data_31_47),
- .data = thermistor_data_31_47,
-};
-
-int get_temp_3v3_30k9_47k_4050b(int idx_adc, int *temp_ptr)
-{
- return thermistor_get_temperature(idx_adc, temp_ptr,
- &thermistor_info_31_47);
-}
-#endif /* CONFIG_STEINHART_HART_3V3_30K9_47K_4050B */