diff options
| author | wenhao.deng <wenhao.deng@new-bund.net> | 2016-06-07 14:52:20 +0800 |
|---|---|---|
| committer | Mister Oyster <oysterized@gmail.com> | 2017-01-23 13:27:11 +0100 |
| commit | 02d9372a9f59a3f9004b42fd61435a1801a85152 (patch) | |
| tree | 5258464ac024ac29a22578e4bbfafae9d294b296 | |
| parent | 89fd0cd554ba90065944b7576a4730b90f5937d4 (diff) | |
| download | android_kernel_m2note-02d9372a9f59a3f9004b42fd61435a1801a85152.tar.gz | |
sensor: lsm6ds0 acc&gyro work together in PowerMode, and change to 2000DPS
Change-Id: I19c5e9ea5234d81f8769526a06796f1886eb28c6
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 |
