sensors.h revision 670dfdf96e62446e763f60c7c315fd7e25461242
1/*
2* Copyright (C) 2014 Invensense, Inc.
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8*      http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*/
16
17#ifndef ANDROID_SENSORS_H
18#define ANDROID_SENSORS_H
19
20#include <stdint.h>
21#include <errno.h>
22#include <sys/cdefs.h>
23#include <sys/types.h>
24
25#include <linux/input.h>
26
27#include <hardware/hardware.h>
28#include <hardware/sensors.h>
29
30__BEGIN_DECLS
31
32/*****************************************************************************/
33
34#ifndef ARRAY_SIZE
35#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
36#endif
37
38#undef ENABLE_PRESSURE
39
40enum {
41    ID_GY = 0,
42    ID_RG,
43    ID_A,
44    ID_M,
45    ID_RM,
46#ifdef ENABLE_PRESSURE
47    ID_PS,
48#endif
49    ID_O,
50    ID_RV,
51    ID_GRV,
52    ID_LA,
53    ID_GR,
54    ID_SM,
55    ID_P,
56    ID_SC,
57    ID_GMRV,
58    ID_SO
59};
60
61enum {
62    Gyro = 0,
63    RawGyro,
64    Accelerometer,
65    MagneticField,
66    RawMagneticField,
67#ifdef ENABLE_PRESSURE
68    Pressure,
69#endif
70    Orientation,
71    RotationVector,
72    GameRotationVector,
73    LinearAccel,
74    Gravity,
75    SignificantMotion,
76    StepDetector,
77    StepCounter,
78    GeomagneticRotationVector,
79    NumSensors
80};
81
82#ifdef ENABLE_PRESSURE
83#define LAST_HW_SENSOR	Pressure
84#else
85#define LAST_HW_SENSOR	RawMagneticField
86#endif
87
88/* Physical parameters of the sensors supported by Invensense MPL */
89#define SENSORS_GYROSCOPE_HANDLE                   (ID_GY)
90#define SENSORS_RAW_GYROSCOPE_HANDLE               (ID_RG)
91#define SENSORS_ACCELERATION_HANDLE                (ID_A)
92#define SENSORS_MAGNETIC_FIELD_HANDLE              (ID_M)
93#define SENSORS_RAW_MAGNETIC_FIELD_HANDLE          (ID_RM)
94#define SENSORS_PRESSURE_HANDLE                    (ID_PS)
95#define SENSORS_ORIENTATION_HANDLE                 (ID_O)
96#define SENSORS_ROTATION_VECTOR_HANDLE             (ID_RV)
97#define SENSORS_GAME_ROTATION_VECTOR_HANDLE        (ID_GRV)
98#define SENSORS_LINEAR_ACCEL_HANDLE                (ID_LA)
99#define SENSORS_GRAVITY_HANDLE                     (ID_GR)
100#define SENSORS_SIGNIFICANT_MOTION_HANDLE          (ID_SM)
101#define SENSORS_PEDOMETER_HANDLE                   (ID_P)
102#define SENSORS_STEP_COUNTER_HANDLE                (ID_SC)
103#define SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE (ID_GMRV)
104#define SENSORS_SCREEN_ORIENTATION_HANDLE          (ID_SO)
105
106/*****************************************************************************/
107
108/*
109   Android KitKat
110   Populate sensor_t structure according to hardware sensors.h
111   {    name, vendor, version, handle, type, maxRange, resolution, power, minDelay,
112    fifoReservedEventCount, fifoMaxEventCount, reserved[]    }
113*/
114#if defined ANDROID_KITKAT
115static struct sensor_t sBaseSensorList[] =
116{
117    {"MPL Gyroscope", "Invensense", 1, SENSORS_GYROSCOPE_HANDLE,
118     SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 124,
119     SENSOR_STRING_TYPE_GYROSCOPE, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
120    {"MPL Raw Gyroscope", "Invensense", 1, SENSORS_RAW_GYROSCOPE_HANDLE,
121     SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 2000.0f, 1.0f, 0.5f, 10000, 0, 124,
122     SENSOR_STRING_TYPE_GYROSCOPE_UNCALIBRATED, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
123    {"MPL Accelerometer", "Invensense", 1, SENSORS_ACCELERATION_HANDLE,
124     SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, 0, 124,
125     SENSOR_STRING_TYPE_ACCELEROMETER, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
126    {"MPL Magnetic Field", "Invensense", 1, SENSORS_MAGNETIC_FIELD_HANDLE,
127     SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, 0, 124,
128     SENSOR_STRING_TYPE_MAGNETIC_FIELD, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
129    {"MPL Raw Magnetic Field", "Invensense", 1, SENSORS_RAW_MAGNETIC_FIELD_HANDLE,
130     SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 10240.0f, 1.0f, 0.5f, 10000, 0, 124,
131     SENSOR_STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
132#ifdef ENABLE_PRESSURE
133    {"MPL Pressure", "Invensense", 1, SENSORS_PRESSURE_HANDLE,
134     SENSOR_TYPE_PRESSURE, 10240.0f, 1.0f, 0.5f, 10000, 0, 165,
135     SENSOR_STRING_TYPE_PRESSURE, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
136#endif
137    {"MPL Orientation", "Invensense", 1, SENSORS_ORIENTATION_HANDLE,
138     SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, 0, 0,
139     SENSOR_STRING_TYPE_ORIENTATION, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
140    {"MPL Rotation Vector", "Invensense", 1, SENSORS_ROTATION_VECTOR_HANDLE,
141     SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 0,
142     SENSOR_STRING_TYPE_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
143    {"MPL Game Rotation Vector", "Invensense", 1, SENSORS_GAME_ROTATION_VECTOR_HANDLE,
144     SENSOR_TYPE_GAME_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 62,
145     SENSOR_STRING_TYPE_GAME_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
146    {"MPL Linear Acceleration", "Invensense", 1, SENSORS_LINEAR_ACCEL_HANDLE,
147     SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, 0, 0,
148     SENSOR_STRING_TYPE_LINEAR_ACCELERATION, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
149    {"MPL Gravity", "Invensense", 1, SENSORS_GRAVITY_HANDLE,
150     SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, 0, 0,
151     SENSOR_STRING_TYPE_GRAVITY, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
152    {"MPL Significant Motion", "Invensense", 1, SENSORS_SIGNIFICANT_MOTION_HANDLE,
153     SENSOR_TYPE_SIGNIFICANT_MOTION, 100.0f, 1.0f, 1.1f, 0, 0, 0,
154     SENSOR_STRING_TYPE_SIGNIFICANT_MOTION, 0, 0,
155     SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP, {}},
156    {"MPL Step Detector", "Invensense", 1, SENSORS_PEDOMETER_HANDLE,
157     SENSOR_TYPE_STEP_DETECTOR, 100.0f, 1.0f, 1.1f, 0, 0, 124,
158     SENSOR_STRING_TYPE_STEP_DETECTOR, 0, 0, SENSOR_FLAG_SPECIAL_REPORTING_MODE, {}},
159    {"MPL Step Counter", "Invensense", 1, SENSORS_STEP_COUNTER_HANDLE,
160     SENSOR_TYPE_STEP_COUNTER, 100.0f, 1.0f, 1.1f, 0, 0, 0,
161     SENSOR_STRING_TYPE_STEP_COUNTER, 0, 0, SENSOR_FLAG_ON_CHANGE_MODE, {}},
162    {"MPL Geomagnetic Rotation Vector", "Invensense", 1,
163     SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE,
164     SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 5000, 0, 0,
165     SENSOR_STRING_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 0, 0, SENSOR_FLAG_CONTINUOUS_MODE, {}},
166#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
167    {"MPL Screen Orientation", "Invensense ", 1, SENSORS_SCREEN_ORIENTATION_HANDLE,
168     SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, 0, 0,
169     SENSOR_STRING_TYPE_SCREEN_ORIENTATION, 0, 0, SENSOR_FLAG_ON_CHANGE_MODE, {}},
170#endif
171};
172#else  //ANDROID_KITKAT END
173static struct sensor_t sBaseSensorList[] =
174{
175    {"MPL Gyroscope", "Invensense", 1,
176     SENSORS_GYROSCOPE_HANDLE,
177     SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, {}},
178    {"MPL Raw Gyroscope", "Invensense", 1,
179     SENSORS_RAW_GYROSCOPE_HANDLE,
180     SENSOR_TYPE_GYROSCOPE_UNCALIBRATED, 2000.0f, 1.0f, 0.5f, 10000, {}},
181    {"MPL Accelerometer", "Invensense", 1,
182     SENSORS_ACCELERATION_HANDLE,
183     SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, {}},
184    {"MPL Magnetic Field", "Invensense", 1,
185     SENSORS_MAGNETIC_FIELD_HANDLE,
186     SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, {}},
187    {"MPL Raw Magnetic Field", "Invensense", 1,
188     SENSORS_RAW_MAGNETIC_FIELD_HANDLE,
189     SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED, 10240.0f, 1.0f, 0.5f, 10000, {}},
190#ifdef ENABLE_PRESSURE
191    {"MPL Pressure", "Invensense", 1,
192     SENSORS_PRESSURE_HANDLE,
193     SENSOR_TYPE_PRESSURE, 10240.0f, 1.0f, 0.5f, 10000, {}},
194#endif
195    {"MPL Orientation", "Invensense", 1,
196     SENSORS_ORIENTATION_HANDLE,
197     SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, {}},
198    {"MPL Rotation Vector", "Invensense", 1,
199     SENSORS_ROTATION_VECTOR_HANDLE,
200     SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}},
201    {"MPL Game Rotation Vector", "Invensense", 1,
202     SENSORS_GAME_ROTATION_VECTOR_HANDLE,
203     SENSOR_TYPE_GAME_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}},
204    {"MPL Linear Acceleration", "Invensense", 1,
205     SENSORS_LINEAR_ACCEL_HANDLE,
206     SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, {}},
207    {"MPL Gravity", "Invensense", 1,
208     SENSORS_GRAVITY_HANDLE,
209     SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, {}},
210    {"MPL Significant Motion", "Invensense", 1,
211     SENSORS_SIGNIFICANT_MOTION_HANDLE,
212     SENSOR_TYPE_SIGNIFICANT_MOTION, 100.0f, 1.0f, 1.1f, 0, {}},
213    {"MPL Step Detector", "Invensense", 1,
214     SENSORS_PEDOMETER_HANDLE,
215     SENSOR_TYPE_STEP_DETECTOR, 100.0f, 1.0f, 1.1f, 0, {}},
216    {"MPL Step Counter", "Invensense", 1,
217     SENSORS_STEP_COUNTER_HANDLE,
218     SENSOR_TYPE_STEP_COUNTER, 100.0f, 1.0f, 1.1f, 0, {}},
219    {"MPL Geomagnetic Rotation Vector", "Invensense", 1,
220     SENSORS_GEOMAGNETIC_ROTATION_VECTOR_HANDLE,
221     SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, {}},
222#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
223    {"MPL Screen Orientation", "Invensense ", 1,
224     SENSORS_SCREEN_ORIENTATION_HANDLE,
225     SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, {}},
226#endif
227};
228#endif //ANDROID_JELLYBEAN END
229
230/*****************************************************************************/
231
232/*
233 * The SENSORS Module
234 */
235
236/* ITG3500 */
237#define EVENT_TYPE_GYRO_X          REL_X
238#define EVENT_TYPE_GYRO_Y          REL_Y
239#define EVENT_TYPE_GYRO_Z          REL_Z
240/* MPU6050 MPU9150 */
241#define EVENT_TYPE_IACCEL_X        REL_RX
242#define EVENT_TYPE_IACCEL_Y        REL_RY
243#define EVENT_TYPE_IACCEL_Z        REL_RZ
244/* MPU6050 MPU9150 */
245#define EVENT_TYPE_ICOMPASS_X      REL_X
246#define EVENT_TYPE_ICOMPASS_Y      REL_Y
247#define EVENT_TYPE_ICOMPASS_Z      REL_Z
248/* MPUxxxx */
249#define EVENT_TYPE_TIMESTAMP_HI    REL_MISC
250#define EVENT_TYPE_TIMESTAMP_LO    REL_WHEEL
251
252/* Accel BMA250 */
253#define EVENT_TYPE_ACCEL_X          ABS_X
254#define EVENT_TYPE_ACCEL_Y          ABS_Y
255#define EVENT_TYPE_ACCEL_Z          ABS_Z
256#define LSG                         (1000.0f)
257
258// conversion of acceleration data to SI units (m/s^2)
259#define RANGE_A                     (4*GRAVITY_EARTH)
260#define RESOLUTION_A                (GRAVITY_EARTH / LSG)
261#define CONVERT_A                   (GRAVITY_EARTH / LSG)
262#define CONVERT_A_X                 (CONVERT_A)
263#define CONVERT_A_Y                 (CONVERT_A)
264#define CONVERT_A_Z                 (CONVERT_A)
265
266/* AKM  compasses */
267#define EVENT_TYPE_MAGV_X           ABS_RX
268#define EVENT_TYPE_MAGV_Y           ABS_RY
269#define EVENT_TYPE_MAGV_Z           ABS_RZ
270#define EVENT_TYPE_MAGV_STATUS      ABS_RUDDER
271
272/* conversion of magnetic data to uT units */
273#define CONVERT_M                   (0.06f)
274
275/* conversion of sensor rates */
276#define hertz_request = 200;
277#define DEFAULT_MPL_GYRO_RATE           (20000L)     //us
278#define DEFAULT_MPL_COMPASS_RATE        (20000L)     //us
279
280#define DEFAULT_HW_GYRO_RATE            (100)        //Hz
281#define DEFAULT_HW_ACCEL_RATE           (20)         //ms
282#define DEFAULT_HW_COMPASS_RATE         (20000000L)  //ns
283#define DEFAULT_HW_AKMD_COMPASS_RATE    (200000000L) //ns
284
285/* convert ns to hardware units */
286#define HW_GYRO_RATE_NS                 (1000000000LL / rate_request) // to Hz
287#define HW_ACCEL_RATE_NS                (rate_request / (1000000L))   // to ms
288#define HW_COMPASS_RATE_NS              (rate_request)                // to ns
289
290/* convert Hz to hardware units */
291#define HW_GYRO_RATE_HZ                 (hertz_request)
292#define HW_ACCEL_RATE_HZ                (1000 / hertz_request)
293#define HW_COMPASS_RATE_HZ              (1000000000LL / hertz_request)
294
295#define RATE_200HZ                      5000000LL
296#define RATE_15HZ                       66667000LL
297#define RATE_5HZ                        200000000LL
298__END_DECLS
299
300#endif  // ANDROID_SENSORS_H
301