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_MPL_SENSOR_H
18 #define ANDROID_MPL_SENSOR_H
19
20 #include <stdint.h>
21 #include <errno.h>
22 #include <sys/cdefs.h>
23 #include <sys/types.h>
24 #include <poll.h>
25 #include <time.h>
26 #include <utils/Vector.h>
27 #include <utils/KeyedVector.h>
28 #include <utils/String8.h>
29 #include "sensors.h"
30 #include "SensorBase.h"
31 #include "InputEventReader.h"
32
33 #ifndef INVENSENSE_COMPASS_CAL
34 #pragma message("unified HAL for AKM")
35 #include "CompassSensor.AKM.h"
36 #endif
37
38 #ifdef SENSOR_ON_PRIMARY_BUS
39 #pragma message("Sensor on Primary Bus")
40 #include "CompassSensor.IIO.primary.h"
41 #else
42 #pragma message("Sensor on Secondary Bus")
43 #include "CompassSensor.IIO.9150.h"
44 #endif
45
46 class PressureSensor;
47
48 /*****************************************************************************/
49 /* Sensors Enable/Disable Mask
50 *****************************************************************************/
51 #define MAX_CHIP_ID_LEN (20)
52
53 #define INV_THREE_AXIS_GYRO (0x000F)
54 #define INV_THREE_AXIS_ACCEL (0x0070)
55 #define INV_THREE_AXIS_COMPASS (0x0380)
56 #define INV_ONE_AXIS_PRESSURE (0x0400)
57 #define INV_ALL_SENSORS (0x7FFF)
58
59 #ifdef INVENSENSE_COMPASS_CAL
60 #define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
61 | INV_THREE_AXIS_COMPASS \
62 | INV_THREE_AXIS_GYRO)
63 #else
64 #define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
65 | INV_THREE_AXIS_COMPASS \
66 | INV_THREE_AXIS_GYRO)
67 #endif
68
69 // mask of virtual sensors that require gyro + accel + compass data
70 #define VIRTUAL_SENSOR_9AXES_MASK ( \
71 (1 << Orientation) \
72 | (1 << RotationVector) \
73 | (1 << LinearAccel) \
74 | (1 << Gravity) \
75 )
76 // mask of virtual sensors that require gyro + accel data (but no compass data)
77 #define VIRTUAL_SENSOR_GYRO_6AXES_MASK ( \
78 (1 << GameRotationVector) \
79 )
80 // mask of virtual sensors that require mag + accel data (but no gyro data)
81 #define VIRTUAL_SENSOR_MAG_6AXES_MASK ( \
82 (1 << GeomagneticRotationVector) \
83 )
84 // mask of all virtual sensors
85 #define VIRTUAL_SENSOR_ALL_MASK ( \
86 VIRTUAL_SENSOR_9AXES_MASK \
87 | VIRTUAL_SENSOR_GYRO_6AXES_MASK \
88 | VIRTUAL_SENSOR_MAG_6AXES_MASK \
89 )
90
91 // bit mask of current MPL active features (mMplFeatureActiveMask)
92 #define INV_COMPASS_CAL 0x01
93 #define INV_COMPASS_FIT 0x02
94
95 // bit mask of current DMP active features (mFeatureActiveMask)
96 #define INV_DMP_QUATERNION 0x001 //3 elements without real part, 32 bit each
97 #define INV_DMP_DISPL_ORIENTATION 0x002 //screen orientation
98 #define INV_DMP_SIGNIFICANT_MOTION 0x004 //significant motion
99 #define INV_DMP_PEDOMETER 0x008 //interrupt-based pedometer
100 #define INV_DMP_PEDOMETER_STEP 0x010 //timer-based pedometer
101 #define INV_DMP_PED_STANDALONE 0x020 //timestamps only
102 #define INV_DMP_6AXIS_QUATERNION 0x040 //3 elements without real part, 32 bit each
103 #define INV_DMP_PED_QUATERNION 0x080 //3 elements without real part, 16 bit each
104 #define INV_DMP_PED_INDICATOR 0x100 //tag along header with step indciator
105 #define INV_DMP_BATCH_MODE 0x200 //batch mode
106
107 // bit mask of whether DMP should be turned on
108 #define DMP_FEATURE_MASK ( \
109 (INV_DMP_QUATERNION) \
110 | (INV_DMP_DISPL_ORIENTATION) \
111 | (INV_DMP_SIGNIFICANT_MOTION) \
112 | (INV_DMP_PEDOMETER) \
113 | (INV_DMP_PEDOMETER_STEP) \
114 | (INV_DMP_6AXIS_QUATERNION) \
115 | (INV_DMP_PED_QUATERNION) \
116 | (INV_DMP_BATCH_MODE) \
117 )
118
119 // bit mask of DMP features as sensors
120 #define DMP_SENSOR_MASK ( \
121 (INV_DMP_DISPL_ORIENTATION) \
122 | (INV_DMP_SIGNIFICANT_MOTION) \
123 | (INV_DMP_PEDOMETER) \
124 | (INV_DMP_PEDOMETER_STEP) \
125 | (INV_DMP_6AXIS_QUATERNION) \
126 )
127
128 // data header format used by kernel driver.
129 #define DATA_FORMAT_STEP 0x0001
130 #define DATA_FORMAT_MARKER 0x0010
131 #define DATA_FORMAT_EMPTY_MARKER 0x0020
132 #define DATA_FORMAT_PED_STANDALONE 0x0100
133 #define DATA_FORMAT_PED_QUAT 0x0200
134 #define DATA_FORMAT_6_AXIS 0x0400
135 #define DATA_FORMAT_QUAT 0x0800
136 #define DATA_FORMAT_COMPASS 0x1000
137 #define DATA_FORMAT_COMPASS_OF 0x1800
138 #define DATA_FORMAT_GYRO 0x2000
139 #define DATA_FORMAT_ACCEL 0x4000
140 #define DATA_FORMAT_PRESSURE 0x8000
141 #define DATA_FORMAT_MASK 0xffff
142
143 #define BYTES_PER_SENSOR 8
144 #define BYTES_PER_SENSOR_PACKET 16
145 #define QUAT_ONLY_LAST_PACKET_OFFSET 16
146 #define BYTES_QUAT_DATA 24
147 #define MAX_READ_SIZE BYTES_QUAT_DATA
148 #define MAX_SUSPEND_BATCH_PACKET_SIZE 1024
149 #define MAX_PACKET_SIZE 80 //8 * 4 + (2 * 24)
150
151 /* Uncomment to enable Low Power Quaternion */
152 #define ENABLE_LP_QUAT_FEAT
153
154 /* Enable Pressure sensor support */
155 #undef ENABLE_PRESSURE
156
157 /* Screen Orientation is not currently supported */
isDmpScreenAutoRotationEnabled()158 int isDmpScreenAutoRotationEnabled()
159 {
160 #ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
161 return 1;
162 #else
163 return 0;
164 #endif
165 }
166
167 int (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
168 /*****************************************************************************/
169 /** MPLSensor implementation which fits into the HAL example for crespo provided
170 * by Google.
171 * WARNING: there may only be one instance of MPLSensor, ever.
172 */
173
174 class MPLSensor: public SensorBase
175 {
176 typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
177
178 public:
179
180 MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
181 virtual ~MPLSensor();
182
183 virtual int setDelay(int32_t handle, int64_t ns);
184 virtual int enable(int32_t handle, int enabled);
185 virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
186 virtual int flush(int handle);
187 int selectAndSetQuaternion(int batchMode, int mEnabled, long long featureMask);
188 int checkBatchEnabled();
189 int setBatch(int en, int toggleEnable);
190 int writeBatchTimeout(int en);
191 int writeBatchTimeout(int en, int64_t timeoutInMs);
getEnableMask()192 int32_t getEnableMask() { return mEnabled; }
193 void getHandle(int32_t handle, int &what, android::String8 &sname);
194
195 virtual int readEvents(sensors_event_t *data, int count);
196 virtual int getFd() const;
197 virtual int getAccelFd() const;
198 virtual int getCompassFd() const;
199 virtual int getPollTime();
200 virtual int getStepCountPollTime();
201 virtual bool hasPendingEvents() const;
202 virtual bool hasStepCountPendingEvents();
203 int populateSensorList(struct sensor_t *list, int len);
204
205 void buildCompassEvent();
206 void buildMpuEvent();
207 int checkValidHeader(unsigned short data_format);
208
209 int turnOffAccelFifo();
210 int turnOffGyroFifo();
211 int enableDmpOrientation(int);
212 int dmpOrientHandler(int);
213 int readDmpOrientEvents(sensors_event_t* data, int count);
214 int getDmpOrientFd();
215 int openDmpOrientFd();
216 int closeDmpOrientFd();
217
218 int getDmpRate(int64_t *);
219 int checkDMPOrientation();
220
221 int getDmpSignificantMotionFd();
222 int readDmpSignificantMotionEvents(sensors_event_t* data, int count);
223 int enableDmpSignificantMotion(int);
224 int significantMotionHandler(sensors_event_t* data);
checkSmdSupport()225 bool checkSmdSupport(){return (mDmpSignificantMotionEnabled);};
226
227 int enableDmpPedometer(int, int);
228 int readDmpPedometerEvents(sensors_event_t* data, int count, int32_t id, int outputType);
229 int getDmpPedometerFd();
checkPedometerSupport()230 bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);};
checkOrientationSupport()231 bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn()
232 && (mDmpOrientationEnabled
233 || !isDmpScreenAutoRotationEnabled())));};
234
235 protected:
236 CompassSensor *mCompassSensor;
237 PressureSensor *mPressureSensor;
238
239 int gyroHandler(sensors_event_t *data);
240 int rawGyroHandler(sensors_event_t *data);
241 int accelHandler(sensors_event_t *data);
242 int compassHandler(sensors_event_t *data);
243 int rawCompassHandler(sensors_event_t *data);
244 int rvHandler(sensors_event_t *data);
245 int grvHandler(sensors_event_t *data);
246 int laHandler(sensors_event_t *data);
247 int gravHandler(sensors_event_t *data);
248 int orienHandler(sensors_event_t *data);
249 int smHandler(sensors_event_t *data);
250 int pHandler(sensors_event_t *data);
251 int gmHandler(sensors_event_t *data);
252 int psHandler(sensors_event_t *data);
253 int sdHandler(sensors_event_t *data);
254 int scHandler(sensors_event_t *data);
255 int metaHandler(sensors_event_t *data, int flags);
256 void calcOrientationSensor(float *Rx, float *Val);
257 virtual int update_delay();
258
259 void inv_set_device_properties();
260 int inv_constructor_init();
261 int inv_constructor_default_enable();
262 int setAccelInitialState();
263 int masterEnable(int en);
264 int enablePedStandalone(int en);
265 int enablePedStandaloneData(int en);
266 int enablePedQuaternion(int);
267 int enablePedQuaternionData(int);
268 int setPedQuaternionRate(int64_t wanted);
269 int enable6AxisQuaternion(int);
270 int enable6AxisQuaternionData(int);
271 int set6AxisQuaternionRate(int64_t wanted);
272 int enableLPQuaternion(int);
273 int enableQuaternionData(int);
274 int setQuaternionRate(int64_t wanted);
275 int enableAccelPedometer(int);
276 int enableAccelPedData(int);
277 int onDmp(int);
278 int enableGyro(int en);
279 int enableLowPowerAccel(int en);
280 int enableAccel(int en);
281 int enableCompass(int en, int rawSensorOn);
282 int enablePressure(int en);
283 int enableBatch(int64_t timeout);
284 void computeLocalSensorMask(int enabled_sensors);
285 int computeBatchSensorMask(int enableSensor, int checkNewBatchSensor);
286 int computeBatchDataOutput();
287 int enableSensors(unsigned long sensors, int en, uint32_t changed);
288 int inv_read_temperature(long long *data);
289 int inv_read_dmp_state(int fd);
290 int inv_read_sensor_bias(int fd, long *data);
291 void inv_get_sensors_orientation(void);
292 int inv_init_sysfs_attributes(void);
293 int resetCompass(void);
294 void setCompassDelay(int64_t ns);
295 void enable_iio_sysfs(void);
296 int setDmpFeature(int en);
297 int computeAndSetDmpState(void);
298 int computeDmpState(bool* dmp_state);
299 int SetDmpState(bool dmpState);
300 int enablePedometer(int);
301 int enablePedIndicator(int en);
302 int checkPedStandaloneBatched(void);
303 int checkPedStandaloneEnabled(void);
304 int checkPedQuatEnabled();
305 int check6AxisQuatEnabled();
306 int checkLPQRateSupported();
307 int checkLPQuaternion();
308 int checkAccelPed();
309 void setInitial6QuatValue();
310 int writeSignificantMotionParams(bool toggleEnable,
311 uint32_t delayThreshold1, uint32_t delayThreshold2,
312 uint32_t motionThreshold);
313 long mMasterSensorMask;
314 long mLocalSensorMask;
315 int mPollTime;
316 int64_t mStepCountPollTime;
317 bool mHaveGoodMpuCal; // flag indicating that the cal file can be written
318 int mGyroAccuracy; // value indicating the quality of the gyro calibr.
319 int mAccelAccuracy; // value indicating the quality of the accel calibr.
320 int mCompassAccuracy; // value indicating the quality of the compass calibr.
321 struct pollfd mPollFds[5];
322 pthread_mutex_t mMplMutex;
323 pthread_mutex_t mHALMutex;
324
325 char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
326
327 int iio_fd;
328 int accel_fd;
329 int mpufifo_fd;
330 int gyro_temperature_fd;
331 int accel_x_offset_fd;
332 int accel_y_offset_fd;
333 int accel_z_offset_fd;
334
335 int accel_x_dmp_bias_fd;
336 int accel_y_dmp_bias_fd;
337 int accel_z_dmp_bias_fd;
338
339 int gyro_x_offset_fd;
340 int gyro_y_offset_fd;
341 int gyro_z_offset_fd;
342
343 int gyro_x_dmp_bias_fd;
344 int gyro_y_dmp_bias_fd;
345 int gyro_z_dmp_bias_fd;
346
347 int dmp_orient_fd;
348 int mDmpOrientationEnabled;
349
350 int dmp_sign_motion_fd;
351 int mDmpSignificantMotionEnabled;
352
353 int dmp_pedometer_fd;
354 int mDmpPedometerEnabled;
355 int mDmpStepCountEnabled;
356
357 uint32_t mEnabled;
358 uint32_t mEnabledCached;
359 uint32_t mBatchEnabled;
360 android::Vector<int> mFlushSensorEnabledVector;
361 uint32_t mOldBatchEnabledMask;
362 int64_t mBatchTimeoutInMs;
363 sensors_event_t mPendingEvents[NumSensors];
364 sensors_event_t mPendingFlushEvents[NumSensors];
365 sensors_event_t mSmEvents;
366 sensors_event_t mSdEvents;
367 sensors_event_t mScEvents;
368 int64_t mDelays[NumSensors];
369 int64_t mBatchDelays[NumSensors];
370 int64_t mBatchTimeouts[NumSensors];
371 hfunc_t mHandlers[NumSensors];
372 int64_t mEnabledTime[NumSensors];
373 int64_t mLastTimestamp[NumSensors];
374 short mCachedGyroData[3];
375 long mCachedAccelData[3];
376 long mCachedCompassData[3];
377 long mCachedQuaternionData[3];
378 long mCached6AxisQuaternionData[3];
379 long mCachedPedQuaternionData[3];
380 long mCachedPressureData;
381 android::KeyedVector<int, int> mIrqFds;
382
383 InputEventCircularReader mAccelInputReader;
384 InputEventCircularReader mGyroInputReader;
385
386 int mCompassOverFlow;
387 bool mFirstRead;
388 short mTempScale;
389 short mTempOffset;
390 int64_t mTempCurrentTime;
391 int mAccelScale;
392 long mAccelSelfTestScale;
393 long mGyroScale;
394 long mGyroSelfTestScale;
395 long mCompassScale;
396 float mCompassBias[3];
397 bool mFactoryGyroBiasAvailable;
398 long mFactoryGyroBias[3];
399 bool mGyroBiasAvailable;
400 bool mGyroBiasApplied;
401 float mGyroBias[3]; //in body frame
402 long mGyroChipBias[3]; //in chip frame
403 bool mFactoryAccelBiasAvailable;
404 long mFactoryAccelBias[3];
405 bool mAccelBiasAvailable;
406 bool mAccelBiasApplied;
407 long mAccelBias[3]; //in chip frame
408
409 uint32_t mPendingMask;
410 unsigned long mSensorMask;
411
412 char chip_ID[MAX_CHIP_ID_LEN];
413 char mSysfsPath[MAX_SYSFS_NAME_LEN];
414
415 signed char mGyroOrientation[9];
416 signed char mAccelOrientation[9];
417
418 int64_t mSensorTimestamp;
419 int64_t mCompassTimestamp;
420 int64_t mPressureTimestamp;
421
422 int64_t mGyroBatchRate;
423 int64_t mAccelBatchRate;
424 int64_t mCompassBatchRate;
425 int64_t mPressureBatchRate;
426 int64_t mQuatBatchRate;
427 int64_t mGyroRate;
428 int64_t mAccelRate;
429 int64_t mCompassRate;
430 int64_t mPressureRate;
431 int64_t mQuatRate;
432 int64_t mResetRate;
433
434 uint32_t mDataInterrupt;
435
436 bool mFirstBatchCall;
437 bool mEnableCalled;
438
439 struct sysfs_attrbs {
440 char *chip_enable;
441 char *power_state;
442 char *master_enable;
443 char *dmp_firmware;
444 char *firmware_loaded;
445 char *dmp_on;
446 char *dmp_int_on;
447 char *dmp_event_int_on;
448 char *tap_on;
449 char *key;
450 char *self_test;
451 char *temperature;
452
453 char *gyro_enable;
454 char *gyro_fifo_rate;
455 char *gyro_fsr;
456 char *gyro_orient;
457 char *gyro_fifo_enable;
458 char *gyro_rate;
459
460 char *accel_enable;
461 char *accel_fifo_rate;
462 char *accel_fsr;
463 char *accel_bias;
464 char *accel_orient;
465 char *accel_fifo_enable;
466 char *accel_rate;
467
468 char *three_axis_q_on; //formerly quaternion_on
469 char *three_axis_q_rate;
470
471 char *six_axis_q_on;
472 char *six_axis_q_rate;
473
474 char *six_axis_q_value;
475
476 char *ped_q_on;
477 char *ped_q_rate;
478
479 char *step_detector_on;
480 char *step_indicator_on;
481
482 char *in_timestamp_en;
483 char *in_timestamp_index;
484 char *in_timestamp_type;
485
486 char *buffer_length;
487
488 char *display_orientation_on;
489 char *event_display_orientation;
490
491 char *in_accel_x_offset;
492 char *in_accel_y_offset;
493 char *in_accel_z_offset;
494 char *in_accel_self_test_scale;
495
496 char *in_accel_x_dmp_bias;
497 char *in_accel_y_dmp_bias;
498 char *in_accel_z_dmp_bias;
499
500 char *in_gyro_x_offset;
501 char *in_gyro_y_offset;
502 char *in_gyro_z_offset;
503 char *in_gyro_self_test_scale;
504
505 char *in_gyro_x_dmp_bias;
506 char *in_gyro_y_dmp_bias;
507 char *in_gyro_z_dmp_bias;
508
509 char *event_smd;
510 char *smd_enable;
511 char *smd_delay_threshold;
512 char *smd_delay_threshold2;
513 char *smd_threshold;
514 char *batchmode_timeout;
515 char *batchmode_wake_fifo_full_on;
516 char *flush_batch;
517
518 char *pedometer_on;
519 char *pedometer_int_on;
520 char *event_pedometer;
521 char *pedometer_steps;
522 char *pedometer_step_thresh;
523 char *pedometer_counter;
524
525 char *motion_lpa_on;
526 } mpu;
527
528 char *sysfs_names_ptr;
529 int mMplFeatureActiveMask;
530 uint64_t mFeatureActiveMask;
531 bool mDmpOn;
532 int mPedUpdate;
533 int mPressureUpdate;
534 int64_t mQuatSensorTimestamp;
535 int64_t mStepSensorTimestamp;
536 uint64_t mLastStepCount;
537 int mLeftOverBufferSize;
538 char mLeftOverBuffer[1024];
539 bool mInitial6QuatValueAvailable;
540 long mInitial6QuatValue[4];
541 int mFlushBatchSet;
542 uint32_t mSkipReadEvents;
543 uint32_t mSkipExecuteOnData;
544 bool mDataMarkerDetected;
545 bool mEmptyDataMarkerDetected;
546 int mDmpState;
547
548 private:
549 /* added for dynamic get sensor list */
550 void fillAccel(const char* accel, struct sensor_t *list);
551 void fillGyro(const char* gyro, struct sensor_t *list);
552 void fillRV(struct sensor_t *list);
553 void fillGMRV(struct sensor_t *list);
554 void fillGRV(struct sensor_t *list);
555 void fillOrientation(struct sensor_t *list);
556 void fillGravity(struct sensor_t *list);
557 void fillLinearAccel(struct sensor_t *list);
558 void fillSignificantMotion(struct sensor_t *list);
559 #ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
560 void fillScreenOrientation(struct sensor_t *list);
561 #endif
562 void storeCalibration();
563 void loadDMP();
564 bool isMpuNonDmp();
565 int isLowPowerQuatEnabled();
566 int isDmpDisplayOrientationOn();
567 void getCompassBias();
568 void getFactoryGyroBias();
569 void setFactoryGyroBias();
570 void getGyroBias();
571 void setGyroZeroBias();
572 void setGyroBias();
573 void getFactoryAccelBias();
574 void setFactoryAccelBias();
575 void getAccelBias();
576 void setAccelBias();
577 int isCompassDisabled();
578 int setBatchDataRates();
579 int calcBatchDataRates(int64_t *gyro_rate, int64_t *accel_rate, int64_t *compass_rate, int64_t *pressure_rate, int64_t *quat_rate);
580 int setBatchDataRates(int64_t gyroRate, int64_t accelRate, int64_t compassRate, int64_t pressureRate, int64_t quatRate);
581 int resetDataRates();
582 int calctDataRates(int64_t *resetRate, int64_t *gyroRate, int64_t *accelRate, int64_t *compassRate, int64_t *pressureRate);
583 int resetDataRates(int64_t resetRate, int64_t gyroRate, int64_t accelRate, int64_t compassRate, int64_t pressureRate);
584 void initBias();
585 void resetMplStates();
586 void sys_dump(bool fileMode);
587 int calcBatchTimeout(int en, int64_t *out);
588 };
589
590 extern "C" {
591 void setCallbackObject(MPLSensor*);
592 MPLSensor *getCallbackObject();
593 }
594
595 #endif // ANDROID_MPL_SENSOR_H
596