blob: c363a00d0903ac69c122717c8684b747ccc9d343 [file] [log] [blame]
/*
$License:
Copyright 2011 InvenSense, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
$
*/
#ifndef __MPU_H_
#error Do not include this file directly. Include mpu.h instead.
#endif
#ifndef __MPU3050_H_
#define __MPU3050_H_
#ifdef __KERNEL__
#include <linux/types.h>
#endif
#if !defined CONFIG_MPU_SENSORS_MPU3050
#error MPU6000 build including MPU3050 header
#endif
#define MPU_NAME "mpu3050"
#define DEFAULT_MPU_SLAVEADDR 0x68
/*==== MPU REGISTER SET ====*/
enum mpu_register {
MPUREG_WHO_AM_I = 0, /* 00 0x00 */
MPUREG_PRODUCT_ID, /* 01 0x01 */
MPUREG_02_RSVD, /* 02 0x02 */
MPUREG_03_RSVD, /* 03 0x03 */
MPUREG_04_RSVD, /* 04 0x04 */
MPUREG_XG_OFFS_TC, /* 05 0x05 */
MPUREG_06_RSVD, /* 06 0x06 */
MPUREG_07_RSVD, /* 07 0x07 */
MPUREG_YG_OFFS_TC, /* 08 0x08 */
MPUREG_09_RSVD, /* 09 0x09 */
MPUREG_0A_RSVD, /* 10 0x0a */
MPUREG_ZG_OFFS_TC, /* 11 0x0b */
MPUREG_X_OFFS_USRH, /* 12 0x0c */
MPUREG_X_OFFS_USRL, /* 13 0x0d */
MPUREG_Y_OFFS_USRH, /* 14 0x0e */
MPUREG_Y_OFFS_USRL, /* 15 0x0f */
MPUREG_Z_OFFS_USRH, /* 16 0x10 */
MPUREG_Z_OFFS_USRL, /* 17 0x11 */
MPUREG_FIFO_EN1, /* 18 0x12 */
MPUREG_FIFO_EN2, /* 19 0x13 */
MPUREG_AUX_SLV_ADDR, /* 20 0x14 */
MPUREG_SMPLRT_DIV, /* 21 0x15 */
MPUREG_DLPF_FS_SYNC, /* 22 0x16 */
MPUREG_INT_CFG, /* 23 0x17 */
MPUREG_ACCEL_BURST_ADDR,/* 24 0x18 */
MPUREG_19_RSVD, /* 25 0x19 */
MPUREG_INT_STATUS, /* 26 0x1a */
MPUREG_TEMP_OUT_H, /* 27 0x1b */
MPUREG_TEMP_OUT_L, /* 28 0x1c */
MPUREG_GYRO_XOUT_H, /* 29 0x1d */
MPUREG_GYRO_XOUT_L, /* 30 0x1e */
MPUREG_GYRO_YOUT_H, /* 31 0x1f */
MPUREG_GYRO_YOUT_L, /* 32 0x20 */
MPUREG_GYRO_ZOUT_H, /* 33 0x21 */
MPUREG_GYRO_ZOUT_L, /* 34 0x22 */
MPUREG_23_RSVD, /* 35 0x23 */
MPUREG_24_RSVD, /* 36 0x24 */
MPUREG_25_RSVD, /* 37 0x25 */
MPUREG_26_RSVD, /* 38 0x26 */
MPUREG_27_RSVD, /* 39 0x27 */
MPUREG_28_RSVD, /* 40 0x28 */
MPUREG_29_RSVD, /* 41 0x29 */
MPUREG_2A_RSVD, /* 42 0x2a */
MPUREG_2B_RSVD, /* 43 0x2b */
MPUREG_2C_RSVD, /* 44 0x2c */
MPUREG_2D_RSVD, /* 45 0x2d */
MPUREG_2E_RSVD, /* 46 0x2e */
MPUREG_2F_RSVD, /* 47 0x2f */
MPUREG_30_RSVD, /* 48 0x30 */
MPUREG_31_RSVD, /* 49 0x31 */
MPUREG_32_RSVD, /* 50 0x32 */
MPUREG_33_RSVD, /* 51 0x33 */
MPUREG_34_RSVD, /* 52 0x34 */
MPUREG_DMP_CFG_1, /* 53 0x35 */
MPUREG_DMP_CFG_2, /* 54 0x36 */
MPUREG_BANK_SEL, /* 55 0x37 */
MPUREG_MEM_START_ADDR, /* 56 0x38 */
MPUREG_MEM_R_W, /* 57 0x39 */
MPUREG_FIFO_COUNTH, /* 58 0x3a */
MPUREG_FIFO_COUNTL, /* 59 0x3b */
MPUREG_FIFO_R_W, /* 60 0x3c */
MPUREG_USER_CTRL, /* 61 0x3d */
MPUREG_PWR_MGM, /* 62 0x3e */
MPUREG_3F_RSVD, /* 63 0x3f */
NUM_OF_MPU_REGISTERS /* 64 0x40 */
};
/*==== BITS FOR MPU ====*/
/*---- MPU 'FIFO_EN1' register (12) ----*/
#define BIT_TEMP_OUT 0x80
#define BIT_GYRO_XOUT 0x40
#define BIT_GYRO_YOUT 0x20
#define BIT_GYRO_ZOUT 0x10
#define BIT_ACCEL_XOUT 0x08
#define BIT_ACCEL_YOUT 0x04
#define BIT_ACCEL_ZOUT 0x02
#define BIT_AUX_1OUT 0x01
/*---- MPU 'FIFO_EN2' register (13) ----*/
#define BIT_AUX_2OUT 0x02
#define BIT_AUX_3OUT 0x01
/*---- MPU 'DLPF_FS_SYNC' register (16) ----*/
#define BITS_EXT_SYNC_NONE 0x00
#define BITS_EXT_SYNC_TEMP 0x20
#define BITS_EXT_SYNC_GYROX 0x40
#define BITS_EXT_SYNC_GYROY 0x60
#define BITS_EXT_SYNC_GYROZ 0x80
#define BITS_EXT_SYNC_ACCELX 0xA0
#define BITS_EXT_SYNC_ACCELY 0xC0
#define BITS_EXT_SYNC_ACCELZ 0xE0
#define BITS_EXT_SYNC_MASK 0xE0
#define BITS_FS_250DPS 0x00
#define BITS_FS_500DPS 0x08
#define BITS_FS_1000DPS 0x10
#define BITS_FS_2000DPS 0x18
#define BITS_FS_MASK 0x18
#define BITS_DLPF_CFG_256HZ_NOLPF2 0x00
#define BITS_DLPF_CFG_188HZ 0x01
#define BITS_DLPF_CFG_98HZ 0x02
#define BITS_DLPF_CFG_42HZ 0x03
#define BITS_DLPF_CFG_20HZ 0x04
#define BITS_DLPF_CFG_10HZ 0x05
#define BITS_DLPF_CFG_5HZ 0x06
#define BITS_DLPF_CFG_2100HZ_NOLPF 0x07
#define BITS_DLPF_CFG_MASK 0x07
/*---- MPU 'INT_CFG' register (17) ----*/
#define BIT_ACTL 0x80
#define BIT_ACTL_LOW 0x80
#define BIT_ACTL_HIGH 0x00
#define BIT_OPEN 0x40
#define BIT_OPEN_DRAIN 0x40
#define BIT_PUSH_PULL 0x00
#define BIT_LATCH_INT_EN 0x20
#define BIT_INT_PULSE_WIDTH_50US 0x00
#define BIT_INT_ANYRD_2CLEAR 0x10
#define BIT_INT_STAT_READ_2CLEAR 0x00
#define BIT_MPU_RDY_EN 0x04
#define BIT_DMP_INT_EN 0x02
#define BIT_RAW_RDY_EN 0x01
/*---- MPU 'INT_STATUS' register (1A) ----*/
#define BIT_INT_STATUS_FIFO_OVERLOW 0x80
#define BIT_MPU_RDY 0x04
#define BIT_DMP_INT 0x02
#define BIT_RAW_RDY 0x01
/*---- MPU 'BANK_SEL' register (37) ----*/
#define BIT_PRFTCH_EN 0x20
#define BIT_CFG_USER_BANK 0x10
#define BITS_MEM_SEL 0x0f
/*---- MPU 'USER_CTRL' register (3D) ----*/
#define BIT_DMP_EN 0x80
#define BIT_FIFO_EN 0x40
#define BIT_AUX_IF_EN 0x20
#define BIT_AUX_RD_LENG 0x10
#define BIT_AUX_IF_RST 0x08
#define BIT_DMP_RST 0x04
#define BIT_FIFO_RST 0x02
#define BIT_GYRO_RST 0x01
/*---- MPU 'PWR_MGM' register (3E) ----*/
#define BIT_H_RESET 0x80
#define BIT_SLEEP 0x40
#define BIT_STBY_XG 0x20
#define BIT_STBY_YG 0x10
#define BIT_STBY_ZG 0x08
#define BITS_CLKSEL 0x07
/*---- MPU Silicon Revision ----*/
#define MPU_SILICON_REV_A4 1 /* MPU A4 Device */
#define MPU_SILICON_REV_B1 2 /* MPU B1 Device */
#define MPU_SILICON_REV_B4 3 /* MPU B4 Device */
#define MPU_SILICON_REV_B6 4 /* MPU B6 Device */
/*---- MPU Memory ----*/
#define MPU_MEM_BANK_SIZE (256)
#define FIFO_HW_SIZE (512)
enum MPU_MEMORY_BANKS {
MPU_MEM_RAM_BANK_0 = 0,
MPU_MEM_RAM_BANK_1,
MPU_MEM_RAM_BANK_2,
MPU_MEM_RAM_BANK_3,
MPU_MEM_NUM_RAM_BANKS,
MPU_MEM_OTP_BANK_0 = MPU_MEM_NUM_RAM_BANKS,
/* This one is always last */
MPU_MEM_NUM_BANKS
};
/*---- structure containing control variables used by MLDL ----*/
/*---- MPU clock source settings ----*/
/*---- MPU filter selections ----*/
enum mpu_filter {
MPU_FILTER_256HZ_NOLPF2 = 0,
MPU_FILTER_188HZ,
MPU_FILTER_98HZ,
MPU_FILTER_42HZ,
MPU_FILTER_20HZ,
MPU_FILTER_10HZ,
MPU_FILTER_5HZ,
MPU_FILTER_2100HZ_NOLPF,
NUM_MPU_FILTER
};
enum mpu_fullscale {
MPU_FS_250DPS = 0,
MPU_FS_500DPS,
MPU_FS_1000DPS,
MPU_FS_2000DPS,
NUM_MPU_FS
};
enum mpu_clock_sel {
MPU_CLK_SEL_INTERNAL = 0,
MPU_CLK_SEL_PLLGYROX,
MPU_CLK_SEL_PLLGYROY,
MPU_CLK_SEL_PLLGYROZ,
MPU_CLK_SEL_PLLEXT32K,
MPU_CLK_SEL_PLLEXT19M,
MPU_CLK_SEL_RESERVED,
MPU_CLK_SEL_STOP,
NUM_CLK_SEL
};
enum mpu_ext_sync {
MPU_EXT_SYNC_NONE = 0,
MPU_EXT_SYNC_TEMP,
MPU_EXT_SYNC_GYROX,
MPU_EXT_SYNC_GYROY,
MPU_EXT_SYNC_GYROZ,
MPU_EXT_SYNC_ACCELX,
MPU_EXT_SYNC_ACCELY,
MPU_EXT_SYNC_ACCELZ,
NUM_MPU_EXT_SYNC
};
#define DLPF_FS_SYNC_VALUE(ext_sync, full_scale, lpf) \
((ext_sync << 5) | (full_scale << 3) | lpf)
#endif /* __MPU3050_H_ */