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 */ 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 int32_t getEnableMask() { return mEnabled; } 192 void getHandle(int32_t handle, int &what, android::String8 &sname); 193 194 virtual int readEvents(sensors_event_t *data, int count); 195 virtual int getFd() const; 196 virtual int getAccelFd() const; 197 virtual int getCompassFd() const; 198 virtual int getPollTime(); 199 virtual int getStepCountPollTime(); 200 virtual bool hasPendingEvents() const; 201 virtual bool hasStepCountPendingEvents(); 202 int populateSensorList(struct sensor_t *list, int len); 203 204 void buildCompassEvent(); 205 void buildMpuEvent(); 206 int checkValidHeader(unsigned short data_format); 207 208 int turnOffAccelFifo(); 209 int turnOffGyroFifo(); 210 int enableDmpOrientation(int); 211 int dmpOrientHandler(int); 212 int readDmpOrientEvents(sensors_event_t* data, int count); 213 int getDmpOrientFd(); 214 int openDmpOrientFd(); 215 int closeDmpOrientFd(); 216 217 int getDmpRate(int64_t *); 218 int checkDMPOrientation(); 219 220 int getDmpSignificantMotionFd(); 221 int readDmpSignificantMotionEvents(sensors_event_t* data, int count); 222 int enableDmpSignificantMotion(int); 223 int significantMotionHandler(sensors_event_t* data); 224 bool checkSmdSupport(){return (mDmpSignificantMotionEnabled);}; 225 226 int enableDmpPedometer(int, int); 227 int readDmpPedometerEvents(sensors_event_t* data, int count, int32_t id, int outputType); 228 int getDmpPedometerFd(); 229 bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);}; 230 bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn() 231 && (mDmpOrientationEnabled 232 || !isDmpScreenAutoRotationEnabled())));}; 233 234 protected: 235 CompassSensor *mCompassSensor; 236 PressureSensor *mPressureSensor; 237 238 int gyroHandler(sensors_event_t *data); 239 int rawGyroHandler(sensors_event_t *data); 240 int accelHandler(sensors_event_t *data); 241 int compassHandler(sensors_event_t *data); 242 int rawCompassHandler(sensors_event_t *data); 243 int rvHandler(sensors_event_t *data); 244 int grvHandler(sensors_event_t *data); 245 int laHandler(sensors_event_t *data); 246 int gravHandler(sensors_event_t *data); 247 int orienHandler(sensors_event_t *data); 248 int smHandler(sensors_event_t *data); 249 int pHandler(sensors_event_t *data); 250 int gmHandler(sensors_event_t *data); 251 int psHandler(sensors_event_t *data); 252 int sdHandler(sensors_event_t *data); 253 int scHandler(sensors_event_t *data); 254 int metaHandler(sensors_event_t *data, int flags); 255 void calcOrientationSensor(float *Rx, float *Val); 256 virtual int update_delay(); 257 258 void inv_set_device_properties(); 259 int inv_constructor_init(); 260 int inv_constructor_default_enable(); 261 int setAccelInitialState(); 262 int masterEnable(int en); 263 int enablePedStandalone(int en); 264 int enablePedStandaloneData(int en); 265 int enablePedQuaternion(int); 266 int enablePedQuaternionData(int); 267 int setPedQuaternionRate(int64_t wanted); 268 int enable6AxisQuaternion(int); 269 int enable6AxisQuaternionData(int); 270 int set6AxisQuaternionRate(int64_t wanted); 271 int enableLPQuaternion(int); 272 int enableQuaternionData(int); 273 int setQuaternionRate(int64_t wanted); 274 int enableAccelPedometer(int); 275 int enableAccelPedData(int); 276 int onDmp(int); 277 int enableGyro(int en); 278 int enableLowPowerAccel(int en); 279 int enableAccel(int en); 280 int enableCompass(int en, int rawSensorOn); 281 int enablePressure(int en); 282 int enableBatch(int64_t timeout); 283 void computeLocalSensorMask(int enabled_sensors); 284 int computeBatchSensorMask(int enableSensor, int checkNewBatchSensor); 285 int computeBatchDataOutput(); 286 int enableSensors(unsigned long sensors, int en, uint32_t changed); 287 int inv_read_temperature(long long *data); 288 int inv_read_dmp_state(int fd); 289 int inv_read_sensor_bias(int fd, long *data); 290 void inv_get_sensors_orientation(void); 291 int inv_init_sysfs_attributes(void); 292 int resetCompass(void); 293 void setCompassDelay(int64_t ns); 294 void enable_iio_sysfs(void); 295 int setDmpFeature(int en); 296 int computeAndSetDmpState(void); 297 int enablePedometer(int); 298 int enablePedIndicator(int en); 299 int checkPedStandaloneBatched(void); 300 int checkPedStandaloneEnabled(void); 301 int checkPedQuatEnabled(); 302 int check6AxisQuatEnabled(); 303 int checkLPQRateSupported(); 304 int checkLPQuaternion(); 305 int checkAccelPed(); 306 void setInitial6QuatValue(); 307 int writeSignificantMotionParams(bool toggleEnable, 308 uint32_t delayThreshold1, uint32_t delayThreshold2, 309 uint32_t motionThreshold); 310 long mMasterSensorMask; 311 long mLocalSensorMask; 312 int mPollTime; 313 int64_t mStepCountPollTime; 314 bool mHaveGoodMpuCal; // flag indicating that the cal file can be written 315 int mGyroAccuracy; // value indicating the quality of the gyro calibr. 316 int mAccelAccuracy; // value indicating the quality of the accel calibr. 317 int mCompassAccuracy; // value indicating the quality of the compass calibr. 318 struct pollfd mPollFds[5]; 319 pthread_mutex_t mMplMutex; 320 pthread_mutex_t mHALMutex; 321 322 char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH]; 323 324 int iio_fd; 325 int accel_fd; 326 int mpufifo_fd; 327 int gyro_temperature_fd; 328 int accel_x_offset_fd; 329 int accel_y_offset_fd; 330 int accel_z_offset_fd; 331 332 int accel_x_dmp_bias_fd; 333 int accel_y_dmp_bias_fd; 334 int accel_z_dmp_bias_fd; 335 336 int gyro_x_offset_fd; 337 int gyro_y_offset_fd; 338 int gyro_z_offset_fd; 339 340 int gyro_x_dmp_bias_fd; 341 int gyro_y_dmp_bias_fd; 342 int gyro_z_dmp_bias_fd; 343 344 int dmp_orient_fd; 345 int mDmpOrientationEnabled; 346 347 int dmp_sign_motion_fd; 348 int mDmpSignificantMotionEnabled; 349 350 int dmp_pedometer_fd; 351 int mDmpPedometerEnabled; 352 int mDmpStepCountEnabled; 353 354 uint32_t mEnabled; 355 uint32_t mBatchEnabled; 356 android::Vector<int> mFlushSensorEnabledVector; 357 uint32_t mOldBatchEnabledMask; 358 int64_t mBatchTimeoutInMs; 359 sensors_event_t mPendingEvents[NumSensors]; 360 sensors_event_t mPendingFlushEvents[NumSensors]; 361 sensors_event_t mSmEvents; 362 sensors_event_t mSdEvents; 363 sensors_event_t mScEvents; 364 int64_t mDelays[NumSensors]; 365 int64_t mBatchDelays[NumSensors]; 366 int64_t mBatchTimeouts[NumSensors]; 367 hfunc_t mHandlers[NumSensors]; 368 short mCachedGyroData[3]; 369 long mCachedAccelData[3]; 370 long mCachedCompassData[3]; 371 long mCachedQuaternionData[3]; 372 long mCached6AxisQuaternionData[3]; 373 long mCachedPedQuaternionData[3]; 374 long mCachedPressureData; 375 android::KeyedVector<int, int> mIrqFds; 376 377 InputEventCircularReader mAccelInputReader; 378 InputEventCircularReader mGyroInputReader; 379 380 int mCompassOverFlow; 381 bool mFirstRead; 382 short mTempScale; 383 short mTempOffset; 384 int64_t mTempCurrentTime; 385 int mAccelScale; 386 long mAccelSelfTestScale; 387 long mGyroScale; 388 long mGyroSelfTestScale; 389 long mCompassScale; 390 float mCompassBias[3]; 391 bool mFactoryGyroBiasAvailable; 392 long mFactoryGyroBias[3]; 393 bool mGyroBiasAvailable; 394 bool mGyroBiasApplied; 395 float mGyroBias[3]; //in body frame 396 long mGyroChipBias[3]; //in chip frame 397 bool mFactoryAccelBiasAvailable; 398 long mFactoryAccelBias[3]; 399 bool mAccelBiasAvailable; 400 bool mAccelBiasApplied; 401 long mAccelBias[3]; //in chip frame 402 403 uint32_t mPendingMask; 404 unsigned long mSensorMask; 405 406 char chip_ID[MAX_CHIP_ID_LEN]; 407 char mSysfsPath[MAX_SYSFS_NAME_LEN]; 408 409 signed char mGyroOrientation[9]; 410 signed char mAccelOrientation[9]; 411 412 int64_t mSensorTimestamp; 413 int64_t mCompassTimestamp; 414 int64_t mPressureTimestamp; 415 416 struct sysfs_attrbs { 417 char *chip_enable; 418 char *power_state; 419 char *master_enable; 420 char *dmp_firmware; 421 char *firmware_loaded; 422 char *dmp_on; 423 char *dmp_int_on; 424 char *dmp_event_int_on; 425 char *tap_on; 426 char *key; 427 char *self_test; 428 char *temperature; 429 430 char *gyro_enable; 431 char *gyro_fifo_rate; 432 char *gyro_fsr; 433 char *gyro_orient; 434 char *gyro_fifo_enable; 435 char *gyro_rate; 436 437 char *accel_enable; 438 char *accel_fifo_rate; 439 char *accel_fsr; 440 char *accel_bias; 441 char *accel_orient; 442 char *accel_fifo_enable; 443 char *accel_rate; 444 445 char *three_axis_q_on; //formerly quaternion_on 446 char *three_axis_q_rate; 447 448 char *six_axis_q_on; 449 char *six_axis_q_rate; 450 451 char *six_axis_q_value; 452 453 char *ped_q_on; 454 char *ped_q_rate; 455 456 char *step_detector_on; 457 char *step_indicator_on; 458 459 char *in_timestamp_en; 460 char *in_timestamp_index; 461 char *in_timestamp_type; 462 463 char *buffer_length; 464 465 char *display_orientation_on; 466 char *event_display_orientation; 467 468 char *in_accel_x_offset; 469 char *in_accel_y_offset; 470 char *in_accel_z_offset; 471 char *in_accel_self_test_scale; 472 473 char *in_accel_x_dmp_bias; 474 char *in_accel_y_dmp_bias; 475 char *in_accel_z_dmp_bias; 476 477 char *in_gyro_x_offset; 478 char *in_gyro_y_offset; 479 char *in_gyro_z_offset; 480 char *in_gyro_self_test_scale; 481 482 char *in_gyro_x_dmp_bias; 483 char *in_gyro_y_dmp_bias; 484 char *in_gyro_z_dmp_bias; 485 486 char *event_smd; 487 char *smd_enable; 488 char *smd_delay_threshold; 489 char *smd_delay_threshold2; 490 char *smd_threshold; 491 char *batchmode_timeout; 492 char *batchmode_wake_fifo_full_on; 493 char *flush_batch; 494 495 char *pedometer_on; 496 char *pedometer_int_on; 497 char *event_pedometer; 498 char *pedometer_steps; 499 char *pedometer_step_thresh; 500 char *pedometer_counter; 501 502 char *motion_lpa_on; 503 } mpu; 504 505 char *sysfs_names_ptr; 506 int mMplFeatureActiveMask; 507 uint64_t mFeatureActiveMask; 508 bool mDmpOn; 509 int mPedUpdate; 510 int mPressureUpdate; 511 int64_t mQuatSensorTimestamp; 512 int64_t mStepSensorTimestamp; 513 uint64_t mLastStepCount; 514 int mLeftOverBufferSize; 515 char mLeftOverBuffer[1024]; 516 bool mInitial6QuatValueAvailable; 517 long mInitial6QuatValue[4]; 518 bool mFlushBatchSet; 519 uint32_t mSkipReadEvents; 520 bool mDataMarkerDetected; 521 bool mEmptyDataMarkerDetected; 522 523 private: 524 /* added for dynamic get sensor list */ 525 void fillAccel(const char* accel, struct sensor_t *list); 526 void fillGyro(const char* gyro, struct sensor_t *list); 527 void fillRV(struct sensor_t *list); 528 void fillGMRV(struct sensor_t *list); 529 void fillGRV(struct sensor_t *list); 530 void fillOrientation(struct sensor_t *list); 531 void fillGravity(struct sensor_t *list); 532 void fillLinearAccel(struct sensor_t *list); 533 void fillSignificantMotion(struct sensor_t *list); 534 #ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION 535 void fillScreenOrientation(struct sensor_t *list); 536 #endif 537 void storeCalibration(); 538 void loadDMP(); 539 bool isMpuNonDmp(); 540 int isLowPowerQuatEnabled(); 541 int isDmpDisplayOrientationOn(); 542 void getCompassBias(); 543 void getFactoryGyroBias(); 544 void setFactoryGyroBias(); 545 void getGyroBias(); 546 void setGyroZeroBias(); 547 void setGyroBias(); 548 void getFactoryAccelBias(); 549 void setFactoryAccelBias(); 550 void getAccelBias(); 551 void setAccelBias(); 552 int isCompassDisabled(); 553 int setBatchDataRates(); 554 int resetDataRates(); 555 void initBias(); 556 void resetMplStates(); 557 void sys_dump(bool fileMode); 558 }; 559 560 extern "C" { 561 void setCallbackObject(MPLSensor*); 562 MPLSensor *getCallbackObject(); 563 } 564 565 #endif // ANDROID_MPL_SENSOR_H 566