Update MPU3050 kernel driver
1. Update MPU3050 drivers to Invensense MPU code update v3.3.4 ported from:
https://android.googlesource.com/kernel/msm.git/+/android-msm-sony-cm-jb-3.0
2. Enable LSM303DLHA and LSM303DLHM as MPU3050 slaves instead of fake BMA150 and AK8975
3. Proper LSM303DLHA and LSM303DLHM power management when acting as MPU3050 slaves
4. Gyro axis configuration changed
5. Updates to sensor setup by John Newby
diff --git a/include/linux/mpu.h b/include/linux/mpu.h
index d4e0e91..026a0b7 100644
--- a/include/linux/mpu.h
+++ b/include/linux/mpu.h
@@ -30,82 +30,44 @@
#include "mpu3050.h"
#endif
+/* Number of axes on each sensor */
#define GYRO_NUM_AXES (3)
#define ACCEL_NUM_AXES (3)
#define COMPASS_NUM_AXES (3)
-#define MPU_SET_MPU_CONFIG (0x00)
-#define MPU_SET_INT_CONFIG (0x01)
-#define MPU_SET_EXT_SYNC (0x02)
-#define MPU_SET_FULL_SCALE (0x03)
-#define MPU_SET_LPF (0x04)
-#define MPU_SET_CLK_SRC (0x05)
-#define MPU_SET_DIVIDER (0x06)
-#define MPU_SET_LEVEL_SHIFTER (0x07)
-#define MPU_SET_DMP_ENABLE (0x08)
-#define MPU_SET_FIFO_ENABLE (0x09)
-#define MPU_SET_DMP_CFG1 (0x0a)
-#define MPU_SET_DMP_CFG2 (0x0b)
-#define MPU_SET_OFFSET_TC (0x0c)
-#define MPU_SET_RAM (0x0d)
-
-#define MPU_SET_PLATFORM_DATA (0x0e)
-
-#define MPU_GET_MPU_CONFIG (0x80)
-#define MPU_GET_INT_CONFIG (0x81)
-#define MPU_GET_EXT_SYNC (0x82)
-#define MPU_GET_FULL_SCALE (0x83)
-#define MPU_GET_LPF (0x84)
-#define MPU_GET_CLK_SRC (0x85)
-#define MPU_GET_DIVIDER (0x86)
-#define MPU_GET_LEVEL_SHIFTER (0x87)
-#define MPU_GET_DMP_ENABLE (0x88)
-#define MPU_GET_FIFO_ENABLE (0x89)
-#define MPU_GET_DMP_CFG1 (0x8a)
-#define MPU_GET_DMP_CFG2 (0x8b)
-#define MPU_GET_OFFSET_TC (0x8c)
-#define MPU_GET_RAM (0x8d)
-
-#define MPU_READ_REGISTER (0x40)
-#define MPU_WRITE_REGISTER (0x41)
-#define MPU_READ_MEMORY (0x42)
-#define MPU_WRITE_MEMORY (0x43)
-
-#define MPU_SUSPEND (0x44)
-#define MPU_RESUME (0x45)
-#define MPU_READ_COMPASS (0x46)
-#define MPU_READ_ACCEL (0x47)
-#define MPU_READ_PRESSURE (0x48)
-
-#define MPU_CONFIG_ACCEL (0x20)
-#define MPU_CONFIG_COMPASS (0x21)
-#define MPU_CONFIG_PRESSURE (0x22)
-
-#define MPU_GET_CONFIG_ACCEL (0x28)
-#define MPU_GET_CONFIG_COMPASS (0x29)
-#define MPU_GET_CONFIG_PRESSURE (0x2a)
-
-#ifdef CONFIG_MACH_HTC
-#define HTC_READ_CAL_DATA
-#endif
-#ifdef HTC_READ_CAL_DATA
-#define MPU_READ_CAL_DATA (0xef)
-extern unsigned char gyro_gsensor_kvalue[37];
-#endif
-
+/* Structure for the following IOCTL's:
+ MPU_READ
+ MPU_WRITE
+ MPU_READ_MEM
+ MPU_WRITE_MEM
+ MPU_READ_FIFO
+ MPU_WRITE_FIFO
+*/
struct mpu_read_write {
+ /* Memory address or register address depending on ioctl */
unsigned short address;
unsigned short length;
unsigned char *data;
};
+enum mpuirq_data_type {
+ MPUIRQ_DATA_TYPE_MPU_IRQ,
+ MPUIRQ_DATA_TYPE_SLAVE_IRQ,
+ MPUIRQ_DATA_TYPE_PM_EVENT,
+ MPUIRQ_DATA_TYPE_NUM_TYPES,
+};
+
+/* User space PM event notification */
+#define MPU_PM_EVENT_SUSPEND_PREPARE (3)
+#define MPU_PM_EVENT_POST_SUSPEND (4)
+
struct mpuirq_data {
int interruptcount;
unsigned long long irqtime;
int data_type;
- int data_size;
- void *data;
+ long data;
};
+
enum ext_slave_config_key {
MPU_SLAVE_CONFIG_ODR_SUSPEND,
MPU_SLAVE_CONFIG_ODR_RESUME,
@@ -119,15 +81,44 @@
MPU_SLAVE_CONFIG_IRQ_RESUME,
MPU_SLAVE_WRITE_REGISTERS,
MPU_SLAVE_READ_REGISTERS,
+ /* AMI 306 specific config keys */
+ MPU_SLAVE_PARAM,
+ MPU_SLAVE_WINDOW,
+ MPU_SLAVE_READWINPARAMS,
+ MPU_SLAVE_SEARCHOFFSET,
+ /* AKM specific config keys */
+ MPU_SLAVE_READ_SCALE,
+ /* YAS specific config keys */
+ MPU_SLAVE_OFFSET_VALS,
+ MPU_SLAVE_RANGE_CHECK,
+
MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS,
};
+/* For the MPU_SLAVE_CONFIG_IRQ_SUSPEND and MPU_SLAVE_CONFIG_IRQ_RESUME */
enum ext_slave_config_irq_type {
MPU_SLAVE_IRQ_TYPE_NONE,
MPU_SLAVE_IRQ_TYPE_MOTION,
MPU_SLAVE_IRQ_TYPE_DATA_READY,
};
+/* Structure for the following IOCTS's
+ * MPU_CONFIG_ACCEL
+ * MPU_CONFIG_COMPASS
+ * MPU_CONFIG_PRESSURE
+ * MPU_GET_CONFIG_ACCEL
+ * MPU_GET_CONFIG_COMPASS
+ * MPU_GET_CONFIG_PRESSURE
+ *
+ * @key one of enum ext_slave_config_key
+ * @len length of data pointed to by data
+ * @apply zero if communication with the chip is not necessary, false otherwise
+ * This flag can be used to select cached data or to refresh cashed data
+ * cache data to be pushed later or push immediately. If true and the
+ * slave is on the secondary bus the MPU will first enger bypass mode
+ * before calling the slaves .config or .get_config funcion
+ * @data pointer to the data to confgure or get
+ */
struct ext_slave_config {
int key;
int len;
@@ -140,7 +131,9 @@
EXT_SLAVE_TYPE_ACCELEROMETER,
EXT_SLAVE_TYPE_COMPASS,
EXT_SLAVE_TYPE_PRESSURE,
-
+ /*EXT_SLAVE_TYPE_TEMPERATURE */
+
+ EXT_SLAVE_NUM_TYPES
};
enum ext_slave_id {
@@ -159,7 +152,6 @@
ACCEL_ID_LIS3DH,
COMPASS_ID_AKM,
- COMPASS_ID_AKM8963,
COMPASS_ID_AMI30X,
COMPASS_ID_YAS529,
COMPASS_ID_HMC5883,
@@ -186,6 +178,26 @@
};
+/**
+ * struct ext_slave_platform_data - Platform data for mpu3050 and mpu6050
+ * slave devices
+ *
+ * @get_slave_descr: Function pointer to retrieve the struct ext_slave_descr
+ * for this slave
+ * @irq: the irq number attached to the slave if any.
+ * @adapt_num: the I2C adapter number.
+ * @bus: the bus the slave is attached to: enum ext_slave_bus
+ * @address: the I2C slave address of the slave device.
+ * @orientation: the mounting matrix of the device relative to MPU.
+ * @irq_data: private data for the slave irq handler
+ * @private_data: additional data, user customizable. Not touched by the MPU
+ * driver.
+ *
+ * The orientation matricies are 3x3 rotation matricies
+ * that are applied to the data to rotate from the mounting orientation to the
+ * platform orientation. The values must be one of 0, 1, or -1 and each row and
+ * column should have exactly 1 non-zero value.
+ */
struct ext_slave_platform_data {
struct ext_slave_descr *(*get_slave_descr) (void);
int irq;
@@ -195,14 +207,49 @@
signed char orientation[9];
void *irq_data;
void *private_data;
+ void (*bypass_state)(int, char*);
+ int (*check_sleep_status)(void);
+ void (*vote_sleep_status)(int, int);
+
};
-
-struct tFixPntRange {
+struct fix_pnt_range {
long mantissa;
long fraction;
};
+static inline long range_fixedpoint_to_long_mg(struct fix_pnt_range rng)
+{
+ return (long)(rng.mantissa * 1000 + rng.fraction / 10);
+}
+
+struct ext_slave_read_trigger {
+ unsigned char reg;
+ unsigned char value;
+};
+
+/**
+ * struct ext_slave_descr - Description of the slave device for programming.
+ *
+ * @suspend: function pointer to put the device in suspended state
+ * @resume: function pointer to put the device in running state
+ * @read: function that reads the device data
+ * @init: function used to preallocate memory used by the driver
+ * @exit: function used to free memory allocated for the driver
+ * @config: function used to configure the device
+ * @get_config:function used to get the device's configuration
+ *
+ * @name: text name of the device
+ * @type: device type. enum ext_slave_type
+ * @id: enum ext_slave_id
+ * @reg: starting register address to retrieve data.
+ * @len: length in bytes of the sensor data. Should be 6.
+ * @endian: byte order of the data. enum ext_slave_endian
+ * @range: full scale range of the slave ouput: struct tFixPntRange
+ *
+ * Defines the functions and information about the slave the mpu3050 needs to
+ * use the slave device.
+ */
struct ext_slave_descr {
int (*init) (void *mlsl_handle,
struct ext_slave_descr *slave,
@@ -242,78 +289,99 @@
unsigned char reg;
unsigned int len;
unsigned char endian;
- struct tFixPntRange range;
+ struct fix_pnt_range range;
+ struct ext_slave_read_trigger *trigger;
};
+/**
+ * struct mpu3050_platform_data - Platform data for the mpu driver
+ * @int_config: Bits [7:3] of the int config register.
+ * @orientation: Orientation matrix of the gyroscope
+ * @level_shifter: 0: VLogic, 1: VDD
+ * @accel: Accel platform data
+ * @compass: Compass platform data
+ * @pressure: Pressure platform data
+ *
+ * Contains platform specific information on how to configure the MPU3050 to
+ * work on this platform. The orientation matricies are 3x3 rotation matricies
+ * that are applied to the data to rotate from the mounting orientation to the
+ * platform orientation. The values must be one of 0, 1, or -1 and each row and
+ * column should have exactly 1 non-zero value.
+ */
struct mpu3050_platform_data {
unsigned char int_config;
- signed char orientation[MPU_NUM_AXES * MPU_NUM_AXES];
+ signed char orientation[GYRO_NUM_AXES * GYRO_NUM_AXES];
unsigned char level_shifter;
struct ext_slave_platform_data accel;
struct ext_slave_platform_data compass;
struct ext_slave_platform_data pressure;
- int (*g_sensors_reset)(void);
- int (*power_LPM)(int on);
+ int (*setup)(struct device *dev, int enable);
+ void (*hw_config)(int enable);
+ void (*power_mode)(int enable);
};
+/*
+ Accelerometer
+*/
#define get_accel_slave_descr NULL
-#ifdef CONFIG_MPU_SENSORS_ADXL346
+#ifdef CONFIG_MPU_SENSORS_ADXL346 /* ADI accelerometer */
struct ext_slave_descr *adxl346_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr adxl346_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_BMA150
+#ifdef CONFIG_MPU_SENSORS_BMA150 /* Bosch accelerometer */
struct ext_slave_descr *bma150_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr bma150_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_BMA250
+#ifdef CONFIG_MPU_SENSORS_BMA250 /* Bosch 250 accelerometer */
struct ext_slave_descr *bma250_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr bma250_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_BMA222
+#ifdef CONFIG_MPU_SENSORS_BMA222 /* Bosch 222 accelerometer */
struct ext_slave_descr *bma222_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr bma222_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_KXSD9
+#ifdef CONFIG_MPU_SENSORS_KXSD9 /* Kionix accelerometer */
struct ext_slave_descr *kxsd9_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr kxsd9_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_KXTF9
+#ifdef CONFIG_MPU_SENSORS_KXTF9 /* Kionix accelerometer */
struct ext_slave_descr *kxtf9_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr kxtf9_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_LIS331DLH
+#ifdef CONFIG_MPU_SENSORS_LIS331DLH /* ST accelerometer */
struct ext_slave_descr *lis331dlh_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr lis331dlh_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_LIS3DH
+#ifdef CONFIG_MPU_SENSORS_LIS3DH /* ST accelerometer */
struct ext_slave_descr *lis3dh_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr lis3dh_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_LSM303DLHA
+#ifdef CONFIG_MPU_SENSORS_LSM303DLHA /* ST accelerometer */
struct ext_slave_descr *lsm303dlha_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr lsm303dlha_get_slave_descr
#endif
+/* MPU6000 Accel */
#if defined(CONFIG_MPU_SENSORS_MPU6000) || \
defined(CONFIG_MPU_SENSORS_MPU6000_MODULE)
struct ext_slave_descr *mantis_get_slave_descr(void);
@@ -321,80 +389,111 @@
#define get_accel_slave_descr mantis_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_MMA8450
+#ifdef CONFIG_MPU_SENSORS_MMA8450 /* Freescale accelerometer */
struct ext_slave_descr *mma8450_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr mma8450_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_MMA845X
+#ifdef CONFIG_MPU_SENSORS_MMA845X /* Freescale accelerometer */
struct ext_slave_descr *mma845x_get_slave_descr(void);
#undef get_accel_slave_descr
#define get_accel_slave_descr mma845x_get_slave_descr
#endif
+/*
+ Compass
+*/
#define get_compass_slave_descr NULL
-#ifdef CONFIG_MPU_SENSORS_AK8975
+#ifdef CONFIG_MPU_SENSORS_AK8975 /* AKM compass */
struct ext_slave_descr *ak8975_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr ak8975_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_AK8963
-struct ext_slave_descr *ak8963_get_slave_descr(void);
-#undef get_compass_slave_descr
-#define get_compass_slave_descr ak8963_get_slave_descr
-#endif
-
-#ifdef CONFIG_MPU_SENSORS_AMI30X
+#ifdef CONFIG_MPU_SENSORS_AMI30X /* AICHI Steel compass */
struct ext_slave_descr *ami30x_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr ami30x_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_HMC5883
+#ifdef CONFIG_MPU_SENSORS_HMC5883 /* Honeywell compass */
struct ext_slave_descr *hmc5883_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr hmc5883_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_MMC314X
+#ifdef CONFIG_MPU_SENSORS_MMC314X /* MEMSIC compass */
struct ext_slave_descr *mmc314x_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr mmc314x_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_LSM303DLHM
+#ifdef CONFIG_MPU_SENSORS_LSM303DLHM /* ST compass */
struct ext_slave_descr *lsm303dlhm_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr lsm303dlhm_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_YAS529
+#ifdef CONFIG_MPU_SENSORS_YAS529 /* Yamaha compass */
struct ext_slave_descr *yas529_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr yas529_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_HSCDTD002B
+#ifdef CONFIG_MPU_SENSORS_HSCDTD002B /* Alps HSCDTD002B compass */
struct ext_slave_descr *hscdtd002b_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr hscdtd002b_get_slave_descr
#endif
-#ifdef CONFIG_MPU_SENSORS_HSCDTD004A
+#ifdef CONFIG_MPU_SENSORS_HSCDTD004A /* Alps HSCDTD004A compass */
struct ext_slave_descr *hscdtd004a_get_slave_descr(void);
#undef get_compass_slave_descr
#define get_compass_slave_descr hscdtd004a_get_slave_descr
#endif
+/*
+ Pressure
+*/
#define get_pressure_slave_descr NULL
-#ifdef CONFIG_MPU_SENSORS_BMA085
+#ifdef CONFIG_MPU_SENSORS_BMA085 /* BMA pressure */
struct ext_slave_descr *bma085_get_slave_descr(void);
#undef get_pressure_slave_descr
#define get_pressure_slave_descr bma085_get_slave_descr
#endif
-#endif
+#define MPU_IOCTL (0x81) /* Magic number for MPU Iocts */
+/* IOCTL commands for /dev/mpu */
+#define MPU_SET_MPU_CONFIG _IOWR(MPU_IOCTL, 0x00, struct mldl_cfg)
+#define MPU_GET_MPU_CONFIG _IOW(MPU_IOCTL, 0x00, struct mldl_cfg)
+
+#define MPU_SET_PLATFORM_DATA _IOWR(MPU_IOCTL, 0x01, struct mldl_cfg)
+
+#define MPU_READ _IOWR(MPU_IOCTL, 0x10, struct mpu_read_write)
+#define MPU_WRITE _IOW(MPU_IOCTL, 0x10, struct mpu_read_write)
+#define MPU_READ_MEM _IOWR(MPU_IOCTL, 0x11, struct mpu_read_write)
+#define MPU_WRITE_MEM _IOW(MPU_IOCTL, 0x11, struct mpu_read_write)
+#define MPU_READ_FIFO _IOWR(MPU_IOCTL, 0x12, struct mpu_read_write)
+#define MPU_WRITE_FIFO _IOW(MPU_IOCTL, 0x12, struct mpu_read_write)
+
+#define MPU_READ_COMPASS _IOR(MPU_IOCTL, 0x12, unsigned char)
+#define MPU_READ_ACCEL _IOR(MPU_IOCTL, 0x13, unsigned char)
+#define MPU_READ_PRESSURE _IOR(MPU_IOCTL, 0x14, unsigned char)
+
+#define MPU_CONFIG_ACCEL _IOW(MPU_IOCTL, 0x20, struct ext_slave_config)
+#define MPU_CONFIG_COMPASS _IOW(MPU_IOCTL, 0x21, struct ext_slave_config)
+#define MPU_CONFIG_PRESSURE _IOW(MPU_IOCTL, 0x22, struct ext_slave_config)
+
+#define MPU_GET_CONFIG_ACCEL _IOWR(MPU_IOCTL, 0x20, struct ext_slave_config)
+#define MPU_GET_CONFIG_COMPASS _IOWR(MPU_IOCTL, 0x21, struct ext_slave_config)
+#define MPU_GET_CONFIG_PRESSURE _IOWR(MPU_IOCTL, 0x22, struct ext_slave_config)
+
+#define MPU_SUSPEND _IO(MPU_IOCTL, 0x30)
+#define MPU_RESUME _IO(MPU_IOCTL, 0x31)
+/* Userspace PM Event response */
+#define MPU_PM_EVENT_HANDLED _IO(MPU_IOCTL, 0x32)
+
+#endif /* __MPU_H_ */