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); |