summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGerrit <chrome-bot@google.com>2012-02-28 11:48:18 -0800
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2012-02-28 11:48:18 -0800
commit7e40bacb1bbf99deac444712a271a264cd62b5b9 (patch)
tree080236a4a2c57af35c1c4e5d9f710abeeb725265
parent2a469c61cf3362bc2844d293ac8b1c99f4170191 (diff)
parentc55b1527aee1415c666007a6943724a3836b508b (diff)
downloadchrome-ec-7e40bacb1bbf99deac444712a271a264cd62b5b9.tar.gz
Merge "Remove unused temperature command"
-rw-r--r--common/tmp006.c85
1 files changed, 46 insertions, 39 deletions
diff --git a/common/tmp006.c b/common/tmp006.c
index ff38286aef..6d3cf5edf4 100644
--- a/common/tmp006.c
+++ b/common/tmp006.c
@@ -50,6 +50,7 @@ static int tmp006_read_die_temp(int idx)
*/
static int tmp006_calculate_object_temp(int Tdie_i, int Vobj_i, int S0_i)
{
+#ifdef CONFIG_FPU
float Tdie, Vobj, S0;
float Tx, S, Vos, Vx, fv, Tobj, T4;
int Tobj_i;
@@ -77,6 +78,51 @@ static int tmp006_calculate_object_temp(int Tdie_i, int Vobj_i, int S0_i)
disable_fpu(Tobj_i);
return Tobj_i;
+#else
+ /* This is the fixed-point version of object temperature calculation.
+ * Should be accurate but it is hard to prevent and debug
+ * overflow/underflow problem. Only use this version if there is no
+ * FPU support.
+ * Division is delayed when possible to preserve precision, but should
+ * not cause overflow.
+ * Assuming Tdie is between 200K and 400K, and S0 between 3e-14 and
+ * 9e-14, the maximum value during the calculation should be less than
+ * (1 << 30), which fits in int32_t.
+ */
+ int32_t Tx, S19, Vos, Vx, fv9, ub, lb;
+
+ Tx = Tdie - 29815;
+ /* S19 is the sensitivity multipled by 1e19 */
+ S19 = S0 * (100000 + 175 * Tx / 100 -
+ 1678 * Tx / 100 * Tx / 100000) / 1000;
+ /* Vos is the offset voltage in nV */
+ Vos = -29400 - 570 * Tx / 100 + 463 * Tx / 100 * Tx / 10000;
+ Vx = Vobj - Vos;
+ /* fv9 is Seebeck coefficient f(Vobj) multipled by 1e9 */
+ fv9 = Vx + 134 * Vx / 100000 * Vx / 100000;
+
+ /* The last step in the calculation involves square root, so we use
+ * binary search.
+ * Assuming the object temperature is between 200K and 400K, the search
+ * should take at most 14 iterations.
+ */
+ ub = 40000;
+ lb = 20000;
+ while (lb != ub) {
+ int32_t t, rhs, lhs;
+
+ t = (ub + lb) / 2;
+ lhs = t / 100 * t / 10000 * t / 10000 * (S19/100) / 1000 * t;
+ rhs = Tdie / 100 * Tdie / 10000 * Tdie / 10000 * (S19/100) /
+ 1000 * Tdie + fv9 * 1000;
+ if (lhs > rhs)
+ ub = t;
+ else
+ lb = t + 1;
+ }
+
+ return ub;
+#endif /* CONFIG_FPU */
}
/* Temporal Correction
@@ -209,45 +255,6 @@ int tmp006_poll(void)
/*****************************************************************************/
/* Console commands */
-/* TMP006 object temperature calculation command.
- * TODO: This command is only for debugging. Remove it when temporal correciton
- * is done.
- */
-static int command_sensor_remote(int argc, char **argv)
-{
- char *e;
- int32_t Td2, Vobj9, Sm03;
-
- if (argc != 4) {
- uart_puts("Usage: tempcorrect <Tdie*100> <Vobj*10^9> <S0*10^11>\n");
- return EC_ERROR_UNKNOWN;
- }
-
- Td2 = strtoi(argv[1], &e, 0);
- if (e && *e) {
- uart_puts("Bad Tdie.\n");
- return EC_ERROR_UNKNOWN;
- }
-
- Vobj9 = strtoi(argv[2], &e, 0);
- if (e && *e) {
- uart_puts("Bad Vobj.\n");
- return EC_ERROR_UNKNOWN;
- }
-
- Sm03 = strtoi(argv[3], &e, 0);
- if (e && *e) {
- uart_puts("Bad S0.\n");
- return EC_ERROR_UNKNOWN;
- }
-
- uart_printf("%d\n",
- tmp006_calculate_object_temp(Td2, Vobj9, Sm03));
-
- return EC_SUCCESS;
-}
-DECLARE_CONSOLE_COMMAND(tempremote, command_sensor_remote);
-
static int command_sensor_info(int argc, char **argv)
{
int i;