diff options
| author | Evan Wilson <evan@oliodevices.com> | 2015-07-02 03:26:20 -0700 |
|---|---|---|
| committer | Evan Wilson <evan@oliodevices.com> | 2015-07-02 03:26:20 -0700 |
| commit | ecf02dbfdbd1caab5c79b2d3bff188a5360a9da4 (patch) | |
| tree | 1ffd9dc917b2deb2b7e7fc82554650c5d7afe938 | |
| parent | 69a77a4d2e92d81f45249f09126bd5d2c36a0b5d (diff) | |
| download | olio-linux-3.10-ecf02dbfdbd1caab5c79b2d3bff188a5360a9da4.tar.xz olio-linux-3.10-ecf02dbfdbd1caab5c79b2d3bff188a5360a9da4.zip | |
HACK: Tricking significant motion to work off of the tap gesture interruptevan-st-bringup
Change-Id: I7cf00bc99ae094726e164dbf4f568c412f7a7451
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c | 71 | ||||
| -rw-r--r-- | drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c | 40 |
2 files changed, 74 insertions, 37 deletions
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c index 72881512c1b..b6eaa08ae83 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c @@ -156,8 +156,13 @@ #define ST_LSM6DS3_GYRO_STD 6 /* CUSTOM VALUES FOR SIGNIFICANT MOTION SENSOR */ -#define ST_LSM6DS3_SIGN_MOTION_EN_ADDR 0x19 -#define ST_LSM6DS3_SIGN_MOTION_EN_MASK 0x01 +/****** + * WARNING + * Evan: Switching Sig motion to use Tap interrupt + */ +#define ST_LSM6DS3_SIGN_MOTION_EN_ADDR 0x58 +#define ST_LSM6DS3_SIGN_MOTION_EN_MASK 0x02 +#define ST_LSM6DS3_SIGN_MOTION_DRDY_IRQ_MASK 0x40 /* CUSTOM VALUES FOR STEP DETECTOR SENSOR */ #define ST_LSM6DS3_STEP_DETECTOR_DRDY_IRQ_MASK 0x80 @@ -845,6 +850,7 @@ EXPORT_SYMBOL(st_lsm6ds3_reconfigure_fifo); int st_lsm6ds3_set_drdy_irq(struct lsm6ds3_sensor_data *sdata, bool state) { + int err; u8 reg_addr, mask, value; if (state) @@ -884,12 +890,18 @@ int st_lsm6ds3_set_drdy_irq(struct lsm6ds3_sensor_data *sdata, bool state) mask = ST_LSM6DS3_FIFO_THR_IRQ_MASK; break; case ST_INDIO_DEV_SIGN_MOTION: - if (sdata->cdata->sensors_enabled & - (1 << ST_INDIO_DEV_STEP_DETECTOR)) - return 0; - - reg_addr = ST_LSM6DS3_INT1_ADDR; - mask = ST_LSM6DS3_STEP_DETECTOR_DRDY_IRQ_MASK; + //if (sdata->cdata->sensors_enabled & + // (1 << ST_INDIO_DEV_STEP_DETECTOR)) + // return 0; + // The double tap needs to be enabled in-order for latched mode to work + err = st_lsm6ds3_write_data_with_mask(sdata->cdata, + ST_LSM6DS3_MD1_ADDR, + 0x08, + ST_LSM6DS3_EN_BIT, true); + if (err < 0) + return err; + reg_addr = ST_LSM6DS3_MD1_ADDR; + mask = ST_LSM6DS3_SIGN_MOTION_DRDY_IRQ_MASK; break; case ST_INDIO_DEV_STEP_COUNTER: reg_addr = ST_LSM6DS3_INT2_ADDR; @@ -1075,26 +1087,31 @@ static int st_lsm6ds3_enable_sensors(struct lsm6ds3_sensor_data *sdata) if (err < 0) return err; - if ((sdata->cdata->sensors_enabled & ~(1 << sdata->sindex)) & - ST_LSM6DS3_PEDOMETER_DEPENDENCY) { - err = st_lsm6ds3_write_data_with_mask(sdata->cdata, - ST_LSM6DS3_PEDOMETER_EN_ADDR, - ST_LSM6DS3_PEDOMETER_EN_MASK, - ST_LSM6DS3_DIS_BIT, true); - if (err < 0) - return err; +// if ((sdata->cdata->sensors_enabled & ~(1 << sdata->sindex)) & +// ST_LSM6DS3_PEDOMETER_DEPENDENCY) { +// err = st_lsm6ds3_write_data_with_mask(sdata->cdata, +// ST_LSM6DS3_PEDOMETER_EN_ADDR, +// ST_LSM6DS3_PEDOMETER_EN_MASK, +// ST_LSM6DS3_DIS_BIT, true); +// if (err < 0) +// return err; +// +// err = st_lsm6ds3_write_data_with_mask(sdata->cdata, +// ST_LSM6DS3_PEDOMETER_EN_ADDR, +// ST_LSM6DS3_PEDOMETER_EN_MASK, +// ST_LSM6DS3_EN_BIT, true); +// if (err < 0) +// return err; +// } else { +// err = st_lsm6ds3_enable_pedometer(sdata, true); +// if (err < 0) +// return err; +// } - err = st_lsm6ds3_write_data_with_mask(sdata->cdata, - ST_LSM6DS3_PEDOMETER_EN_ADDR, - ST_LSM6DS3_PEDOMETER_EN_MASK, - ST_LSM6DS3_EN_BIT, true); - if (err < 0) - return err; - } else { - err = st_lsm6ds3_enable_pedometer(sdata, true); - if (err < 0) - return err; - } + // This sets the TAP threshold + err = st_lsm6ds3_write_data_with_mask(sdata->cdata, 0x59, 0x1F, 0x04, true); + if (err < 0) + return err; break; case ST_INDIO_DEV_STEP_COUNTER: diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c index fb739c883d4..f5108a7526e 100644 --- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c +++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c @@ -20,7 +20,9 @@ #define ST_LSM6DS3_SRC_FUNC_ADDR 0x53 #define ST_LSM6DS3_FIFO_DATA_AVL_ADDR 0x3b +#define ST_LSM6DS3_TAP_FUNC_ADDR 0x1C +#define ST_LSM6DS3_SRC_SIGN_MOTION_DATA_AVL 0x40 #define ST_LSM6DS3_SRC_STEP_DETECTOR_DATA_AVL 0x10 #define ST_LSM6DS3_SRC_TILT_DATA_AVL 0x20 #define ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL 0x80 @@ -51,7 +53,7 @@ irqreturn_t st_lsm6ds3_save_timestamp(int irq, void *private) static void st_lsm6ds3_irq_management(struct work_struct *data_work) { struct lsm6ds3_data *cdata; - u8 src_value = 0x00, src_fifo = 0x00; + u8 src_value = 0x00, src_fifo = 0x00, tap_value = 0x00, tap_cfg = 0x00, int1_cfg = 0x00, tap_thresh = 0x00; cdata = container_of((struct work_struct *)data_work, struct lsm6ds3_data, data_work); @@ -59,6 +61,14 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) cdata->tf->read(cdata, ST_LSM6DS3_SRC_FUNC_ADDR, 1, &src_value, true); cdata->tf->read(cdata, ST_LSM6DS3_FIFO_DATA_AVL_ADDR, 1, &src_fifo, true); + cdata->tf->read(cdata, ST_LSM6DS3_TAP_FUNC_ADDR, 1, + &tap_value, true); + cdata->tf->read(cdata, 0x58, 1, + &tap_cfg, true); + cdata->tf->read(cdata, 0x5E, 1, + &int1_cfg, true); + cdata->tf->read(cdata, 0x59, 1, + &tap_thresh, true); if (src_fifo & ST_LSM6DS3_FIFO_DATA_AVL) { if (src_fifo & ST_LSM6DS3_FIFO_DATA_OVR) { @@ -76,17 +86,27 @@ static void st_lsm6ds3_irq_management(struct work_struct *data_work) 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), cdata->timestamp); - if (cdata->sign_motion_event_ready) { - iio_push_event(cdata->indio_dev[ - ST_INDIO_DEV_SIGN_MOTION], - IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, - 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), - cdata->timestamp); - - cdata->sign_motion_event_ready = false; - } +// if (cdata->sign_motion_event_ready) { +// iio_push_event(cdata->indio_dev[ +// ST_INDIO_DEV_SIGN_MOTION], +// IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, +// 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), +// cdata->timestamp); +// +// cdata->sign_motion_event_ready = false; +// } } + if (cdata->sign_motion_event_ready && + (tap_value & ST_LSM6DS3_SRC_SIGN_MOTION_DATA_AVL)) { + printk("Firing Sig motion event. Tap value: %x, Tap cfg: %x, Int cfg: %x, Tap thresh: %x\n", tap_value, tap_cfg, int1_cfg, tap_thresh); + iio_push_event(cdata->indio_dev[ + ST_INDIO_DEV_SIGN_MOTION], + IIO_UNMOD_EVENT_CODE(IIO_SIGN_MOTION, + 0, IIO_EV_TYPE_THRESH, IIO_EV_DIR_EITHER), + cdata->timestamp); + cdata->sign_motion_event_ready = false; + } if (src_value & ST_LSM6DS3_SRC_STEP_COUNTER_DATA_AVL) { iio_trigger_poll_chained( cdata->trig[ST_INDIO_DEV_STEP_COUNTER], 0); |