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 46class 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 */ 158int isDmpScreenAutoRotationEnabled() 159{ 160#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION 161 return 1; 162#else 163 return 0; 164#endif 165} 166 167int (*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 174class MPLSensor: public SensorBase 175{ 176 typedef int (MPLSensor::*hfunc_t)(sensors_event_t*); 177 178public: 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); 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); 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(); 230 bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);}; 231 bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn() 232 && (mDmpOrientationEnabled 233 || !isDmpScreenAutoRotationEnabled())));}; 234 235protected: 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 548private: 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 590extern "C" { 591 void setCallbackObject(MPLSensor*); 592 MPLSensor *getCallbackObject(); 593} 594 595#endif // ANDROID_MPL_SENSOR_H 596