summaryrefslogtreecommitdiff
path: root/include/driver/temp_sensor/thermistor.h
diff options
context:
space:
mode:
authorDawid Niedzwiecki <dn@semihalf.com>2021-04-20 14:12:36 +0200
committerCommit Bot <commit-bot@chromium.org>2021-04-22 01:42:36 +0000
commit97f1427e200b70d0654d7391f45697f48d1a3d4c (patch)
tree2a7c00ee9720d01956694ee055a7497a51cdf7b6 /include/driver/temp_sensor/thermistor.h
parent11427bfeb18b81afeb5fcf67ed5205748ce5be20 (diff)
downloadchrome-ec-97f1427e200b70d0654d7391f45697f48d1a3d4c.tar.gz
thermisor: move header to include dir
Move the "thermistor.h" header to the include/driver/temp_sensor directory. It is used by the Zephyr shim, so the change is useful to include the header. BUG=b:180403276 BRANCH=none TEST=make buildall Signed-off-by: Dawid Niedzwiecki <dn@semihalf.com> Change-Id: I0e83df97e50a3b324440b65ddb900ddf135f2439 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2843323 Reviewed-by: Keith Short <keithshort@chromium.org> Commit-Queue: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'include/driver/temp_sensor/thermistor.h')
-rw-r--r--include/driver/temp_sensor/thermistor.h150
1 files changed, 150 insertions, 0 deletions
diff --git a/include/driver/temp_sensor/thermistor.h b/include/driver/temp_sensor/thermistor.h
new file mode 100644
index 0000000000..7ebe2b42ac
--- /dev/null
+++ b/include/driver/temp_sensor/thermistor.h
@@ -0,0 +1,150 @@
+/* Copyright 2015 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.
+ */
+
+/* Thermistor module for Chrome EC */
+
+#ifndef __CROS_EC_TEMP_SENSOR_THERMISTOR_H
+#define __CROS_EC_TEMP_SENSOR_THERMISTOR_H
+
+struct thermistor_data_pair {
+ uint8_t mv; /* Scaled voltage level at ADC (in mV) */
+ uint8_t temp; /* Temperature in Celsius */
+};
+
+struct thermistor_info {
+ uint8_t scaling_factor; /* Scaling factor for voltage in data pair. */
+ uint8_t num_pairs; /* Number of data pairs. */
+
+ /*
+ * Values between given data pairs will be calculated as points on
+ * a line. Pairs can be derived using the Steinhart-Hart equation.
+ *
+ * Guidelines for data sets:
+ * - Must contain at least two pairs.
+ * - First and last pairs are the max and min.
+ * - Pairs must be sorted in descending order.
+ * - 5 pairs should provide reasonable accuracy in most cases. Use
+ * points where the slope changes significantly or to recalibrate
+ * the algorithm if needed.
+ */
+ const struct thermistor_data_pair *data;
+};
+
+/**
+ * Calculate temperature using linear interpolation of data points.
+ *
+ * Given a set of datapoints, the algorithm will calculate the "step" in
+ * between each one in order to interpolate missing entries.
+ *
+ * @param mv Value read from ADC (in millivolts).
+ * @param info Reference data set and info.
+ *
+ * @return temperature in C
+ */
+int thermistor_linear_interpolate(uint16_t mv,
+ const struct thermistor_info *info);
+
+#ifdef CONFIG_THERMISTOR_NCP15WB
+/**
+ * ncp15wb temperature conversion routine.
+ *
+ * @param adc 10bit raw data on adc.
+ *
+ * @return temperature in C.
+ */
+int ncp15wb_calculate_temp(uint16_t adc);
+#endif /* CONFIG_THERMISTOR_NCP15WB */
+
+#ifdef CONFIG_STEINHART_HART_3V3_13K7_47K_4050B
+/**
+ * Reads the specified ADC channel and uses a lookup table and interpolation to
+ * return a temperature in degrees K.
+ *
+ * The lookup table is based off of a resistor divider circuit on 3.3V with a
+ * 13.7K resistor in series with a thermistor with nominal value of 47K (at 25C)
+ * and a B (25/100) value of 4050.
+ *
+ * @param idx_adc The idx value from the temp_sensor_t struct, which is
+ * the ADC channel to read and convert to degrees K
+ * @param temp_ptr Destination for temperature (in degrees K)
+ *
+ * @return EC_SUCCESS, or non-zero if error.
+ */
+int get_temp_3v3_13k7_47k_4050b(int idx_adc, int *temp_ptr);
+#endif
+
+#ifdef CONFIG_STEINHART_HART_3V3_51K1_47K_4050B
+/**
+ * Reads the specified ADC channel and uses a lookup table and interpolation to
+ * return a temperature in degrees K.
+ *
+ * The lookup table is based off of a resistor divider circuit on 3.3V with a
+ * 51.1K resistor in series with a thermistor with nominal value of 47K (at 25C)
+ * and a B (25/100) value of 4050.
+ *
+ * @param idx_adc The idx value from the temp_sensor_t struct, which is
+ * the ADC channel to read and convert to degrees K
+ * @param temp_ptr Destination for temperature (in degrees K)
+ *
+ * @return EC_SUCCESS, or non-zero if error.
+ */
+int get_temp_3v3_51k1_47k_4050b(int idx_adc, int *temp_ptr);
+#endif
+
+#ifdef CONFIG_STEINHART_HART_6V0_51K1_47K_4050B
+/**
+ * Reads the specified ADC channel and uses a lookup table and interpolation to
+ * return a temperature in degrees K.
+ *
+ * The lookup table is based off of a resistor divider circuit on 6.0V with a
+ * 51.1K resistor in series with a thermistor with nominal value of 47K (at 25C)
+ * and a B (25/100) value of 4050.
+ *
+ * @param idx_adc The idx value from the temp_sensor_t struct, which is
+ * the ADC channel to read and convert to degrees K
+ * @param temp_ptr Destination for temperature (in degrees K)
+ *
+ * @return EC_SUCCESS, or non-zero if error.
+ */
+int get_temp_6v0_51k1_47k_4050b(int idx_adc, int *temp_ptr);
+#endif
+
+#ifdef CONFIG_STEINHART_HART_3V0_22K6_47K_4050B
+/**
+ * Reads the specified ADC channel and uses a lookup table and interpolation to
+ * return a temperature in degrees K.
+ *
+ * The lookup table is based off of a resistor divider circuit on 3V with a
+ * 22.6K resistor in series with a thermistor with nominal value of 47K (at 25C)
+ * and a B (25/100) value of 4050.
+ *
+ * @param idx_adc The idx value from the temp_sensor_t struct, which is
+ * the ADC channel to read and convert to degrees K
+ * @param temp_ptr Destination for temperature (in degrees K)
+ *
+ * @return EC_SUCCESS, or non-zero if error.
+ */
+int get_temp_3v0_22k6_47k_4050b(int idx_adc, int *temp_ptr);
+#endif
+
+#ifdef CONFIG_STEINHART_HART_3V3_30K9_47K_4050B
+/**
+ * Reads the specified ADC channel and uses a lookup table and interpolation to
+ * return a temperature in degrees K.
+ *
+ * The lookup table is based off of a resistor divider circuit on 3.3V with a
+ * 30.9K resistor in series with a thermistor with nominal value of 47K (at 25C)
+ * and a B (25/100) value of 4050.
+ *
+ * @param idx_adc The idx value from the temp_sensor_t struct, which is
+ * the ADC channel to read and convert to degrees K
+ * @param temp_ptr Destination for temperature (in degrees K)
+ *
+ * @return EC_SUCCESS, or non-zero if error.
+ */
+int get_temp_3v3_30k9_47k_4050b(int idx_adc, int *temp_ptr);
+#endif
+
+#endif /* __CROS_EC_TEMP_SENSOR_THERMISTOR_NCP15WB_H */