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 
40 enum {
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 
61 enum {
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
115 static 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
173 static 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