1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
|
/*
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
/*register and associated bit definition*/
#ifndef __MPU6050_H__
#define __MPU6050_H__
#define REG_SAMPLE_RATE_DIV 0x19
#define REG_CONFIG 0x1A
#define REG_GYRO_CONFIG 0x1B
#define BITS_SELF_TEST_EN 0xE0
#define GYRO_CONFIG_FSR_SHIFT 3
#define REG_ACCEL_CONFIG 0x1C
#define REG_ACCEL_MOT_THR 0x1F
#define REG_ACCEL_MOT_DUR 0x20
#define ACCL_CONFIG_FSR_SHIFT 3
#define REG_ACCELMOT_THR 0x1F
#define REG_ACCEL_MOT_DUR 0x20
#define REG_FIFO_EN 0x23
#define FIFO_DISABLE_ALL 0x00
#define BIT_ACCEL_OUT 0x08
#define BITS_GYRO_OUT 0x70
#define REG_INT_PIN_CFG 0x37
#define BIT_INT_ACTIVE_LOW 0x80
#define BIT_INT_OPEN_DRAIN 0x40
#define BIT_INT_LATCH_EN 0x20
#define BIT_INT_RD_CLR 0x10
#define BIT_I2C_BYPASS_EN 0x02
#define BIT_INT_CFG_DEFAULT (BIT_INT_LATCH_EN | BIT_INT_RD_CLR)
#define REG_INT_ENABLE 0x38
#define BIT_DATA_RDY_EN 0x01
#define BIT_DMP_INT_EN 0x02
#define BIT_FIFO_OVERFLOW 0x10
#define BIT_ZMOT_EN 0x20
#define BIT_MOT_EN 0x40
#define BIT_6500_WOM_EN 0x40
#define REG_DMP_INT_STATUS 0x39
#define REG_INT_STATUS 0x3A
#define BIT_DATA_RDY_INT 0x01
#define BIT_DMP_INT_INT 0x02
#define BIT_FIFO_OVERFLOW 0x10
#define BIT_ZMOT_INT 0x20
#define BIT_MOT_INT 0x40
#define BIT_6500_WOM_INT 0x40
#define REG_RAW_ACCEL 0x3B
#define REG_TEMPERATURE 0x41
#define REG_RAW_GYRO 0x43
#define REG_EXT_SENS_DATA_00 0x49
#define BIT_FIFO_RST 0x04
#define BIT_DMP_RST 0x08
#define BIT_I2C_MST_EN 0x20
#define BIT_FIFO_EN 0x40
#define BIT_DMP_EN 0x80
#define BIT_ACCEL_FIFO 0x08
#define BIT_GYRO_FIFO 0x70
#define REG_DETECT_CTRL 0x69
#define MOT_DET_DELAY_SHIFT 4
#define REG_USER_CTRL 0x6A
#define BIT_FIFO_EN 0x40
#define BIT_FIFO_RESET 0x04
#define REG_PWR_MGMT_1 0x6B
#define BIT_H_RESET 0x80
#define BIT_SLEEP 0x40
#define BIT_CYCLE 0x20
#define BIT_CLK_MASK 0x07
#define BIT_RESET_ALL 0xCF
#define BIT_WAKEUP_AFTER_RESET 0x00
#define REG_PWR_MGMT_2 0x6C
#define BIT_PWR_ACCEL_STBY_MASK 0x38
#define BIT_PWR_GYRO_STBY_MASK 0x07
#define BIT_LPA_FREQ_MASK 0xC0
#define BITS_PWR_ALL_AXIS_STBY (BIT_PWR_ACCEL_STBY_MASK |\
BIT_PWR_GYRO_STBY_MASK)
#define REG_FIFO_COUNT_H 0x72
#define REG_FIFO_R_W 0x74
#define REG_WHOAMI 0x75
#define SAMPLE_DIV_MAX 0xFF
#define ODR_DLPF_DIS 8000
#define ODR_DLPF_ENA 1000
/* Min delay = MSEC_PER_SEC/ODR_DLPF_ENA */
/* Max delay = MSEC_PER_SEC/(ODR_DLPF_ENA/SAMPLE_DIV_MAX+1) */
#define DELAY_MS_MIN_DLPF 1
#define DELAY_MS_MAX_DLPF 256
/* Min delay = MSEC_PER_SEC/ODR_DLPF_DIS and round up to 1*/
/* Max delay = MSEC_PER_SEC/(ODR_DLPF_DIS/SAMPLE_DIV_MAX+1) */
#define DELAY_MS_MIN_NODLPF 1
#define DELAY_MS_MAX_NODLPF 32
/* device bootup time in millisecond */
#define POWER_UP_TIME_MS 100
/* delay to wait gyro engine stable in millisecond */
#define SENSOR_UP_TIME_MS 30
/* delay between power operation in millisecond */
#define POWER_EN_DELAY_US 10
#define MPU6050_LPA_5HZ 0x40
/* initial configure */
#define INIT_FIFO_RATE 200
#define DEFAULT_MOT_THR 1
#define DEFAULT_MOT_DET_DUR 1
#define DEFAULT_MOT_DET_DELAY 0
/* chip reset wait */
#define MPU6050_RESET_RETRY_CNT 10
#define MPU6050_RESET_WAIT_MS 20
/* FIFO related constant */
#define MPU6050_FIFO_SIZE_BYTE 1024
#define MPU6050_FIFO_CNT_SIZE 2
enum mpu_device_id {
MPU6050_ID = 0x68,
MPU6500_ID = 0x70,
};
enum mpu_fsr {
MPU_FSR_250DPS = 0,
MPU_FSR_500DPS,
MPU_FSR_1000DPS,
MPU_FSR_2000DPS,
NUM_FSR
};
enum mpu_filter {
MPU_DLPF_256HZ_NOLPF2 = 0,
MPU_DLPF_188HZ,
MPU_DLPF_98HZ,
MPU_DLPF_42HZ,
MPU_DLPF_20HZ,
MPU_DLPF_10HZ,
MPU_DLPF_5HZ,
MPU_DLPF_RESERVED,
NUM_FILTER
};
enum mpu_clock_source {
MPU_CLK_INTERNAL = 0,
MPU_CLK_PLL_X,
NUM_CLK
};
enum mpu_accl_fs {
ACCEL_FS_02G = 0,
ACCEL_FS_04G,
ACCEL_FS_08G,
ACCEL_FS_16G,
NUM_ACCL_FSR
};
/* Sensitivity Scale Factor */
/* Sensor HAL will take 1024 LSB/g */
enum mpu_accel_fs_shift {
ACCEL_SCALE_SHIFT_02G = 0,
ACCEL_SCALE_SHIFT_04G = 1,
ACCEL_SCALE_SHIFT_08G = 2,
ACCEL_SCALE_SHIFT_16G = 3
};
enum mpu_gyro_fs_shift {
GYRO_SCALE_SHIFT_FS0 = 3,
GYRO_SCALE_SHIFT_FS1 = 2,
GYRO_SCALE_SHIFT_FS2 = 1,
GYRO_SCALE_SHIFT_FS3 = 0
};
/*device enum */
enum inv_devices {
INV_MPU6050,
INV_MPU6500,
INV_MPU6XXX,
INV_NUM_PARTS
};
/**
* struct mpu_reg_map_s - Notable slave registers.
* @sample_rate_div: Divider applied to gyro output rate.
* @lpf: Configures internal LPF.
* @fifo_en: Determines which data will appear in FIFO.
* @gyro_config: gyro config register.
* @accel_config: accel config register
* @mot_thr: Motion detection threshold.
* @fifo_count_h: Upper byte of FIFO count.
* @fifo_r_w: FIFO register.
* @raw_gyro: Address of first gyro register.
* @raw_accl: Address of first accel register.
* @temperature: temperature register.
* @int_pin_cfg: Interrupt pin and I2C bypass configuration.
* @int_enable: Interrupt enable register.
* @int_status: Interrupt flags.
* @user_ctrl: User control.
* @pwr_mgmt_1: Controls chip's power state and clock source.
* @pwr_mgmt_2: Controls power state of individual sensors.
*/
struct mpu_reg_map {
u8 sample_rate_div;
u8 lpf;
u8 fifo_en;
u8 gyro_config;
u8 accel_config;
u8 fifo_count_h;
u8 mot_thr;
u8 mot_dur;
u8 fifo_r_w;
u8 raw_gyro;
u8 raw_accel;
u8 temperature;
u8 int_pin_cfg;
u8 int_enable;
u8 int_status;
u8 user_ctrl;
u8 pwr_mgmt_1;
u8 pwr_mgmt_2;
};
/**
* struct mpu_chip_config - Cached chip configuration data.
* @fsr: Full scale range.
* @lpf: Digital low pass filter frequency.
* @accl_fs: accel full scale range.
* @enable: master enable to enable output
* @accel_enable: enable accel functionality
* @accel_fifo_enable: enable accel data output
* @gyro_enable: enable gyro functionality
* @gyro_fifo_enable: enable gyro data output
* @is_asleep: 1 if chip is powered down.
* @lpa_mode: low power mode.
* @tap_on: tap on/off.
* @flick_int_on: flick interrupt on/off.
* @int_enabled: interrupt is enabled.
* @mot_det_on: motion detection wakeup enabled.
* @cfg_fifo_en: FIFO R/W is enabled in USER_CTRL register.
* @int_pin_cfg: interrupt pin configuration.
* @lpa_freq: frequency of low power accelerometer.
* @rate_div: Sampling rate divider.
*/
struct mpu_chip_config {
u32 fsr:2;
u32 lpf:3;
u32 accel_fs:2;
u32 enable:1;
u32 accel_enable:1;
u32 accel_fifo_enable:1;
u32 gyro_enable:1;
u32 gyro_fifo_enable:1;
u32 is_asleep:1;
u32 lpa_mode:1;
u32 tap_on:1;
u32 flick_int_on:1;
u32 int_enabled:1;
u32 mot_det_on:1;
u32 cfg_fifo_en:1;
u8 int_pin_cfg;
u16 lpa_freq;
u16 rate_div;
};
/**
* struct mpu6050_platform_data - device platform dependent data.
* @gpio_en: enable GPIO.
* @gpio_int: interrupt GPIO.
* @int_flags: interrupt pin control flags.
* @use_int: use interrupt mode instead of polling data.
* @place: sensor place number.
*/
struct mpu6050_platform_data {
int gpio_en;
int gpio_int;
u32 int_flags;
bool use_int;
u8 place;
};
#endif /* __MPU6050_H__ */
|