diff options
-rw-r--r-- | driver/als_si114x.c | 12 | ||||
-rw-r--r-- | driver/als_si114x.h | 4 |
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]; }; |