aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/mediatek/accelerometer/lsm6ds3/lsm6ds3.h
blob: 2e3decf056f39ec48b49cee6de12ebce8518d131 (plain) (blame)
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
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
/* lsm6ds3.h
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
#ifndef L3M6DS3_H
#define L3M6DS3_H
	 
#include <linux/ioctl.h>
	 
#define LSM6DS3_I2C_SLAVE_ADDR		0xD0
#define LSM6DS3_FIXED_DEVID			0x69


/* LSM6DS3 Register Map  (Please refer to LSM6DS3 Specifications) */
#define LSM6DS3_FUNC_CFG_ACCESS  0x00
#define LSM6DS3_RAM_ACCESS  	0X01
#define LSM6DS3_SENSOR_SYNC_TIME_FRAME 0X04

/*FIFO control register*/
#define LSM6DS3_FIFO_CTRL1 0x06
#define LSM6DS3_FIFO_CTRL2 0x07
#define LSM6DS3_FIFO_CTRL3 0x08
#define LSM6DS3_FIFO_CTRL4 0x09
#define LSM6DS3_FIFO_CTRL5 0x0a

/*Orientation configuration*/
#define LSM6DS3_ORIENT_CFG_G 0x0B

/*Interrupt control*/
#define LSM6DS3_INT1_CTRL 0x0C//0x0D
#define LSM6DS3_INT2_CTRL 0x0E

#define LSM6DS3_WHO_AM_I 0x0F

/*Acc and Gyro control registers*/
#define LSM6DS3_CTRL1_XL 0x10
#define LSM6DS3_CTRL2_G 0x11
#define LSM6DS3_CTRL3_C	0x12
#define LSM6DS3_CTRL4_C 0x1E//0x13
#define LSM6DS3_CTRL5_C 0x1f//0x14
#define LSM6DS3_CTRL6_C 0x20//0x15
#define LSM6DS3_CTRL7_G 0x21//0x16
#define LSM6DS3_CTRL8_XL 0x22//0x17
#define LSM6DS3_CTRL9_XL 0x23//0x18
#define LSM6DS3_CTRL10_C 0x24//0x19

#define LSM6DS3_MASTER_CONFIG 0x1A
#define LSM6DS3_WAKE_UP_SRC 0x1B
#define LSM6DS3_TAP_SRC 0x1C
#define LSM6DS3_D6D_SRC	0x1D
#define LSM6DS3_STATUS_REG 0x1E

/*Output register*/
#define LSM6DS3_OUT_TEMP_L 0x20
#define LSM6DS3_OUT_TEMP_H 0x21
#define LSM6DS3_OUTX_L_G   0x18
#define LSM6DS3_OUTX_H_G   0x19
#define LSM6DS3_OUTY_L_G   0x1A//0x24
#define LSM6DS3_OUTY_H_G   0x1B//0x25
#define LSM6DS3_OUTZ_L_G   0x1C//0x26
#define LSM6DS3_OUTZ_H_G   0x1D//0x27

#define LSM6DS3_OUTX_L_XL   0x28
#define LSM6DS3_OUTX_H_XL   0x29
#define LSM6DS3_OUTY_L_XL   0x1A//0x2A
#define LSM6DS3_OUTY_H_XL   0x1B//0x2B
#define LSM6DS3_OUTZ_L_XL   0x1C//0x2C
#define LSM6DS3_OUTZ_H_XL   0x1D//0x2D

/*Sensor Hub registers*/
#define LSM6DS3_SENSORHUB1_REG 0x2E
#define LSM6DS3_SENSORHUB2_REG 0x2F
#define LSM6DS3_SENSORHUB3_REG 0x30
#define LSM6DS3_SENSORHUB4_REG 0x31
#define LSM6DS3_SENSORHUB5_REG 0x32
#define LSM6DS3_SENSORHUB6_REG 0x33
#define LSM6DS3_SENSORHUB7_REG 0x34
#define LSM6DS3_SENSORHUB8_REG 0x35
#define LSM6DS3_SENSORHUB9_REG 0x36
#define LSM6DS3_SENSORHUB10_REG 0x37
#define LSM6DS3_SENSORHUB11_REG 0x38
#define LSM6DS3_SENSORHUB12_REG 0x39

#define LSM6DS3_SENSORHUB13_REG 0x4D
#define LSM6DS3_SENSORHUB14_REG 0x4E
#define LSM6DS3_SENSORHUB15_REG 0x4F
#define LSM6DS3_SENSORHUB16_REG 0x50
#define LSM6DS3_SENSORHUB17_REG 0x51
#define LSM6DS3_SENSORHUB18_REG 0x52

/*FIFO status registers*/
#define LSM6DS3_FIFO_STATUS1 0x3A
#define LSM6DS3_FIFO_STATUS2 0x3B
#define LSM6DS3_FIFO_STATUS3 0x3C
#define LSM6DS3_FIFO_STATUS4 0x3D

#define LSM6DS3_FIFO_DATA_OUT_L 0x3E
#define LSM6DS3_FIFO_DATA_OUT_H 0x3F

#define LSM6DS3_TIMESTAMP0_REG 0x40
#define LSM6DS3_TIMESTAMP1_REG 0x41
#define LSM6DS3_TIMESTAMP2_REG 0x42

#define LSM6DS3_STEP_TIMESTAMP_L 0x49
#define LSM6DS3_STEP_TIMESTAMP_H 0x4A

#define LSM6DS3_STEP_COUNTER_L	0x4B
#define LSM6DS3_STEP_COUNTER_H	0x4C

#define LSM6DS3_FUNC_SRC 	0x53
#define LSM6DS3_TAP_CFG	0x58
#define LSM6DS3_TAP_THS_6D 0x59
#define LSM6DS3_INT_DUR2	0x5A
#define LSM6DS3_WAKE_UP_THS	0x5B
#define LSM6DS3_WAKE_UP_DUR 0x5C

#define LSM6DS3_FREE_FALL 0x5D
#define LSM6DS3_MD1_CFG 0x5E
#define LSM6DS3_MD2_CFG 0x5F

/*Output Raw data*/
#define LSM6DS3_OUT_MAG_RAW_X_L 0x66
#define LSM6DS3_OUT_MAG_RAW_X_H 0x67
#define LSM6DS3_OUT_MAG_RAW_Y_L 0x68
#define LSM6DS3_OUT_MAG_RAW_Y_H 0x69
#define LSM6DS3_OUT_MAG_RAW_Z_L 0x6A
#define LSM6DS3_OUT_MAG_RAW_Z_H 0x6B

/*Embedded function register*/
#define LSM6DS3_SLV0_ADD 0x02
#define LSM6DS3_SLV0_SUBADD 0x03
#define LSM6DS3_SLAVE0_CONFIG 0x04

#define LSM6DS3_SLV1_ADD 0x05
#define LSM6DS3_SLV1_SUBADD 0x06
#define LSM6DS3_SLAVE1_CONFIG 0x07

#define LSM6DS3_SLV2_ADD 0x08
#define LSM6DS3_SLV2_SUBADD 0x09
#define LSM6DS3_SLAVE2_CONFIG 0x0a

#define LSM6DS3_SLV3_ADD 0x0b
#define LSM6DS3_SLV3_SUBADD 0x0c
#define LSM6DS3_SLAVE3_CONFIG 0x0d

#define LSM6DS3_DATAWRITE_SRC_MODE_SUB_SLV0 0x0e
#define LSM6DS3_SM_THS 0x13
#define LSM6DS3_STEP_COUNT_DELTA 0x15
#define LSM6DS3_MAG_SI_XX 0x24
#define LSM6DS3_MAG_SI_XY 0x25
#define LSM6DS3_MAG_SI_XZ 0x26
#define LSM6DS3_MAG_SI_YX 0x27
#define LSM6DS3_MAG_SI_YY 0x28
#define LSM6DS3_MAG_SI_YZ 0x29
#define LSM6DS3_MAG_SI_ZX 0x2a
#define LSM6DS3_MAG_SI_ZY 0x2b
#define LSM6DS3_MAG_SI_ZZ 0x2c

#define LSM6DS3_MAG_OFFX_L 0x2D
#define LSM6DS3_MAG_OFFX_H 0x2E
#define LSM6DS3_MAG_OFFY_L 0x2F
#define LSM6DS3_MAG_OFFY_H 0x30
#define LSM6DS3_MAG_OFFZ_L 0x31
#define LSM6DS3_MAG_OFFZ_H 0x32




/*LSM6DS3 Register Bit definitions*/
#define LSM6DS3_ACC_RANGE_MASK 0x0C
#define LSM6DS3_ACC_RANGE_2g		    0x00
#define LSM6DS3_ACC_RANGE_4g		    0x08
#define LSM6DS3_ACC_RANGE_8g		    0x0C
#define LSM6DS3_ACC_RANGE_16g		    0x04

#define LSM6DS3_ACC_ODR_MASK	0xF0
#define LSM6DS3_ACC_ODR_POWER_DOWN		0x00
#define LSM6DS3_ACC_ODR_13HZ		    0x10
#define LSM6DS3_ACC_ODR_26HZ		    0x20
#define LSM6DS3_ACC_ODR_52HZ		    0x30
#define LSM6DS3_ACC_ODR_104HZ		    0x40
#define LSM6DS3_ACC_ODR_208HZ		    0x50
#define LSM6DS3_ACC_ODR_416HZ		    0x60
#define LSM6DS3_ACC_ODR_833HZ		    0x70
#define LSM6DS3_ACC_ODR_1660HZ		    0x80
#define LSM6DS3_ACC_ODR_3330HZ		    0x90
#define LSM6DS3_ACC_ODR_6660HZ		    0xA0

#define LSM6DS3_GYRO_RANGE_MASK	0x0E
#define LSM6DS3_GYRO_RANGE_125DPS	0x02
#define LSM6DS3_GYRO_RANGE_245DPS	0x00
#define LSM6DS3_GYRO_RANGE_500DPS	0x04
#define LSM6DS3_GYRO_RANGE_1000DPS	0x08
#define LSM6DS3_GYRO_RANGE_2000DPS	0x0c

#define LSM6DS3_GYRO_ODR_MASK	0xf0
#define LSM6DS3_GYRO_ODR_POWER_DOWN	0x00
#define LSM6DS3_GYRO_ODR_13HZ		0x10
#define LSM6DS3_GYRO_ODR_26HZ		0x20
#define LSM6DS3_GYRO_ODR_52HZ		0x30
#define LSM6DS3_GYRO_ODR_104HZ		0x40
#define LSM6DS3_GYRO_ODR_208HZ		0x50
#define LSM6DS3_GYRO_ODR_416HZ		0x60
#define LSM6DS3_GYRO_ODR_833HZ		0x70
#define LSM6DS3_GYRO_ODR_1660HZ		0x80

#define AUTO_INCREMENT 0x80
#define LSM6DS3_CTRL3_C_IFINC 0x04


#define LSM6DS3_ACC_SENSITIVITY_2G		61	/*ug/LSB*/
#define LSM6DS3_ACC_SENSITIVITY_4G		122	/*ug/LSB*/
#define LSM6DS3_ACC_SENSITIVITY_8G		244	/*ug/LSB*/
#define LSM6DS3_ACC_SENSITIVITY_16G		488	/*ug/LSB*/


#define LSM6DS3_ACC_ENABLE_AXIS_MASK 0X38
#define LSM6DS3_ACC_ENABLE_AXIS_X 0x08
#define LSM6DS3_ACC_ENABLE_AXIS_Y 0x10
#define LSM6DS3_ACC_ENABLE_AXIS_Z 0x20



#define LSM6DS3_GYRO_SENSITIVITY_125DPS		4375	/*udps/LSB*/
#define LSM6DS3_GYRO_SENSITIVITY_245DPS		8750	/*udps/LSB*/
#define LSM6DS3_GYRO_SENSITIVITY_500DPS		17500	/*udps/LSB*/
#define LSM6DS3_GYRO_SENSITIVITY_1000DPS	35000	/*udps/LSB*/
#define LSM6DS3_GYRO_SENSITIVITY_2000DPS	70000	/*udps/LSB*/

#define LSM6DS3_GYRO_ENABLE_AXIS_MASK 0x38
#define LSM6DS3_GYRO_ENABLE_AXIS_X 0x08
#define LSM6DS3_GYRO_ENABLE_AXIS_Y 0x10
#define LSM6DS3_GYRO_ENABLE_AXIS_Z 0x20

#define LSM6DS3_ACC_GYRO_FUNC_EN_MASK  	0x04
#define LSM6DS3_PEDO_EN_MASK 0x40
typedef enum {
  	LSM6DS3_ACC_GYRO_PEDO_EN_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_PEDO_EN_ENABLED 		 =0x40,
} LSM6DS3_ACC_GYRO_PEDO_EN_t;

#define LSM6DS3_TILT_EN_MASK 0x20

typedef enum {
  	LSM6DS3_ACC_GYRO_TILT_EN_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_TILT_EN_ENABLED 		 =0x20,
} LSM6DS3_ACC_GYRO_TILT_EN_t;

typedef enum {
  	LSM6DS3_ACC_GYRO_INT1 		 =0,
  	LSM6DS3_ACC_GYRO_INT2 		 =1,
} LSM6DS3_ACC_GYRO_ROUNT_INT_t;
typedef enum {
  	LSM6DS3_ACC_GYRO_FUNC_EN_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_FUNC_EN_ENABLED 		 =0x04,
} LSM6DS3_ACC_GYRO_FUNC_EN_t;

typedef enum {
  	LSM6DS3_ACC_GYRO_INT_TILT_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_INT_TILT_ENABLED 		 =0x02,
} LSM6DS3_ACC_GYRO_INT2_TILT_t;

#define  	LSM6DS3_ACC_GYRO_INT_TILT_MASK  	0x02
typedef enum {
  	LSM6DS3_ACC_GYRO_TILT_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_TILT_ENABLED 		 =0x02,
} LSM6DS3_ACC_GYRO_TILT_t;

#define LSM6DS3_ACC_GYRO_TILT_MASK  	0x02

typedef enum {
  	LSM6DS3_ACC_GYRO_INT_SIGN_MOT_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_INT_SIGN_MOT_ENABLED 		 =0x40,
} LSM6DS3_ACC_GYRO_INT_SIGN_MOT_t;

#define  	LSM6DS3_ACC_GYRO_INT_SIGN_MOT_MASK  	0x40

typedef enum {
  	LSM6DS3_ACC_GYRO_SIGN_MOT_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_SIGN_MOT_ENABLED 		 =0x01,
} LSM6DS3_ACC_GYRO_SIGN_MOT_t;

#define  	LSM6DS3_ACC_GYRO_SIGN_MOT_MASK  	0x01

typedef enum {
  	LSM6DS3_ACC_GYRO_RAM_PAGE_DISABLED 		 =0x00,
  	LSM6DS3_ACC_GYRO_RAM_PAGE_ENABLED 		 =0x80,
} LSM6DS3_ACC_GYRO_RAM_PAGE_t;

#define LSM6DS3_RAM_PAGE_MASK  	0x80
#define LSM6DS3_CONFIG_PEDO_THS_MIN          0x0F

typedef enum {
  	LSM6DS3_ACC_GYRO_PEDO_RST_STEP_DISABLED 	 =0x00,
  	LSM6DS3_ACC_GYRO_PEDO_RST_STEP_ENABLED 		 =0x02,
} LSM6DS3_ACC_GYRO_PEDO_RST_STEP_t;

#define LSM6DS3_PEDO_RST_STEP_MASK  0x02

typedef enum {
  	LSM6DS3_ACC_GYRO_INT_ACTIVE_HIGH 	 =0x00,
  	LSM6DS3_ACC_GYRO_INT_ACTIVE_LOW		 =0x20,
} LSM6DS3_ACC_GYRO_INT_ACTIVE_t;

#define LSM6DS3_ACC_GYRO_INT_ACTIVE_MASK 0x20

typedef enum {
  	LSM6DS3_ACC_GYRO_INT_LATCH 	  =0x01,
  	LSM6DS3_ACC_GYRO_INT_NO_LATCH	 =0x00,
} LSM6DS3_ACC_GYRO_INT_LATCH_CTL_t;

#define LSM6DS3_ACC_GYRO_INT_LATCH_CTL_MASK 0x01



#define LSM6DS3_SIGNICANT_MOTION_INT_STATUS 0x40
#define LSM6DS3_TILT_INT_STATUS 0x20
#define LSM6DS3_STEP_DETECT_INT_STATUS 0x10



#define LSM6DS3_SUCCESS		       0
#define LSM6DS3_ERR_I2C		      -1
#define LSM6DS3_ERR_STATUS			  -3
#define LSM6DS3_ERR_SETUP_FAILURE	  -4
#define LSM6DS3_ERR_GETGSENSORDATA  -5
#define LSM6DS3_ERR_IDENTIFICATION	  -6

#define LSM6DS3_BUFSIZE 60

/*------------------------------------------------------------------*/

// 1 rad = 180/PI degree, L3G4200D_OUT_MAGNIFY = 131,
// 180*131/PI = 7506
#define DEGREE_TO_RAD	180*1000000/PI//7506  // fenggy mask
//#define DEGREE_TO_RAD 819	 
#endif //L3M6DS3_H