3 Copyright (C) 2010 InvenSense Corporation, All Rights Reserved.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
32 #define MPU_NAME "mpu6000"
33 #define DEFAULT_MPU_SLAVEADDR 0x68
35 /*==== M_HW REGISTER SET ====*/
37 MPUREG_XG_OFFS_TC = 0, /* 0x00 */
38 MPUREG_YG_OFFS_TC, /* 0x00 */
39 MPUREG_ZG_OFFS_TC, /* 0x00 */
40 MPUREG_X_FINE_GAIN, /* 0x00 */
41 MPUREG_Y_FINE_GAIN, /* 0x00 */
42 MPUREG_Z_FINE_GAIN, /* 0x00 */
43 MPUREG_XA_OFFS_H, /* 0x00 */
44 MPUREG_XA_OFFS_L_TC, /* 0x00 */
45 MPUREG_YA_OFFS_H, /* 0x00 */
46 MPUREG_YA_OFFS_L_TC, /* 0x00 */
47 MPUREG_ZA_OFFS_H, /* 0x00 */
48 MPUREG_ZA_OFFS_L_TC, /* 0xB */
49 MPUREG_0C_RSVD, /* 0x00 */
50 MPUREG_0D_RSVD, /* 0x00 */
51 MPUREG_0E_RSVD, /* 0x00 */
52 MPUREG_0F_RSVD, /* 0x00 */
53 MPUREG_10_RSVD, /* 0x00 */
54 MPUREG_11_RSVD, /* 0x00 */
55 MPUREG_12_RSVD, /* 0x00 */
56 MPUREG_XG_OFFS_USRH, /* 0x00 */
57 MPUREG_XG_OFFS_USRL, /* 0x00 */
58 MPUREG_YG_OFFS_USRH, /* 0x00 */
59 MPUREG_YG_OFFS_USRL, /* 0x00 */
60 MPUREG_ZG_OFFS_USRH, /* 0x00 */
61 MPUREG_ZG_OFFS_USRL, /* 0x00 */
62 MPUREG_SMPLRT_DIV, /* 0x19 */
63 MPUREG_CONFIG, /* 0x1A ==> DLPF_FS_SYNC */
64 MPUREG_GYRO_CONFIG, /* 0x00 */
65 MPUREG_ACCEL_CONFIG, /* 0x00 */
66 MPUREG_ACCEL_FF_THR, /* 0x00 */
67 MPUREG_ACCEL_FF_DUR, /* 0x00 */
68 MPUREG_ACCEL_MOT_THR, /* 0x00 */
69 MPUREG_ACCEL_MOT_DUR, /* 0x00 */
70 MPUREG_ACCEL_ZRMOT_THR, /* 0x00 */
71 MPUREG_ACCEL_ZRMOT_DUR, /* 0x00 */
72 MPUREG_FIFO_EN, /* 0x23 */
73 MPUREG_I2C_MST_CTRL, /* 0x00 */
74 MPUREG_I2C_SLV0_ADDR, /* 0x25 */
75 MPUREG_I2C_SLV0_REG, /* 0x00 */
76 MPUREG_I2C_SLV0_CTRL, /* 0x00 */
77 MPUREG_I2C_SLV1_ADDR, /* 0x28 */
78 MPUREG_I2C_SLV1_REG_PASSWORD, /* 0x00 */
79 MPUREG_I2C_SLV1_CTRL, /* 0x00 */
80 MPUREG_I2C_SLV2_ADDR, /* 0x2B */
81 MPUREG_I2C_SLV2_REG, /* 0x00 */
82 MPUREG_I2C_SLV2_CTRL, /* 0x00 */
83 MPUREG_I2C_SLV3_ADDR, /* 0x2E */
84 MPUREG_I2C_SLV3_REG, /* 0x00 */
85 MPUREG_I2C_SLV3_CTRL, /* 0x00 */
86 MPUREG_I2C_SLV4_ADDR, /* 0x31 */
87 MPUREG_I2C_SLV4_REG, /* 0x00 */
88 MPUREG_I2C_SLV4_DO, /* 0x00 */
89 MPUREG_I2C_SLV4_CTRL, /* 0x00 */
90 MPUREG_I2C_SLV4_DI, /* 0x00 */
91 MPUREG_I2C_MST_STATUS, /* 0x36 */
92 MPUREG_INT_PIN_CFG, /* 0x37 ==> -* INT_CFG */
93 MPUREG_INT_ENABLE, /* 0x38 ==> / */
94 MPUREG_DMP_INT_STATUS, /* 0x39 */
95 MPUREG_INT_STATUS, /* 0x3A */
96 MPUREG_ACCEL_XOUT_H, /* 0x3B */
97 MPUREG_ACCEL_XOUT_L, /* 0x00 */
98 MPUREG_ACCEL_YOUT_H, /* 0x00 */
99 MPUREG_ACCEL_YOUT_L, /* 0x00 */
100 MPUREG_ACCEL_ZOUT_H, /* 0x00 */
101 MPUREG_ACCEL_ZOUT_L, /* 0x00 */
102 MPUREG_TEMP_OUT_H, /* 0x41 */
103 MPUREG_TEMP_OUT_L, /* 0x00 */
104 MPUREG_GYRO_XOUT_H, /* 0x43 */
105 MPUREG_GYRO_XOUT_L, /* 0x00 */
106 MPUREG_GYRO_YOUT_H, /* 0x00 */
107 MPUREG_GYRO_YOUT_L, /* 0x00 */
108 MPUREG_GYRO_ZOUT_H, /* 0x00 */
109 MPUREG_GYRO_ZOUT_L, /* 0x00 */
110 MPUREG_EXT_SLV_SENS_DATA_00, /* 0x49 */
111 MPUREG_EXT_SLV_SENS_DATA_01, /* 0x00 */
112 MPUREG_EXT_SLV_SENS_DATA_02, /* 0x00 */
113 MPUREG_EXT_SLV_SENS_DATA_03, /* 0x00 */
114 MPUREG_EXT_SLV_SENS_DATA_04, /* 0x00 */
115 MPUREG_EXT_SLV_SENS_DATA_05, /* 0x00 */
116 MPUREG_EXT_SLV_SENS_DATA_06, /* 0x4F */
117 MPUREG_EXT_SLV_SENS_DATA_07, /* 0x00 */
118 MPUREG_EXT_SLV_SENS_DATA_08, /* 0x00 */
119 MPUREG_EXT_SLV_SENS_DATA_09, /* 0x00 */
120 MPUREG_EXT_SLV_SENS_DATA_10, /* 0x00 */
121 MPUREG_EXT_SLV_SENS_DATA_11, /* 0x00 */
122 MPUREG_EXT_SLV_SENS_DATA_12, /* 0x55 */
123 MPUREG_EXT_SLV_SENS_DATA_13, /* 0x00 */
124 MPUREG_EXT_SLV_SENS_DATA_14, /* 0x00 */
125 MPUREG_EXT_SLV_SENS_DATA_15, /* 0x00 */
126 MPUREG_EXT_SLV_SENS_DATA_16, /* 0x00 */
127 MPUREG_EXT_SLV_SENS_DATA_17, /* 0x00 */
128 MPUREG_EXT_SLV_SENS_DATA_18, /* 0x5B */
129 MPUREG_EXT_SLV_SENS_DATA_19, /* 0x00 */
130 MPUREG_EXT_SLV_SENS_DATA_20, /* 0x00 */
131 MPUREG_EXT_SLV_SENS_DATA_21, /* 0x00 */
132 MPUREG_EXT_SLV_SENS_DATA_22, /* 0x00 */
133 MPUREG_EXT_SLV_SENS_DATA_23, /* 0x00 */
134 ACCEL_INTEL_STATUS, /* 0x61 */
135 MPUREG_62_RSVD, /* 0x00 */
136 MPUREG_63_RSVD, /* 0x00 */
137 MPUREG_64_RSVD, /* 0x00 */
138 MPUREG_65_RSVD, /* 0x00 */
139 MPUREG_66_RSVD, /* 0x00 */
140 MPUREG_67_RSVD, /* 0x00 */
141 SIGNAL_PATH_RESET, /* 0x68 */
142 ACCEL_INTEL_CTRL, /* 0x69 */
143 MPUREG_USER_CTRL, /* 0x6A */
144 MPUREG_PWR_MGMT_1, /* 0x6B */
145 MPUREG_PWR_MGMT_2, /* 0x00 */
146 MPUREG_BANK_SEL, /* 0x6D */
147 MPUREG_MEM_START_ADDR, /* 0x6E */
148 MPUREG_MEM_R_W, /* 0x6F */
149 MPUREG_PRGM_STRT_ADDRH, /* 0x00 */
150 MPUREG_PRGM_STRT_ADDRL, /* 0x00 */
151 MPUREG_FIFO_COUNTH, /* 0x72 */
152 MPUREG_FIFO_COUNTL, /* 0x00 */
153 MPUREG_FIFO_R_W, /* 0x74 */
154 MPUREG_WHOAMI, /* 0x75,117 */
156 NUM_OF_MPU_REGISTERS /* = 0x76,118 */
159 /*==== M_HW MEMORY ====*/
160 enum MPU_MEMORY_BANKS {
173 MPU_MEM_NUM_RAM_BANKS,
174 MPU_MEM_OTP_BANK_0 = 16
178 /*==== M_HW parameters ====*/
180 #define NUM_REGS (NUM_OF_MPU_REGISTERS)
181 #define START_SENS_REGS (0x3B)
182 #define NUM_SENS_REGS (0x60-START_SENS_REGS+1)
184 /*---- MPU Memory ----*/
185 #define NUM_BANKS (MPU_MEM_NUM_RAM_BANKS)
186 #define BANK_SIZE (256)
187 #define MEM_SIZE (NUM_BANKS*BANK_SIZE)
188 #define MPU_MEM_BANK_SIZE (BANK_SIZE) /*alternative name */
190 #define FIFO_HW_SIZE (1024)
192 #define NUM_EXT_SLAVES (4)
195 /*==== BITS FOR M_HW ====*/
197 /*---- M_HW 'FIFO_EN' register (23) ----*/
198 #define BIT_TEMP_OUT 0x80
199 #define BIT_GYRO_XOUT 0x40
200 #define BIT_GYRO_YOUT 0x20
201 #define BIT_GYRO_ZOUT 0x10
202 #define BIT_ACCEL 0x08
203 #define BIT_SLV_2 0x04
204 #define BIT_SLV_1 0x02
205 #define BIT_SLV_0 0x01
206 /*---- M_HW 'CONFIG' register (1A) ----*/
208 #define BITS_EXT_SYNC_SET 0x38
209 #define BITS_DLPF_CFG 0x07
210 /*---- M_HW 'GYRO_CONFIG' register (1B) ----*/
211 /* voluntarily modified label from BITS_FS_SEL to
212 * BITS_GYRO_FS_SEL to avoid confusion with MPU
214 #define BITS_GYRO_FS_SEL 0x18
216 /*---- M_HW 'ACCEL_CONFIG' register (1C) ----*/
217 #define BITS_ACCEL_FS_SEL 0x18
218 #define BITS_ACCEL_HPF 0x07
219 /*---- M_HW 'I2C_MST_CTRL' register (24) ----*/
220 #define BIT_MULT_MST_DIS 0x80
221 #define BIT_WAIT_FOR_ES 0x40
222 #define BIT_I2C_MST_VDDIO 0x20
224 #define BITS_I2C_MST_CLK 0x0F
225 /*---- M_HW 'I2C_SLV?_CTRL' register (27,2A,2D,30) ----*/
226 #define BIT_SLV_ENABLE 0x80
227 #define BIT_SLV_BYTE_SW 0x40
229 #define BIT_SLV_GRP 0x10
230 #define BITS_SLV_LENG 0x0F
231 /*---- M_HW 'I2C_SLV4_ADDR' register (31) ----*/
232 #define BIT_I2C_SLV4_RNW 0x80
233 /*---- M_HW 'I2C_SLV4_CTRL' register (34) ----*/
234 #define BIT_I2C_SLV4_EN 0x80
235 #define BIT_SLV4_DONE_INT_EN 0x40
237 /*---- M_HW 'I2C_MST_STATUS' register (36) ----*/
238 #define BIT_PASSTHROUGH 0x80
239 #define BIT_I2C_SLV4_DONE 0x40
240 #define BIT_I2C_LOST_ARB 0x20
241 #define BIT_I2C_SLV4_NACK 0x10
242 #define BIT_I2C_SLV3_NACK 0x08
243 #define BIT_I2C_SLV2_NACK 0x04
244 #define BIT_I2C_SLV1_NACK 0x02
245 #define BIT_I2C_SLV0_NACK 0x01
246 /*---- M_HW 'INT_PIN_CFG' register (37) ----*/
247 #define BIT_ACTL 0x80
248 #define BIT_ACTL_LOW 0x80
249 #define BIT_ACTL_HIGH 0x00
250 #define BIT_OPEN 0x40
251 #define BIT_LATCH_INT_EN 0x20
252 #define BIT_INT_ANYRD_2CLEAR 0x10
253 #define BIT_ACTL_FSYNC 0x08
254 #define BIT_FSYNC_INT_EN 0x04
255 #define BIT_BYPASS_EN 0x02
256 #define BIT_CLKOUT_EN 0x01
257 /*---- M_HW 'INT_ENABLE' register (38) ----*/
258 #define BIT_FF_EN 0x80
259 #define BIT_MOT_EN 0x40
260 #define BIT_ZMOT_EN 0x20
261 #define BIT_FIFO_OVERFLOW_EN 0x10
262 #define BIT_I2C_MST_INT_EN 0x08
263 #define BIT_PLL_RDY_EN 0x04
264 #define BIT_DMP_INT_EN 0x02
265 #define BIT_RAW_RDY_EN 0x01
266 /*---- M_HW 'DMP_INT_STATUS' register (39) ----*/
269 #define BIT_DMP_INT_5 0x20
270 #define BIT_DMP_INT_4 0x10
271 #define BIT_DMP_INT_3 0x08
272 #define BIT_DMP_INT_2 0x04
273 #define BIT_DMP_INT_1 0x02
274 #define BIT_DMP_INT_0 0x01
275 /*---- M_HW 'INT_STATUS' register (3A) ----*/
276 #define BIT_FF_INT 0x80
277 #define BIT_MOT_INT 0x40
278 #define BIT_ZMOT_INT 0x20
279 #define BIT_FIFO_OVERFLOW_INT 0x10
280 #define BIT_I2C_MST_INT 0x08
281 #define BIT_PLL_RDY_INT 0x04
282 #define BIT_DMP_INT 0x02
283 #define BIT_RAW_DATA_RDY_INT 0x01
284 /*---- M_HW 'BANK_SEL' register (6D) ----*/
285 #define BIT_PRFTCH_EN 0x40
286 #define BIT_CFG_USER_BANK 0x20
287 #define BITS_MEM_SEL 0x1f
288 /*---- M_HW 'USER_CTRL' register (6A) ----*/
289 #define BIT_DMP_EN 0x80
290 #define BIT_FIFO_EN 0x40
291 #define BIT_I2C_MST_EN 0x20
292 #define BIT_I2C_IF_DIS 0x10
293 #define BIT_DMP_RST 0x08
294 #define BIT_FIFO_RST 0x04
295 #define BIT_I2C_MST_RST 0x02
296 #define BIT_SIG_COND_RST 0x01
297 /*---- M_HW 'PWR_MGMT_1' register (6B) ----*/
298 #define BIT_H_RESET 0x80
299 #define BITS_PWRSEL 0x70
300 #define BIT_WKUP_INT 0x08
301 #define BITS_CLKSEL 0x07
302 /*---- M_HW 'PWR_MGMT_2' register (6C) ----*/
303 #define BITS_LPA_WAKE_CTRL 0xC0
304 #define BIT_STBY_XA 0x20
305 #define BIT_STBY_YA 0x10
306 #define BIT_STBY_ZA 0x08
307 #define BIT_STBY_XG 0x04
308 #define BIT_STBY_YG 0x02
309 #define BIT_STBY_ZG 0x01
311 /* although it has 6, this refers to the gyros */
312 #define MPU_NUM_AXES (3)
314 #define ACCEL_MOT_THR_LSB (32) /* mg */
315 #define ACCEL_MOT_DUR_LSB (1)
316 #define ACCEL_ZRMOT_THR_LSB_CONVERSION(mg) ((mg *1000)/255)
317 #define ACCEL_ZRMOT_DUR_LSB (64)
319 /*----------------------------------------------------------------------------*/
320 /*---- Alternative names to take care of conflicts with current mpu3050.h ----*/
321 /*----------------------------------------------------------------------------*/
324 #define MPUREG_DLPF_FS_SYNC MPUREG_CONFIG /* 0x1A */
326 #define MPUREG_PRODUCT_ID MPUREG_WHOAMI /* 0x75 HACK!*/
327 #define MPUREG_PWR_MGM MPUREG_PWR_MGMT_1 /* 0x6B */
328 #define MPUREG_FIFO_EN1 MPUREG_FIFO_EN /* 0x23 */
329 #define MPUREG_DMP_CFG_1 MPUREG_PRGM_STRT_ADDRH /* 0x70 */
330 #define MPUREG_DMP_CFG_2 MPUREG_PRGM_STRT_ADDRL /* 0x71 */
331 #define MPUREG_INT_CFG MPUREG_INT_ENABLE /* 0x38 */
332 #define MPUREG_X_OFFS_USRH MPUREG_XG_OFFS_USRH /* 0x13 */
333 #define MPUREG_WHO_AM_I MPUREG_WHOAMI /* 0x75 */
334 #define MPUREG_23_RSVD MPUREG_EXT_SLV_SENS_DATA_00 /* 0x49 */
335 #define MPUREG_AUX_SLV_ADDR MPUREG_I2C_SLV0_ADDR /* 0x25 */
336 #define MPUREG_ACCEL_BURST_ADDR MPUREG_I2C_SLV0_REG /* 0x26 */
339 /* 'USER_CTRL' register */
340 #define BIT_AUX_IF_EN BIT_I2C_MST_EN
341 #define BIT_AUX_RD_LENG BIT_I2C_MST_EN
342 #define BIT_IME_IF_RST BIT_I2C_MST_RST
343 #define BIT_GYRO_RST BIT_SIG_COND_RST
344 /* 'INT_ENABLE' register */
345 #define BIT_RAW_RDY BIT_RAW_DATA_RDY_INT
346 #define BIT_MPU_RDY_EN BIT_PLL_RDY_EN
347 /* 'INT_STATUS' register */
348 #define BIT_INT_STATUS_FIFO_OVERLOW BIT_FIFO_OVERFLOW_INT
352 /*---- M_HW Silicon Revisions ----*/
353 #define MPU_SILICON_REV_A1 1 /* M_HW A1 Device */
354 #define MPU_SILICON_REV_B1 2 /* M_HW B1 Device */
356 /*---- structure containing control variables used by MLDL ----*/
357 /*---- MPU clock source settings ----*/
358 /*---- MPU filter selections ----*/
360 MPU_FILTER_256HZ_NOLPF2 = 0,
367 MPU_FILTER_2100HZ_NOLPF,
380 MPU_CLK_SEL_INTERNAL = 0,
381 MPU_CLK_SEL_PLLGYROX,
382 MPU_CLK_SEL_PLLGYROY,
383 MPU_CLK_SEL_PLLGYROZ,
384 MPU_CLK_SEL_PLLEXT32K,
385 MPU_CLK_SEL_PLLEXT19M,
386 MPU_CLK_SEL_RESERVED,
392 MPU_EXT_SYNC_NONE = 0,
403 #define DLPF_FS_SYNC_VALUE(ext_sync, full_scale, lpf) \
404 ((ext_sync << 5) | (full_scale << 3) | lpf)
406 #endif /* __IMU6000_H_ */