summaryrefslogtreecommitdiff
path: root/common/temp_sensor.c
diff options
context:
space:
mode:
authorVic Yang <victoryang@google.com>2012-01-12 17:02:10 +0800
committerVic Yang <victoryang@google.com>2012-02-04 14:37:04 +0800
commit000a6d57423e96ffaa2061bd764b8141ea46bb8e (patch)
tree528dd0d5f798101470a1d45f9480bc7b2ecebcb0 /common/temp_sensor.c
parent249467b9f291e2b10a7aafdbb584c68c8b0a4e88 (diff)
downloadchrome-ec-000a6d57423e96ffaa2061bd764b8141ea46bb8e.tar.gz
Refactor temperature sensor code and add support of Link I2C temp sensor.
Refactor board/chip-specific code into corresponding directories. Add support of the four I2C temp sensor in Link. Use table lookup to handle different types of temperature sensors. BUG=chrome-os-partner:7527 TEST=Correctly read EC internal temperature on bds. Compile for link succeeded. Change-Id: I694cfa54e1545798d877fafdf18c5585ab5f03e2
Diffstat (limited to 'common/temp_sensor.c')
-rw-r--r--common/temp_sensor.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/common/temp_sensor.c b/common/temp_sensor.c
new file mode 100644
index 0000000000..a517636ea2
--- /dev/null
+++ b/common/temp_sensor.c
@@ -0,0 +1,142 @@
+/* Copyright (c) 2011 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.
+ */
+
+/* Temperature sensor module for Chrome EC */
+
+#include "i2c.h"
+#include "temp_sensor.h"
+#include "uart.h"
+#include "util.h"
+#include "console.h"
+#include "board.h"
+
+/* Defined in board_temp_sensor.c. Must be in the same order as
+ * in enum temp_sensor_id.
+ */
+extern const struct temp_sensor_t temp_sensors[TEMP_SENSOR_COUNT];
+
+int temp_sensor_read(enum temp_sensor_id id)
+{
+ const struct temp_sensor_t *sensor;
+
+ if (id < 0 || id >= TEMP_SENSOR_COUNT)
+ return -1;
+ sensor = temp_sensors + id;
+ return sensor->read(sensor);
+}
+
+int temp_sensor_tmp006_read(const struct temp_sensor_t* sensor)
+{
+ int traw, t;
+ int rv;
+ int addr = sensor->addr;
+
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0x01, &traw);
+ if (rv)
+ return -1;
+ t = (int)(int16_t)traw / 128;
+ return t + 273;
+}
+
+void temp_sensor_tmp006_config(const struct temp_sensor_t* sensor)
+{
+ int addr = sensor->addr;
+
+ /* Configure the sensor:
+ * 0x7000 = bits 14:12 = continuous conversion
+ * 0x0400 = bits 11:9 = ADC conversion rate (1/sec)
+ * 0x0100 = bit 8 = DRDY pin enabled */
+
+ /* TODO: support shutdown mode for power-saving? */
+ i2c_write16(TMP006_PORT(addr), TMP006_REG(addr), 0x02, 0x7500);
+}
+
+int temp_sensor_tmp006_print(const struct temp_sensor_t* sensor)
+{
+ int vraw, v;
+ int traw, t;
+ int rv;
+ int d;
+ int addr = sensor->addr;
+
+ uart_printf("Debug data from %s:\n", sensor->name);
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0xfe, &d);
+ if (rv)
+ return rv;
+ uart_printf(" Manufacturer ID: 0x%04x\n", d);
+
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0xff, &d);
+ uart_printf(" Device ID: 0x%04x\n", d);
+
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0x02, &d);
+ uart_printf(" Config: 0x%04x\n", d);
+
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0x00, &vraw);
+ v = ((int)(int16_t)vraw * 15625) / 100;
+ uart_printf(" Voltage: 0x%04x = %d nV\n", vraw, v);
+
+ rv = i2c_read16(TMP006_PORT(addr), TMP006_REG(addr), 0x01, &traw);
+ t = ((int)(int16_t)traw * 100) / 128;
+ uart_printf(" Temperature: 0x%04x = %d.%02d C\n",
+ traw, t / 100, t > 0 ? t % 100 : 100 - (t % 100));
+
+ return EC_SUCCESS;
+}
+/*****************************************************************************/
+/* Console commands */
+
+static int command_temps(int argc, char **argv)
+{
+ int i;
+ int rv = 0;
+ int t;
+
+ uart_puts("Reading temperature sensors...\n");
+
+ for (i = 0; i < TEMP_SENSOR_COUNT; ++i) {
+ uart_printf(" Temp from %s: ", temp_sensors[i].name);
+ t = temp_sensor_read(temp_sensors[i].id);
+ if (t < 0) {
+ uart_printf("Error.\n\n");
+ rv = -1;
+ }
+ else
+ uart_printf("%d K\n\n", t);
+ }
+
+ if (rv == -1)
+ return EC_ERROR_UNKNOWN;
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(temps, command_temps);
+
+static int command_sensor_info(int argc, char ** argv)
+{
+ int i;
+ int rv;
+ const struct temp_sensor_t* sensor;
+
+ for (i = 0; i < TEMP_SENSOR_COUNT; ++i) {
+ sensor = temp_sensors + i;
+ if (sensor->print == TEMP_SENSOR_NO_PRINT)
+ continue;
+ rv = sensor->print(sensor);
+ if (rv != EC_SUCCESS)
+ return rv;
+ }
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(tempsinfo, command_sensor_info);
+
+
+/*****************************************************************************/
+/* Initialization */
+
+int temp_sensor_init(void)
+{
+ return EC_SUCCESS;
+}