aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwenhao.deng <wenhao.deng@new-bund.net>2016-06-07 14:52:20 +0800
committerMister Oyster <oysterized@gmail.com>2017-01-23 13:27:11 +0100
commit02d9372a9f59a3f9004b42fd61435a1801a85152 (patch)
tree5258464ac024ac29a22578e4bbfafae9d294b296
parent89fd0cd554ba90065944b7576a4730b90f5937d4 (diff)
downloadandroid_kernel_m2note-02d9372a9f59a3f9004b42fd61435a1801a85152.tar.gz
sensor: lsm6ds0 acc&gyro work together in PowerMode, and change to 2000DPS
Change-Id: I19c5e9ea5234d81f8769526a06796f1886eb28c6
-rw-r--r--drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.c13
-rw-r--r--drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h97
-rw-r--r--drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3a.h7
-rw-r--r--drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3_gy.c17
-rw-r--r--drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3gy.h7
5 files changed, 132 insertions, 9 deletions
diff --git a/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.c b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.c
index 7ded5aa22..ed57ddc80 100644
--- a/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.c
+++ b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.c
@@ -31,6 +31,7 @@
#include <linux/hwmsen_dev.h>
#include <linux/sensors_io.h>
#include "lsm6ds3.h"
+#include "lsm6ds3gy.h"
#include <linux/hwmsen_helper.h>
#include <linux/kernel.h>
#include <mach/mt_pm_ldo.h>
@@ -563,6 +564,12 @@ static int LSM6DS3_enable_pedo(struct i2c_client *client, bool enable)
}
#endif
+int lsm6ds3_acc_mode(void)
+{
+ return sensor_power;
+}
+EXPORT_SYMBOL(lsm6ds3_acc_mode);
+
static int LSM6DS3_acc_SetPowerMode(struct i2c_client *client, bool enable)
{
u8 databuf[2] = {0};
@@ -591,8 +598,10 @@ static int LSM6DS3_acc_SetPowerMode(struct i2c_client *client, bool enable)
else
{
// do nothing
- databuf[0] &= ~LSM6DS3_ACC_ODR_MASK;//clear lsm6ds3 acc ODR bits
- databuf[0] |= LSM6DS3_ACC_ODR_POWER_DOWN;
+ if (lsm6ds3_gyro_mode() == false){
+ databuf[0] &= ~LSM6DS3_ACC_ODR_MASK;//clear lsm6ds3 acc ODR bits
+ databuf[0] |= LSM6DS3_ACC_ODR_POWER_DOWN;
+ }
}
databuf[1] = databuf[0];
databuf[0] = LSM6DS3_CTRL1_XL;
diff --git a/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h
index 988593403..2e3decf05 100644
--- a/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h
+++ b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h
@@ -14,8 +14,8 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#ifndef L3M6DS3_GY_H
-#define L3M6DS3_GY_H
+#ifndef L3M6DS3_H
+#define L3M6DS3_H
#include <linux/ioctl.h>
@@ -25,6 +25,7 @@
/* LSM6DS3 Register Map (Please refer to LSM6DS3 Specifications) */
#define LSM6DS3_FUNC_CFG_ACCESS 0x00
+#define LSM6DS3_RAM_ACCESS 0X01
#define LSM6DS3_SENSOR_SYNC_TIME_FRAME 0X04
/*FIFO control register*/
@@ -243,6 +244,92 @@
#define LSM6DS3_GYRO_ENABLE_AXIS_Y 0x10
#define LSM6DS3_GYRO_ENABLE_AXIS_Z 0x20
+#define LSM6DS3_ACC_GYRO_FUNC_EN_MASK 0x04
+#define LSM6DS3_PEDO_EN_MASK 0x40
+typedef enum {
+ LSM6DS3_ACC_GYRO_PEDO_EN_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_PEDO_EN_ENABLED =0x40,
+} LSM6DS3_ACC_GYRO_PEDO_EN_t;
+
+#define LSM6DS3_TILT_EN_MASK 0x20
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_TILT_EN_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_TILT_EN_ENABLED =0x20,
+} LSM6DS3_ACC_GYRO_TILT_EN_t;
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_INT1 =0,
+ LSM6DS3_ACC_GYRO_INT2 =1,
+} LSM6DS3_ACC_GYRO_ROUNT_INT_t;
+typedef enum {
+ LSM6DS3_ACC_GYRO_FUNC_EN_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_FUNC_EN_ENABLED =0x04,
+} LSM6DS3_ACC_GYRO_FUNC_EN_t;
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_INT_TILT_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_INT_TILT_ENABLED =0x02,
+} LSM6DS3_ACC_GYRO_INT2_TILT_t;
+
+#define LSM6DS3_ACC_GYRO_INT_TILT_MASK 0x02
+typedef enum {
+ LSM6DS3_ACC_GYRO_TILT_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_TILT_ENABLED =0x02,
+} LSM6DS3_ACC_GYRO_TILT_t;
+
+#define LSM6DS3_ACC_GYRO_TILT_MASK 0x02
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_INT_SIGN_MOT_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_INT_SIGN_MOT_ENABLED =0x40,
+} LSM6DS3_ACC_GYRO_INT_SIGN_MOT_t;
+
+#define LSM6DS3_ACC_GYRO_INT_SIGN_MOT_MASK 0x40
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_SIGN_MOT_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_SIGN_MOT_ENABLED =0x01,
+} LSM6DS3_ACC_GYRO_SIGN_MOT_t;
+
+#define LSM6DS3_ACC_GYRO_SIGN_MOT_MASK 0x01
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_RAM_PAGE_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_RAM_PAGE_ENABLED =0x80,
+} LSM6DS3_ACC_GYRO_RAM_PAGE_t;
+
+#define LSM6DS3_RAM_PAGE_MASK 0x80
+#define LSM6DS3_CONFIG_PEDO_THS_MIN 0x0F
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_PEDO_RST_STEP_DISABLED =0x00,
+ LSM6DS3_ACC_GYRO_PEDO_RST_STEP_ENABLED =0x02,
+} LSM6DS3_ACC_GYRO_PEDO_RST_STEP_t;
+
+#define LSM6DS3_PEDO_RST_STEP_MASK 0x02
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_INT_ACTIVE_HIGH =0x00,
+ LSM6DS3_ACC_GYRO_INT_ACTIVE_LOW =0x20,
+} LSM6DS3_ACC_GYRO_INT_ACTIVE_t;
+
+#define LSM6DS3_ACC_GYRO_INT_ACTIVE_MASK 0x20
+
+typedef enum {
+ LSM6DS3_ACC_GYRO_INT_LATCH =0x01,
+ LSM6DS3_ACC_GYRO_INT_NO_LATCH =0x00,
+} LSM6DS3_ACC_GYRO_INT_LATCH_CTL_t;
+
+#define LSM6DS3_ACC_GYRO_INT_LATCH_CTL_MASK 0x01
+
+
+
+#define LSM6DS3_SIGNICANT_MOTION_INT_STATUS 0x40
+#define LSM6DS3_TILT_INT_STATUS 0x20
+#define LSM6DS3_STEP_DETECT_INT_STATUS 0x10
+
+
#define LSM6DS3_SUCCESS 0
#define LSM6DS3_ERR_I2C -1
@@ -253,9 +340,11 @@
#define LSM6DS3_BUFSIZE 60
+/*------------------------------------------------------------------*/
+
// 1 rad = 180/PI degree, L3G4200D_OUT_MAGNIFY = 131,
// 180*131/PI = 7506
-#define DEGREE_TO_RAD 7506 //180*1000000/PI//7506 // fenggy mask
+#define DEGREE_TO_RAD 180*1000000/PI//7506 // fenggy mask
//#define DEGREE_TO_RAD 819
-#endif //L3M6DS3_GY_H
+#endif //L3M6DS3_H
diff --git a/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3a.h b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3a.h
new file mode 100644
index 000000000..e19f65225
--- /dev/null
+++ b/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3a.h
@@ -0,0 +1,7 @@
+#ifndef LSM6DS3A_H
+#define LSM6DS3A_H
+
+int lsm6ds3_acc_mode(void);
+
+
+#endif
diff --git a/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3_gy.c b/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3_gy.c
index 4538d0fd4..e2d3bc555 100644
--- a/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3_gy.c
+++ b/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3_gy.c
@@ -29,6 +29,7 @@
#include <linux/hwmsen_dev.h>
#include <linux/sensors_io.h>
#include "lsm6ds3_gy.h"
+#include "lsm6ds3a.h"
#include <linux/hwmsen_helper.h>
#include <linux/kernel.h>
#include <mach/mt_pm_ldo.h>
@@ -338,6 +339,13 @@ static int LSM6DS3_CheckDeviceID(struct i2c_client *client)
return LSM6DS3_SUCCESS;
}
+int lsm6ds3_gyro_mode(void)
+{
+ return sensor_power;
+}
+EXPORT_SYMBOL(lsm6ds3_gyro_mode);
+
+
//----------------------------------------------------------------------------//
static int LSM6DS3_gyro_SetPowerMode(struct i2c_client *client, bool enable)
{
@@ -360,19 +368,22 @@ static int LSM6DS3_gyro_SetPowerMode(struct i2c_client *client, bool enable)
if(true == enable)
{
databuf[0] &= ~LSM6DS3_GYRO_ODR_MASK;//clear lsm6ds3 gyro ODR bits
- databuf[0] |= LSM6DS3_GYRO_ODR_104HZ; //default set 100HZ for LSM6DS3 gyro
+ databuf[0] |= 0x58;/*2000dps*///LSM6DS3_GYRO_ODR_104HZ; //default set 100HZ for LSM6DS3 gyro
}
else
{
// do nothing
- databuf[0] &= ~LSM6DS3_GYRO_ODR_MASK;//clear lsm6ds3 gyro ODR bits
- databuf[0] |= LSM6DS3_GYRO_ODR_POWER_DOWN; //POWER DOWN
+ if (lsm6ds3_acc_mode() == false){
+ databuf[0] &= ~LSM6DS3_GYRO_ODR_MASK;//clear lsm6ds3 gyro ODR bits
+ databuf[0] |= LSM6DS3_GYRO_ODR_POWER_DOWN; //POWER DOWN
+ }
}
databuf[1] = databuf[0];
databuf[0] = LSM6DS3_CTRL2_G;
res = i2c_master_send(client, databuf, 0x2);
+
if(res <= 0)
{
GYRO_LOG("LSM6DS3 set power mode: ODR 100hz failed!\n");
diff --git a/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3gy.h b/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3gy.h
new file mode 100644
index 000000000..be353b2c1
--- /dev/null
+++ b/drivers/misc/mediatek/gyroscope/lsm6ds3gy/lsm6ds3gy.h
@@ -0,0 +1,7 @@
+#ifndef LSM6DS3GY_H
+#define LSM6DS3GY_H
+
+int lsm6ds3_gyro_mode(void);
+
+
+#endif