• 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 /**
20  *  @addtogroup MLDL
21  *
22  *  @{
23  *      @file   mldl_cfg.h
24  *      @brief  The Motion Library Driver Layer Configuration header file.
25  */
26 
27 #ifndef __MLDL_CFG_H__
28 #define __MLDL_CFG_H__
29 
30 #include "mltypes.h"
31 #include "mlsl.h"
32 #include <linux/mpu.h>
33 #if defined CONFIG_MPU_SENSORS_MPU6050A2
34 #    include "mpu6050a2.h"
35 #elif defined CONFIG_MPU_SENSORS_MPU6050B1
36 #    include "mpu6050b1.h"
37 #elif defined CONFIG_MPU_SENSORS_MPU3050
38 #  include "mpu3050.h"
39 #else
40 #error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
41 #endif
42 
43 #include "log.h"
44 
45 /*************************************************************************
46  *  Sensors
47  *************************************************************************/
48 
49 #define INV_X_GYRO			(0x0001)
50 #define INV_Y_GYRO			(0x0002)
51 #define INV_Z_GYRO			(0x0004)
52 #define INV_DMP_PROCESSOR		(0x0008)
53 
54 #define INV_X_ACCEL			(0x0010)
55 #define INV_Y_ACCEL			(0x0020)
56 #define INV_Z_ACCEL			(0x0040)
57 
58 #define INV_X_COMPASS			(0x0080)
59 #define INV_Y_COMPASS			(0x0100)
60 #define INV_Z_COMPASS			(0x0200)
61 
62 #define INV_X_PRESSURE			(0x0300)
63 #define INV_Y_PRESSURE			(0x0800)
64 #define INV_Z_PRESSURE			(0x1000)
65 
66 #define INV_TEMPERATURE			(0x2000)
67 #define INV_TIME			(0x4000)
68 
69 #define INV_THREE_AXIS_GYRO		(0x000F)
70 #define INV_THREE_AXIS_ACCEL		(0x0070)
71 #define INV_THREE_AXIS_COMPASS		(0x0380)
72 #define INV_THREE_AXIS_PRESSURE		(0x1C00)
73 
74 #define INV_FIVE_AXIS			(0x007B)
75 #define INV_SIX_AXIS_GYRO_ACCEL		(0x007F)
76 #define INV_SIX_AXIS_ACCEL_COMPASS	(0x03F0)
77 #define INV_NINE_AXIS			(0x03FF)
78 #define INV_ALL_SENSORS			(0x7FFF)
79 
80 #define MPL_PROD_KEY(ver, rev) (ver * 100 + rev)
81 
82 /* -------------------------------------------------------------------------- */
83 
84 /* Platform data for the MPU */
85 struct mldl_cfg {
86 	/* MPU related configuration */
87 	unsigned long requested_sensors;
88 	unsigned char ignore_system_suspend;
89 	unsigned char addr;
90 	unsigned char int_config;
91 	unsigned char ext_sync;
92 	unsigned char full_scale;
93 	unsigned char lpf;
94 	unsigned char clk_src;
95 	unsigned char divider;
96 	unsigned char dmp_enable;
97 	unsigned char fifo_enable;
98 	unsigned char dmp_cfg1;
99 	unsigned char dmp_cfg2;
100 	unsigned char offset_tc[GYRO_NUM_AXES];
101 	unsigned short offset[GYRO_NUM_AXES];
102 	unsigned char ram[MPU_MEM_NUM_RAM_BANKS][MPU_MEM_BANK_SIZE];
103 
104 	/* MPU Related stored status and info */
105 	unsigned char product_revision;
106 	unsigned char silicon_revision;
107 	unsigned char product_id;
108 	unsigned short gyro_sens_trim;
109 #if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
110 	defined CONFIG_MPU_SENSORS_MPU6050B1
111 	unsigned short accel_sens_trim;
112 #endif
113 
114 	/* Driver/Kernel related state information */
115 	int gyro_is_bypassed;
116 	int i2c_slaves_enabled;
117 	int dmp_is_running;
118 	int gyro_is_suspended;
119 	int accel_is_suspended;
120 	int compass_is_suspended;
121 	int pressure_is_suspended;
122 	int gyro_needs_reset;
123 
124 	/* Slave related information */
125 	struct ext_slave_descr *accel;
126 	struct ext_slave_descr *compass;
127 	struct ext_slave_descr *pressure;
128 
129 	/* Platform Data */
130 	struct mpu_platform_data *pdata;
131 };
132 
133 /* -------------------------------------------------------------------------- */
134 
135 int inv_mpu_open(struct mldl_cfg *mldl_cfg,
136 		 void *mlsl_handle,
137 		 void *accel_handle,
138 		 void *compass_handle,
139 		 void *pressure_handle);
140 int inv_mpu_close(struct mldl_cfg *mldl_cfg,
141 		  void *mlsl_handle,
142 		  void *accel_handle,
143 		  void *compass_handle,
144 		  void *pressure_handle);
145 int inv_mpu_resume(struct mldl_cfg *mldl_cfg,
146 		   void *gyro_handle,
147 		   void *accel_handle,
148 		   void *compass_handle,
149 		   void *pressure_handle,
150 		   unsigned long sensors);
151 int inv_mpu_suspend(struct mldl_cfg *mldl_cfg,
152 		    void *gyro_handle,
153 		    void *accel_handle,
154 		    void *compass_handle,
155 		    void *pressure_handle,
156 		    unsigned long sensors);
157 
158 /* Slave Read functions */
159 int inv_mpu_slave_read(struct mldl_cfg *mldl_cfg,
160 		       void *gyro_handle,
161 		       void *slave_handle,
162 		       struct ext_slave_descr *slave,
163 		       struct ext_slave_platform_data *pdata,
164 		       unsigned char *data);
inv_mpu_read_accel(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * accel_handle,unsigned char * data)165 static inline int inv_mpu_read_accel(struct mldl_cfg *mldl_cfg,
166 				     void *gyro_handle,
167 				     void *accel_handle, unsigned char *data)
168 {
169 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
170 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
171 		return INV_ERROR_INVALID_PARAMETER;
172 	}
173 
174 	return inv_mpu_slave_read(mldl_cfg, gyro_handle, accel_handle,
175 				  mldl_cfg->accel, &mldl_cfg->pdata->accel,
176 				  data);
177 }
178 
inv_mpu_read_compass(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * compass_handle,unsigned char * data)179 static inline int inv_mpu_read_compass(struct mldl_cfg *mldl_cfg,
180 				       void *gyro_handle,
181 				       void *compass_handle,
182 				       unsigned char *data)
183 {
184 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
185 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
186 		return INV_ERROR_INVALID_PARAMETER;
187 	}
188 
189 	return inv_mpu_slave_read(mldl_cfg, gyro_handle, compass_handle,
190 				  mldl_cfg->compass, &mldl_cfg->pdata->compass,
191 				  data);
192 }
193 
inv_mpu_read_pressure(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * pressure_handle,unsigned char * data)194 static inline int inv_mpu_read_pressure(struct mldl_cfg *mldl_cfg,
195 					void *gyro_handle,
196 					void *pressure_handle,
197 					unsigned char *data)
198 {
199 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
200 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
201 		return INV_ERROR_INVALID_PARAMETER;
202 	}
203 
204 	return inv_mpu_slave_read(mldl_cfg, gyro_handle, pressure_handle,
205 				  mldl_cfg->pressure,
206 				  &mldl_cfg->pdata->pressure, data);
207 }
208 
209 /* Slave Config functions */
210 int inv_mpu_slave_config(struct mldl_cfg *mldl_cfg,
211 			 void *gyro_handle,
212 			 void *slave_handle,
213 			 struct ext_slave_config *data,
214 			 struct ext_slave_descr *slave,
215 			 struct ext_slave_platform_data *pdata);
inv_mpu_config_accel(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * accel_handle,struct ext_slave_config * data)216 static inline int inv_mpu_config_accel(struct mldl_cfg *mldl_cfg,
217 				       void *gyro_handle,
218 				       void *accel_handle,
219 				       struct ext_slave_config *data)
220 {
221 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
222 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
223 		return INV_ERROR_INVALID_PARAMETER;
224 	}
225 
226 	return inv_mpu_slave_config(mldl_cfg, gyro_handle, accel_handle, data,
227 				    mldl_cfg->accel, &mldl_cfg->pdata->accel);
228 }
229 
inv_mpu_config_compass(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * compass_handle,struct ext_slave_config * data)230 static inline int inv_mpu_config_compass(struct mldl_cfg *mldl_cfg,
231 					 void *gyro_handle,
232 					 void *compass_handle,
233 					 struct ext_slave_config *data)
234 {
235 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
236 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
237 		return INV_ERROR_INVALID_PARAMETER;
238 	}
239 
240 	return inv_mpu_slave_config(mldl_cfg, gyro_handle, compass_handle, data,
241 				    mldl_cfg->compass,
242 				    &mldl_cfg->pdata->compass);
243 }
244 
inv_mpu_config_pressure(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * pressure_handle,struct ext_slave_config * data)245 static inline int inv_mpu_config_pressure(struct mldl_cfg *mldl_cfg,
246 					  void *gyro_handle,
247 					  void *pressure_handle,
248 					  struct ext_slave_config *data)
249 {
250 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
251 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
252 		return INV_ERROR_INVALID_PARAMETER;
253 	}
254 
255 	return inv_mpu_slave_config(mldl_cfg, gyro_handle, pressure_handle,
256 				    data, mldl_cfg->pressure,
257 				    &mldl_cfg->pdata->pressure);
258 }
259 
260 /* Slave get config functions */
261 int inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg,
262 			     void *gyro_handle,
263 			     void *slave_handle,
264 			     struct ext_slave_config *data,
265 			     struct ext_slave_descr *slave,
266 			     struct ext_slave_platform_data *pdata);
267 
inv_mpu_get_accel_config(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * accel_handle,struct ext_slave_config * data)268 static inline int inv_mpu_get_accel_config(struct mldl_cfg *mldl_cfg,
269 					   void *gyro_handle,
270 					   void *accel_handle,
271 					   struct ext_slave_config *data)
272 {
273 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
274 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
275 		return INV_ERROR_INVALID_PARAMETER;
276 	}
277 
278 	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle, accel_handle,
279 					data, mldl_cfg->accel,
280 					&mldl_cfg->pdata->accel);
281 }
282 
inv_mpu_get_compass_config(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * compass_handle,struct ext_slave_config * data)283 static inline int inv_mpu_get_compass_config(struct mldl_cfg *mldl_cfg,
284 					     void *gyro_handle,
285 					     void *compass_handle,
286 					     struct ext_slave_config *data)
287 {
288 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
289 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
290 		return INV_ERROR_INVALID_PARAMETER;
291 	}
292 
293 	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle, compass_handle,
294 					data, mldl_cfg->compass,
295 					&mldl_cfg->pdata->compass);
296 }
297 
inv_mpu_get_pressure_config(struct mldl_cfg * mldl_cfg,void * gyro_handle,void * pressure_handle,struct ext_slave_config * data)298 static inline int inv_mpu_get_pressure_config(struct mldl_cfg *mldl_cfg,
299 					      void *gyro_handle,
300 					      void *pressure_handle,
301 					      struct ext_slave_config *data)
302 {
303 	if (!mldl_cfg || !(mldl_cfg->pdata)) {
304 		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
305 		return INV_ERROR_INVALID_PARAMETER;
306 	}
307 
308 	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle,
309 					pressure_handle, data,
310 					mldl_cfg->pressure,
311 					&mldl_cfg->pdata->pressure);
312 }
313 
314 /* -------------------------------------------------------------------------- */
315 
inv_mpu_get_sampling_rate_hz(struct mldl_cfg * mldl_cfg)316 static inline long inv_mpu_get_sampling_rate_hz(struct mldl_cfg *mldl_cfg)
317 {
318 	if (((mldl_cfg->lpf) == 0) || ((mldl_cfg->lpf) == 7))
319 		return 8000L / (mldl_cfg->divider + 1);
320 	else
321 		return 1000L / (mldl_cfg->divider + 1);
322 }
323 
inv_mpu_get_sampling_period_us(struct mldl_cfg * mldl_cfg)324 static inline long inv_mpu_get_sampling_period_us(struct mldl_cfg *mldl_cfg)
325 {
326 	if (((mldl_cfg->lpf) == 0) || ((mldl_cfg->lpf) == 7))
327 		return (long) (1000000L * (mldl_cfg->divider + 1)) / 8000L;
328 	else
329 		return (long) (1000000L * (mldl_cfg->divider + 1)) / 1000L;
330 }
331 
332 #endif				/* __MLDL_CFG_H__ */
333 
334 /**
335  *@}
336  */
337