summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYB.Ha <ybha@samsung.com>2017-11-24 18:30:40 +0900
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2017-12-08 09:42:38 +0000
commitadf7b12df7f088ee5d8c0fccef68163d8ec567f7 (patch)
tree344790e8babbf50aa10a6be946755564324d6218
parentb7331af1fd77560b02e3f0b10b54d5517106721c (diff)
downloadchrome-ec-adf7b12df7f088ee5d8c0fccef68163d8ec567f7.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=emerge-caroline chromeos-ec ec-utils 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> Reviewed-on: https://chromium-review.googlesource.com/816917 Reviewed-by: Vincent Palatin <vpalatin@chromium.org> Commit-Queue: YongBeum Ha <ybha@samsung.com>
-rw-r--r--driver/als_bh1730.c175
-rw-r--r--driver/als_bh1730.h91
-rw-r--r--driver/build.mk1
-rw-r--r--include/config.h6
-rw-r--r--include/ec_commands.h1
-rw-r--r--util/ectool.c3
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..b55f860e72
--- /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(I2C_PORT_ALS, 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(I2C_PORT_ALS, 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(I2C_PORT_ALS, 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(I2C_PORT_ALS, s->addr, BH1730_GAIN, BH1730_CONF_GAIN);
+
+ if (ret != EC_SUCCESS) {
+ CPRINTF("bh1730_init_sensor - gain fail %d\n", ret);
+ return ret;
+ }
+
+ return EC_SUCCESS;
+}
+
+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 c06bbf5a16..fbcbc780a2 100644
--- a/driver/build.mk
+++ b/driver/build.mk
@@ -21,6 +21,7 @@ driver-$(CONFIG_GYRO_L3GD20H)+=gyro_l3gd20h.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
#Keyboard Backlight
driver-$(CONFIG_KBLIGHT_MAX14521)+=kbl_max14521.o
diff --git a/include/config.h b/include/config.h
index 9bf23c4ac3..098d921bf0 100644
--- a/include/config.h
+++ b/include/config.h
@@ -115,6 +115,12 @@
#else
#undef CONFIG_ALS
#endif
+#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 cc323810ff..a560a67c14 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -1877,6 +1877,7 @@ enum motionsensor_chip {
MOTIONSENSE_CHIP_BMA255 = 8,
MOTIONSENSE_CHIP_BMP280 = 9,
MOTIONSENSE_CHIP_OPT3001 = 10,
+ MOTIONSENSE_CHIP_BH1730 = 11,
};
struct __ec_todo_packed ec_response_motion_sensor_data {
diff --git a/util/ectool.c b/util/ectool.c
index cc2e3376f1..1f9d4069fe 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -3477,6 +3477,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");
}