summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/als_si114x.c12
-rw-r--r--driver/als_si114x.h4
2 files changed, 16 insertions, 0 deletions
diff --git a/driver/als_si114x.c b/driver/als_si114x.c
index 9a4fd1ff85..f11a2100db 100644
--- a/driver/als_si114x.c
+++ b/driver/als_si114x.c
@@ -81,6 +81,7 @@ error:
static int si114x_read_results(struct motion_sensor_t *s, int nb)
{
int i, ret, val;
+ struct si114x_drv_data_t *data = SI114X_GET_DATA(s);
struct si114x_typed_data_t *type_data = SI114X_GET_TYPED_DATA(s);
#ifdef CONFIG_ACCEL_FIFO
struct ec_response_motion_sensor_data vector;
@@ -113,6 +114,16 @@ static int si114x_read_results(struct motion_sensor_t *s, int nb)
if (ret != EC_SUCCESS)
return ret;
+ if (s->type == MOTIONSENSE_TYPE_PROX)
+ data->covered = (s->raw_xyz[0] < SI114X_COVERED_THRESHOLD);
+ else if (data->covered)
+ /*
+ * The sensor (proximity & light) is covered. The light data
+ * will most likely be incorrect (darker than expected), so
+ * ignore the measurement.
+ */
+ return EC_SUCCESS;
+
/* Add in fifo if changed only */
for (i = 0; i < nb; i++) {
if (s->raw_xyz[i] != s->xyz[i])
@@ -539,6 +550,7 @@ const struct accelgyro_drv si114x_drv = {
struct si114x_drv_data_t g_si114x_data = {
.state = SI114X_NOT_READY,
+ .covered = 0,
.type_data = {
/* Proximity */
{
diff --git a/driver/als_si114x.h b/driver/als_si114x.h
index 2e068eb50c..c044a8bddf 100644
--- a/driver/als_si114x.h
+++ b/driver/als_si114x.h
@@ -204,6 +204,9 @@
#define SI114X_SEQ_REV_A10 0x08
#define SI114X_SEQ_REV_A11 0x09
+/* Proximity sensor finds an object within 5 cm, disable light sensor */
+#define SI114X_COVERED_THRESHOLD 5
+
extern const struct accelgyro_drv si114x_drv;
enum si114x_state {
@@ -232,6 +235,7 @@ struct si114x_typed_data_t {
struct si114x_drv_data_t {
enum si114x_state state;
+ uint8_t covered;
struct si114x_typed_data_t type_data[2];
};