diff options
author | YB.Ha <ybha@samsung.com> | 2017-11-24 18:30:40 +0900 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2017-12-08 00:37:03 -0800 |
commit | 47a6acca3a41f21f8fe08e5ecb7b4d23acb6eb00 (patch) | |
tree | 3ba213fc0f9fef8b324543913122420487cf32b4 | |
parent | aa63578a25e2cc8b321d8f4868414b9628ec027a (diff) | |
download | chrome-ec-47a6acca3a41f21f8fe08e5ecb7b4d23acb6eb00.tar.gz |
motion: Add bh1730 as a motion sensor
- Add ROHM ambient light sensor driver
- Add als sensor to motion sensors
BRANCH=glados
BUG=b:67022366
TEST=This driver is tested in caroline
Signed-off-by: yb.ha <ybha@samsung.com>
Change-Id: Ic73c50e17b412975f7850b7348ce310180f7a6eb
Reviewed-on: https://chromium-review.googlesource.com/784659
Commit-Ready: YongBeum Ha <ybha@samsung.com>
Tested-by: YongBeum Ha <ybha@samsung.com>
Reviewed-by: Gwendal Grignou <gwendal@google.com>
-rw-r--r-- | driver/als_bh1730.c | 175 | ||||
-rw-r--r-- | driver/als_bh1730.h | 91 | ||||
-rw-r--r-- | driver/build.mk | 1 | ||||
-rw-r--r-- | include/config.h | 6 | ||||
-rw-r--r-- | include/ec_commands.h | 1 | ||||
-rw-r--r-- | util/ectool.c | 3 |
6 files changed, 277 insertions, 0 deletions
diff --git a/driver/als_bh1730.c b/driver/als_bh1730.c new file mode 100644 index 0000000000..57db6fdba7 --- /dev/null +++ b/driver/als_bh1730.c @@ -0,0 +1,175 @@ +/* Copyright 2017 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. + * + * Rohm BH1730 Ambient light sensor driver + */ + +#include "accelgyro.h" +#include "config.h" +#include "console.h" +#include "driver/als_bh1730.h" +#include "i2c.h" + +#define CPRINTS(format, args...) cprints(CC_MOTION_SENSE, format, ## args) +#define CPRINTF(format, args...) cprintf(CC_MOTION_SENSE, format, ## args) + +/** + * Convert BH1730 data0, data1 to lux + */ +static int bh1730_convert_to_lux(uint32_t data0_1) +{ + int lux; + uint16_t data0 = 0x0000ffff & data0_1; + uint16_t data1 = data0_1 >> 16; + uint32_t d0_1k = data0 * 1000; + uint32_t d1_1k = data1 * 1000; + uint32_t d_temp = d1_1k / d0_1k; + uint32_t d_lux; + + if (data0 == 0) + return 0; + + if(d_temp < BH1730_LUXTH1_1K) { + d0_1k = BH1730_LUXTH1_D0_1K * data0; + d1_1k = BH1730_LUXTH1_D1_1K * data1; + } else if(d_temp < BH1730_LUXTH2_1K) { + d0_1k = BH1730_LUXTH2_D0_1K * data0; + d1_1k = BH1730_LUXTH2_D1_1K * data1; + } else if(d_temp < BH1730_LUXTH3_1K) { + d0_1k = BH1730_LUXTH3_D0_1K * data0; + d1_1k = BH1730_LUXTH3_D1_1K * data1; + } else if(d_temp < BH1730_LUXTH4_1K) { + d0_1k = BH1730_LUXTH4_D0_1K * data0; + d1_1k = BH1730_LUXTH4_D1_1K * data1; + } else + return 0; + + d_lux = (d0_1k - d1_1k) / BH1730_GAIN_DIV; + d_lux *= 100; + lux = d_lux / ITIME_MS_X_1K; + + return lux; +} + +/** + * Read BH1730 light sensor data. + */ +static int bh1730_read_lux(const struct motion_sensor_t *s, vector_3_t v) +{ + struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s); + int ret; + int data0_1; + + /* read data0 and data1 from sensor */ + ret = i2c_read32(s->port, s->addr, BH1730_DATA0LOW, &data0_1); + if (ret != EC_SUCCESS) { + CPRINTF("bh1730_read_lux - fail %d\n", ret); + return ret; + } + + /* convert sensor data0 and data1 to lux */ + v[0] = bh1730_convert_to_lux(data0_1); + v[1] = 0; + v[2] = 0; + + /* + * Return an error when nothing change to prevent filling the + * fifo with useless data. + */ + if (v[0] == drv_data->last_value) + return EC_ERROR_UNCHANGED; + else + return EC_SUCCESS; +} + +static int bh1730_set_range(const struct motion_sensor_t *s, int range, + int rnd) +{ + return EC_SUCCESS; +} + +static int bh1730_get_range(const struct motion_sensor_t *s) +{ + return 1; +} + +static int bh1730_set_data_rate(const struct motion_sensor_t *s, + int rate, int roundup) +{ + struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s); + + /* now only one rate supported */ + drv_data->rate = BH1730_10000_MHZ; + + return EC_SUCCESS; +} + +static int bh1730_get_data_rate(const struct motion_sensor_t *s) +{ + struct bh1730_drv_data_t *drv_data = BH1730_GET_DATA(s); + + return drv_data->rate; +} + +static int bh1730_set_offset(const struct motion_sensor_t *s, + const int16_t *offset, + int16_t temp) +{ + return EC_SUCCESS; +} + +static int bh1730_get_offset(const struct motion_sensor_t *s, + int16_t *offset, + int16_t *temp) +{ + *offset = 0; + + return EC_SUCCESS; +} + +/** + * Initialise BH1730 Ambient light sensor. + */ +static int bh1730_init(const struct motion_sensor_t *s) +{ + int ret; + + /* power and measurement bit high */ + ret = i2c_write8(s->port, s->addr, + BH1730_CONTROL, + BH1730_CONTROL_POWER_ENABLE|BH1730_CONTROL_ADC_EN_ENABLE); + + if (ret != EC_SUCCESS) { + CPRINTF("bh1730_init_sensor - enable fail %d\n", ret); + return ret; + } + + /* set timing */ + ret = i2c_write8(s->port, s->addr, BH1730_TIMING, BH1730_CONF_ITIME); + if (ret != EC_SUCCESS) { + CPRINTF("bh1730_init_sensor - time fail %d\n", ret); + return ret; + } + /* set ADC gain */ + ret = i2c_write8(s->port, s->addr, BH1730_GAIN, BH1730_CONF_GAIN); + + if (ret != EC_SUCCESS) { + CPRINTF("bh1730_init_sensor - gain fail %d\n", ret); + return ret; + } + + return sensor_init_done(s); +} + +const struct accelgyro_drv bh1730_drv = { + .init = bh1730_init, + .read = bh1730_read_lux, + .set_range = bh1730_set_range, + .get_range = bh1730_get_range, + .set_offset = bh1730_set_offset, + .get_offset = bh1730_get_offset, + .set_data_rate = bh1730_set_data_rate, + .get_data_rate = bh1730_get_data_rate, +}; + diff --git a/driver/als_bh1730.h b/driver/als_bh1730.h new file mode 100644 index 0000000000..3cd8757822 --- /dev/null +++ b/driver/als_bh1730.h @@ -0,0 +1,91 @@ +/* Copyright 2017 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. + * + * Rohm BH1730 Ambient light sensor driver + */ + +#ifndef __CROS_EC_ALS_BH1730_H +#define __CROS_EC_ALS_BH1730_H + +/* I2C interface */ +#define BH1730_I2C_ADDR (0x29 << 1) + +/* BH1730 registers */ +#define BH1730_CONTROL 0x80 +#define BH1730_TIMING 0x81 +#define BH1730_INTERRUPT 0x82 +#define BH1730_THLLOW 0x83 +#define BH1730_THLHIGH 0x84 +#define BH1730_THHLOW 0x85 +#define BH1730_THHHIGH 0x86 +#define BH1730_GAIN 0x87 +#define BH1730_OPART_ID 0x92 +#define BH1730_DATA0LOW 0x94 +#define BH1730_DATA0HIGH 0x95 +#define BH1730_DATA1LOW 0x96 +#define BH1730_DATA1HIGH 0x97 +/* Software reset */ +#define BH1730_RESET 0xE4 + +/* Registers bits */ +#define BH1730_CONTROL_ADC_INTR_INACTIVE (0x00 << 5) +#define BH1730_CONTROL_ADC_INTR_ACTIVE (0x01 << 5) +#define BH1730_CONTROL_ADC_VALID (0x01 << 4) +#define BH1730_CONTROL_ONE_TIME_CONTINOUS (0x00 << 3) +#define BH1730_CONTROL_ONE_TIME_ONETIME (0x01 << 3) +#define BH1730_CONTROL_DATA_SEL_TYPE0_AND_1 (0x00 << 2) +#define BH1730_CONTROL_DATA_SEL_TYPE0 (0x01 << 2) +#define BH1730_CONTROL_ADC_EN_DISABLE (0x00 << 1) +#define BH1730_CONTROL_ADC_EN_ENABLE (0x01 << 1) +#define BH1730_CONTROL_POWER_DISABLE (0x00 << 0) +#define BH1730_CONTROL_POWER_ENABLE (0x01 << 0) + +#define BH1730_GAIN_GAIN_X1_GAIN (0x00 << 0) +#define BH1730_GAIN_GAIN_X2_GAIN (0x01 << 0) +#define BH1730_GAIN_GAIN_X64_GAIN (0x02 << 0) +#define BH1730_GAIN_GAIN_X128_GAIN (0x03 << 0) + +/* Sensor configuration */ +/* Select Gain */ +#define BH1730_CONF_GAIN BH1730_GAIN_GAIN_X64_GAIN +#define BH1730_GAIN_DIV 64 + +/* Select Itime, 0xDA is 102.6ms = 38*2.7ms */ +#define BH1730_CONF_ITIME 0xDA +#define ITIME_MS_X_10 ((256 - BH1730_CONF_ITIME) * 27) +#define ITIME_MS_X_1K (ITIME_MS_X_10*100) + +/* default Itime is about 10Hz */ +#define BH1730_10000_MHZ (10*1000) + +/* + * Use default lux calculation formula parameters if board specific + * parameters are not defined. + */ +#ifndef CONFIG_ALS_BH1730_LUXTH_PARAMS +#define BH1730_LUXTH1_1K 260 +#define BH1730_LUXTH1_D0_1K 1290 +#define BH1730_LUXTH1_D1_1K 2733 +#define BH1730_LUXTH2_1K 550 +#define BH1730_LUXTH2_D0_1K 797 +#define BH1730_LUXTH2_D1_1K 859 +#define BH1730_LUXTH3_1K 1090 +#define BH1730_LUXTH3_D0_1K 510 +#define BH1730_LUXTH3_D1_1K 345 +#define BH1730_LUXTH4_1K 2130 +#define BH1730_LUXTH4_D0_1K 276 +#define BH1730_LUXTH4_D1_1K 130 +#endif + +#define BH1730_GET_DATA(_s) ((struct bh1730_drv_data_t *)(_s)->drv_data) + +struct bh1730_drv_data_t { + int rate; + int last_value; +}; + +extern const struct accelgyro_drv bh1730_drv; + +#endif /* __CROS_EC_ALS_BH1730_H */ + diff --git a/driver/build.mk b/driver/build.mk index 0a966b7cf8..a35782daee 100644 --- a/driver/build.mk +++ b/driver/build.mk @@ -28,6 +28,7 @@ driver-$(CONFIG_ALS_AL3010)+=als_al3010.o driver-$(CONFIG_ALS_ISL29035)+=als_isl29035.o driver-$(CONFIG_ALS_OPT3001)+=als_opt3001.o driver-$(CONFIG_ALS_SI114X)+=als_si114x.o +driver-$(CONFIG_ALS_BH1730)+=als_bh1730.o # Barometers driver-$(CONFIG_BARO_BMP280)+=baro_bmp280.o diff --git a/include/config.h b/include/config.h index f5c26ffa55..c90ab85c1f 100644 --- a/include/config.h +++ b/include/config.h @@ -152,6 +152,12 @@ #undef CONFIG_ALS #endif #undef CONFIG_ALS_AL3010 +#undef CONFIG_ALS_BH1730 +/* + * If defined, BH1730 uses board specific lux calculation formula parameters. + * If not defined, BH1730 uses default parameters to calculate lux. + */ +#undef CONFIG_ALS_BH1730_LUXTH_PARAMS #undef CONFIG_ALS_ISL29035 #undef CONFIG_ALS_OPT3001 /* Define the exact model ID present on the board: SI1141 = 41, SI1142 = 42, */ diff --git a/include/ec_commands.h b/include/ec_commands.h index 367b625ffe..cc53a4f314 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -2259,6 +2259,7 @@ enum motionsensor_chip { MOTIONSENSE_CHIP_BMA255 = 8, MOTIONSENSE_CHIP_BMP280 = 9, MOTIONSENSE_CHIP_OPT3001 = 10, + MOTIONSENSE_CHIP_BH1730 = 11, }; /* List of orientation positions */ diff --git a/util/ectool.c b/util/ectool.c index f8f9e6cfef..eb4dd398b6 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -3822,6 +3822,9 @@ static int cmd_motionsense(int argc, char **argv) case MOTIONSENSE_CHIP_OPT3001: printf("opt3001\n"); break; + case MOTIONSENSE_CHIP_BH1730: + printf("bh1730\n"); + break; default: printf("unknown\n"); } |