Merge remote-tracking branch 'linux-2.6.32.y/master' into develop
[firefly-linux-kernel-4.4.55.git] / include / linux / mpu6000.h
1 /*
2  $License:
3     Copyright (C) 2010 InvenSense Corporation, All Rights Reserved.
4  $
5  */
6
7 /**
8  * @defgroup
9  * @brief
10  *
11  * @{
12  *      @file     mpu6000.h
13  *      @brief
14  */
15
16 #ifndef __MPU6000_H_
17 #define __MPU6000_H_
18
19 #define MPU_NAME "mpu6000"
20 #define DEFAULT_MPU_SLAVEADDR       0x68
21
22 /*==== M_HW REGISTER SET ====*/
23 enum {
24         MPUREG_XG_OFFS_TC = 0,
25         MPUREG_YG_OFFS_TC,
26         MPUREG_ZG_OFFS_TC,
27         MPUREG_X_FINE_GAIN,
28         MPUREG_Y_FINE_GAIN,
29         MPUREG_Z_FINE_GAIN,
30         MPUREG_XA_OFFS_H,
31         MPUREG_XA_OFFS_L_TC,
32         MPUREG_YA_OFFS_H,
33         MPUREG_YA_OFFS_L_TC,
34         MPUREG_ZA_OFFS_H,
35         MPUREG_ZA_OFFS_L_TC,    /* 0xB */
36         MPUREG_0C_RSVD,
37         MPUREG_0D_RSVD,
38         MPUREG_0E_RSVD,
39         MPUREG_0F_RSVD,
40         MPUREG_10_RSVD,
41         MPUREG_11_RSVD,
42         MPUREG_12_RSVD,
43         MPUREG_XG_OFFS_USRH,
44         MPUREG_XG_OFFS_USRL,
45         MPUREG_YG_OFFS_USRH,
46         MPUREG_YG_OFFS_USRL,
47         MPUREG_ZG_OFFS_USRH,
48         MPUREG_ZG_OFFS_USRL,
49         MPUREG_SMPLRT_DIV,      /* 0x19 */
50         MPUREG_CONFIG,          /* 0x1A ==> DLPF_FS_SYNC */
51         MPUREG_GYRO_CONFIG,
52         MPUREG_ACCEL_CONFIG,
53         MPUREG_ACCEL_FF_THR,
54         MPUREG_ACCEL_FF_DUR,
55         MPUREG_ACCEL_MOT_THR,
56         MPUREG_ACCEL_MOT_DUR,
57         MPUREG_ACCEL_ZRMOT_THR,
58         MPUREG_ACCEL_ZRMOT_DUR,
59         MPUREG_FIFO_EN,         /* 0x23 */
60         MPUREG_I2C_MST_CTRL,
61         MPUREG_I2C_SLV0_ADDR,   /* 0x25 */
62         MPUREG_I2C_SLV0_REG,
63         MPUREG_I2C_SLV0_CTRL,
64         MPUREG_I2C_SLV1_ADDR,   /* 0x28 */
65         MPUREG_I2C_SLV1_REG_PASSWORD,
66         MPUREG_I2C_SLV1_CTRL,
67         MPUREG_I2C_SLV2_ADDR,   /* 0x2B */
68         MPUREG_I2C_SLV2_REG,
69         MPUREG_I2C_SLV2_CTRL,
70         MPUREG_I2C_SLV3_ADDR,   /* 0x2E */
71         MPUREG_I2C_SLV3_REG,
72         MPUREG_I2C_SLV3_CTRL,
73         MPUREG_I2C_SLV4_ADDR,   /* 0x31 */
74         MPUREG_I2C_SLV4_REG,
75         MPUREG_I2C_SLV4_DO,
76         MPUREG_I2C_SLV4_CTRL,
77         MPUREG_I2C_SLV4_DI,
78         MPUREG_I2C_MST_STATUS,  /* 0x36 */
79         MPUREG_INT_PIN_CFG,     /* 0x37 ==> -* INT_CFG */
80         MPUREG_INT_ENABLE,      /* 0x38 ==> / */
81         MPUREG_DMP_INT_STATUS,  /* 0x39 */
82         MPUREG_INT_STATUS,      /* 0x3A */
83         MPUREG_ACCEL_XOUT_H,    /* 0x3B */
84         MPUREG_ACCEL_XOUT_L,
85         MPUREG_ACCEL_YOUT_H,
86         MPUREG_ACCEL_YOUT_L,
87         MPUREG_ACCEL_ZOUT_H,
88         MPUREG_ACCEL_ZOUT_L,
89         MPUREG_TEMP_OUT_H,      /* 0x41 */
90         MPUREG_TEMP_OUT_L,
91         MPUREG_GYRO_XOUT_H,     /* 0x43 */
92         MPUREG_GYRO_XOUT_L,
93         MPUREG_GYRO_YOUT_H,
94         MPUREG_GYRO_YOUT_L,
95         MPUREG_GYRO_ZOUT_H,
96         MPUREG_GYRO_ZOUT_L,
97         MPUREG_EXT_SLV_SENS_DATA_00,    /* 0x49 */
98         MPUREG_EXT_SLV_SENS_DATA_01,
99         MPUREG_EXT_SLV_SENS_DATA_02,
100         MPUREG_EXT_SLV_SENS_DATA_03,
101         MPUREG_EXT_SLV_SENS_DATA_04,
102         MPUREG_EXT_SLV_SENS_DATA_05,
103         MPUREG_EXT_SLV_SENS_DATA_06,    /* 0x4F */
104         MPUREG_EXT_SLV_SENS_DATA_07,
105         MPUREG_EXT_SLV_SENS_DATA_08,
106         MPUREG_EXT_SLV_SENS_DATA_09,
107         MPUREG_EXT_SLV_SENS_DATA_10,
108         MPUREG_EXT_SLV_SENS_DATA_11,
109         MPUREG_EXT_SLV_SENS_DATA_12,    /* 0x55 */
110         MPUREG_EXT_SLV_SENS_DATA_13,
111         MPUREG_EXT_SLV_SENS_DATA_14,
112         MPUREG_EXT_SLV_SENS_DATA_15,
113         MPUREG_EXT_SLV_SENS_DATA_16,
114         MPUREG_EXT_SLV_SENS_DATA_17,
115         MPUREG_EXT_SLV_SENS_DATA_18,    /* 0x5B */
116         MPUREG_EXT_SLV_SENS_DATA_19,
117         MPUREG_EXT_SLV_SENS_DATA_20,
118         MPUREG_EXT_SLV_SENS_DATA_21,
119         MPUREG_EXT_SLV_SENS_DATA_22,
120         MPUREG_EXT_SLV_SENS_DATA_23,
121         ACCEL_INTEL_STATUS,     /* 0x61 */
122         MPUREG_62_RSVD,
123         MPUREG_63_RSVD,
124         MPUREG_64_RSVD,
125         MPUREG_65_RSVD,
126         MPUREG_66_RSVD,
127         MPUREG_67_RSVD,
128         SIGNAL_PATH_RESET,      /* 0x68 */
129         ACCEL_INTEL_CTRL,       /* 0x69 */
130         MPUREG_USER_CTRL,       /* 0x6A */
131         MPUREG_PWR_MGMT_1,      /* 0x6B */
132         MPUREG_PWR_MGMT_2,
133         MPUREG_BANK_SEL,        /* 0x6D */
134         MPUREG_MEM_START_ADDR,  /* 0x6E */
135         MPUREG_MEM_R_W,         /* 0x6F */
136         MPUREG_PRGM_STRT_ADDRH,
137         MPUREG_PRGM_STRT_ADDRL,
138         MPUREG_FIFO_COUNTH,     /* 0x72 */
139         MPUREG_FIFO_COUNTL,
140         MPUREG_FIFO_R_W,        /* 0x74 */
141         MPUREG_WHOAMI,          /* 0x75,117 */
142
143         NUM_OF_MPU_REGISTERS    /* = 0x76,118 */
144 };
145
146 /*==== M_HW MEMORY ====*/
147 enum MPU_MEMORY_BANKS {
148         MEM_RAM_BANK_0 = 0,
149         MEM_RAM_BANK_1,
150         MEM_RAM_BANK_2,
151         MEM_RAM_BANK_3,
152         MEM_RAM_BANK_4,
153         MEM_RAM_BANK_5,
154         MEM_RAM_BANK_6,
155         MEM_RAM_BANK_7,
156         MEM_RAM_BANK_8,
157         MEM_RAM_BANK_9,
158         MEM_RAM_BANK_10,
159         MEM_RAM_BANK_11,
160         MPU_MEM_NUM_RAM_BANKS,
161         MPU_MEM_OTP_BANK_0 = 16
162 };
163
164
165 /*==== M_HW parameters ====*/
166
167 #define NUM_REGS            (NUM_OF_MPU_REGISTERS)
168 #define START_SENS_REGS     (0x3B)
169 #define NUM_SENS_REGS       (0x60-START_SENS_REGS+1)
170
171 /*---- MPU Memory ----*/
172 #define NUM_BANKS           (MPU_MEM_NUM_RAM_BANKS)
173 #define BANK_SIZE           (256)
174 #define MEM_SIZE            (NUM_BANKS*BANK_SIZE)
175 #define MPU_MEM_BANK_SIZE   (BANK_SIZE) /*alternative name */
176
177 #define FIFO_HW_SIZE        (1024)
178
179 #define NUM_EXT_SLAVES      (4)
180
181
182 /*==== BITS FOR M_HW ====*/
183
184 /*---- M_HW 'FIFO_EN' register (23) ----*/
185 #define BIT_TEMP_OUT                            0x80
186 #define BIT_GYRO_XOUT                           0x40
187 #define BIT_GYRO_YOUT                           0x20
188 #define BIT_GYRO_ZOUT                           0x10
189 #define BIT_ACCEL                               0x08
190 #define BIT_SLV_2                               0x04
191 #define BIT_SLV_1                               0x02
192 #define BIT_SLV_0                               0x01
193 /*---- M_HW 'CONFIG' register (1A) ----*/
194 /*NONE                                          0xC0 */
195 #define BITS_EXT_SYNC_SET                       0x38
196 #define BITS_DLPF_CFG                           0x07
197 /*---- M_HW 'GYRO_CONFIG' register (1B) ----*/
198 /* voluntarily modified label from BITS_FS_SEL to
199  * BITS_GYRO_FS_SEL to avoid confusion with MPU
200  */
201 #define BITS_GYRO_FS_SEL                        0x18
202 /*NONE                                          0x07 */
203 /*---- M_HW 'ACCEL_CONFIG' register (1C) ----*/
204 #define BITS_ACCEL_FS_SEL                       0x18
205 #define BITS_ACCEL_HPF                          0x07
206 /*---- M_HW 'I2C_MST_CTRL' register (24) ----*/
207 #define BIT_MULT_MST_DIS                        0x80
208 #define BIT_WAIT_FOR_ES                         0x40
209 #define BIT_I2C_MST_VDDIO                       0x20
210 /*NONE                                          0x10 */
211 #define BITS_I2C_MST_CLK                        0x0F
212 /*---- M_HW 'I2C_SLV?_CTRL' register (27,2A,2D,30) ----*/
213 #define BIT_SLV_ENABLE                          0x80
214 #define BIT_SLV_BYTE_SW                         0x40
215 /*NONE                                          0x20 */
216 #define BIT_SLV_GRP                             0x10
217 #define BITS_SLV_LENG                           0x0F
218 /*---- M_HW 'I2C_SLV4_ADDR' register (31) ----*/
219 #define BIT_I2C_SLV4_RNW                        0x80
220 /*---- M_HW 'I2C_SLV4_CTRL' register (34) ----*/
221 #define BIT_I2C_SLV4_EN                         0x80
222 #define BIT_SLV4_DONE_INT_EN                    0x40
223 /*NONE                                          0x3F */
224 /*---- M_HW 'I2C_MST_STATUS' register (36) ----*/
225 #define BIT_PASSTHROUGH                         0x80
226 #define BIT_I2C_SLV4_DONE                       0x40
227 #define BIT_I2C_LOST_ARB                        0x20
228 #define BIT_I2C_SLV4_NACK                       0x10
229 #define BIT_I2C_SLV3_NACK                       0x08
230 #define BIT_I2C_SLV2_NACK                       0x04
231 #define BIT_I2C_SLV1_NACK                       0x02
232 #define BIT_I2C_SLV0_NACK                       0x01
233 /*---- M_HW 'INT_PIN_CFG' register (37) ----*/
234 #define BIT_ACTL                                0x80
235 #define BIT_ACTL_LOW                            0x80
236 #define BIT_ACTL_HIGH                           0x00
237 #define BIT_OPEN                                0x40
238 #define BIT_LATCH_INT_EN                        0x20
239 #define BIT_INT_ANYRD_2CLEAR                    0x10
240 #define BIT_ACTL_FSYNC                          0x08
241 #define BIT_FSYNC_INT_EN                        0x04
242 #define BIT_BYPASS_EN                           0x02
243 #define BIT_CLKOUT_EN                           0x01
244 /*---- M_HW 'INT_ENABLE' register (38) ----*/
245 #define BIT_FF_EN                               0x80
246 #define BIT_MOT_EN                              0x40
247 #define BIT_ZMOT_EN                             0x20
248 #define BIT_FIFO_OVERFLOW_EN                    0x10
249 #define BIT_I2C_MST_INT_EN                      0x08
250 #define BIT_PLL_RDY_EN                          0x04
251 #define BIT_DMP_INT_EN                          0x02
252 #define BIT_RAW_RDY_EN                          0x01
253 /*---- M_HW 'DMP_INT_STATUS' register (39) ----*/
254 /*NONE                                          0x80 */
255 /*NONE                                          0x40 */
256 #define BIT_DMP_INT_5                           0x20
257 #define BIT_DMP_INT_4                           0x10
258 #define BIT_DMP_INT_3                           0x08
259 #define BIT_DMP_INT_2                           0x04
260 #define BIT_DMP_INT_1                           0x02
261 #define BIT_DMP_INT_0                           0x01
262 /*---- M_HW 'INT_STATUS' register (3A) ----*/
263 #define BIT_FF_INT                              0x80
264 #define BIT_MOT_INT                             0x40
265 #define BIT_ZMOT_INT                            0x20
266 #define BIT_FIFO_OVERFLOW_INT                   0x10
267 #define BIT_I2C_MST_INT                         0x08
268 #define BIT_PLL_RDY_INT                         0x04
269 #define BIT_DMP_INT                             0x02
270 #define BIT_RAW_DATA_RDY_INT                    0x01
271 /*---- M_HW 'BANK_SEL' register (6D) ----*/
272 #define BIT_PRFTCH_EN                           0x40
273 #define BIT_CFG_USER_BANK                       0x20
274 #define BITS_MEM_SEL                            0x1f
275 /*---- M_HW 'USER_CTRL' register (6A) ----*/
276 #define BIT_DMP_EN                              0x80
277 #define BIT_FIFO_EN                             0x40
278 #define BIT_I2C_MST_EN                          0x20
279 #define BIT_I2C_IF_DIS                          0x10
280 #define BIT_DMP_RST                             0x08
281 #define BIT_FIFO_RST                            0x04
282 #define BIT_I2C_MST_RST                         0x02
283 #define BIT_SIG_COND_RST                        0x01
284 /*---- M_HW 'PWR_MGMT_1' register (6B) ----*/
285 #define BIT_H_RESET                             0x80
286 #define BITS_PWRSEL                             0x70
287 #define BIT_WKUP_INT                            0x08
288 #define BITS_CLKSEL                             0x07
289 /*---- M_HW 'PWR_MGMT_2' register (6C) ----*/
290 #define BITS_LPA_WAKE_CTRL                      0xC0
291 #define BIT_STBY_XA                             0x20
292 #define BIT_STBY_YA                             0x10
293 #define BIT_STBY_ZA                             0x08
294 #define BIT_STBY_XG                             0x04
295 #define BIT_STBY_YG                             0x02
296 #define BIT_STBY_ZG                             0x01
297
298 /* although it has 6, this refers to the gyros */
299 #define MPU_NUM_AXES (3)
300
301 /*----------------------------------------------------------------------------*/
302 /*---- Alternative names to take care of conflicts with current mpu3050.h ----*/
303 /*----------------------------------------------------------------------------*/
304
305 /*-- registers --*/
306 #define MPUREG_DLPF_FS_SYNC        MPUREG_CONFIG                /* 0x1A */
307
308 #define MPUREG_PRODUCT_ID          MPUREG_WHOAMI                /* 0x75  HACK!*/
309 #define MPUREG_PWR_MGM             MPUREG_PWR_MGMT_1            /* 0x6B */
310 #define MPUREG_FIFO_EN1            MPUREG_FIFO_EN               /* 0x23 */
311 #define MPUREG_DMP_CFG_1           MPUREG_PRGM_STRT_ADDRH       /* 0x70 */
312 #define MPUREG_DMP_CFG_2           MPUREG_PRGM_STRT_ADDRL       /* 0x71 */
313 #define MPUREG_INT_CFG             MPUREG_INT_ENABLE            /* 0x38 */
314 #define MPUREG_X_OFFS_USRH         MPUREG_XG_OFFS_USRH          /* 0x13 */
315 #define MPUREG_WHO_AM_I            MPUREG_WHOAMI                /* 0x75 */
316 #define MPUREG_23_RSVD             MPUREG_EXT_SLV_SENS_DATA_00  /* 0x49 */
317 #define MPUREG_AUX_SLV_ADDR        MPUREG_I2C_SLV0_ADDR         /* 0x25 */
318 #define MPUREG_ACCEL_BURST_ADDR    MPUREG_I2C_SLV0_REG          /* 0x26 */
319
320 /*-- bits --*/
321 /* 'USER_CTRL' register */
322 #define BIT_AUX_IF_EN               BIT_I2C_MST_EN
323 #define BIT_AUX_RD_LENG             BIT_I2C_MST_EN
324 #define BIT_IME_IF_RST              BIT_I2C_MST_RST
325 #define BIT_GYRO_RST                BIT_SIG_COND_RST
326 /* 'INT_ENABLE' register */
327 #define BIT_RAW_RDY                 BIT_RAW_DATA_RDY_INT
328 #define BIT_MPU_RDY_EN              BIT_PLL_RDY_EN
329 /* 'INT_STATUS' register */
330 #define BIT_INT_STATUS_FIFO_OVERLOW BIT_FIFO_OVERFLOW_INT
331
332
333
334 /*---- M_HW Silicon Revisions ----*/
335 #define MPU_SILICON_REV_A1           1  /* M_HW A1 Device */
336 #define MPU_SILICON_REV_B1           2  /* M_HW B1 Device */
337
338 /*---- structure containing control variables used by MLDL ----*/
339 /*---- MPU clock source settings ----*/
340 /*---- MPU filter selections ----*/
341 enum mpu_filter {
342         MPU_FILTER_256HZ_NOLPF2 = 0,
343         MPU_FILTER_188HZ,
344         MPU_FILTER_98HZ,
345         MPU_FILTER_42HZ,
346         MPU_FILTER_20HZ,
347         MPU_FILTER_10HZ,
348         MPU_FILTER_5HZ,
349         MPU_FILTER_2100HZ_NOLPF,
350         NUM_MPU_FILTER
351 };
352
353 enum mpu_fullscale {
354         MPU_FS_250DPS = 0,
355         MPU_FS_500DPS,
356         MPU_FS_1000DPS,
357         MPU_FS_2000DPS,
358         NUM_MPU_FS
359 };
360
361 enum mpu_clock_sel {
362         MPU_CLK_SEL_INTERNAL = 0,
363         MPU_CLK_SEL_PLLGYROX,
364         MPU_CLK_SEL_PLLGYROY,
365         MPU_CLK_SEL_PLLGYROZ,
366         MPU_CLK_SEL_PLLEXT32K,
367         MPU_CLK_SEL_PLLEXT19M,
368         MPU_CLK_SEL_RESERVED,
369         MPU_CLK_SEL_STOP,
370         NUM_CLK_SEL
371 };
372
373 enum mpu_ext_sync {
374         MPU_EXT_SYNC_NONE = 0,
375         MPU_EXT_SYNC_TEMP,
376         MPU_EXT_SYNC_GYROX,
377         MPU_EXT_SYNC_GYROY,
378         MPU_EXT_SYNC_GYROZ,
379         MPU_EXT_SYNC_ACCELX,
380         MPU_EXT_SYNC_ACCELY,
381         MPU_EXT_SYNC_ACCELZ,
382         NUM_MPU_EXT_SYNC
383 };
384
385 #define DLPF_FS_SYNC_VALUE(ext_sync, full_scale, lpf) \
386     ((ext_sync << 5) | (full_scale << 3) | lpf)
387
388 #endif                          /* __IMU6000_H_ */