• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  $License:
3    Copyright 2011 InvenSense, Inc.
4 
5  Licensed under the Apache License, Version 2.0 (the "License");
6  you may not use this file except in compliance with the License.
7  You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11  Unless required by applicable law or agreed to in writing, software
12  distributed under the License is distributed on an "AS IS" BASIS,
13  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  See the License for the specific language governing permissions and
15  limitations under the License.
16   $
17  */
18 
19 #ifndef __MPU_H_
20 #error Do not include this file directly.  Include mpu.h instead.
21 #endif
22 
23 #ifndef __MPU3050_H_
24 #define __MPU3050_H_
25 
26 #ifdef __KERNEL__
27 #include <linux/types.h>
28 #endif
29 
30 #if !defined CONFIG_MPU_SENSORS_MPU3050
31 #error MPU6000 build including MPU3050 header
32 #endif
33 
34 #define MPU_NAME "mpu3050"
35 #define DEFAULT_MPU_SLAVEADDR       0x68
36 
37 /*==== MPU REGISTER SET ====*/
38 enum mpu_register {
39 	MPUREG_WHO_AM_I = 0,	/* 00 0x00 */
40 	MPUREG_PRODUCT_ID,	/* 01 0x01 */
41 	MPUREG_02_RSVD,		/* 02 0x02 */
42 	MPUREG_03_RSVD,		/* 03 0x03 */
43 	MPUREG_04_RSVD,		/* 04 0x04 */
44 	MPUREG_XG_OFFS_TC,	/* 05 0x05 */
45 	MPUREG_06_RSVD,		/* 06 0x06 */
46 	MPUREG_07_RSVD,		/* 07 0x07 */
47 	MPUREG_YG_OFFS_TC,	/* 08 0x08 */
48 	MPUREG_09_RSVD,		/* 09 0x09 */
49 	MPUREG_0A_RSVD,		/* 10 0x0a */
50 	MPUREG_ZG_OFFS_TC,	/* 11 0x0b */
51 	MPUREG_X_OFFS_USRH,	/* 12 0x0c */
52 	MPUREG_X_OFFS_USRL,	/* 13 0x0d */
53 	MPUREG_Y_OFFS_USRH,	/* 14 0x0e */
54 	MPUREG_Y_OFFS_USRL,	/* 15 0x0f */
55 	MPUREG_Z_OFFS_USRH,	/* 16 0x10 */
56 	MPUREG_Z_OFFS_USRL,	/* 17 0x11 */
57 	MPUREG_FIFO_EN1,	/* 18 0x12 */
58 	MPUREG_FIFO_EN2,	/* 19 0x13 */
59 	MPUREG_AUX_SLV_ADDR,	/* 20 0x14 */
60 	MPUREG_SMPLRT_DIV,	/* 21 0x15 */
61 	MPUREG_DLPF_FS_SYNC,	/* 22 0x16 */
62 	MPUREG_INT_CFG,		/* 23 0x17 */
63 	MPUREG_ACCEL_BURST_ADDR,/* 24 0x18 */
64 	MPUREG_19_RSVD,		/* 25 0x19 */
65 	MPUREG_INT_STATUS,	/* 26 0x1a */
66 	MPUREG_TEMP_OUT_H,	/* 27 0x1b */
67 	MPUREG_TEMP_OUT_L,	/* 28 0x1c */
68 	MPUREG_GYRO_XOUT_H,	/* 29 0x1d */
69 	MPUREG_GYRO_XOUT_L,	/* 30 0x1e */
70 	MPUREG_GYRO_YOUT_H,	/* 31 0x1f */
71 	MPUREG_GYRO_YOUT_L,	/* 32 0x20 */
72 	MPUREG_GYRO_ZOUT_H,	/* 33 0x21 */
73 	MPUREG_GYRO_ZOUT_L,	/* 34 0x22 */
74 	MPUREG_23_RSVD,		/* 35 0x23 */
75 	MPUREG_24_RSVD,		/* 36 0x24 */
76 	MPUREG_25_RSVD,		/* 37 0x25 */
77 	MPUREG_26_RSVD,		/* 38 0x26 */
78 	MPUREG_27_RSVD,		/* 39 0x27 */
79 	MPUREG_28_RSVD,		/* 40 0x28 */
80 	MPUREG_29_RSVD,		/* 41 0x29 */
81 	MPUREG_2A_RSVD,		/* 42 0x2a */
82 	MPUREG_2B_RSVD,		/* 43 0x2b */
83 	MPUREG_2C_RSVD,		/* 44 0x2c */
84 	MPUREG_2D_RSVD,		/* 45 0x2d */
85 	MPUREG_2E_RSVD,		/* 46 0x2e */
86 	MPUREG_2F_RSVD,		/* 47 0x2f */
87 	MPUREG_30_RSVD,		/* 48 0x30 */
88 	MPUREG_31_RSVD,		/* 49 0x31 */
89 	MPUREG_32_RSVD,		/* 50 0x32 */
90 	MPUREG_33_RSVD,		/* 51 0x33 */
91 	MPUREG_34_RSVD,		/* 52 0x34 */
92 	MPUREG_DMP_CFG_1,	/* 53 0x35 */
93 	MPUREG_DMP_CFG_2,	/* 54 0x36 */
94 	MPUREG_BANK_SEL,	/* 55 0x37 */
95 	MPUREG_MEM_START_ADDR,	/* 56 0x38 */
96 	MPUREG_MEM_R_W,		/* 57 0x39 */
97 	MPUREG_FIFO_COUNTH,	/* 58 0x3a */
98 	MPUREG_FIFO_COUNTL,	/* 59 0x3b */
99 	MPUREG_FIFO_R_W,	/* 60 0x3c */
100 	MPUREG_USER_CTRL,	/* 61 0x3d */
101 	MPUREG_PWR_MGM,		/* 62 0x3e */
102 	MPUREG_3F_RSVD,		/* 63 0x3f */
103 	NUM_OF_MPU_REGISTERS	/* 64 0x40 */
104 };
105 
106 /*==== BITS FOR MPU ====*/
107 
108 /*---- MPU 'FIFO_EN1' register (12) ----*/
109 #define BIT_TEMP_OUT                0x80
110 #define BIT_GYRO_XOUT               0x40
111 #define BIT_GYRO_YOUT               0x20
112 #define BIT_GYRO_ZOUT               0x10
113 #define BIT_ACCEL_XOUT              0x08
114 #define BIT_ACCEL_YOUT              0x04
115 #define BIT_ACCEL_ZOUT              0x02
116 #define BIT_AUX_1OUT                0x01
117 /*---- MPU 'FIFO_EN2' register (13) ----*/
118 #define BIT_AUX_2OUT                0x02
119 #define BIT_AUX_3OUT                0x01
120 /*---- MPU 'DLPF_FS_SYNC' register (16) ----*/
121 #define BITS_EXT_SYNC_NONE          0x00
122 #define BITS_EXT_SYNC_TEMP          0x20
123 #define BITS_EXT_SYNC_GYROX         0x40
124 #define BITS_EXT_SYNC_GYROY         0x60
125 #define BITS_EXT_SYNC_GYROZ         0x80
126 #define BITS_EXT_SYNC_ACCELX        0xA0
127 #define BITS_EXT_SYNC_ACCELY        0xC0
128 #define BITS_EXT_SYNC_ACCELZ        0xE0
129 #define BITS_EXT_SYNC_MASK          0xE0
130 #define BITS_FS_250DPS              0x00
131 #define BITS_FS_500DPS              0x08
132 #define BITS_FS_1000DPS             0x10
133 #define BITS_FS_2000DPS             0x18
134 #define BITS_FS_MASK                0x18
135 #define BITS_DLPF_CFG_256HZ_NOLPF2  0x00
136 #define BITS_DLPF_CFG_188HZ         0x01
137 #define BITS_DLPF_CFG_98HZ          0x02
138 #define BITS_DLPF_CFG_42HZ          0x03
139 #define BITS_DLPF_CFG_20HZ          0x04
140 #define BITS_DLPF_CFG_10HZ          0x05
141 #define BITS_DLPF_CFG_5HZ           0x06
142 #define BITS_DLPF_CFG_2100HZ_NOLPF  0x07
143 #define BITS_DLPF_CFG_MASK          0x07
144 /*---- MPU 'INT_CFG' register (17) ----*/
145 #define BIT_ACTL                    0x80
146 #define BIT_ACTL_LOW                0x80
147 #define BIT_ACTL_HIGH               0x00
148 #define BIT_OPEN                    0x40
149 #define BIT_OPEN_DRAIN              0x40
150 #define BIT_PUSH_PULL               0x00
151 #define BIT_LATCH_INT_EN            0x20
152 #define BIT_INT_PULSE_WIDTH_50US    0x00
153 #define BIT_INT_ANYRD_2CLEAR        0x10
154 #define BIT_INT_STAT_READ_2CLEAR    0x00
155 #define BIT_MPU_RDY_EN              0x04
156 #define BIT_DMP_INT_EN              0x02
157 #define BIT_RAW_RDY_EN              0x01
158 /*---- MPU 'INT_STATUS' register (1A) ----*/
159 #define BIT_INT_STATUS_FIFO_OVERLOW 0x80
160 #define BIT_MPU_RDY                 0x04
161 #define BIT_DMP_INT                 0x02
162 #define BIT_RAW_RDY                 0x01
163 /*---- MPU 'BANK_SEL' register (37) ----*/
164 #define BIT_PRFTCH_EN               0x20
165 #define BIT_CFG_USER_BANK           0x10
166 #define BITS_MEM_SEL                0x0f
167 /*---- MPU 'USER_CTRL' register (3D) ----*/
168 #define BIT_DMP_EN                  0x80
169 #define BIT_FIFO_EN                 0x40
170 #define BIT_AUX_IF_EN               0x20
171 #define BIT_AUX_RD_LENG             0x10
172 #define BIT_AUX_IF_RST              0x08
173 #define BIT_DMP_RST                 0x04
174 #define BIT_FIFO_RST                0x02
175 #define BIT_GYRO_RST                0x01
176 /*---- MPU 'PWR_MGM' register (3E) ----*/
177 #define BIT_H_RESET                 0x80
178 #define BIT_SLEEP                   0x40
179 #define BIT_STBY_XG                 0x20
180 #define BIT_STBY_YG                 0x10
181 #define BIT_STBY_ZG                 0x08
182 #define BITS_CLKSEL                 0x07
183 
184 /*---- MPU Silicon Revision ----*/
185 #define MPU_SILICON_REV_A4           1	/* MPU A4 Device */
186 #define MPU_SILICON_REV_B1           2	/* MPU B1 Device */
187 #define MPU_SILICON_REV_B4           3	/* MPU B4 Device */
188 #define MPU_SILICON_REV_B6           4	/* MPU B6 Device */
189 
190 /*---- MPU Memory ----*/
191 #define MPU_MEM_BANK_SIZE           (256)
192 #define FIFO_HW_SIZE                (512)
193 
194 enum MPU_MEMORY_BANKS {
195 	MPU_MEM_RAM_BANK_0 = 0,
196 	MPU_MEM_RAM_BANK_1,
197 	MPU_MEM_RAM_BANK_2,
198 	MPU_MEM_RAM_BANK_3,
199 	MPU_MEM_NUM_RAM_BANKS,
200 	MPU_MEM_OTP_BANK_0 = MPU_MEM_NUM_RAM_BANKS,
201 	/* This one is always last */
202 	MPU_MEM_NUM_BANKS
203 };
204 
205 /*---- structure containing control variables used by MLDL ----*/
206 /*---- MPU clock source settings ----*/
207 /*---- MPU filter selections ----*/
208 enum mpu_filter {
209 	MPU_FILTER_256HZ_NOLPF2 = 0,
210 	MPU_FILTER_188HZ,
211 	MPU_FILTER_98HZ,
212 	MPU_FILTER_42HZ,
213 	MPU_FILTER_20HZ,
214 	MPU_FILTER_10HZ,
215 	MPU_FILTER_5HZ,
216 	MPU_FILTER_2100HZ_NOLPF,
217 	NUM_MPU_FILTER
218 };
219 
220 enum mpu_fullscale {
221 	MPU_FS_250DPS = 0,
222 	MPU_FS_500DPS,
223 	MPU_FS_1000DPS,
224 	MPU_FS_2000DPS,
225 	NUM_MPU_FS
226 };
227 
228 enum mpu_clock_sel {
229 	MPU_CLK_SEL_INTERNAL = 0,
230 	MPU_CLK_SEL_PLLGYROX,
231 	MPU_CLK_SEL_PLLGYROY,
232 	MPU_CLK_SEL_PLLGYROZ,
233 	MPU_CLK_SEL_PLLEXT32K,
234 	MPU_CLK_SEL_PLLEXT19M,
235 	MPU_CLK_SEL_RESERVED,
236 	MPU_CLK_SEL_STOP,
237 	NUM_CLK_SEL
238 };
239 
240 enum mpu_ext_sync {
241 	MPU_EXT_SYNC_NONE = 0,
242 	MPU_EXT_SYNC_TEMP,
243 	MPU_EXT_SYNC_GYROX,
244 	MPU_EXT_SYNC_GYROY,
245 	MPU_EXT_SYNC_GYROZ,
246 	MPU_EXT_SYNC_ACCELX,
247 	MPU_EXT_SYNC_ACCELY,
248 	MPU_EXT_SYNC_ACCELZ,
249 	NUM_MPU_EXT_SYNC
250 };
251 
252 #define DLPF_FS_SYNC_VALUE(ext_sync, full_scale, lpf) \
253 	((ext_sync << 5) | (full_scale << 3) | lpf)
254 
255 #endif				/* __MPU3050_H_ */
256