summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Wilson <evan@oliodevices.com>2015-07-02 03:26:20 -0700
committerEvan Wilson <evan@oliodevices.com>2015-07-02 03:26:20 -0700
commitecf02dbfdbd1caab5c79b2d3bff188a5360a9da4 (patch)
tree1ffd9dc917b2deb2b7e7fc82554650c5d7afe938
parent69a77a4d2e92d81f45249f09126bd5d2c36a0b5d (diff)
downloadolio-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.c71
-rw-r--r--drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c40
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);