diff options
author | Bill Richardson <wfrichar@chromium.org> | 2013-11-07 08:03:46 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2013-11-07 23:42:56 +0000 |
commit | f23e68d721eb282619f1dd7b5b3ac4392234e6d4 (patch) | |
tree | 0aab4bd5d2134572087477d92aa52c24ca58c220 /driver | |
parent | bb9b335e31cda78f4a0e7c3e546ffcc1499c989b (diff) | |
download | chrome-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.c | 65 | ||||
-rw-r--r-- | driver/als_isl29035.h | 13 | ||||
-rw-r--r-- | driver/build.mk | 3 |
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 |