summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorBill Richardson <wfrichar@chromium.org>2013-11-07 08:03:46 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-11-07 23:42:56 +0000
commitf23e68d721eb282619f1dd7b5b3ac4392234e6d4 (patch)
tree0aab4bd5d2134572087477d92aa52c24ca58c220 /driver
parentbb9b335e31cda78f4a0e7c3e546ffcc1499c989b (diff)
downloadchrome-ec-f23e68d721eb282619f1dd7b5b3ac4392234e6d4.tar.gz
Add ALS driver for light sensors connected to EC
This adds the driver and a console command to read an Intersil ISL29305 light sensor connected to the EC. BUG=chrome-os-partner:23380 BRANCH=samus TEST=manual Run the "als" command from the EC console, while pointing the sensor in various directions. It should give higher numbers when facing a light source. If you get "Error 1", it means the ALS isn't powered. Change-Id: I855ed64dab7fc60e29126ab3e97669be24dc6a64 Signed-off-by: Bill Richardson <wfrichar@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/176056
Diffstat (limited to 'driver')
-rw-r--r--driver/als_isl29035.c65
-rw-r--r--driver/als_isl29035.h13
-rw-r--r--driver/build.mk3
3 files changed, 81 insertions, 0 deletions
diff --git a/driver/als_isl29035.c b/driver/als_isl29035.c
new file mode 100644
index 0000000000..13e5d77c14
--- /dev/null
+++ b/driver/als_isl29035.c
@@ -0,0 +1,65 @@
+/* Copyright (c) 2013 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.
+ *
+ * Intersil ILS29035 light sensor driver
+ */
+
+#include "driver/als_isl29035.h"
+#include "common.h"
+#include "i2c.h"
+#include "timer.h"
+
+/* I2C interface */
+#define ILS29035_I2C_ADDR 0x88
+#define ILS29035_REG_COMMAND_I 0
+#define ILS29035_REG_COMMAND_II 1
+#define ILS29035_REG_DATA_LSB 2
+#define ILS29035_REG_DATA_MSB 3
+#define ILS29035_REG_INT_LT_LSB 4
+#define ILS29035_REG_INT_LT_MSB 5
+#define ILS29035_REG_INT_HT_LSB 6
+#define ILS29035_REG_INT_HT_MSB 7
+#define ILS29035_REG_ID 15
+
+int isl29035_read_lux(int *lux)
+{
+ int rv, lsb, msb, data;
+
+ /* Tell it to read once */
+ rv = i2c_write8(I2C_PORT_ALS, ILS29035_I2C_ADDR,
+ ILS29035_REG_COMMAND_I, 0x20);
+ if (rv)
+ return rv;
+
+ /* The highest precision (default) should take ~90ms */
+ usleep(100 * MSEC);
+
+ /* NOTE: It is necessary to read the LSB first, then the MSB. If you do
+ * it in the opposite order, the results are not correct. This is
+ * apparently an undocumented "feature".
+ */
+
+ /* Read lsb */
+ rv = i2c_read8(I2C_PORT_ALS, ILS29035_I2C_ADDR,
+ ILS29035_REG_DATA_LSB, &lsb);
+ if (rv)
+ return rv;
+
+ /* Read msb */
+ rv = i2c_read8(I2C_PORT_ALS, ILS29035_I2C_ADDR,
+ ILS29035_REG_DATA_MSB, &msb);
+ if (rv)
+ return rv;
+
+ data = (msb << 8) | lsb;
+
+ /*
+ * The default power-on values will give 16 bits of precision:
+ * 0x0000-0xffff indicates 0-1000 lux. If you change the defaults,
+ * you'll need to change the scale factor accordingly.
+ */
+ *lux = data * 1000 / 0xffff;
+
+ return EC_SUCCESS;
+}
diff --git a/driver/als_isl29035.h b/driver/als_isl29035.h
new file mode 100644
index 0000000000..8d3a4ac0f5
--- /dev/null
+++ b/driver/als_isl29035.h
@@ -0,0 +1,13 @@
+/* Copyright (c) 2013 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.
+ *
+ * Intersil ILS29035 light sensor driver
+ */
+
+#ifndef __CROS_EC_ALS_ILS29035_H
+#define __CROS_EC_ALS_ILS29035_H
+
+int isl29035_read_lux(int *lux);
+
+#endif /* __CROS_EC_ALS_ILS29035_H */
diff --git a/driver/build.mk b/driver/build.mk
index 013cfb4159..59e27f1efa 100644
--- a/driver/build.mk
+++ b/driver/build.mk
@@ -6,6 +6,9 @@
# Drivers for off-chip devices
#
+# ALS drivers
+driver-$(CONFIG_ALS_ISL29035)+=als_isl29035.o
+
# Batteries
driver-$(CONFIG_BATTERY_BQ20Z453)+=battery/bq20z453.o
driver-$(CONFIG_BATTERY_BQ27541)+=battery/bq27541.o