summaryrefslogtreecommitdiff
path: root/6515/libsensors_iio/MPLSensor.h
diff options
context:
space:
mode:
Diffstat (limited to '6515/libsensors_iio/MPLSensor.h')
-rw-r--r--6515/libsensors_iio/MPLSensor.h557
1 files changed, 557 insertions, 0 deletions
diff --git a/6515/libsensors_iio/MPLSensor.h b/6515/libsensors_iio/MPLSensor.h
new file mode 100644
index 0000000..65e3b23
--- /dev/null
+++ b/6515/libsensors_iio/MPLSensor.h
@@ -0,0 +1,557 @@
+/*
+* Copyright (C) 2012 Invensense, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef ANDROID_MPL_SENSOR_H
+#define ANDROID_MPL_SENSOR_H
+
+#include <stdint.h>
+#include <errno.h>
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <poll.h>
+#include <time.h>
+#include <utils/Vector.h>
+#include <utils/KeyedVector.h>
+#include <utils/String8.h>
+#include "sensors.h"
+#include "SensorBase.h"
+#include "InputEventReader.h"
+
+#ifndef INVENSENSE_COMPASS_CAL
+#pragma message("unified HAL for AKM")
+#include "CompassSensor.AKM.h"
+#endif
+
+#ifdef SENSOR_ON_PRIMARY_BUS
+#pragma message("Sensor on Primary Bus")
+#include "CompassSensor.IIO.primary.h"
+#else
+#pragma message("Sensor on Secondary Bus")
+#include "CompassSensor.IIO.9150.h"
+#endif
+
+class PressureSensor;
+
+/*****************************************************************************/
+/* Sensors Enable/Disable Mask
+ *****************************************************************************/
+#define MAX_CHIP_ID_LEN (20)
+
+#define INV_THREE_AXIS_GYRO (0x000F)
+#define INV_THREE_AXIS_ACCEL (0x0070)
+#define INV_THREE_AXIS_COMPASS (0x0380)
+#define INV_ONE_AXIS_PRESSURE (0x0400)
+#define INV_ALL_SENSORS (0x7FFF)
+
+#ifdef INVENSENSE_COMPASS_CAL
+#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
+ | INV_THREE_AXIS_COMPASS \
+ | INV_THREE_AXIS_GYRO)
+#else
+#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL \
+ | INV_THREE_AXIS_COMPASS \
+ | INV_THREE_AXIS_GYRO)
+#endif
+
+// mask of virtual sensors that require gyro + accel + compass data
+#define VIRTUAL_SENSOR_9AXES_MASK ( \
+ (1 << Orientation) \
+ | (1 << RotationVector) \
+ | (1 << LinearAccel) \
+ | (1 << Gravity) \
+)
+// mask of virtual sensors that require gyro + accel data (but no compass data)
+#define VIRTUAL_SENSOR_GYRO_6AXES_MASK ( \
+ (1 << GameRotationVector) \
+)
+// mask of virtual sensors that require mag + accel data (but no gyro data)
+#define VIRTUAL_SENSOR_MAG_6AXES_MASK ( \
+ (1 << GeomagneticRotationVector) \
+)
+// mask of all virtual sensors
+#define VIRTUAL_SENSOR_ALL_MASK ( \
+ VIRTUAL_SENSOR_9AXES_MASK \
+ | VIRTUAL_SENSOR_GYRO_6AXES_MASK \
+ | VIRTUAL_SENSOR_MAG_6AXES_MASK \
+)
+
+// bit mask of current MPL active features (mMplFeatureActiveMask)
+#define INV_COMPASS_CAL 0x01
+#define INV_COMPASS_FIT 0x02
+
+// bit mask of current DMP active features (mFeatureActiveMask)
+#define INV_DMP_QUATERNION 0x001 //3 elements without real part, 32 bit each
+#define INV_DMP_DISPL_ORIENTATION 0x002 //screen orientation
+#define INV_DMP_SIGNIFICANT_MOTION 0x004 //significant motion
+#define INV_DMP_PEDOMETER 0x008 //interrupt-based pedometer
+#define INV_DMP_PEDOMETER_STEP 0x010 //timer-based pedometer
+#define INV_DMP_PED_STANDALONE 0x020 //timestamps only
+#define INV_DMP_6AXIS_QUATERNION 0x040 //3 elements without real part, 32 bit each
+#define INV_DMP_PED_QUATERNION 0x080 //3 elements without real part, 16 bit each
+#define INV_DMP_PED_INDICATOR 0x100 //tag along header with step indciator
+#define INV_DMP_BATCH_MODE 0x200 //batch mode
+
+// bit mask of whether DMP should be turned on
+#define DMP_FEATURE_MASK ( \
+ (INV_DMP_QUATERNION) \
+ | (INV_DMP_DISPL_ORIENTATION) \
+ | (INV_DMP_SIGNIFICANT_MOTION) \
+ | (INV_DMP_PEDOMETER) \
+ | (INV_DMP_PEDOMETER_STEP) \
+ | (INV_DMP_6AXIS_QUATERNION) \
+ | (INV_DMP_PED_QUATERNION) \
+ | (INV_DMP_BATCH_MODE) \
+)
+
+// bit mask of DMP features as sensors
+#define DMP_SENSOR_MASK ( \
+ (INV_DMP_DISPL_ORIENTATION) \
+ | (INV_DMP_SIGNIFICANT_MOTION) \
+ | (INV_DMP_PEDOMETER) \
+ | (INV_DMP_PEDOMETER_STEP) \
+ | (INV_DMP_6AXIS_QUATERNION) \
+)
+
+// data header format used by kernel driver.
+#define DATA_FORMAT_STEP 0x0001
+#define DATA_FORMAT_MARKER 0x0010
+#define DATA_FORMAT_EMPTY_MARKER 0x0020
+#define DATA_FORMAT_PED_STANDALONE 0x0100
+#define DATA_FORMAT_PED_QUAT 0x0200
+#define DATA_FORMAT_6_AXIS 0x0400
+#define DATA_FORMAT_QUAT 0x0800
+#define DATA_FORMAT_COMPASS 0x1000
+#define DATA_FORMAT_GYRO 0x2000
+#define DATA_FORMAT_ACCEL 0x4000
+#define DATA_FORMAT_PRESSURE 0x8000
+#define DATA_FORMAT_MASK 0xffff
+
+#define BYTES_PER_SENSOR 8
+#define BYTES_PER_SENSOR_PACKET 16
+#define QUAT_ONLY_LAST_PACKET_OFFSET 16
+#define BYTES_QUAT_DATA 24
+#define MAX_READ_SIZE BYTES_QUAT_DATA
+#define MAX_SUSPEND_BATCH_PACKET_SIZE 1024
+#define MAX_PACKET_SIZE 80 //8 * 4 + (2 * 24)
+
+/* Uncomment to enable Low Power Quaternion */
+#define ENABLE_LP_QUAT_FEAT
+
+/* Enable Pressure sensor support */
+#define ENABLE_PRESSURE
+
+/* Screen Orientation is not currently supported */
+int isDmpScreenAutoRotationEnabled()
+{
+#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+int (*m_pt2AccelCalLoadFunc)(long *bias) = NULL;
+/*****************************************************************************/
+/** MPLSensor implementation which fits into the HAL example for crespo provided
+ * by Google.
+ * WARNING: there may only be one instance of MPLSensor, ever.
+ */
+
+class MPLSensor: public SensorBase
+{
+ typedef int (MPLSensor::*hfunc_t)(sensors_event_t*);
+
+public:
+
+ MPLSensor(CompassSensor *, int (*m_pt2AccelCalLoadFunc)(long*) = 0);
+ virtual ~MPLSensor();
+
+ virtual int setDelay(int32_t handle, int64_t ns);
+ virtual int enable(int32_t handle, int enabled);
+ virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
+ virtual int flush(int handle);
+ int selectAndSetQuaternion(int batchMode, int mEnabled, long long featureMask);
+ int checkBatchEnabled();
+ int setBatch(int en, int toggleEnable);
+ int32_t getEnableMask() { return mEnabled; }
+ void getHandle(int32_t handle, int &what, android::String8 &sname);
+
+ virtual int readEvents(sensors_event_t *data, int count);
+ virtual int getFd() const;
+ virtual int getAccelFd() const;
+ virtual int getCompassFd() const;
+ virtual int getPollTime();
+ virtual int getStepCountPollTime();
+ virtual bool hasPendingEvents() const;
+ virtual bool hasStepCountPendingEvents();
+ int populateSensorList(struct sensor_t *list, int len);
+
+ int readAccelEvents(sensors_event_t* data, int count);
+ void buildCompassEvent();
+ void buildMpuEvent();
+ int checkValidHeader(unsigned short data_format);
+
+ int turnOffAccelFifo();
+ int turnOffGyroFifo();
+ int enableDmpOrientation(int);
+ int dmpOrientHandler(int);
+ int readDmpOrientEvents(sensors_event_t* data, int count);
+ int getDmpOrientFd();
+ int openDmpOrientFd();
+ int closeDmpOrientFd();
+
+ int getDmpRate(int64_t *);
+ int checkDMPOrientation();
+
+ int getDmpSignificantMotionFd();
+ int readDmpSignificantMotionEvents(sensors_event_t* data, int count);
+ int enableDmpSignificantMotion(int);
+ int significantMotionHandler(sensors_event_t* data);
+ bool checkSmdSupport(){return (mDmpSignificantMotionEnabled);};
+
+ int enableDmpPedometer(int, int);
+ int readDmpPedometerEvents(sensors_event_t* data, int count, int32_t id, int outputType);
+ int getDmpPedometerFd();
+ bool checkPedometerSupport() {return (mDmpPedometerEnabled || mDmpStepCountEnabled);};
+ bool checkOrientationSupport() {return ((isDmpDisplayOrientationOn()
+ && (mDmpOrientationEnabled
+ || !isDmpScreenAutoRotationEnabled())));};
+
+protected:
+ CompassSensor *mCompassSensor;
+ PressureSensor *mPressureSensor;
+
+ int gyroHandler(sensors_event_t *data);
+ int rawGyroHandler(sensors_event_t *data);
+ int accelHandler(sensors_event_t *data);
+ int compassHandler(sensors_event_t *data);
+ int rawCompassHandler(sensors_event_t *data);
+ int rvHandler(sensors_event_t *data);
+ int grvHandler(sensors_event_t *data);
+ int laHandler(sensors_event_t *data);
+ int gravHandler(sensors_event_t *data);
+ int orienHandler(sensors_event_t *data);
+ int smHandler(sensors_event_t *data);
+ int pHandler(sensors_event_t *data);
+ int gmHandler(sensors_event_t *data);
+ int psHandler(sensors_event_t *data);
+ int sdHandler(sensors_event_t *data);
+ int scHandler(sensors_event_t *data);
+ int metaHandler(sensors_event_t *data, int flags);
+ void calcOrientationSensor(float *Rx, float *Val);
+ virtual int update_delay();
+
+ void inv_set_device_properties();
+ int inv_constructor_init();
+ int inv_constructor_default_enable();
+ int setAccelInitialState();
+ int masterEnable(int en);
+ int enablePedStandalone(int en);
+ int enablePedStandaloneData(int en);
+ int enablePedQuaternion(int);
+ int enablePedQuaternionData(int);
+ int enable6AxisQuaternion(int);
+ int enable6AxisQuaternionData(int);
+ int enableLPQuaternion(int);
+ int enableQuaternionData(int);
+ int enableAccelPedometer(int);
+ int enableAccelPedData(int);
+ int onDmp(int);
+ int enableGyro(int en);
+ int enableLowPowerAccel(int en);
+ int enableAccel(int en);
+ int enableCompass(int en, int rawSensorOn);
+ int enablePressure(int en);
+ int enableBatch(int64_t timeout);
+ void computeLocalSensorMask(int enabled_sensors);
+ int computeBatchSensorMask(int enableSensor, int checkNewBatchSensor);
+ int computeBatchDataOutput();
+ int enableSensors(unsigned long sensors, int en, uint32_t changed);
+ int inv_read_temperature(long long *data);
+ int inv_read_dmp_state(int fd);
+ int inv_read_sensor_bias(int fd, long *data);
+ void inv_get_sensors_orientation(void);
+ int inv_init_sysfs_attributes(void);
+ int resetCompass(void);
+ void setCompassDelay(int64_t ns);
+ void enable_iio_sysfs(void);
+ int setDmpFeature(int en);
+ int computeAndSetDmpState(void);
+ int enablePedometer(int);
+ int enablePedIndicator(int en);
+ int checkPedStandaloneEnabled(void);
+ int checkPedQuatEnabled();
+ int check6AxisQuatEnabled();
+ int checkLPQRateSupported();
+ int checkLPQuaternion();
+ int checkAccelPed();
+ void setInitial6QuatValue();
+ int writeSignificantMotionParams(bool toggleEnable,
+ uint32_t delayThreshold1, uint32_t delayThreshold2,
+ uint32_t motionThreshold);
+ long mMasterSensorMask;
+ long mLocalSensorMask;
+ int mPollTime;
+ int64_t mStepCountPollTime;
+ bool mHaveGoodMpuCal; // flag indicating that the cal file can be written
+ int mGyroAccuracy; // value indicating the quality of the gyro calibr.
+ int mAccelAccuracy; // value indicating the quality of the accel calibr.
+ int mCompassAccuracy; // value indicating the quality of the compass calibr.
+ struct pollfd mPollFds[5];
+ pthread_mutex_t mMplMutex;
+ pthread_mutex_t mHALMutex;
+
+ char mIIOBuffer[(16 + 8 * 3 + 8) * IIO_BUFFER_LENGTH];
+
+ int iio_fd;
+ int accel_fd;
+ int mpufifo_fd;
+ int gyro_temperature_fd;
+ int accel_x_offset_fd;
+ int accel_y_offset_fd;
+ int accel_z_offset_fd;
+
+ int accel_x_dmp_bias_fd;
+ int accel_y_dmp_bias_fd;
+ int accel_z_dmp_bias_fd;
+
+ int gyro_x_offset_fd;
+ int gyro_y_offset_fd;
+ int gyro_z_offset_fd;
+
+ int gyro_x_dmp_bias_fd;
+ int gyro_y_dmp_bias_fd;
+ int gyro_z_dmp_bias_fd;
+
+ int dmp_orient_fd;
+ int mDmpOrientationEnabled;
+
+ int dmp_sign_motion_fd;
+ int mDmpSignificantMotionEnabled;
+
+ int dmp_pedometer_fd;
+ int mDmpPedometerEnabled;
+ int mDmpStepCountEnabled;
+
+ uint32_t mEnabled;
+ uint32_t mBatchEnabled;
+ int32_t mFlushSensorEnabled;
+ uint32_t mOldBatchEnabledMask;
+ int64_t mBatchTimeoutInMs;
+ sensors_event_t mPendingEvents[NumSensors];
+ sensors_event_t mSmEvents;
+ sensors_event_t mSdEvents;
+ sensors_event_t mScEvents;
+ int64_t mDelays[NumSensors];
+ int64_t mBatchDelays[NumSensors];
+ int64_t mBatchTimeouts[NumSensors];
+ hfunc_t mHandlers[NumSensors];
+ short mCachedGyroData[3];
+ long mCachedAccelData[3];
+ long mCachedCompassData[3];
+ long mCachedQuaternionData[3];
+ long mCached6AxisQuaternionData[3];
+ long mCachedPedQuaternionData[3];
+ long mCachedPressureData;
+ android::KeyedVector<int, int> mIrqFds;
+
+ InputEventCircularReader mAccelInputReader;
+ InputEventCircularReader mGyroInputReader;
+
+ bool mFirstRead;
+ short mTempScale;
+ short mTempOffset;
+ int64_t mTempCurrentTime;
+ int mAccelScale;
+ long mAccelSelfTestScale;
+ long mGyroScale;
+ long mGyroSelfTestScale;
+ long mCompassScale;
+ float mCompassBias[3];
+ bool mFactoryGyroBiasAvailable;
+ long mFactoryGyroBias[3];
+ bool mGyroBiasAvailable;
+ bool mGyroBiasApplied;
+ float mGyroBias[3]; //in body frame
+ long mGyroChipBias[3]; //in chip frame
+ bool mFactoryAccelBiasAvailable;
+ long mFactoryAccelBias[3];
+ bool mAccelBiasAvailable;
+ bool mAccelBiasApplied;
+ long mAccelBias[3]; //in chip frame
+
+ uint32_t mPendingMask;
+ unsigned long mSensorMask;
+
+ char chip_ID[MAX_CHIP_ID_LEN];
+ char mSysfsPath[MAX_SYSFS_NAME_LEN];
+
+ signed char mGyroOrientation[9];
+ signed char mAccelOrientation[9];
+
+ int64_t mSensorTimestamp;
+ int64_t mCompassTimestamp;
+ int64_t mPressureTimestamp;
+
+ struct sysfs_attrbs {
+ char *chip_enable;
+ char *power_state;
+ char *master_enable;
+ char *dmp_firmware;
+ char *firmware_loaded;
+ char *dmp_on;
+ char *dmp_int_on;
+ char *dmp_event_int_on;
+ char *tap_on;
+ char *key;
+ char *self_test;
+ char *temperature;
+
+ char *gyro_enable;
+ char *gyro_fifo_rate;
+ char *gyro_fsr;
+ char *gyro_orient;
+ char *gyro_fifo_enable;
+ char *gyro_rate;
+
+ char *accel_enable;
+ char *accel_fifo_rate;
+ char *accel_fsr;
+ char *accel_bias;
+ char *accel_orient;
+ char *accel_fifo_enable;
+ char *accel_rate;
+
+ char *three_axis_q_on; //formerly quaternion_on
+ char *three_axis_q_rate;
+
+ char *six_axis_q_on;
+ char *six_axis_q_rate;
+
+ char *six_axis_q_value;
+
+ char *ped_q_on;
+ char *ped_q_rate;
+
+ char *step_detector_on;
+ char *step_indicator_on;
+
+ char *in_timestamp_en;
+ char *in_timestamp_index;
+ char *in_timestamp_type;
+
+ char *buffer_length;
+
+ char *display_orientation_on;
+ char *event_display_orientation;
+
+ char *in_accel_x_offset;
+ char *in_accel_y_offset;
+ char *in_accel_z_offset;
+ char *in_accel_self_test_scale;
+
+ char *in_accel_x_dmp_bias;
+ char *in_accel_y_dmp_bias;
+ char *in_accel_z_dmp_bias;
+
+ char *in_gyro_x_offset;
+ char *in_gyro_y_offset;
+ char *in_gyro_z_offset;
+ char *in_gyro_self_test_scale;
+
+ char *in_gyro_x_dmp_bias;
+ char *in_gyro_y_dmp_bias;
+ char *in_gyro_z_dmp_bias;
+
+ char *event_smd;
+ char *smd_enable;
+ char *smd_delay_threshold;
+ char *smd_delay_threshold2;
+ char *smd_threshold;
+ char *batchmode_timeout;
+ char *batchmode_wake_fifo_full_on;
+ char *flush_batch;
+
+ char *pedometer_on;
+ char *pedometer_int_on;
+ char *event_pedometer;
+ char *pedometer_steps;
+ char *pedometer_counter;
+
+ char *motion_lpa_on;
+ } mpu;
+
+ char *sysfs_names_ptr;
+ int mMplFeatureActiveMask;
+ uint64_t mFeatureActiveMask;
+ bool mDmpOn;
+ int mPedUpdate;
+ int mPressureUpdate;
+ int64_t mQuatSensorTimestamp;
+ int64_t mStepSensorTimestamp;
+ uint64_t mLastStepCount;
+ int mLeftOverBufferSize;
+ char mLeftOverBuffer[1024];
+ bool mInitial6QuatValueAvailable;
+ long mInitial6QuatValue[4];
+ bool mFlushBatchSet;
+ uint32_t mSkipReadEvents;
+ bool mDataMarkerDetected;
+ bool mEmptyDataMarkerDetected;
+
+private:
+ /* added for dynamic get sensor list */
+ void fillAccel(const char* accel, struct sensor_t *list);
+ void fillGyro(const char* gyro, struct sensor_t *list);
+ void fillRV(struct sensor_t *list);
+ void fillGMRV(struct sensor_t *list);
+ void fillGRV(struct sensor_t *list);
+ void fillOrientation(struct sensor_t *list);
+ void fillGravity(struct sensor_t *list);
+ void fillLinearAccel(struct sensor_t *list);
+ void fillSignificantMotion(struct sensor_t *list);
+#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
+ void fillScreenOrientation(struct sensor_t *list);
+#endif
+ void storeCalibration();
+ void loadDMP();
+ bool isMpuNonDmp();
+ int isLowPowerQuatEnabled();
+ int isDmpDisplayOrientationOn();
+ void getCompassBias();
+ void getFactoryGyroBias();
+ void setFactoryGyroBias();
+ void getGyroBias();
+ void setGyroZeroBias();
+ void setGyroBias();
+ void getFactoryAccelBias();
+ void setFactoryAccelBias();
+ void getAccelBias();
+ void setAccelBias();
+ int isCompassDisabled();
+ int setBatchDataRates();
+ int resetDataRates();
+ void initBias();
+ void resetMplStates();
+ void sys_dump(bool fileMode);
+};
+
+extern "C" {
+ void setCallbackObject(MPLSensor*);
+ MPLSensor *getCallbackObject();
+}
+
+#endif // ANDROID_MPL_SENSOR_H