diff --git a/60xx/Android.mk b/60xx/Android.mk
deleted file mode 100644
index 427bbb4..0000000
--- a/60xx/Android.mk
+++ /dev/null
@@ -1,8 +0,0 @@
-# Can't have both manta and non-manta libsensors.
-ifneq ($(filter manta, $(TARGET_DEVICE)),)
-# libsensors_iio expects IIO drivers for an MPU6050+AK8963 which are only available on manta.
-include $(call all-named-subdir-makefiles,libsensors_iio)
-else
-# libsensors expects an non-IIO MPU3050.
-include $(call all-named-subdir-makefiles,mlsdk libsensors)
-endif
diff --git a/60xx/libsensors/Android.mk b/60xx/libsensors/Android.mk
deleted file mode 100644
index 326e096..0000000
--- a/60xx/libsensors/Android.mk
+++ /dev/null
@@ -1,47 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# 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.
-# Modified 2011 by InvenSense, Inc
-
-
-LOCAL_PATH := $(call my-dir)
-
-ifneq ($(BOARD_USES_GENERIC_INVENSENSE),false)
-
-# InvenSense fragment of the HAL
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libinvensense_hal
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\" -Werror -Wall
-LOCAL_CFLAGS += -DCONFIG_MPU_SENSORS_MPU3050=1
-
-LOCAL_SRC_FILES := SensorBase.cpp MPLSensor.cpp 
-
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/platform/include
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/platform/include/linux
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/platform/linux
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/mllite
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/mldmp
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/external/aichi
-LOCAL_C_INCLUDES += hardware/invensense/60xx/mlsdk/external/akmd
-
-LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libdl libmllite libmlplatform
-LOCAL_CPPFLAGS+=-DLINUX=1
-LOCAL_LDFLAGS:=-rdynamic
-
-include $(BUILD_SHARED_LIBRARY)
-
-endif
diff --git a/60xx/libsensors/MPLSensor.cpp b/60xx/libsensors/MPLSensor.cpp
deleted file mode 100644
index 4676d0e..0000000
--- a/60xx/libsensors/MPLSensor.cpp
+++ /dev/null
@@ -1,1304 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-
-//#define LOG_NDEBUG 0
-//see also the EXTRA_VERBOSE define, below
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <float.h>
-#include <poll.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <stdlib.h>
-#include <sys/select.h>
-#include <dlfcn.h>
-#include <pthread.h>
-
-#include <cutils/log.h>
-#include <utils/KeyedVector.h>
-
-#include "MPLSensor.h"
-
-#include "math.h"
-#include "ml.h"
-#include "mlFIFO.h"
-#include "mlsl.h"
-#include "mlos.h"
-#include "ml_mputest.h"
-#include "ml_stored_data.h"
-#include "mldl_cfg.h"
-#include "mldl.h"
-
-#include "mpu.h"
-#include "accel.h"
-#include "compass.h"
-#include "kernel/timerirq.h"
-#include "kernel/mpuirq.h"
-#include "kernel/slaveirq.h"
-
-extern "C" {
-#include "mlsupervisor.h"
-}
-
-#include "mlcontrol.h"
-#include "sensor_params.h"
-
-#define EXTRA_VERBOSE (0)
-//#define FUNC_LOG ALOGV("%s", __PRETTY_FUNCTION__)
-#define FUNC_LOG
-#define VFUNC_LOG ALOGV_IF(EXTRA_VERBOSE, "%s", __PRETTY_FUNCTION__)
-/* this mask must turn on only the sensors that are present and managed by the MPL */
-#define ALL_MPL_SENSORS_NP (INV_THREE_AXIS_ACCEL | INV_THREE_AXIS_COMPASS | INV_THREE_AXIS_GYRO)
-
-#define CALL_MEMBER_FN(pobject,ptrToMember)  ((pobject)->*(ptrToMember))
-
-/******************************************/
-
-/* Base values for the sensor list, these need to be in the order defined in MPLSensor.h */
-static struct sensor_t sSensorList[] =
-    { { "MPL Gyroscope", "Invensense", 1,
-         SENSORS_GYROSCOPE_HANDLE,
-         SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Accelerometer", "Invensense", 1,
-         SENSORS_ACCELERATION_HANDLE,
-         SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Magnetic Field", "Invensense", 1,
-         SENSORS_MAGNETIC_FIELD_HANDLE,
-         SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Orientation", "Invensense", 1,
-         SENSORS_ORIENTATION_HANDLE,
-         SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Rotation Vector", "Invensense", 1,
-         SENSORS_ROTATION_VECTOR_HANDLE,
-         SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Linear Acceleration", "Invensense", 1,
-         SENSORS_LINEAR_ACCEL_HANDLE,
-         SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-      { "MPL Gravity", "Invensense", 1,
-         SENSORS_GRAVITY_HANDLE,
-         SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, { } },
-};
-
-static unsigned long long irq_timestamp = 0;
-/* ***************************************************************************
- * MPL interface misc.
- */
-//static pointer to the object that will handle callbacks
-static MPLSensor* gMPLSensor = NULL;
-
-/* we need to pass some callbacks to the MPL.  The mpl is a C library, so
- * wrappers for the C++ callback implementations are required.
- */
-extern "C" {
-//callback wrappers go here
-void mot_cb_wrapper(uint16_t val)
-{
-    if (gMPLSensor) {
-        gMPLSensor->cbOnMotion(val);
-    }
-}
-
-void procData_cb_wrapper()
-{
-    if(gMPLSensor) {
-        gMPLSensor->cbProcData();
-    }
-}
-
-} //end of extern C
-
-void setCallbackObject(MPLSensor* gbpt)
-{
-    gMPLSensor = gbpt;
-}
-
-
-/*****************************************************************************
- * sensor class implementation
- */
-
-#define GY_ENABLED ((1<<ID_GY) & enabled_sensors)
-#define A_ENABLED  ((1<<ID_A)  & enabled_sensors)
-#define O_ENABLED  ((1<<ID_O)  & enabled_sensors)
-#define M_ENABLED  ((1<<ID_M)  & enabled_sensors)
-#define LA_ENABLED ((1<<ID_LA) & enabled_sensors)
-#define GR_ENABLED ((1<<ID_GR) & enabled_sensors)
-#define RV_ENABLED ((1<<ID_RV) & enabled_sensors)
-
-MPLSensor::MPLSensor() :
-    SensorBase(NULL, NULL),
-            mNewData(0),
-            mDmpStarted(false),
-            mMasterSensorMask(INV_ALL_SENSORS),
-            mLocalSensorMask(ALL_MPL_SENSORS_NP), mPollTime(-1),
-            mCurFifoRate(-1), mHaveGoodMpuCal(false), mHaveGoodCompassCal(false),
-            mUseTimerIrqAccel(false), mUsetimerIrqCompass(true),
-            mUseTimerirq(false), mSampleCount(0),
-            mEnabled(0), mPendingMask(0)
-{
-    FUNC_LOG;
-    int mpu_int_fd;
-    char *port = NULL;
-
-    ALOGV_IF(EXTRA_VERBOSE, "MPLSensor constructor: numSensors = %d", numSensors);
-
-    pthread_mutex_init(&mMplMutex, NULL);
-
-    mForceSleep = false;
-
-    /* used for identifying whether 9axis is enabled or not             */
-    /* this variable will be changed in initMPL() when libmpl is loaded */
-    /* sensor list will be changed based on this variable               */
-    mNineAxisEnabled = false;
-
-    for (size_t i = 0; i < ARRAY_SIZE(mPollFds); i++) {
-        mPollFds[i].fd = -1;
-        mPollFds[i].events = 0;
-    }
-
-    pthread_mutex_lock(&mMplMutex);
-
-    mpu_int_fd = open("/dev/mpuirq", O_RDWR);
-    if (mpu_int_fd == -1) {
-        ALOGE("could not open the mpu irq device node");
-    } else {
-        fcntl(mpu_int_fd, F_SETFL, O_NONBLOCK);
-        mIrqFds.add(MPUIRQ_FD, mpu_int_fd);
-        mPollFds[MPUIRQ_FD].fd = mpu_int_fd;
-        mPollFds[MPUIRQ_FD].events = POLLIN;
-    }
-
-    accel_fd = open("/dev/accelirq", O_RDWR);
-    if (accel_fd == -1) {
-        ALOGE("could not open the accel irq device node");
-    } else {
-        fcntl(accel_fd, F_SETFL, O_NONBLOCK);
-        mIrqFds.add(ACCELIRQ_FD, accel_fd);
-        mPollFds[ACCELIRQ_FD].fd = accel_fd;
-        mPollFds[ACCELIRQ_FD].events = POLLIN;
-    }
-
-    timer_fd = open("/dev/timerirq", O_RDWR);
-    if (timer_fd == -1) {
-        ALOGE("could not open the timer irq device node");
-    } else {
-        fcntl(timer_fd, F_SETFL, O_NONBLOCK);
-        mIrqFds.add(TIMERIRQ_FD, timer_fd);
-        mPollFds[TIMERIRQ_FD].fd = timer_fd;
-        mPollFds[TIMERIRQ_FD].events = POLLIN;
-    }
-
-    data_fd = mpu_int_fd;
-
-    if ((accel_fd == -1) && (timer_fd != -1)) {
-        //no accel irq and timer available
-        mUseTimerIrqAccel = true;
-    }
-
-    memset(mPendingEvents, 0, sizeof(mPendingEvents));
-
-    mPendingEvents[RotationVector].version = sizeof(sensors_event_t);
-    mPendingEvents[RotationVector].sensor = ID_RV;
-    mPendingEvents[RotationVector].type = SENSOR_TYPE_ROTATION_VECTOR;
-
-    mPendingEvents[LinearAccel].version = sizeof(sensors_event_t);
-    mPendingEvents[LinearAccel].sensor = ID_LA;
-    mPendingEvents[LinearAccel].type = SENSOR_TYPE_LINEAR_ACCELERATION;
-
-    mPendingEvents[Gravity].version = sizeof(sensors_event_t);
-    mPendingEvents[Gravity].sensor = ID_GR;
-    mPendingEvents[Gravity].type = SENSOR_TYPE_GRAVITY;
-
-    mPendingEvents[Gyro].version = sizeof(sensors_event_t);
-    mPendingEvents[Gyro].sensor = ID_GY;
-    mPendingEvents[Gyro].type = SENSOR_TYPE_GYROSCOPE;
-
-    mPendingEvents[Accelerometer].version = sizeof(sensors_event_t);
-    mPendingEvents[Accelerometer].sensor = ID_A;
-    mPendingEvents[Accelerometer].type = SENSOR_TYPE_ACCELEROMETER;
-
-    mPendingEvents[MagneticField].version = sizeof(sensors_event_t);
-    mPendingEvents[MagneticField].sensor = ID_M;
-    mPendingEvents[MagneticField].type = SENSOR_TYPE_MAGNETIC_FIELD;
-    mPendingEvents[MagneticField].magnetic.status = SENSOR_STATUS_ACCURACY_HIGH;
-
-    mPendingEvents[Orientation].version = sizeof(sensors_event_t);
-    mPendingEvents[Orientation].sensor = ID_O;
-    mPendingEvents[Orientation].type = SENSOR_TYPE_ORIENTATION;
-    mPendingEvents[Orientation].orientation.status
-            = SENSOR_STATUS_ACCURACY_HIGH;
-
-    mHandlers[RotationVector] = &MPLSensor::rvHandler;
-    mHandlers[LinearAccel] = &MPLSensor::laHandler;
-    mHandlers[Gravity] = &MPLSensor::gravHandler;
-    mHandlers[Gyro] = &MPLSensor::gyroHandler;
-    mHandlers[Accelerometer] = &MPLSensor::accelHandler;
-    mHandlers[MagneticField] = &MPLSensor::compassHandler;
-    mHandlers[Orientation] = &MPLSensor::orienHandler;
-
-    for (int i = 0; i < numSensors; i++)
-        mDelays[i] = 30000000LLU; // 30 ms by default
-
-    if (inv_serial_start(port) != INV_SUCCESS) {
-        ALOGE("Fatal Error : could not open MPL serial interface");
-    }
-
-    //initialize library parameters
-    initMPL();
-
-    //setup the FIFO contents
-    setupFIFO();
-
-
-    pthread_mutex_unlock(&mMplMutex);
-
-}
-
-MPLSensor::~MPLSensor()
-{
-    FUNC_LOG;
-    pthread_mutex_lock(&mMplMutex);
-    if (inv_dmp_stop() != INV_SUCCESS) {
-        ALOGW("Error: could not stop the DMP correctly.\n");
-    }
-
-    if (inv_dmp_close() != INV_SUCCESS) {
-        ALOGW("Error: could not close the DMP");
-    }
-
-    if (inv_serial_stop() != INV_SUCCESS) {
-        ALOGW("Error : could not close the serial port");
-    }
-    pthread_mutex_unlock(&mMplMutex);
-    pthread_mutex_destroy(&mMplMutex);
-}
-
-/* clear any data from our various filehandles */
-void MPLSensor::clearIrqData(bool* irq_set)
-{
-    unsigned int i;
-    int nread;
-    struct mpuirq_data irqdata;
-
-    poll(mPollFds, ARRAY_SIZE(mPollFds), 0); //check which ones need to be cleared
-
-    for (i = 0; i < ARRAY_SIZE(mPollFds); i++) {
-        int cur_fd = mPollFds[i].fd;
-        if (mPollFds[i].revents & POLLIN) {
-            nread = read(cur_fd, &irqdata, sizeof(irqdata));
-            if (nread > 0) {
-                irq_set[i] = true;
-                irq_timestamp = irqdata.irqtime;
-            }
-        }
-        mPollFds[i].revents = 0;
-    }
-}
-
-/* set the power states of the various sensors based on the bits set in the
- * enabled_sensors parameter.
- * this function modifies globalish state variables.  It must be called with the mMplMutex held. */
-void MPLSensor::setPowerStates(int enabled_sensors)
-{
-    FUNC_LOG;
-    bool irq_set[5] = { false, false, false, false, false };
-
-    do {
-
-        if (LA_ENABLED || GR_ENABLED || RV_ENABLED || O_ENABLED) {
-            mLocalSensorMask = ALL_MPL_SENSORS_NP;
-            break;
-        }
-
-        if (!A_ENABLED && !M_ENABLED && !GY_ENABLED) {
-            mLocalSensorMask = 0;
-            break;
-        }
-
-        if (GY_ENABLED) {
-            mLocalSensorMask |= INV_THREE_AXIS_GYRO;
-        } else {
-            mLocalSensorMask &= ~INV_THREE_AXIS_GYRO;
-        }
-
-        if (A_ENABLED) {
-            mLocalSensorMask |= (INV_THREE_AXIS_ACCEL);
-        } else {
-            mLocalSensorMask &= ~(INV_THREE_AXIS_ACCEL);
-        }
-
-        if (M_ENABLED) {
-            mLocalSensorMask |= INV_THREE_AXIS_COMPASS;
-        } else {
-            mLocalSensorMask &= ~(INV_THREE_AXIS_COMPASS);
-        }
-
-    } while (0);
-
-    //record the new sensor state
-    inv_error_t rv;
-
-    unsigned long sen_mask = mLocalSensorMask & mMasterSensorMask;
-
-    bool changing_sensors = ((inv_get_dl_config()->requested_sensors
-            != sen_mask) && (sen_mask != 0));
-    bool restart = (!mDmpStarted) && (sen_mask != 0);
-
-    if (changing_sensors || restart) {
-
-        ALOGV_IF(EXTRA_VERBOSE, "cs:%d rs:%d ", changing_sensors, restart);
-
-        if (mDmpStarted) {
-            inv_dmp_stop();
-            clearIrqData(irq_set);
-            mDmpStarted = false;
-        }
-
-        if (sen_mask != inv_get_dl_config()->requested_sensors) {
-            rv = inv_set_mpu_sensors(sen_mask);
-            ALOGE_IF(rv != INV_SUCCESS,
-                    "error: unable to set MPL sensor power states (sens=%ld retcode = %d)",
-                    sen_mask, rv);
-        }
-
-        if (((mUsetimerIrqCompass && (sen_mask == INV_THREE_AXIS_COMPASS))
-                || (mUseTimerIrqAccel && (sen_mask & INV_THREE_AXIS_ACCEL)))
-                && ((sen_mask & INV_DMP_PROCESSOR) == 0)) {
-            ALOGV_IF(EXTRA_VERBOSE, "Allowing TimerIRQ");
-            mUseTimerirq = true;
-        } else {
-            if (mUseTimerirq) {
-                ioctl(mIrqFds.valueFor(TIMERIRQ_FD), TIMERIRQ_STOP, 0);
-                clearIrqData(irq_set);
-            }
-            ALOGV_IF(EXTRA_VERBOSE, "Not allowing TimerIRQ");
-            mUseTimerirq = false;
-        }
-
-        if (!mDmpStarted) {
-            if (mHaveGoodMpuCal || mHaveGoodCompassCal) {
-                rv = inv_store_calibration();
-                ALOGE_IF(rv != INV_SUCCESS,
-                        "error: unable to store MPL calibration file");
-                mHaveGoodMpuCal = false;
-                mHaveGoodCompassCal = false;
-            }
-            rv = inv_dmp_start();
-            ALOGE_IF(rv != INV_SUCCESS, "unable to start dmp");
-            mDmpStarted = true;
-        }
-    }
-
-    //check if we should stop the DMP
-    if (mDmpStarted && (sen_mask == 0)) {
-        rv = inv_dmp_stop();
-        ALOGE_IF(rv != INV_SUCCESS, "error: unable to stop DMP (retcode = %d)",
-                rv);
-        if (mUseTimerirq) {
-            ioctl(mIrqFds.valueFor(TIMERIRQ_FD), TIMERIRQ_STOP, 0);
-        }
-        clearIrqData(irq_set);
-
-        mDmpStarted = false;
-        mPollTime = -1;
-        mCurFifoRate = -1;
-    }
-
-}
-
-/**
- * container function for all the calls we make once to set up the MPL.
- */
-void MPLSensor::initMPL()
-{
-    FUNC_LOG;
-    inv_error_t result;
-    unsigned short bias_update_mask = 0xFFFF;
-
-    if (inv_dmp_open() != INV_SUCCESS) {
-        ALOGE("Fatal Error : could not open DMP correctly.\n");
-    }
-
-    result = inv_set_mpu_sensors(ALL_MPL_SENSORS_NP); //default to all sensors, also makes 9axis enable work
-    ALOGE_IF(result != INV_SUCCESS,
-            "Fatal Error : could not set enabled sensors.");
-
-    if (inv_load_calibration() != INV_SUCCESS) {
-        ALOGE("could not open MPL calibration file");
-    }
-
-    //check for the 9axis fusion library: if available load it and start 9x
-    void* h_dmp_lib=dlopen("libinvensense_mpl.so", RTLD_NOW);
-    if(h_dmp_lib) {
-        const char* error;
-        error = dlerror();
-        inv_error_t (*fp_inv_enable_9x_fusion)() =
-              (inv_error_t(*)()) dlsym(h_dmp_lib, "inv_enable_9x_fusion");
-        if((error = dlerror()) != NULL) {
-            ALOGE("%s %s", error, "inv_enable_9x_fusion");
-        } else if ((*fp_inv_enable_9x_fusion)() != INV_SUCCESS) {
-            ALOGE( "Warning : 9 axis sensor fusion not available "
-                  "- No compass detected.\n");
-        } else {
-            /*  9axis is loaded and enabled                            */
-            /*  this variable is used for coming up with sensor list   */
-            mNineAxisEnabled = true;
-        }
-    } else {
-        const char* error = dlerror();
-        ALOGE("libinvensense_mpl.so not found, 9x sensor fusion disabled (%s)",error);
-    }
-
-    if (inv_set_bias_update(bias_update_mask) != INV_SUCCESS) {
-        ALOGE("Error : Bias update function could not be set.\n");
-    }
-
-    if (inv_set_motion_interrupt(1) != INV_SUCCESS) {
-        ALOGE("Error : could not set motion interrupt");
-    }
-
-    if (inv_set_fifo_interrupt(1) != INV_SUCCESS) {
-        ALOGE("Error : could not set fifo interrupt");
-    }
-
-    result = inv_set_fifo_rate(6);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_set_fifo_rate returned %d\n", result);
-    }
-
-    setupCallbacks();
-
-}
-
-/** setup the fifo contents.
- */
-void MPLSensor::setupFIFO()
-{
-    FUNC_LOG;
-    inv_error_t result;
-
-    result = inv_send_accel(INV_ALL, INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_accel returned %d\n", result);
-    }
-
-    result = inv_send_quaternion(INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_quaternion returned %d\n", result);
-    }
-
-    result = inv_send_linear_accel(INV_ALL, INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_linear_accel returned %d\n", result);
-    }
-
-    result = inv_send_linear_accel_in_world(INV_ALL, INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_linear_accel_in_world returned %d\n",
-             result);
-    }
-
-    result = inv_send_gravity(INV_ALL, INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_gravity returned %d\n", result);
-    }
-
-    result = inv_send_gyro(INV_ALL, INV_32_BIT);
-    if (result != INV_SUCCESS) {
-        ALOGE("Fatal error: inv_send_gyro returned %d\n", result);
-    }
-
-}
-
-/**
- *  set up the callbacks that we use in all cases (outside of gestures, etc)
- */
-void MPLSensor::setupCallbacks()
-{
-    FUNC_LOG;
-    if (inv_set_motion_callback(mot_cb_wrapper) != INV_SUCCESS) {
-        ALOGE("Error : Motion callback could not be set.\n");
-
-    }
-
-    if (inv_set_fifo_processed_callback(procData_cb_wrapper) != INV_SUCCESS) {
-        ALOGE("Error : Processed data callback could not be set.");
-
-    }
-}
-
-/**
- * handle the motion/no motion output from the MPL.
- */
-void MPLSensor::cbOnMotion(uint16_t val)
-{
-    FUNC_LOG;
-    //after the first no motion, the gyro should be calibrated well
-    if (val == 2) {
-        if ((inv_get_dl_config()->requested_sensors) & INV_THREE_AXIS_GYRO) {
-            //if gyros are on and we got a no motion, set a flag
-            // indicating that the cal file can be written.
-            mHaveGoodMpuCal = true;
-        }
-    }
-
-    return;
-}
-
-
-void MPLSensor::cbProcData()
-{
-    mNewData = 1;
-    mSampleCount++;
-}
-
-//these handlers transform mpl data into one of the Android sensor types
-//  scaling and coordinate transforms should be done in the handlers
-
-void MPLSensor::gyroHandler(sensors_event_t* s, uint32_t* pending_mask,
-                             int index)
-{
-    VFUNC_LOG;
-    inv_error_t res;
-    res = inv_get_float_array(INV_GYROS, s->gyro.v);
-    s->gyro.v[0] = s->gyro.v[0] * M_PI / 180.0;
-    s->gyro.v[1] = s->gyro.v[1] * M_PI / 180.0;
-    s->gyro.v[2] = s->gyro.v[2] * M_PI / 180.0;
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-}
-
-void MPLSensor::accelHandler(sensors_event_t* s, uint32_t* pending_mask,
-                              int index)
-{
-    //VFUNC_LOG;
-    inv_error_t res;
-    res = inv_get_float_array(INV_ACCELS, s->acceleration.v);
-    //res = inv_get_accel_float(s->acceleration.v);
-    s->acceleration.v[0] = s->acceleration.v[0] * 9.81;
-    s->acceleration.v[1] = s->acceleration.v[1] * 9.81;
-    s->acceleration.v[2] = s->acceleration.v[2] * 9.81;
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-}
-
-int MPLSensor::estimateCompassAccuracy()
-{
-    inv_error_t res;
-    int rv;
-
-    res = inv_get_compass_accuracy(&rv);
-    if(rv >= SENSOR_STATUS_ACCURACY_MEDIUM) {
-         mHaveGoodCompassCal = true;	 
-    }
-    ALOGE_IF(res != INV_SUCCESS, "error returned from inv_get_compass_accuracy");
-
-    return rv;
-}
-
-void MPLSensor::compassHandler(sensors_event_t* s, uint32_t* pending_mask,
-                                int index)
-{
-    VFUNC_LOG;
-    inv_error_t res;
-
-    res = inv_get_float_array(INV_MAGNETOMETER, s->magnetic.v);
-
-    if (res != INV_SUCCESS) {
-        ALOGW(
-             "compass_handler inv_get_float_array(INV_MAGNETOMETER) returned %d",
-             res);
-    }
-
-    s->magnetic.status = estimateCompassAccuracy();
-
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-}
-
-void MPLSensor::rvHandler(sensors_event_t* s, uint32_t* pending_mask,
-                           int index)
-{
-    VFUNC_LOG;
-    float quat[4];
-    float norm = 0;
-    inv_error_t r;
-
-    r = inv_get_float_array(INV_QUATERNION, quat);
-
-    if (r != INV_SUCCESS) {
-        *pending_mask &= ~(1 << index);
-        return;
-    } else {
-        *pending_mask |= (1 << index);
-    }
-
-    norm = quat[1] * quat[1] + quat[2] * quat[2] + quat[3] * quat[3]
-            + FLT_EPSILON;
-
-    if (norm > 1.0f) {
-        //renormalize
-        norm = sqrtf(norm);
-        float inv_norm = 1.0f / norm;
-        quat[1] = quat[1] * inv_norm;
-        quat[2] = quat[2] * inv_norm;
-        quat[3] = quat[3] * inv_norm;
-    }
-
-    if (quat[0] < 0.0) {
-        quat[1] = -quat[1];
-        quat[2] = -quat[2];
-        quat[3] = -quat[3];
-    }
-
-    s->gyro.v[0] = quat[1];
-    s->gyro.v[1] = quat[2];
-    s->gyro.v[2] = quat[3];
-
-}
-
-void MPLSensor::laHandler(sensors_event_t* s, uint32_t* pending_mask,
-                           int index)
-{
-    VFUNC_LOG;
-    inv_error_t res;
-    res = inv_get_float_array(INV_LINEAR_ACCELERATION, s->gyro.v);
-    s->gyro.v[0] *= 9.81;
-    s->gyro.v[1] *= 9.81;
-    s->gyro.v[2] *= 9.81;
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-}
-
-void MPLSensor::gravHandler(sensors_event_t* s, uint32_t* pending_mask,
-                             int index)
-{
-    VFUNC_LOG;
-    inv_error_t res;
-    res = inv_get_float_array(INV_GRAVITY, s->gyro.v);
-    s->gyro.v[0] *= 9.81;
-    s->gyro.v[1] *= 9.81;
-    s->gyro.v[2] *= 9.81;
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-}
-
-void MPLSensor::calcOrientationSensor(float *R, float *values)
-{
-    float tmp;
-
-    //Azimuth
-    if ((R[7] > 0.7071067f) || ((R[8] < 0) && (fabs(R[7]) > fabs(R[6])))) {
-        values[0] = (float) atan2f(-R[3], R[0]);
-    } else {
-        values[0] = (float) atan2f(R[1], R[4]);
-    }
-    values[0] *= 57.295779513082320876798154814105f;
-    if (values[0] < 0) {
-        values[0] += 360.0f;
-    }
-    //Pitch
-    tmp = R[7];
-    if (tmp > 1.0f)
-        tmp = 1.0f;
-    if (tmp < -1.0f)
-        tmp = -1.0f;
-    values[1] = -asinf(tmp) * 57.295779513082320876798154814105f;
-    if (R[8] < 0) {
-        values[1] = 180.0f - values[1];
-    }
-    if (values[1] > 180.0f) {
-        values[1] -= 360.0f;
-    }
-    //Roll
-    if ((R[7] > 0.7071067f)) {
-        values[2] = (float) atan2f(R[6], R[7]);
-    } else {
-        values[2] = (float) atan2f(R[6], R[8]);
-    }
-
-    values[2] *= 57.295779513082320876798154814105f;
-    if (values[2] > 90.0f) {
-        values[2] = 180.0f - values[2];
-    }
-    if (values[2] < -90.0f) {
-        values[2] = -180.0f - values[2];
-    }
-}
-
-void MPLSensor::orienHandler(sensors_event_t* s, uint32_t* pending_mask,
-                              int index) //note that this is the handler for the android 'orientation' sensor, not the mpl orientation output
-{
-    VFUNC_LOG;
-    inv_error_t res;
-    float rot_mat[9];
-
-    res = inv_get_float_array(INV_ROTATION_MATRIX, rot_mat);
-
-    calcOrientationSensor(rot_mat, s->orientation.v);
-
-    s->orientation.status = estimateCompassAccuracy();
-
-    if (res == INV_SUCCESS)
-        *pending_mask |= (1 << index);
-    else
-        ALOGW("orienHandler: data not valid (%d)", (int) res);
-
-}
-
-int MPLSensor::enable(int32_t handle, int en)
-{
-    FUNC_LOG;
-
-    int what = -1;
-
-    switch (handle) {
-    case ID_A:
-        what = Accelerometer;
-        break;
-    case ID_M:
-        what = MagneticField;
-        break;
-    case ID_O:
-        what = Orientation;
-        break;
-    case ID_GY:
-        what = Gyro;
-        break;
-    case ID_GR:
-        what = Gravity;
-        break;
-    case ID_RV:
-        what = RotationVector;
-        break;
-    case ID_LA:
-        what = LinearAccel;
-        break;
-    default: //this takes care of all the gestures
-        what = handle;
-        break;
-    }
-
-    if (uint32_t(what) >= numSensors)
-        return -EINVAL;
-
-    int newState = en ? 1 : 0;
-    int err = 0;
-
-    pthread_mutex_lock(&mMplMutex);
-    if ((uint32_t(newState) << what) != (mEnabled & (1 << what))) {
-        short flags = newState;
-        mEnabled &= ~(1 << what);
-        mEnabled |= (uint32_t(flags) << what);
-        ALOGV_IF(EXTRA_VERBOSE, "mEnabled = %x", mEnabled);
-        setPowerStates(mEnabled);
-        pthread_mutex_unlock(&mMplMutex);
-        if (!newState)
-            update_delay();
-        return err;
-    }
-    pthread_mutex_unlock(&mMplMutex);
-    return err;
-}
-
-int MPLSensor::setDelay(int32_t handle, int64_t ns)
-{
-    FUNC_LOG;
-    ALOGV_IF(EXTRA_VERBOSE,
-            " setDelay handle: %d rate %d", handle, (int) (ns / 1000000LL));
-    int what = -1;
-    switch (handle) {
-    case ID_A:
-        what = Accelerometer;
-        break;
-    case ID_M:
-        what = MagneticField;
-        break;
-    case ID_O:
-        what = Orientation;
-        break;
-    case ID_GY:
-        what = Gyro;
-        break;
-    case ID_GR:
-        what = Gravity;
-        break;
-    case ID_RV:
-        what = RotationVector;
-        break;
-    case ID_LA:
-        what = LinearAccel;
-        break;
-    default:
-        what = handle;
-        break;
-    }
-
-    if (uint32_t(what) >= numSensors)
-        return -EINVAL;
-
-    if (ns < 0)
-        return -EINVAL;
-
-    pthread_mutex_lock(&mMplMutex);
-    mDelays[what] = ns;
-    pthread_mutex_unlock(&mMplMutex);
-    return update_delay();
-}
-
-int MPLSensor::update_delay()
-{
-    FUNC_LOG;
-    int rv = 0;
-    bool irq_set[5];
-
-    pthread_mutex_lock(&mMplMutex);
-
-    if (mEnabled) {
-        uint64_t wanted = -1LLU;
-        for (int i = 0; i < numSensors; i++) {
-            if (mEnabled & (1 << i)) {
-                uint64_t ns = mDelays[i];
-                wanted = wanted < ns ? wanted : ns;
-            }
-        }
-
-        //Limit all rates to 100Hz max. 100Hz = 10ms = 10000000ns
-        if (wanted < 10000000LLU) {
-            wanted = 10000000LLU;
-        }
-
-        int rate = ((wanted) / 5000000LLU) - ((wanted % 5000000LLU == 0) ? 1
-                                                                         : 0); //mpu fifo rate is in increments of 5ms
-        if (rate == 0) //KLP disallow fifo rate 0
-            rate = 1;
-
-        if (rate != mCurFifoRate) {
-            inv_error_t res; // = inv_dmp_stop();
-            res = inv_set_fifo_rate(rate);
-            ALOGE_IF(res != INV_SUCCESS, "error setting FIFO rate");
-
-            mCurFifoRate = rate;
-            rv = (res == INV_SUCCESS);
-        }
-
-        if (((inv_get_dl_config()->requested_sensors & INV_DMP_PROCESSOR) == 0)) {
-            if (mUseTimerirq) {
-                ioctl(mIrqFds.valueFor(TIMERIRQ_FD), TIMERIRQ_STOP, 0);
-                clearIrqData(irq_set);
-                if (inv_get_dl_config()->requested_sensors
-                        == INV_THREE_AXIS_COMPASS) {
-                    ioctl(mIrqFds.valueFor(TIMERIRQ_FD), TIMERIRQ_START,
-                          (unsigned long) (wanted / 1000000LLU));
-                    ALOGV_IF(EXTRA_VERBOSE, "updated timerirq period to %d",
-                            (int) (wanted / 1000000LLU));
-                } else {
-                    ioctl(mIrqFds.valueFor(TIMERIRQ_FD), TIMERIRQ_START,
-                          (unsigned long) inv_get_sample_step_size_ms());
-                    ALOGV_IF(EXTRA_VERBOSE, "updated timerirq period to %d",
-                            (int) inv_get_sample_step_size_ms());
-                }
-            }
-        }
-
-    }
-    pthread_mutex_unlock(&mMplMutex);
-    return rv;
-}
-
-/* return the current time in nanoseconds */
-int64_t MPLSensor::now_ns(void)
-{
-    //FUNC_LOG;
-    struct timespec ts;
-
-    clock_gettime(CLOCK_MONOTONIC, &ts);
-    return (int64_t) ts.tv_sec * 1000000000 + ts.tv_nsec;
-}
-
-int MPLSensor::readEvents(sensors_event_t* data, int count)
-{
-    //VFUNC_LOG;
-    bool irq_set[5] = { false, false, false, false, false };
-    inv_error_t rv;
-    if (count < 1)
-        return -EINVAL;
-    int numEventReceived = 0;
-
-    clearIrqData(irq_set);
-
-    pthread_mutex_lock(&mMplMutex);
-    if (mDmpStarted) {
-        rv = inv_update_data();
-        ALOGE_IF(rv != INV_SUCCESS, "inv_update_data error (code %d)", (int) rv);
-    }
-
-    else {
-        //probably just one extra read after shutting down
-        ALOGV_IF(EXTRA_VERBOSE,
-                "MPLSensor::readEvents called, but there's nothing to do.");
-    }
-
-    pthread_mutex_unlock(&mMplMutex);
-
-    if (!mNewData) {
-        ALOGV_IF(EXTRA_VERBOSE, "no new data");
-        return 0;
-    }
-    mNewData = 0;
-    
-    /* google timestamp */
-    pthread_mutex_lock(&mMplMutex);
-    for (int i = 0; i < numSensors; i++) {
-        if (mEnabled & (1 << i)) {
-            CALL_MEMBER_FN(this,mHandlers[i])(mPendingEvents + i,
-                                              &mPendingMask, i);
-	    mPendingEvents[i].timestamp = irq_timestamp;
-        }
-    }
-
-    for (int j = 0; count && mPendingMask && j < numSensors; j++) {
-        if (mPendingMask & (1 << j)) {
-            mPendingMask &= ~(1 << j);
-            if (mEnabled & (1 << j)) {
-                *data++ = mPendingEvents[j];
-                count--;
-                numEventReceived++;
-            }
-        }
-
-    }
-
-    pthread_mutex_unlock(&mMplMutex);
-    return numEventReceived;
-}
-
-int MPLSensor::getFd() const
-{
-    return data_fd;
-}
-
-int MPLSensor::getAccelFd() const
-{
-    return accel_fd;
-}
-
-int MPLSensor::getTimerFd() const
-{
-    return timer_fd;
-}
-
-int MPLSensor::getPowerFd() const
-{
-    int hdl = (uintptr_t) inv_get_serial_handle();
-    return hdl;
-}
-
-int MPLSensor::getPollTime()
-{
-    return mPollTime;
-}
-
-bool MPLSensor::hasPendingEvents() const
-{
-    //if we are using the polling workaround, force the main loop to check for data every time
-    return (mPollTime != -1);
-}
-
-void MPLSensor::handlePowerEvent()
-{
-    VFUNC_LOG;
-    mpuirq_data irqd;
-
-    int fd = (uintptr_t) inv_get_serial_handle();
-    read(fd, &irqd, sizeof(irqd));
-
-    if (irqd.data == MPU_PM_EVENT_SUSPEND_PREPARE) {
-        //going to sleep
-        sleepEvent();
-    } else if (irqd.data == MPU_PM_EVENT_POST_SUSPEND) {
-        //waking up
-        wakeEvent();
-    }
-
-    ioctl(fd, MPU_PM_EVENT_HANDLED, 0);
-}
-
-void MPLSensor::sleepEvent()
-{
-    VFUNC_LOG;
-    pthread_mutex_lock(&mMplMutex);
-    if (mEnabled != 0) {
-        mForceSleep = true;
-        mOldEnabledMask = mEnabled;
-        setPowerStates(0);
-    }
-    pthread_mutex_unlock(&mMplMutex);
-}
-
-void MPLSensor::wakeEvent()
-{
-    VFUNC_LOG;
-    pthread_mutex_lock(&mMplMutex);
-    if (mForceSleep) {
-        setPowerStates((mOldEnabledMask | mEnabled));
-    }
-    mForceSleep = false;
-    pthread_mutex_unlock(&mMplMutex);
-}
-
-/** fill in the sensor list based on which sensors are configured.
- *  return the number of configured sensors.
- *  parameter list must point to a memory region of at least 7*sizeof(sensor_t)
- *  parameter len gives the length of the buffer pointed to by list
- */
-
-int MPLSensor::populateSensorList(struct sensor_t *list, size_t len)
-{
-    int numsensors;
-
-    if(len < 7*sizeof(sensor_t)) {
-        ALOGE("sensor list too small, not populating.");
-        return 0;
-    }
-
-    /* fill in the base values */
-    memcpy(list, sSensorList, sizeof (struct sensor_t) * 7);
-
-    /* first add gyro, accel and compass to the list */
-
-    /* fill in accel values                          */
-    unsigned short accelId = inv_get_accel_id();
-    if(accelId == 0) {
-       ALOGE("Can not get accel id");
-    }
-    fillAccel(accelId, list);
-
-    /* fill in compass values                        */
-    unsigned short compassId = inv_get_compass_id();
-    if(compassId == 0) {
-       ALOGE("Can not get compass id");
-    }
-    fillCompass(compassId, list);
-
-    /* fill in gyro values                           */
-    fillGyro(MPU_NAME, list);
-
-    if(mNineAxisEnabled)
-    {
-        numsensors = 7;
-        /* all sensors will be added to the list     */
-        /* fill in orientation values	             */
-        fillOrientation(list);
-
-        /* fill in rotation vector values	     */
-        fillRV(list);
-
-        /* fill in gravity values			     */
-        fillGravity(list);
-
-        /* fill in Linear accel values            */
-        fillLinearAccel(list);
-    } else {
-        /* no 9-axis sensors, zero fill that part of the list */
-        numsensors = 3;
-        memset(list+3, 0, 4*sizeof(struct sensor_t));
-    }
-
-    return numsensors;
-}
-
-void MPLSensor::fillAccel(unsigned char accel, struct sensor_t *list)
-{
-    switch (accel) {
-    case ACCEL_ID_LIS331:
-        list[Accelerometer].maxRange = ACCEL_LIS331_RANGE;
-        list[Accelerometer].resolution = ACCEL_LIS331_RESOLUTION;
-        list[Accelerometer].power = ACCEL_LIS331_POWER;
-        break;
-
-    case ACCEL_ID_LIS3DH:
-        list[Accelerometer].maxRange = ACCEL_LIS3DH_RANGE;
-        list[Accelerometer].resolution = ACCEL_LIS3DH_RESOLUTION;
-        list[Accelerometer].power = ACCEL_LIS3DH_POWER;
-        break;
-
-    case ACCEL_ID_KXSD9:
-        list[Accelerometer].maxRange = ACCEL_KXSD9_RANGE;
-        list[Accelerometer].resolution = ACCEL_KXSD9_RESOLUTION;
-        list[Accelerometer].power = ACCEL_KXSD9_POWER;
-        break;
-
-    case ACCEL_ID_KXTF9:
-        list[Accelerometer].maxRange = ACCEL_KXTF9_RANGE;
-        list[Accelerometer].resolution = ACCEL_KXTF9_RESOLUTION;
-        list[Accelerometer].power = ACCEL_KXTF9_POWER;
-        break;
-
-    case ACCEL_ID_BMA150:
-        list[Accelerometer].maxRange = ACCEL_BMA150_RANGE;
-        list[Accelerometer].resolution = ACCEL_BMA150_RESOLUTION;
-        list[Accelerometer].power = ACCEL_BMA150_POWER;
-        break;
-
-    case ACCEL_ID_BMA222:
-        list[Accelerometer].maxRange = ACCEL_BMA222_RANGE;
-        list[Accelerometer].resolution = ACCEL_BMA222_RESOLUTION;
-        list[Accelerometer].power = ACCEL_BMA222_POWER;
-        break;
-
-    case ACCEL_ID_BMA250:
-        list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
-        list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
-        list[Accelerometer].power = ACCEL_BMA250_POWER;
-        break;
-
-    case ACCEL_ID_ADXL34X:
-        list[Accelerometer].maxRange = ACCEL_ADXL34X_RANGE;
-        list[Accelerometer].resolution = ACCEL_ADXL34X_RESOLUTION;
-        list[Accelerometer].power = ACCEL_ADXL34X_POWER;
-        break;
-
-    case ACCEL_ID_MMA8450:
-        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
-        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
-        list[Accelerometer].maxRange = ACCEL_MMA8450_RANGE;
-        break;
-
-    case ACCEL_ID_MMA845X:
-        list[Accelerometer].maxRange = ACCEL_MMA845X_RANGE;
-        list[Accelerometer].resolution = ACCEL_MMA845X_RESOLUTION;
-        list[Accelerometer].power = ACCEL_MMA845X_POWER;
-        break;
-
-    case ACCEL_ID_MPU6050:
-        list[Accelerometer].maxRange = ACCEL_MPU6050_RANGE;
-        list[Accelerometer].resolution = ACCEL_MPU6050_RESOLUTION;
-        list[Accelerometer].power = ACCEL_MPU6050_POWER;
-        break;
-    default:
-        ALOGE("unknown accel id -- accel params will be wrong.");
-        break;
-    }
-}
-
-void MPLSensor::fillCompass(unsigned char compass, struct sensor_t *list)
-{
-    switch (compass) {
-    case COMPASS_ID_AK8975:
-        list[MagneticField].maxRange = COMPASS_AKM8975_RANGE;
-        list[MagneticField].resolution = COMPASS_AKM8975_RESOLUTION;
-        list[MagneticField].power = COMPASS_AKM8975_POWER;
-        break;
-    case COMPASS_ID_AMI30X:
-        list[MagneticField].maxRange = COMPASS_AMI30X_RANGE;
-        list[MagneticField].resolution = COMPASS_AMI30X_RESOLUTION;
-        list[MagneticField].power = COMPASS_AMI30X_POWER;
-        break;
-    case COMPASS_ID_AMI306:
-        list[MagneticField].maxRange = COMPASS_AMI306_RANGE;
-        list[MagneticField].resolution = COMPASS_AMI306_RESOLUTION;
-        list[MagneticField].power = COMPASS_AMI306_POWER;
-        break;
-    case COMPASS_ID_YAS529:
-        list[MagneticField].maxRange = COMPASS_YAS529_RANGE;
-        list[MagneticField].resolution = COMPASS_AMI306_RESOLUTION;
-        list[MagneticField].power = COMPASS_AMI306_POWER;
-        break;
-    case COMPASS_ID_YAS530:
-        list[MagneticField].maxRange = COMPASS_YAS530_RANGE;
-        list[MagneticField].resolution = COMPASS_YAS530_RESOLUTION;
-        list[MagneticField].power = COMPASS_YAS530_POWER;
-        break;
-    case COMPASS_ID_HMC5883:
-        list[MagneticField].maxRange = COMPASS_HMC5883_RANGE;
-        list[MagneticField].resolution = COMPASS_HMC5883_RESOLUTION;
-        list[MagneticField].power = COMPASS_HMC5883_POWER;
-        break;
-    case COMPASS_ID_MMC314X:
-        list[MagneticField].maxRange = COMPASS_MMC314X_RANGE;
-        list[MagneticField].resolution = COMPASS_MMC314X_RESOLUTION;
-        list[MagneticField].power = COMPASS_MMC314X_POWER;
-        break;
-    case COMPASS_ID_HSCDTD002B:
-        list[MagneticField].maxRange = COMPASS_HSCDTD002B_RANGE;
-        list[MagneticField].resolution = COMPASS_HSCDTD002B_RESOLUTION;
-        list[MagneticField].power = COMPASS_HSCDTD002B_POWER;
-        break;
-    case COMPASS_ID_HSCDTD004A:
-        list[MagneticField].maxRange = COMPASS_HSCDTD004A_RANGE;
-        list[MagneticField].resolution = COMPASS_HSCDTD004A_RESOLUTION;
-        list[MagneticField].power = COMPASS_HSCDTD004A_POWER;
-        break;
-    default:
-        ALOGE("unknown compass id -- compass parameters will be wrong");
-    }
-}
-
-void MPLSensor::fillGyro(const char* gyro, struct sensor_t *list)
-{
-    if ((gyro != NULL) && (strcmp(gyro, "mpu3050") == 0)) {
-        list[Gyro].maxRange = GYRO_MPU3050_RANGE;
-        list[Gyro].resolution = GYRO_MPU3050_RESOLUTION;
-        list[Gyro].power = GYRO_MPU3050_POWER;
-    } else {
-        list[Gyro].maxRange = GYRO_MPU6050_RANGE;
-        list[Gyro].resolution = GYRO_MPU6050_RESOLUTION;
-        list[Gyro].power = GYRO_MPU6050_POWER;
-    }
-    return;
-}
-
-
-/* fillRV depends on values of accel and compass in the list	*/
-void MPLSensor::fillRV(struct sensor_t *list)
-{
-    /* compute power on the fly */
-    list[RotationVector].power = list[Gyro].power + list[Accelerometer].power
-            + list[MagneticField].power;
-    list[RotationVector].resolution = .00001;
-    list[RotationVector].maxRange = 1.0;
-    return;
-}
-
-void MPLSensor::fillOrientation(struct sensor_t *list)
-{
-    list[Orientation].power = list[Gyro].power + list[Accelerometer].power
-            + list[MagneticField].power;
-    list[Orientation].resolution = .00001;
-    list[Orientation].maxRange = 360.0;
-    return;
-}
-
-void MPLSensor::fillGravity( struct sensor_t *list)
-{
-    list[Gravity].power = list[Gyro].power + list[Accelerometer].power
-            + list[MagneticField].power;
-    list[Gravity].resolution = .00001;
-    list[Gravity].maxRange = 9.81;
-    return;
-}
-
-void MPLSensor::fillLinearAccel(struct sensor_t *list)
-{
-    list[Gravity].power = list[Gyro].power + list[Accelerometer].power
-            + list[MagneticField].power;
-    list[Gravity].resolution = list[Accelerometer].resolution;
-    list[Gravity].maxRange = list[Accelerometer].maxRange;
-    return;
-}
diff --git a/60xx/libsensors/MPLSensor.h b/60xx/libsensors/MPLSensor.h
deleted file mode 100644
index f580732..0000000
--- a/60xx/libsensors/MPLSensor.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2011 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.
- */
-/*************Removed the gesture related info for Google check in : Meenakshi Ramamoorthi: May 31st *********/
-
-#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 <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include "sensors.h"
-#include "SensorBase.h"
-
-/*****************************************************************************/
-/** 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 void (MPLSensor::*hfunc_t)(sensors_event_t*, uint32_t*, int);
-
-public:
-    MPLSensor();
-    virtual ~MPLSensor();
-
-    enum
-    {
-        Gyro=0,
-        Accelerometer,
-        MagneticField,
-        Orientation,
-        RotationVector,
-        LinearAccel,
-        Gravity,
-        numSensors
-    };
-
-    virtual int setDelay(int32_t handle, int64_t ns);
-    virtual int enable(int32_t handle, int enabled);
-    virtual int readEvents(sensors_event_t *data, int count);
-    virtual int getFd() const;
-    virtual int getAccelFd() const;
-    virtual int getTimerFd() const;
-    virtual int getPowerFd() const;
-    virtual int getPollTime();
-    virtual bool hasPendingEvents() const;
-    virtual void handlePowerEvent();
-    virtual void sleepEvent();
-    virtual void wakeEvent();
-    int populateSensorList(struct sensor_t *list, size_t len);
-    void cbOnMotion(uint16_t);
-    void cbProcData();
-
-protected:
-
-    void clearIrqData(bool* irq_set);
-    void setPowerStates(int enabledsensor);
-    void initMPL();
-    void setupFIFO();
-    void setupCallbacks();
-    void gyroHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void accelHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void compassHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void rvHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void laHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void gravHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void orienHandler(sensors_event_t *data, uint32_t *pendmask, int index);
-    void calcOrientationSensor(float *Rx, float *Val);
-    int estimateCompassAccuracy();
-
-    int mNewData; //flag indicating that the MPL calculated new output values
-    int mDmpStarted;
-    long mMasterSensorMask;
-    long mLocalSensorMask;
-    int mPollTime;
-    int mCurFifoRate; //current fifo rate
-    bool mHaveGoodMpuCal; //flag indicating that the cal file can be written
-    bool mHaveGoodCompassCal;
-    bool mUseTimerIrqAccel;
-    bool mUsetimerIrqCompass;
-    bool mUseTimerirq;
-    struct pollfd mPollFds[4];
-    int mSampleCount;
-    pthread_mutex_t mMplMutex;
-    int64_t now_ns();
-    int64_t select_ns(unsigned long long time_set[]);    
-
-    enum FILEHANDLES
-    {
-        MPUIRQ_FD, ACCELIRQ_FD, COMPASSIRQ_FD, TIMERIRQ_FD,
-    };
-
-private:
-
-    int update_delay();
-    int accel_fd;
-    int timer_fd;
-
-    uint32_t mEnabled;
-    uint32_t mPendingMask;
-    sensors_event_t mPendingEvents[numSensors];
-    uint64_t mDelays[numSensors];
-    hfunc_t mHandlers[numSensors];
-    bool mForceSleep;
-    long int mOldEnabledMask;
-    android::KeyedVector<int, int> mIrqFds;
-
-    /* added for dynamic get sensor list              */
-    bool mNineAxisEnabled;
-    void fillAccel(unsigned char accel, struct sensor_t *list);
-    void fillCompass(unsigned char compass, struct sensor_t *list);
-    void fillGyro(const char* gyro, struct sensor_t *list);
-    void fillRV(struct sensor_t *list);
-    void fillOrientation(struct sensor_t *list);
-    void fillGravity(struct sensor_t *list);
-    void fillLinearAccel(struct sensor_t *list);
-};
-
-void setCallbackObject(MPLSensor*);
-
-/*****************************************************************************/
-
-#endif  // ANDROID_MPL_SENSOR_H
diff --git a/60xx/libsensors/SensorBase.cpp b/60xx/libsensors/SensorBase.cpp
deleted file mode 100644
index 9cc1ee8..0000000
--- a/60xx/libsensors/SensorBase.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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.
- */
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <poll.h>
-#include <string.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-
-#include <cutils/log.h>
-
-#include <linux/input.h>
-
-#include "SensorBase.h"
-
-/*****************************************************************************/
-
-SensorBase::SensorBase(
-        const char* dev_name,
-        const char* data_name)
-    : dev_name(dev_name), data_name(data_name),
-      dev_fd(-1), data_fd(-1)
-{
-    if (data_name) {
-        data_fd = openInput(data_name);
-    }
-}
-
-SensorBase::~SensorBase() {
-    if (data_fd >= 0) {
-        close(data_fd);
-    }
-    if (dev_fd >= 0) {
-        close(dev_fd);
-    }
-}
-
-int SensorBase::open_device() {
-    if (dev_fd<0 && dev_name) {
-        dev_fd = open(dev_name, O_RDONLY);
-        ALOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
-    }
-    return 0;
-}
-
-int SensorBase::close_device() {
-    if (dev_fd >= 0) {
-        close(dev_fd);
-        dev_fd = -1;
-    }
-    return 0;
-}
-
-int SensorBase::getFd() const {
-    if (!data_name) {
-        return dev_fd;
-    }
-    return data_fd;
-}
-
-int SensorBase::setDelay(int32_t handle, int64_t ns) {
-    return 0;
-}
-
-bool SensorBase::hasPendingEvents() const {
-    return false;
-}
-
-int64_t SensorBase::getTimestamp() {
-    struct timespec t;
-    t.tv_sec = t.tv_nsec = 0;
-    clock_gettime(CLOCK_MONOTONIC, &t);
-    return int64_t(t.tv_sec)*1000000000LL + t.tv_nsec;
-}
-
-int SensorBase::openInput(const char* inputName) {
-    int fd = -1;
-    const char *dirname = "/dev/input";
-    char devname[PATH_MAX];
-    char *filename;
-    DIR *dir;
-    struct dirent *de;
-    dir = opendir(dirname);
-    if(dir == NULL)
-        return -1;
-    strcpy(devname, dirname);
-    filename = devname + strlen(devname);
-    *filename++ = '/';
-    while((de = readdir(dir))) {
-        if(de->d_name[0] == '.' &&
-                (de->d_name[1] == '\0' ||
-                        (de->d_name[1] == '.' && de->d_name[2] == '\0')))
-            continue;
-        strcpy(filename, de->d_name);
-        fd = open(devname, O_RDONLY);
-        if (fd>=0) {
-            char name[80];
-            if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
-                name[0] = '\0';
-            }
-            if (!strcmp(name, inputName)) {
-                strcpy(input_name, filename);
-                break;
-            } else {
-                close(fd);
-                fd = -1;
-            }
-        }
-    }
-    closedir(dir);
-    ALOGE_IF(fd<0, "couldn't find '%s' input device", inputName);
-    return fd;
-}
diff --git a/60xx/libsensors/SensorBase.h b/60xx/libsensors/SensorBase.h
deleted file mode 100644
index bb4d055..0000000
--- a/60xx/libsensors/SensorBase.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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_SENSOR_BASE_H
-#define ANDROID_SENSOR_BASE_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-
-/*****************************************************************************/
-
-struct sensors_event_t;
-
-class SensorBase {
-protected:
-    const char* dev_name;
-    const char* data_name;
-    char        input_name[PATH_MAX];
-    int         dev_fd;
-    int         data_fd;
-
-    int openInput(const char* inputName);
-    static int64_t getTimestamp();
-
-
-    static int64_t timevalToNano(timeval const& t) {
-        return t.tv_sec*1000000000LL + t.tv_usec*1000;
-    }
-
-    int open_device();
-    int close_device();
-
-public:
-            SensorBase(
-                    const char* dev_name,
-                    const char* data_name);
-
-    virtual ~SensorBase();
-
-    virtual int readEvents(sensors_event_t* data, int count) = 0;
-    virtual bool hasPendingEvents() const;
-    virtual int getFd() const;
-    virtual int setDelay(int32_t handle, int64_t ns);
-    virtual int enable(int32_t handle, int enabled) = 0;
-};
-
-/*****************************************************************************/
-
-#endif  // ANDROID_SENSOR_BASE_H
diff --git a/60xx/libsensors/sensor_params.h b/60xx/libsensors/sensor_params.h
deleted file mode 100644
index 4925ac4..0000000
--- a/60xx/libsensors/sensor_params.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2011 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 INV_SENSOR_PARAMS_H
-#define INV_SENSOR_PARAMS_H
-
-/* Physical parameters of the sensors supported by Invensense MPL */
-#define SENSORS_ROTATION_VECTOR_HANDLE  (ID_RV)
-#define SENSORS_LINEAR_ACCEL_HANDLE     (ID_LA)
-#define SENSORS_GRAVITY_HANDLE          (ID_GR)
-#define SENSORS_GYROSCOPE_HANDLE        (ID_GY)
-#define SENSORS_ACCELERATION_HANDLE     (ID_A)
-#define SENSORS_MAGNETIC_FIELD_HANDLE   (ID_M)
-#define SENSORS_ORIENTATION_HANDLE      (ID_O)
-/******************************************/
-//COMPASS_ID_AKM
-#define COMPASS_AKM8975_RANGE       (9830.0f)
-#define COMPASS_AKM8975_RESOLUTION  (0.285f)
-#define COMPASS_AKM8975_POWER       (10.0f)
-//COMPASS_ID_AMI30X
-#define COMPASS_AMI30X_RANGE        (5461.0f)
-#define COMPASS_AMI30X_RESOLUTION   (0.9f)
-#define COMPASS_AMI30X_POWER        (0.15f)
-//COMPASS_ID_AMI306
-#define COMPASS_AMI306_RANGE        (5461.0f)
-#define COMPASS_AMI306_RESOLUTION   (0.9f)
-#define COMPASS_AMI306_POWER        (0.15f)
-//COMPASS_ID_YAS529
-#define COMPASS_YAS529_RANGE        (19660.0f)
-#define COMPASS_YAS529_RESOLUTION   (0.012f)
-#define COMPASS_YAS529_POWER        (4.0f)
-//COMPASS_ID_YAS530
-#define COMPASS_YAS530_RANGE        (8001.0f)
-#define COMPASS_YAS530_RESOLUTION   (0.012f)
-#define COMPASS_YAS530_POWER        (4.0f)
-//COMPASS_ID_HMC5883
-#define COMPASS_HMC5883_RANGE       (10673.0f)
-#define COMPASS_HMC5883_RESOLUTION  (10.0f)
-#define COMPASS_HMC5883_POWER       (0.24f)
-//COMPASS_ID_LSM303DLH
-#define COMPASS_LSM303DLH_RANGE     (10240.0f)
-#define COMPASS_LSM303DLH_RESOLUTION    (1.0f)
-#define COMPASS_LSM303DLH_POWER     (1.0f)
-//COMPASS_ID_LSM303DLM
-#define COMPASS_LSM303DLM_RANGE     (10240.0f)
-#define COMPASS_LSM303DLM_RESOLUTION    (1.0f)
-#define COMPASS_LSM303DLM_POWER     (1.0f)
-//COMPASS_ID_MMC314X
-#define COMPASS_MMC314X_RANGE       (400.0f)
-#define COMPASS_MMC314X_RESOLUTION  (2.0f)
-#define COMPASS_MMC314X_POWER       (0.55f)
-//COMPASS_ID_HSCDTD002B
-#define COMPASS_HSCDTD002B_RANGE    (9830.0f)
-#define COMPASS_HSCDTD002B_RESOLUTION   (1.0f)
-#define COMPASS_HSCDTD002B_POWER    (1.0f)
-//COMPASS_ID_HSCDTD004A
-#define COMPASS_HSCDTD004A_RANGE    (9830.0f)
-#define COMPASS_HSCDTD004A_RESOLUTION   (1.0f)
-#define COMPASS_HSCDTD004A_POWER    (1.0f)
-/*******************************************/
-//ACCEL_ID_LIS331
-#define ACCEL_LIS331_RANGE      (2.480f*GRAVITY_EARTH)
-#define ACCEL_LIS331_RESOLUTION     (.001f*GRAVITY_EARTH)
-#define ACCEL_LIS331_POWER      (1.0f)
-//ACCEL_ID_LSM303DLX
-#define ACCEL_LSM303DLX_RANGE       (2.480f*GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_RESOLUTION  (0.001f*GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_POWER       (1.0f)
-//ACCEL_ID_LIS3DH
-#define ACCEL_LIS3DH_RANGE      (2.480f*GRAVITY_EARTH)
-#define ACCEL_LIS3DH_RESOLUTION     (0.001f*GRAVITY_EARTH)
-#define ACCEL_LIS3DH_POWER      (1.0f)
-//ACCEL_ID_KXSD9
-#define ACCEL_KXSD9_RANGE       (2.5006f*GRAVITY_EARTH)
-#define ACCEL_KXSD9_RESOLUTION      (0.001f*GRAVITY_EARTH)
-#define ACCEL_KXSD9_POWER       (1.0f)
-//ACCEL_ID_KXTF9
-#define ACCEL_KXTF9_RANGE       (1.0f*GRAVITY_EARTH)
-#define ACCEL_KXTF9_RESOLUTION      (0.033f*GRAVITY_EARTH)
-#define ACCEL_KXTF9_POWER       (0.35f)
-//ACCEL_ID_BMA150
-#define ACCEL_BMA150_RANGE      (2.0f*GRAVITY_EARTH)
-#define ACCEL_BMA150_RESOLUTION     (0.004f*GRAVITY_EARTH)
-#define ACCEL_BMA150_POWER      (0.2f)
-//ACCEL_ID_BMA222
-#define ACCEL_BMA222_RANGE      (2.0f*GRAVITY_EARTH)
-#define ACCEL_BMA222_RESOLUTION     (0.001f*GRAVITY_EARTH)
-#define ACCEL_BMA222_POWER      (0.1f)
-//ACCEL_ID_BMA250
-#define ACCEL_BMA250_RANGE      (2.0f*GRAVITY_EARTH)
-#define ACCEL_BMA250_RESOLUTION     (0.00391f*GRAVITY_EARTH)
-#define ACCEL_BMA250_POWER      (0.139f)
-//ACCEL_ID_ADXL34X
-#define ACCEL_ADXL34X_RANGE     (2.0f*GRAVITY_EARTH)
-#define ACCEL_ADXL34X_RESOLUTION    (0.001f*GRAVITY_EARTH)
-#define ACCEL_ADXL34X_POWER     (1.0f)
-//ACCEL_ID_MMA8450
-#define ACCEL_MMA8450_RANGE     (2.0f*GRAVITY_EARTH)
-#define ACCEL_MMA8450_RESOLUTION    (0.001f*GRAVITY_EARTH)
-#define ACCEL_MMA8450_POWER     (1.0f)
-//ACCEL_ID_MMA845X
-#define ACCEL_MMA845X_RANGE     (2.0f*GRAVITY_EARTH)
-#define ACCEL_MMA845X_RESOLUTION    (0.001f*GRAVITY_EARTH)
-#define ACCEL_MMA845X_POWER     (1.0f)
-//ACCEL_ID_MPU6050
-#define ACCEL_MPU6050_RANGE     (2.0f*GRAVITY_EARTH)
-#define ACCEL_MPU6050_RESOLUTION    (0.004f*GRAVITY_EARTH)
-#define ACCEL_MPU6050_POWER     (0.0f)
-/******************************************/
-//GYRO MPU3050
-#define RAD_P_DEG (3.14159f/180.0f)
-#define GYRO_MPU3050_RANGE      (2000.0f*RAD_P_DEG)
-#define GYRO_MPU3050_RESOLUTION     (32.8f*RAD_P_DEG)
-#define GYRO_MPU3050_POWER      (6.1f)
-//GYRO MPU6050
-#define GYRO_MPU6050_RANGE      (2000.0f*RAD_P_DEG)
-#define GYRO_MPU6050_RESOLUTION     (16.4f*RAD_P_DEG)
-#define GYRO_MPU6050_POWER      (5.5f)
-
-#endif
-
diff --git a/60xx/libsensors/sensors.h b/60xx/libsensors/sensors.h
deleted file mode 100644
index 5c56da0..0000000
--- a/60xx/libsensors/sensors.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * 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_SENSORS_H
-#define ANDROID_SENSORS_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/input.h>
-
-#include <hardware/hardware.h>
-#include <hardware/sensors.h>
-
-__BEGIN_DECLS
-
-/*****************************************************************************/
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-
-#define ID_MPL_BASE (0)
-#define ID_GY (ID_MPL_BASE)
-#define ID_A  (ID_GY + 1)
-#define ID_M  (ID_A + 1)
-#define ID_O  (ID_M + 1)
-#define ID_RV (ID_O + 1) 
-#define ID_LA (ID_RV + 1)
-#define ID_GR (ID_LA + 1)
-
-/*****************************************************************************/
-
-/*
- * The SENSORS Module
- */
-
-__END_DECLS
-
-#endif  // ANDROID_SENSORS_H
diff --git a/60xx/libsensors_iio/Android.mk b/60xx/libsensors_iio/Android.mk
deleted file mode 100644
index fd8e472..0000000
--- a/60xx/libsensors_iio/Android.mk
+++ /dev/null
@@ -1,118 +0,0 @@
-# Copyright (C) 2008 The Android Open Source Project
-#
-# 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.
-# Modified 2011 by InvenSense, Inc
-
-LOCAL_PATH := $(call my-dir)
-
-# InvenSense fragment of the HAL
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := libinvensense_hal
-
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
-
-LOCAL_CFLAGS := -DLOG_TAG=\"Sensors\" -Werror -Wall
-# Comment out for ICS. Affects Android LOG macros.
-LOCAL_CFLAGS += -DANDROID_JELLYBEAN
-
-ifeq ($(ENG_BUILD),1)
-ifeq ($(COMPILE_INVENSENSE_COMPASS_CAL),1)
-LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
-endif
-ifeq ($(COMPILE_THIRD_PARTY_ACCEL),1)
-LOCAL_CFLAGS += -DTHIRD_PARTY_ACCEL
-endif
-ifeq ($(COMPILE_COMPASS_YAS53x),1)
-LOCAL_CFLAGS += -DCOMPASS_YAS53x
-endif
-ifeq ($(COMPILE_COMPASS_AK8975),1)
-LOCAL_CFLAGS += -DCOMPASS_AK8975
-endif
-ifeq ($(COMPILE_COMPASS_AMI306),1)
-LOCAL_CFLAGS += -DCOMPASS_AMI306
-endif
-else # release builds, default
-LOCAL_CFLAGS += -DINVENSENSE_COMPASS_CAL
-endif
-
-LOCAL_SRC_FILES := SensorBase.cpp
-LOCAL_SRC_FILES += MPLSensor.cpp
-LOCAL_SRC_FILES += MPLSupport.cpp
-LOCAL_SRC_FILES += InputEventReader.cpp
-LOCAL_SRC_FILES += CompassSensor.IIO.9150.cpp
-
-LOCAL_C_INCLUDES += $(LOCAL_PATH)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite/linux
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include/linux
-
-LOCAL_SHARED_LIBRARIES := liblog
-LOCAL_SHARED_LIBRARIES += libcutils
-LOCAL_SHARED_LIBRARIES += libutils
-LOCAL_SHARED_LIBRARIES += libdl
-LOCAL_SHARED_LIBRARIES += libmllite
-
-# Additions for SysPed
-LOCAL_SHARED_LIBRARIES += libmplmpu
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mpl
-LOCAL_CPPFLAGS += -DLINUX=1
-# Experimental
-ifeq ($(BOARD_INV_LIBMLLITE_FROM_SOURCE),true)
-LOCAL_CPPFLAGS += -DLIBMLLITE_FROM_SOURCE
-endif
-
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libmplmpu
-LOCAL_SRC_FILES := libmplmpu.so
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-OVERRIDE_BUILT_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
-LOCAL_STRIP_MODULE := true
-include $(BUILD_PREBUILT)
-
-# Experimental
-ifneq ($(BOARD_INV_LIBMLLITE_FROM_SOURCE),true)
-include $(CLEAR_VARS)
-LOCAL_MODULE := libmllite
-LOCAL_SRC_FILES := libmllite.so
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_OWNER := invensense
-LOCAL_MODULE_SUFFIX := .so
-LOCAL_MODULE_CLASS := SHARED_LIBRARIES
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-OVERRIDE_BUILT_MODULE_PATH := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)
-LOCAL_STRIP_MODULE := true
-include $(BUILD_PREBUILT)
-else
-include $(CLEAR_VARS)
-LOCAL_CFLAGS += -DANDROID_JELLYBEAN
-LOCAL_CFLAGS += -DLINUX=1
-LOCAL_MODULE := libmllite
-LOCAL_SRC_FILES := $(call all-c-files-under, software/core/mllite)
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/mllite/linux
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/software/core/driver/include/linux
-LOCAL_MODULE_OWNER := invensense
-LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
-LOCAL_SHARED_LIBRARIES := liblog
-include $(BUILD_SHARED_LIBRARY)
-endif
diff --git a/60xx/libsensors_iio/CompassSensor.IIO.9150.cpp b/60xx/libsensors_iio/CompassSensor.IIO.9150.cpp
deleted file mode 100644
index be8c912..0000000
--- a/60xx/libsensors_iio/CompassSensor.IIO.9150.cpp
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * 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.
- */
-
-#define LOG_NDEBUG 0
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <sys/select.h>
-#include <cutils/log.h>
-#include <linux/input.h>
-#include <string.h>
-
-#include "CompassSensor.IIO.9150.h"
-#include "sensors.h"
-#include "MPLSupport.h"
-#include "sensor_params.h"
-#include "ml_sysfs_helper.h"
-#include "local_log_def.h"
-
-#define COMPASS_MAX_SYSFS_ATTRB sizeof(compassSysFs) / sizeof(char*)
-
-#if defined COMPASS_YAS53x
-#   pragma message "Invensense compass cal with YAS53x IIO on secondary bus"
-#   define USE_MPL_COMPASS_HAL          (1)
-#   define COMPASS_NAME                 "INV_YAS530"
-#elif defined COMPASS_AK8975
-#   pragma message "Invensense compass cal with AK8975 on primary bus"
-#   define USE_MPL_COMPASS_HAL          (1)
-#   define COMPASS_NAME                 "INV_AK8975"
-#elif defined INVENSENSE_COMPASS_CAL
-#   pragma message "Invensense compass cal with compass IIO on secondary bus"
-#   define USE_MPL_COMPASS_HAL          (1)
-#   define COMPASS_NAME                 "INV_COMPASS"
-#else
-#   pragma message "third party compass cal HAL"
-#   define USE_MPL_COMPASS_HAL          (0)
-// TODO: change to vendor's name
-#   define COMPASS_NAME                 "AKM8975"
-#endif
-
-
-/*****************************************************************************/
-
-CompassSensor::CompassSensor() 
-                  : SensorBase(NULL, NULL),
-                    compass_fd(-1),
-                    mCompassTimestamp(0),
-                    mCompassInputReader(8)
-{
-    VFUNC_LOG;
-
-    if(inv_init_sysfs_attributes()) {
-        LOGE("Error Instantiating Compass\n");
-        return;
-    }
-
-    if (!strcmp(COMPASS_NAME, "INV_COMPASS")) {
-        mI2CBus = COMPASS_BUS_SECONDARY;
-    } else {
-        mI2CBus = COMPASS_BUS_PRIMARY;
-    }
-
-    memset(mCachedCompassData, 0, sizeof(mCachedCompassData));
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)", 
-            compassSysFs.compass_orient, getTimestamp());
-    FILE *fptr;
-    fptr = fopen(compassSysFs.compass_orient, "r");
-    if (fptr != NULL) {
-        int om[9];
-        fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d", 
-               &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
-               &om[6], &om[7], &om[8]);
-        fclose(fptr);
-
-        LOGV_IF(EXTRA_VERBOSE,
-                "HAL:compass mounting matrix: "
-                "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
-                om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
-
-        mCompassOrientation[0] = om[0];
-        mCompassOrientation[1] = om[1];
-        mCompassOrientation[2] = om[2];
-        mCompassOrientation[3] = om[3];
-        mCompassOrientation[4] = om[4];
-        mCompassOrientation[5] = om[5];
-        mCompassOrientation[6] = om[6];
-        mCompassOrientation[7] = om[7];
-        mCompassOrientation[8] = om[8];
-    } else {
-        LOGE("HAL:Couldn't read compass mounting matrix");
-    }
-
-    if (!isIntegrated()) {
-        enable(ID_M, 0);
-    }
-}
-
-CompassSensor::~CompassSensor()
-{
-    VFUNC_LOG;
-
-    free(pathP);
-    if( compass_fd > 0)
-        close(compass_fd);
-}
-
-int CompassSensor::getFd() const
-{
-    VHANDLER_LOG;
-    return compass_fd;
-}
-
-/**
- *  @brief        This function will enable/disable sensor.
- *  @param[in]    handle
- *                  which sensor to enable/disable.
- *  @param[in]    en
- *                  en=1, enable; 
- *                  en=0, disable
- *  @return       if the operation is successful.
- */
-int CompassSensor::enable(int32_t /*handle*/, int en) 
-{
-    VFUNC_LOG;
-
-    mEnable = en;
-    int res;
-
-    res = write_sysfs_int(compassSysFs.compass_enable, en);
-    LOGE_IF(res < 0, "HAL:enable compass failed");
-
-    if (en) {
-        res = write_sysfs_int(compassSysFs.compass_x_fifo_enable, en);
-        res = write_sysfs_int(compassSysFs.compass_y_fifo_enable, en);
-        res = write_sysfs_int(compassSysFs.compass_z_fifo_enable, en);
-    }
-
-    return res;
-}
-
-int CompassSensor::setDelay(int32_t /*handle*/, int64_t ns) 
-{
-    VFUNC_LOG;
-    int tempFd;
-    int res;
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)", 
-            1000000000.f / ns, compassSysFs.compass_rate, getTimestamp());
-    mDelay = ns;
-    if (ns == 0)
-        return -1;
-    tempFd = open(compassSysFs.compass_rate, O_RDWR);
-    res = write_attribute_sensor(tempFd, 1000000000.f / ns);
-    if(res < 0) {
-        LOGE("HAL:Compass update delay error");
-    }
-    return res;
-}
-
-
-/**
-    @brief      This function will return the state of the sensor.
-    @return     1=enabled; 0=disabled
-**/
-int CompassSensor::getEnable(int32_t /*handle*/)
-{
-    VFUNC_LOG;
-    return mEnable;
-}
-
-/* use for Invensense compass calibration */
-#define COMPASS_EVENT_DEBUG (0)
-void CompassSensor::processCompassEvent(const input_event *event)
-{
-    VHANDLER_LOG;
-
-    switch (event->code) {
-    case EVENT_TYPE_ICOMPASS_X:
-        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_X\n");
-        mCachedCompassData[0] = event->value;
-        break;
-    case EVENT_TYPE_ICOMPASS_Y:
-        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Y\n");
-        mCachedCompassData[1] = event->value;
-        break;
-    case EVENT_TYPE_ICOMPASS_Z:
-        LOGV_IF(COMPASS_EVENT_DEBUG, "EVENT_TYPE_ICOMPASS_Z\n");
-        mCachedCompassData[2] = event->value;
-        break;
-    }
-    
-    mCompassTimestamp = 
-        (int64_t)event->time.tv_sec * 1000000000L + event->time.tv_usec * 1000L;
-}
-
-void CompassSensor::getOrientationMatrix(signed char *orient)
-{
-    VFUNC_LOG;
-    memcpy(orient, mCompassOrientation, sizeof(mCompassOrientation));
-}
-
-long CompassSensor::getSensitivity()
-{
-    VFUNC_LOG;
-
-    long sensitivity;
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)", 
-            compassSysFs.compass_scale, getTimestamp());
-    inv_read_data(compassSysFs.compass_scale, &sensitivity);
-    return sensitivity;
-}
-
-/**
-    @brief         This function is called by sensors_mpl.cpp
-                   to read sensor data from the driver.
-    @param[out]    data      sensor data is stored in this variable. Scaled such that
-                             1 uT = 2^16
-    @para[in]      timestamp data's timestamp
-    @return        1, if 1   sample read, 0, if not, negative if error
- */
-int CompassSensor::readSample(long *data, int64_t *timestamp)
-{
-    VHANDLER_LOG;
-
-    int done = 0;
-
-    ssize_t n = mCompassInputReader.fill(compass_fd);
-    if (n < 0) {
-        LOGE("HAL:no compass events read");
-        return n;
-    }
-
-    input_event const* event;
-
-    while (done == 0 && mCompassInputReader.readEvent(&event)) {
-        int type = event->type;
-        if (type == EV_REL) {
-            processCompassEvent(event);
-        } else if (type == EV_SYN) {
-            *timestamp = mCompassTimestamp;
-            memcpy(data, mCachedCompassData, sizeof(mCachedCompassData));
-            done = 1;
-        } else {
-            LOGE("HAL:Compass Sensor: unknown event (type=%d, code=%d)",
-                 type, event->code);
-        }
-        mCompassInputReader.next();
-    }
-
-    return done;
-}
-
-/**
- *  @brief  This function will return the current delay for this sensor.
- *  @return delay in nanoseconds. 
- */
-int64_t CompassSensor::getDelay(int32_t /*handle*/)
-{
-    VFUNC_LOG;
-    return mDelay;
-}
-
-void CompassSensor::fillList(struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    const char *compass = COMPASS_NAME;
-
-    if (compass) {
-        if(!strcmp(compass, "INV_COMPASS")) {
-            list->maxRange = COMPASS_MPU9150_RANGE;
-            /* since target platform would use AK8963 instead of AK8975,
-               need to adopt AK8963's resolution here */
-            list->resolution = COMPASS_AKM8963_RESOLUTION;
-            list->power = COMPASS_MPU9150_POWER;
-            list->minDelay = COMPASS_MPU9150_MINDELAY;
-            return;
-        }
-        if(!strcmp(compass, "compass")
-                || !strcmp(compass, "INV_AK8975") ) {
-            list->maxRange = COMPASS_AKM8975_RANGE;
-            list->resolution = COMPASS_AKM8975_RESOLUTION;
-            list->power = COMPASS_AKM8975_POWER;
-            list->minDelay = COMPASS_AKM8975_MINDELAY;
-            return;
-        }
-        if(!strcmp(compass, "INV_YAS530")) {
-            list->maxRange = COMPASS_YAS53x_RANGE;
-            list->resolution = COMPASS_YAS53x_RESOLUTION;
-            list->power = COMPASS_YAS53x_POWER;
-            list->minDelay = COMPASS_YAS53x_MINDELAY;
-            return;
-        }
-        if(!strcmp(compass, "INV_AMI306")) {
-            list->maxRange = COMPASS_AMI306_RANGE;
-            list->resolution = COMPASS_AMI306_RESOLUTION;
-            list->power = COMPASS_AMI306_POWER;
-            list->minDelay = COMPASS_AMI306_MINDELAY;
-            return;
-        }
-    }
-
-    LOGE("HAL:unknown compass id %s -- "
-         "params default to ak8975 and might be wrong.",
-         compass);
-    list->maxRange = COMPASS_AKM8975_RANGE;
-    list->resolution = COMPASS_AKM8975_RESOLUTION;
-    list->power = COMPASS_AKM8975_POWER;
-    list->minDelay = COMPASS_AKM8975_MINDELAY;
-}
-
-int CompassSensor::inv_init_sysfs_attributes(void)
-{
-    VFUNC_LOG;
-
-    unsigned char i = 0;
-    char sysfs_path[MAX_SYSFS_NAME_LEN], iio_trigger_path[MAX_SYSFS_NAME_LEN];
-    char *sptr;
-    char **dptr;
-
-    pathP = (char*)malloc(
-                    sizeof(char[COMPASS_MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
-    sptr = pathP;
-    dptr = (char**)&compassSysFs;
-    if (sptr == NULL)
-        return -1;
-
-    do {
-        *dptr++ = sptr;
-        sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
-    } while (++i < COMPASS_MAX_SYSFS_ATTRB);
-
-    // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
-    // inv_get_sysfs_abs_path(sysfs_path);
-    if(INV_SUCCESS != inv_get_sysfs_path(sysfs_path)) {
-        ALOGE("CompassSensor failed get sysfs path");
-        return -1;
-    }
-
-    inv_get_iio_trigger_path(iio_trigger_path);
-
-#if defined COMPASS_AK8975
-    char tbuf[2];
-    int num;
-    inv_get_input_number(COMPASS_NAME, &num);
-    tbuf[0] = num + 0x30;
-    tbuf[1] = 0;
-    sprintf(sysfs_path, "%s%s", "sys/class/input/input", tbuf);
-    strcat(sysfs_path, "/ak8975");
-
-    sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/enable");
-    sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/rate");
-    sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/scale");
-    sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-#else
-    sprintf(compassSysFs.compass_enable, "%s%s", sysfs_path, "/compass_enable");
-    sprintf(compassSysFs.compass_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_x_en");
-    sprintf(compassSysFs.compass_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_y_en");
-    sprintf(compassSysFs.compass_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_magn_z_en");
-    sprintf(compassSysFs.compass_rate, "%s%s", sysfs_path, "/sampling_frequency");
-    sprintf(compassSysFs.compass_scale, "%s%s", sysfs_path, "/in_magn_scale");
-    sprintf(compassSysFs.compass_orient, "%s%s", sysfs_path, "/compass_matrix");
-#endif
-
-#if SYSFS_VERBOSE
-    // test print sysfs paths
-    dptr = (char**)&compassSysFs;
-    for (i = 0; i < COMPASS_MAX_SYSFS_ATTRB; i++) {
-        LOGE("HAL:sysfs path: %s", *dptr++);
-    }
-#endif
-    return 0;
-}
diff --git a/60xx/libsensors_iio/CompassSensor.IIO.9150.h b/60xx/libsensors_iio/CompassSensor.IIO.9150.h
deleted file mode 100644
index 6e9bf03..0000000
--- a/60xx/libsensors_iio/CompassSensor.IIO.9150.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * 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 COMPASS_SENSOR_H
-#define COMPASS_SENSOR_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-// TODO fixme, need input_event
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <poll.h>
-#include <utils/Vector.h>
-#include <utils/KeyedVector.h>
-
-#include "sensors.h"
-#include "SensorBase.h"
-#include "InputEventReader.h"
-
-class CompassSensor : public SensorBase {
-
-public:
-    CompassSensor();
-    virtual ~CompassSensor();
-
-    virtual int getFd() const;
-    virtual int enable(int32_t handle, int enabled);
-    virtual int setDelay(int32_t handle, int64_t ns);
-    virtual int getEnable(int32_t handle);
-    virtual int64_t getDelay(int32_t handle);
-
-    // unnecessary for MPL
-    virtual int readEvents(sensors_event_t* /*data*/, int /*count*/) { return 0; }
-
-    int readSample(long *data, int64_t *timestamp);
-    int providesCalibration() { return 0; }
-    void getOrientationMatrix(signed char *orient);
-    long getSensitivity();
-    int getAccuracy() { return 0; }
-    void fillList(struct sensor_t *list);
-    int isIntegrated() { return (mI2CBus == COMPASS_BUS_SECONDARY); }
-
-private:
-    enum CompassBus {
-        COMPASS_BUS_PRIMARY = 0,
-        COMPASS_BUS_SECONDARY = 1
-    } mI2CBus;
-
-    struct sysfs_attrbs {
-       char *compass_enable;
-       char *compass_x_fifo_enable;
-       char *compass_y_fifo_enable;
-       char *compass_z_fifo_enable;
-       char *compass_rate;
-       char *compass_scale;
-       char *compass_orient;
-    } compassSysFs;
-
-    // implementation specific
-    signed char mCompassOrientation[9];
-    long mCachedCompassData[3];
-    int compass_fd;
-    int64_t mCompassTimestamp;
-    InputEventCircularReader mCompassInputReader;
-    int64_t mDelay;
-    int mEnable;
-    char *pathP;
-
-    void processCompassEvent(const input_event *event);
-    int inv_init_sysfs_attributes(void);
-};
-
-/*****************************************************************************/
-
-#endif  // COMPASS_SENSOR_H
diff --git a/60xx/libsensors_iio/InputEventReader.cpp b/60xx/libsensors_iio/InputEventReader.cpp
deleted file mode 100644
index fc48892..0000000
--- a/60xx/libsensors_iio/InputEventReader.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
-* 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.
-*/
-
-#define LOG_NDEBUG 0
-
-#include <stdint.h>
-#include <errno.h>
-#include <string.h>
-#include <unistd.h>
-#include <poll.h>
-
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/input.h>
-
-#include <cutils/log.h>
-
-#include "InputEventReader.h"
-#include "local_log_def.h"
-
-/*****************************************************************************/
-
-struct input_event;
-
-InputEventCircularReader::InputEventCircularReader(size_t numEvents)
-    : mBuffer(new input_event[numEvents * 2]),
-      mBufferEnd(mBuffer + numEvents),
-      mHead(mBuffer),
-      mCurr(mBuffer),
-      mFreeSpace(numEvents)
-{
-}
-
-InputEventCircularReader::~InputEventCircularReader()
-{
-    delete [] mBuffer;
-}
-
-#define INPUT_EVENT_DEBUG (0)
-ssize_t InputEventCircularReader::fill(int fd)
-{
-    size_t numEventsRead = 0;
-    LOGV_IF(INPUT_EVENT_DEBUG, 
-            "DEBUG:%s enter, fd=%d\n", __PRETTY_FUNCTION__, fd);
-    if (mFreeSpace) {
-        const ssize_t nread = read(fd, mHead, mFreeSpace * sizeof(input_event));
-        if (nread < 0 || nread % sizeof(input_event)) {
-            //LOGE("Partial event received nread=%d, required=%d", 
-            //     nread, sizeof(input_event));
-            //LOGE("FD trying to read is: %d");
-            // we got a partial event!!
-            if (INPUT_EVENT_DEBUG) {
-                LOGV_IF(nread < 0, "DEBUG:%s exit nread < 0\n", 
-                        __PRETTY_FUNCTION__);
-                LOGV_IF(nread % sizeof(input_event), 
-                        "DEBUG:%s exit nread %% sizeof(input_event)\n", 
-                        __PRETTY_FUNCTION__);
-            }
-            return (nread < 0 ? -errno : -EINVAL);
-        }
-
-        numEventsRead = nread / sizeof(input_event);
-        if (numEventsRead) {
-            mHead += numEventsRead;
-            mFreeSpace -= numEventsRead;
-            if (mHead > mBufferEnd) {
-                size_t s = mHead - mBufferEnd;
-                memcpy(mBuffer, mBufferEnd, s * sizeof(input_event));
-                mHead = mBuffer + s;
-            }
-        }
-    }
-
-    LOGV_IF(INPUT_EVENT_DEBUG, "DEBUG:%s exit\n", __PRETTY_FUNCTION__);
-    return numEventsRead;
-}
-
-ssize_t InputEventCircularReader::readEvent(input_event const** events)
-{
-    *events = mCurr;
-    ssize_t available = (mBufferEnd - mBuffer) - mFreeSpace;
-    return available ? 1 : 0;
-}
-
-void InputEventCircularReader::next()
-{
-    mCurr++;
-    mFreeSpace++;
-    if (mCurr >= mBufferEnd) {
-        mCurr = mBuffer;
-    }
-}
diff --git a/60xx/libsensors_iio/InputEventReader.h b/60xx/libsensors_iio/InputEventReader.h
deleted file mode 100644
index 5c752db..0000000
--- a/60xx/libsensors_iio/InputEventReader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-* 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_INPUT_EVENT_READER_H
-#define ANDROID_INPUT_EVENT_READER_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include "SensorBase.h"
-
-/*****************************************************************************/
-
-struct input_event;
-
-class InputEventCircularReader
-{
-    struct input_event* const mBuffer;
-    struct input_event* const mBufferEnd;
-    struct input_event* mHead;
-    struct input_event* mCurr;
-    ssize_t mFreeSpace;
-
-public:
-    InputEventCircularReader(size_t numEvents);
-    ~InputEventCircularReader();
-    ssize_t fill(int fd);
-    ssize_t readEvent(input_event const** events);
-    void next();
-};
-
-/*****************************************************************************/
-
-#endif  // ANDROID_INPUT_EVENT_READER_H
diff --git a/60xx/libsensors_iio/License.txt b/60xx/libsensors_iio/License.txt
deleted file mode 100644
index 930f931..0000000
--- a/60xx/libsensors_iio/License.txt
+++ /dev/null
@@ -1,217 +0,0 @@
-SOFTWARE LICENSE AGREEMENT
-
-Unless you and InvenSense Corporation ("InvenSense") execute a separate written
-software license agreement governing use of the accompanying software, this
-software is licensed to you under the terms of this Software License
-Agreement ("Agreement").
-
-ANY USE, REPRODUCTION OR DISTRIBUTION OF THE SOFTWARE CONSTITUTES YOUR
-ACCEPTANCE OF THIS AGREEMENT.
-
-1.  DEFINITIONS.
-
-1.1.    "InvenSense Product" means any of the proprietary integrated circuit
-product(s) sold by InvenSense with which the Software was designed to be used,
-or their successors.
-
-1.2.    "Licensee" means you or if you are accepting on behalf of an entity
-then the entity and its affiliates exercising rights under, and complying
-with all of the terms of this Agreement.
-
-1.3.    "Software" shall mean that software made available by InvenSense to
-Licensee in binary code form with this Agreement.
-
-2.  LICENSE GRANT; OWNERSHIP
-
-2.1.    License Grants.  Subject to the terms and conditions of this Agreement,
-InvenSense hereby grants to Licensee a non-exclusive, non-transferable,
-royalty-free license (i) to use and integrate the Software in conjunction
-with any other software; and (ii) to reproduce and distribute the Software
-complete, unmodified and only for use with a InvenSense Product.
-
-2.2.    Restriction on Modification.  If and to the extent that the Software is
-designed to be compliant with any published communications standard
-(including, without limitation, DOCSIS, HomePNA, IEEE, and ITU standards),
-Licensee may not make any modifications to the Software that would cause the
-Software or the accompanying InvenSense Products to be incompatible with such
-standard.
-
-2.3.    Restriction on Distribution.  Licensee shall only distribute the
-Software (a) under the terms of this Agreement and a copy of this Agreement
-accompanies such distribution, and (b) agrees to defend and indemnify
-InvenSense and its licensors from and against any damages, costs, liabilities,
-settlement amounts and/or expenses (including attorneys' fees) incurred in
-connection with any claim, lawsuit or action by any third party that arises
-or results from the use or distribution of any and all Software by the
-Licensee except as contemplated herein.
-
-2.4.    Proprietary Notices.  Licensee shall not remove, efface or obscure any
-copyright or trademark notices from the Software.  Licensee shall include
-reproductions of the InvenSense copyright notice with each copy of the
-Software, except where such Software is embedded in a manner not readily
-accessible to the end user.  Licensee acknowledges that any symbols,
-trademarks, tradenames, and service marks adopted by InvenSense to identify the
-Software belong to InvenSense and that Licensee shall have no rights therein.
-
-2.5.    Ownership.  InvenSense shall retain all right, title and interest,
-including all intellectual property rights, in and to the Software.  Licensee
-hereby covenants that it will not assert any claim that the Software created
-by or for InvenSense infringe any intellectual property right owned or
-controlled by Licensee.
-
-2.6.    No Other Rights Granted; Restrictions.  Apart from the license rights
-expressly set forth in this Agreement, InvenSense does not grant and Licensee
-does not receive any ownership right, title or interest nor any security
-interest or other interest in any intellectual property rights relating to
-the Software, nor in any copy of any part of the foregoing.  No license is
-granted to Licensee in any human readable code of the Software (source code).
-Licensee shall not (i) use, license, sell or otherwise distribute the
-Software except as provided in this Agreement, (ii) attempt to reverse
-engineer, decompile or disassemble any portion of the Software; or (iii) use
-the Software or other material in violation of any applicable law or
-regulation, including but not limited to any regulatory agency, such as FCC,
-rules.
-
-3.  NO WARRANTY OR SUPPORT
-
-3.1.    No Warranty. THE SOFTWARE IS OFFERED "AS IS," AND INVENSENSE GRANTS AND
-LICENSEE RECEIVES NO WARRANTIES OF ANY KIND, EXPRESS OR IMPLIED, BY STATUTE,
-COMMUNICATION OR CONDUCT WITH LICENSEE, OR OTHERWISE.  INVENSENSE SPECIFICALLY
-DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A SPECIFIC
-PURPOSE OR NONINFRINGEMENT CONCERNING THE SOFTWARE OR ANY UPGRADES TO OR
-DOCUMENTATION FOR THE SOFTWARE.  WITHOUT LIMITATION OF THE ABOVE, INVENSENSE
-GRANTS NO WARRANTY THAT THE SOFTWARE IS ERROR-FREE OR WILL OPERATE WITHOUT
-INTERRUPTION, AND GRANTS NO WARRANTY REGARDING ITS USE OR THE RESULTS
-THEREFROM INCLUDING, WITHOUT LIMITATION, ITS CORRECTNESS, ACCURACY OR
-RELIABILITY.
-
-3.2.    No Support.  Nothing in this agreement shall obligate InvenSense to
-provide any support for the Software. InvenSense may, but shall be under no
-obligation to, correct any defects in the Software and/or provide updates to
-licensees of the Software.  Licensee shall make reasonable efforts to
-promptly report to InvenSense any defects it finds in the Software, as an aid
-to creating improved revisions of the Software.
-
-3.3.    Dangerous Applications.  The Software is not designed, intended, or
-certified for use in components of systems intended for the operation of
-weapons, weapons systems, nuclear installations, means of mass
-transportation, aviation, life-support computers or equipment (including
-resuscitation equipment and surgical implants), pollution control, hazardous
-substances management, or for any other dangerous application in which the
-failure of the Software could create a situation where personal injury or
-death may occur.  Licensee understands that use of the Software in such
-applications is fully at the risk of Licensee.
-
-4.  TERM AND TERMINATION
-
-4.1.    Termination.  This Agreement will automatically terminate if Licensee
-fails to comply with any of the terms and conditions hereof. In such event,
-Licensee must destroy all copies of the Software and all of its component
-parts.
-
-4.2.    Effect Of Termination.  Upon any termination of this Agreement, the
-rights and licenses granted to Licensee under this Agreement shall
-immediately terminate.
-
-4.3.    Survival.  The rights and obligations under this Agreement which by
-their nature should survive termination will remain in effect after
-expiration or termination of this Agreement.
-
-5.  CONFIDENTIALITY
-
-5.1.    Obligations.  Licensee acknowledges and agrees that any documentation
-relating to the Software, and any other information (if such other
-information is identified as confidential or should be recognized as
-confidential under the circumstances) provided to Licensee by InvenSense
-hereunder (collectively, "Confidential Information") constitute the
-confidential and proprietary information of InvenSense, and that Licensee's
-protection thereof is an essential condition to Licensee's use and possession
-of the Software.  Licensee shall retain all Confidential Information in
-strict confidence and not disclose it to any third party or use it in any way
-except under a written agreement with terms and conditions at least as
-protective as the terms of this Section.  Licensee will exercise at least the
-same amount of diligence in preserving the secrecy of the Confidential
-Information as it uses in preserving the secrecy of its own most valuable
-confidential information, but in no event less than reasonable diligence.
-Information shall not be considered Confidential Information if and to the
-extent that it: (i) was in the public domain at the time it was disclosed or
-has entered the public domain through no fault of Licensee; (ii) was known to
-Licensee, without restriction, at the time of disclosure as proven by the
-files of Licensee in existence at the time of disclosure; or (iii) becomes
-known to Licensee, without restriction, from a source other than InvenSense
-without breach of this Agreement by Licensee and otherwise not in violation
-of InvenSense's rights.
-
-5.2.    Return of Confidential Information.  Notwithstanding the foregoing, all
-documents and other tangible objects containing or representing InvenSense
-Confidential Information and all copies thereof which are in the possession
-of Licensee shall be and remain the property of InvenSense, and shall be
-promptly returned to InvenSense upon written request by InvenSense or upon
-termination of this Agreement.
-
-6.  LIMITATION OF LIABILITY
-TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL INVENSENSE OR ANY OF
-INVENSENSE'S LICENSORS HAVE ANY LIABILITY FOR ANY INDIRECT, INCIDENTAL,
-SPECIAL, OR CONSEQUENTIAL DAMAGES, HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER FOR BREACH OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR
-OTHERWISE, ARISING OUT OF THIS AGREEMENT, INCLUDING BUT NOT LIMITED TO LOSS
-OF PROFITS, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES. IN NO EVENT WILL INVENSENSE'S LIABILITY WHETHER IN CONTRACT, TORT
-(INCLUDING NEGLIGENCE), OR OTHERWISE, EXCEED THE AMOUNT PAID BY LICENSEE FOR
-SOFTWARE UNDER THIS AGREEMENT.  THESE LIMITATIONS SHALL APPLY NOTWITHSTANDING
-ANY FAILURE OF ESSENTIAL PURPOSE OF ANY LIMITED REMEDY.
-
-7.  MISCELLANEOUS
-
-7.1.    Export Regulations. YOU UNDERSTAND AND AGREE THAT THE SOFTWARE IS
-SUBJECT TO UNITED STATES AND OTHER APPLICABLE EXPORT-RELATED LAWS AND
-REGULATIONS AND THAT YOU MAY NOT EXPORT, RE-EXPORT OR TRANSFER THE SOFTWARE
-OR ANY DIRECT PRODUCT OF THE SOFTWARE EXCEPT AS PERMITTED UNDER THOSE LAWS.
-WITHOUT LIMITING THE FOREGOING, EXPORT, RE-EXPORT OR TRANSFER OF THE SOFTWARE
-TO CUBA, IRAN, NORTH KOREA, SUDAN AND SYRIA IS PROHIBITED.
-
-7.2 Assignment. This Agreement shall be binding upon and inure to the
-benefit of the parties and their respective successors and assigns, provided,
-however that Licensee may not assign this Agreement or any rights or
-obligation hereunder, directly or indirectly, by operation of law or
-otherwise, without the prior written consent of InvenSense, and any such
-attempted assignment shall be void.  Notwithstanding the foregoing, Licensee
-may assign this Agreement to a successor to all or substantially all of its
-business or assets to which this Agreement relates that is not a competitor
-of InvenSense.
-
-7.3.    Governing Law; Venue.  This Agreement shall be governed by the laws of
-California without regard to any conflict-of-laws rules, and the United
-Nations Convention on Contracts for the International Sale of Goods is hereby
-excluded.  The sole jurisdiction and venue for actions related to the subject
-matter hereof shall be the state and federal courts located in the County of
-Orange, California, and both parties hereby consent to such jurisdiction and
-venue.
-
-7.4.    Severability.  All terms and provisions of this Agreement shall, if
-possible, be construed in a manner which makes them valid, but in the event
-any term or provision of this Agreement is found by a court of competent
-jurisdiction to be illegal or unenforceable, the validity or enforceability
-of the remainder of this Agreement shall not be affected if the illegal or
-unenforceable provision does not materially affect the intent of this
-Agreement.  If the illegal or unenforceable provision materially affects the
-intent of the parties to this Agreement, this Agreement shall become
-terminated.
-
-7.5.    Equitable Relief.  Licensee hereby acknowledges that its breach of this
-Agreement would cause irreparable harm and significant injury to InvenSense
-that may be difficult to ascertain and that a remedy at law would be
-inadequate.  Accordingly, Licensee agrees that InvenSense shall have the right
-to seek and obtain immediate injunctive relief to enforce obligations under
-the Agreement in addition to any other rights and remedies it may have.
-
-7.6.    Waiver.  The waiver of, or failure to enforce, any breach or default
-hereunder shall not constitute the waiver of any other or subsequent breach
-or default.
-
-7.7.    Entire Agreement.  This Agreement sets forth the entire Agreement
-between the parties and supersedes any and all prior proposals, agreements
-and representations between them, whether written or oral concerning the
-Software.  This Agreement may be changed only by mutual agreement of the
-parties in writing.
-
diff --git a/60xx/libsensors_iio/MPLSensor.cpp b/60xx/libsensors_iio/MPLSensor.cpp
deleted file mode 100644
index 031ae6e..0000000
--- a/60xx/libsensors_iio/MPLSensor.cpp
+++ /dev/null
@@ -1,2764 +0,0 @@
-/*
-* 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.
-*/
-
-#define LOG_NDEBUG 0
-//see also the EXTRA_VERBOSE define in the MPLSensor.h header file
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <float.h>
-#include <poll.h>
-#include <unistd.h>
-#include <dirent.h>
-#include <stdlib.h>
-#include <sys/select.h>
-#include <sys/syscall.h>
-#include <dlfcn.h>
-#include <pthread.h>
-#include <cutils/log.h>
-#include <utils/KeyedVector.h>
-#include <utils/String8.h>
-#include <string.h>
-#include <linux/input.h>
-#include <utils/Atomic.h>
-
-#include "MPLSensor.h"
-#include "MPLSupport.h"
-#include "sensor_params.h"
-#include "local_log_def.h"
-
-#include "invensense.h"
-#include "invensense_adv.h"
-#include "ml_stored_data.h"
-#include "ml_load_dmp.h"
-#include "ml_sysfs_helper.h"
-
-// #define TESTING
-
-#ifdef THIRD_PARTY_ACCEL
-#   warning "Third party accel"
-#   define USE_THIRD_PARTY_ACCEL        (1)
-#else
-#   define USE_THIRD_PARTY_ACCEL        (0)
-#endif
-
-#define MAX_SYSFS_ATTRB (sizeof(struct sysfs_attrbs) / sizeof(char*))
-
-/******************************************************************************/
-/*  MPL interface misc.                                                       */
-/******************************************************************************/
-static int hertz_request = 200;
-
-#define DEFAULT_MPL_GYRO_RATE           (20000L)     //us
-#define DEFAULT_MPL_COMPASS_RATE        (20000L)     //us
-
-#define DEFAULT_HW_GYRO_RATE            (100)        //Hz
-#define DEFAULT_HW_ACCEL_RATE           (20)         //ms
-#define DEFAULT_HW_COMPASS_RATE         (20000000L)  //ns
-#define DEFAULT_HW_AKMD_COMPASS_RATE    (200000000L) //ns
-
-/* convert ns to hardware units */
-#define HW_GYRO_RATE_NS                 (1000000000LL / rate_request) // to Hz
-#define HW_ACCEL_RATE_NS                (rate_request / (1000000L))   // to ms
-#define HW_COMPASS_RATE_NS              (rate_request)                // to ns
-
-/* convert Hz to hardware units */
-#define HW_GYRO_RATE_HZ                 (hertz_request)
-#define HW_ACCEL_RATE_HZ                (1000 / hertz_request)
-#define HW_COMPASS_RATE_HZ              (1000000000LL / hertz_request)
-
-#define RATE_200HZ                      5000000LL
-#define RATE_15HZ                       66667000LL
-#define RATE_5HZ                        200000000LL
-
-static struct sensor_t sSensorList[] =
-{
-    {"MPL Gyroscope", "Invensense", 1,
-     SENSORS_GYROSCOPE_HANDLE,
-     SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Raw Gyroscope", "Invensense", 1,
-     SENSORS_RAW_GYROSCOPE_HANDLE,
-     SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Accelerometer", "Invensense", 1,
-     SENSORS_ACCELERATION_HANDLE,
-     SENSOR_TYPE_ACCELEROMETER, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Magnetic Field", "Invensense", 1,
-     SENSORS_MAGNETIC_FIELD_HANDLE,
-     SENSOR_TYPE_MAGNETIC_FIELD, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Orientation", "Invensense", 1,
-     SENSORS_ORIENTATION_HANDLE,
-     SENSOR_TYPE_ORIENTATION, 360.0f, 1.0f, 9.7f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Rotation Vector", "Invensense", 1,
-     SENSORS_ROTATION_VECTOR_HANDLE,
-     SENSOR_TYPE_ROTATION_VECTOR, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Linear Acceleration", "Invensense", 1,
-     SENSORS_LINEAR_ACCEL_HANDLE,
-     SENSOR_TYPE_LINEAR_ACCELERATION, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-    {"MPL Gravity", "Invensense", 1,
-     SENSORS_GRAVITY_HANDLE,
-     SENSOR_TYPE_GRAVITY, 10240.0f, 1.0f, 0.5f, 10000, 0, 0, 0, 0, 0, 0, {}},
-
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
-    {"MPL Screen Orientation", "Invensense ", 1,
-     SENSORS_SCREEN_ORIENTATION_HANDLE,
-     SENSOR_TYPE_SCREEN_ORIENTATION, 100.0f, 1.0f, 1.1f, 0, 0, 0, 0, 0, 0, 0, {}},
-#endif
-};
-
-MPLSensor *MPLSensor::gMPLSensor = NULL;
-
-extern "C" {
-void procData_cb_wrapper()
-{
-    if(MPLSensor::gMPLSensor) {
-        MPLSensor::gMPLSensor->cbProcData();
-    }
-}
-
-void setCallbackObject(MPLSensor* gbpt)
-{
-    MPLSensor::gMPLSensor = gbpt;
-}
-
-MPLSensor* getCallbackObject() {
-    return MPLSensor::gMPLSensor;
-}
-
-} // end of extern C
-
-#ifdef INV_PLAYBACK_DBG
-static FILE *logfile = NULL;
-#endif
-
-pthread_mutex_t GlobalHalMutex = PTHREAD_MUTEX_INITIALIZER;
-
-/*******************************************************************************
- * MPLSensor class implementation
- ******************************************************************************/
-
-MPLSensor::MPLSensor(CompassSensor *compass, int (*m_pt2AccelCalLoadFunc)(long *))
-                       : SensorBase(NULL, NULL),
-                         mNewData(0),
-                         mMasterSensorMask(INV_ALL_SENSORS),
-                         mLocalSensorMask(0),
-                         mPollTime(-1),
-                         mHaveGoodMpuCal(0),
-                         mGyroAccuracy(0),
-                         mAccelAccuracy(0),
-                         mCompassAccuracy(0),
-                         mSampleCount(0),
-                         dmp_orient_fd(-1),
-                         mDmpOrientationEnabled(0),
-                         mEnabled(0),
-                         mOldEnabledMask(0),
-                         mAccelInputReader(4),
-                         mGyroInputReader(32),
-                         mTempScale(0),
-                         mTempOffset(0),
-                         mTempCurrentTime(0),
-                         mAccelScale(2),
-                         mPendingMask(0),
-                         mSensorMask(0),
-                         mFeatureActiveMask(0) {
-    VFUNC_LOG;
-
-    inv_error_t rv;
-    int fd;
-    char *ver_str;
-
-    mCompassSensor = compass;
-
-    LOGV_IF(EXTRA_VERBOSE,
-            "HAL:MPLSensor constructor : numSensors = %d", numSensors);
-
-    pthread_mutex_init(&mMplMutex, NULL);
-    pthread_mutex_init(&mHALMutex, NULL);
-    memset(mGyroOrientation, 0, sizeof(mGyroOrientation));
-    memset(mAccelOrientation, 0, sizeof(mAccelOrientation));
-
-#ifdef INV_PLAYBACK_DBG
-    LOGV_IF(PROCESS_VERBOSE, "HAL:inv_turn_on_data_logging");
-    logfile = fopen("/data/playback.bin", "wb");
-    if (logfile)
-        inv_turn_on_data_logging(logfile);
-#endif
-
-    /* setup sysfs paths */
-    inv_init_sysfs_attributes();
-
-    /* get chip name */
-    if (inv_get_chip_name(chip_ID) != INV_SUCCESS) {
-        LOGE("HAL:ERR- Failed to get chip ID\n");
-    } else {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:Chip ID= %s\n", chip_ID);
-    }
-
-    enable_iio_sysfs();
-
-    /* turn on power state */
-    onPower(1);
-
-    /* reset driver master enable */
-    masterEnable(0);
-
-    if (isLowPowerQuatEnabled() || isDmpDisplayOrientationOn()) {
-        /* Load DMP image if capable, ie. MPU6xxx/9xxx */
-        loadDMP();
-    }
-
-    /* open temperature fd for temp comp */
-    LOGV_IF(EXTRA_VERBOSE, "HAL:gyro temperature path: %s", mpu.temperature);
-    gyro_temperature_fd = open(mpu.temperature, O_RDONLY);
-    if (gyro_temperature_fd == -1) {
-        LOGE("HAL:could not open temperature node");
-    } else {
-        LOGV_IF(EXTRA_VERBOSE,
-                "HAL:temperature_fd opened: %s", mpu.temperature);
-    }
-
-    /* read accel FSR to calcuate accel scale later */
-    if (!USE_THIRD_PARTY_ACCEL) {
-        char buf[3];
-        int count = 0;
-        LOGV_IF(SYSFS_VERBOSE,
-                "HAL:sysfs:cat %s (%lld)", mpu.accel_fsr, getTimestamp());
-
-        fd = open(mpu.accel_fsr, O_RDONLY);
-        if(fd < 0) {
-            LOGE("HAL:Error opening accel FSR");
-        } else {
-           memset(buf, 0, sizeof(buf));
-           count = read_attribute_sensor(fd, buf, sizeof(buf));
-           if(count < 1) {
-               LOGE("HAL:Error reading accel FSR");
-           } else {
-               count = sscanf(buf, "%d", &mAccelScale);
-               if(count)
-                   LOGV_IF(EXTRA_VERBOSE, "HAL:Accel FSR used %d", mAccelScale);
-           }
-           close(fd);
-        }
-    }
-
-    /* initialize sensor data */
-    memset(mPendingEvents, 0, sizeof(mPendingEvents));
-
-    mPendingEvents[RotationVector].version = sizeof(sensors_event_t);
-    mPendingEvents[RotationVector].sensor = ID_RV;
-    mPendingEvents[RotationVector].type = SENSOR_TYPE_ROTATION_VECTOR;
-
-    mPendingEvents[LinearAccel].version = sizeof(sensors_event_t);
-    mPendingEvents[LinearAccel].sensor = ID_LA;
-    mPendingEvents[LinearAccel].type = SENSOR_TYPE_LINEAR_ACCELERATION;
-
-    mPendingEvents[Gravity].version = sizeof(sensors_event_t);
-    mPendingEvents[Gravity].sensor = ID_GR;
-    mPendingEvents[Gravity].type = SENSOR_TYPE_GRAVITY;
-
-    mPendingEvents[Gyro].version = sizeof(sensors_event_t);
-    mPendingEvents[Gyro].sensor = ID_GY;
-    mPendingEvents[Gyro].type = SENSOR_TYPE_GYROSCOPE;
-
-    mPendingEvents[RawGyro].version = sizeof(sensors_event_t);
-    mPendingEvents[RawGyro].sensor = ID_RG;
-    mPendingEvents[RawGyro].type = SENSOR_TYPE_GYROSCOPE;
-
-    mPendingEvents[Accelerometer].version = sizeof(sensors_event_t);
-    mPendingEvents[Accelerometer].sensor = ID_A;
-    mPendingEvents[Accelerometer].type = SENSOR_TYPE_ACCELEROMETER;
-
-    /* Invensense compass calibration */
-    mPendingEvents[MagneticField].version = sizeof(sensors_event_t);
-    mPendingEvents[MagneticField].sensor = ID_M;
-    mPendingEvents[MagneticField].type = SENSOR_TYPE_MAGNETIC_FIELD;
-    mPendingEvents[MagneticField].magnetic.status =
-        SENSOR_STATUS_ACCURACY_HIGH;
-
-    mPendingEvents[Orientation].version = sizeof(sensors_event_t);
-    mPendingEvents[Orientation].sensor = ID_O;
-    mPendingEvents[Orientation].type = SENSOR_TYPE_ORIENTATION;
-    mPendingEvents[Orientation].orientation.status
-            = SENSOR_STATUS_ACCURACY_HIGH;
-
-    mHandlers[RotationVector] = &MPLSensor::rvHandler;
-    mHandlers[LinearAccel] = &MPLSensor::laHandler;
-    mHandlers[Gravity] = &MPLSensor::gravHandler;
-    mHandlers[Gyro] = &MPLSensor::gyroHandler;
-    mHandlers[RawGyro] = &MPLSensor::rawGyroHandler;
-    mHandlers[Accelerometer] = &MPLSensor::accelHandler;
-    mHandlers[MagneticField] = &MPLSensor::compassHandler;
-    mHandlers[Orientation] = &MPLSensor::orienHandler;
-
-    for (int i = 0; i < numSensors; i++) {
-        mDelays[i] = 0;
-    }
-
-    (void)inv_get_version(&ver_str);
-    LOGV_IF(PROCESS_VERBOSE, "%s\n", ver_str);
-
-    /* setup MPL */
-    inv_constructor_init();
-
-    /* load calibration file from /data/inv_cal_data.bin */
-    rv = inv_load_calibration();
-    if(rv == INV_SUCCESS)
-        LOGV_IF(PROCESS_VERBOSE, "HAL:Calibration file successfully loaded");
-    else
-        LOGE("HAL:Could not open or load MPL calibration file (%d)", rv);
-
-    /* Takes external Accel Calibration Load Method */
-    if( m_pt2AccelCalLoadFunc != NULL)
-    {
-        long accel_offset[3];
-        long tmp_offset[3];
-        int result = m_pt2AccelCalLoadFunc(accel_offset);
-        if(result)
-            LOGW("HAL:Vendor accelerometer calibration file load failed %d\n", result);
-        else
-        {
-            LOGW("HAL:Vendor accelerometer calibration file successfully loaded");
-            inv_get_accel_bias(tmp_offset, NULL);
-            LOGV_IF(PROCESS_VERBOSE, "HAL:Original accel offset, %ld, %ld, %ld\n",
-               tmp_offset[0], tmp_offset[1], tmp_offset[2]);
-            inv_set_accel_bias(accel_offset, mAccelAccuracy);
-            inv_get_accel_bias(tmp_offset, NULL);
-            LOGV_IF(PROCESS_VERBOSE, "HAL:Set accel offset, %ld, %ld, %ld\n",
-               tmp_offset[0], tmp_offset[1], tmp_offset[2]);
-        }
-    }
-    /* End of Accel Calibration Load Method */
-
-    inv_set_device_properties();
-
-    /* disable driver master enable the first sensor goes on */
-    masterEnable(0);
-    enableGyro(0);
-    enableAccel(0);
-    enableCompass(0);
-
-    if (isLowPowerQuatEnabled()) {
-        enableLPQuaternion(0);
-    }
-
-    onPower(0);
-
-    if (isDmpDisplayOrientationOn()) {
-        enableDmpOrientation(!isDmpScreenAutoRotationEnabled());
-    }
-
-}
-
-void MPLSensor::enable_iio_sysfs()
-{
-    VFUNC_LOG;
-
-    char iio_trigger_name[MAX_CHIP_ID_LEN], iio_device_node[MAX_CHIP_ID_LEN];
-    FILE *tempFp = NULL;
-
-    /* ignore failures */
-    write_sysfs_int(mpu.in_timestamp_en, 1);
-
-    LOGV_IF(SYSFS_VERBOSE,
-            "HAL:sysfs:cat %s (%lld)",
-            mpu.trigger_name, getTimestamp());
-    tempFp = fopen(mpu.trigger_name, "r");
-    if (tempFp == NULL) {
-        LOGE("HAL:could not open trigger name");
-    } else {
-        if (fscanf(tempFp, "%s", iio_trigger_name) < 0) {
-            LOGE("HAL:could not read trigger name");
-        }
-        fclose(tempFp);
-    }
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %s > %s (%lld)",
-            iio_trigger_name, mpu.current_trigger, getTimestamp());
-    tempFp = fopen(mpu.current_trigger, "w");
-    if (tempFp == NULL) {
-        LOGE("HAL:could not open current trigger");
-    } else {
-        if (fprintf(tempFp, "%s", iio_trigger_name) < 0 || fclose(tempFp) < 0) {
-            LOGE("HAL:could not write current trigger %s err=%d", iio_trigger_name, errno);
-        }
-    }
-
-    write_sysfs_int(mpu.buffer_length, IIO_BUFFER_LENGTH);
-
-    if (inv_get_iio_device_node(iio_device_node) < 0) {
-        LOGE("HAL:could retrive the iio device node");
-    }
-    iio_fd = open(iio_device_node, O_RDONLY);
-    if (iio_fd < 0) {
-        LOGE("HAL:could not open iio device node");
-    } else {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:iio iio_fd (%s) opened: %d", iio_device_node, iio_fd);
-    }
-}
-
-int MPLSensor::inv_constructor_init()
-{
-    VFUNC_LOG;
-
-    inv_error_t result = inv_init_mpl();
-    if (result) {
-        LOGE("HAL:inv_init_mpl() failed");
-        return result;
-    }
-    result = inv_constructor_default_enable();
-    result = inv_start_mpl();
-    if (result) {
-        LOGE("HAL:inv_start_mpl() failed");
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-int MPLSensor::inv_constructor_default_enable()
-{
-    VFUNC_LOG;
-
-    inv_error_t result;
-
-    result = inv_enable_quaternion();
-    if (result) {
-        LOGE("HAL:Cannot enable quaternion\n");
-        return result;
-    }
-
-    result = inv_enable_in_use_auto_calibration();
-    if (result) {
-        return result;
-    }
-
-    // result = inv_enable_motion_no_motion();
-    result = inv_enable_fast_nomot();
-    if (result) {
-        return result;
-    }
-
-    result = inv_enable_gyro_tc();
-    if (result) {
-        return result;
-    }
-
-    result = inv_enable_hal_outputs();
-    if (result) {
-        return result;
-    }
-
-    if (!mCompassSensor->providesCalibration()) {
-        /* Invensense compass calibration */
-        LOGV_IF(PROCESS_VERBOSE, "HAL:Invensense vector compass cal enabled");
-        result = inv_enable_vector_compass_cal();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        } else {
-            mFeatureActiveMask |= INV_COMPASS_CAL;
-        }
-
-        // specify MPL's trust weight, used by compass algorithms
-        inv_vector_compass_cal_sensitivity(3);
-
-        result = inv_enable_compass_bias_w_gyro();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        result = inv_enable_heading_from_gyro();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        result = inv_enable_magnetic_disturbance();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    result = inv_enable_9x_sensor_fusion();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    } else {
-        // 9x sensor fusion enables Compass fit
-        mFeatureActiveMask |= INV_COMPASS_FIT;
-    }
-
-    result = inv_enable_no_gyro_fusion();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    result = inv_enable_quat_accuracy_monitor();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/* TODO: create function pointers to calculate scale */
-void MPLSensor::inv_set_device_properties()
-{
-    VFUNC_LOG;
-
-    unsigned short orient;
-
-    inv_get_sensors_orientation();
-
-    inv_set_gyro_sample_rate(DEFAULT_MPL_GYRO_RATE);
-    inv_set_compass_sample_rate(DEFAULT_MPL_COMPASS_RATE);
-
-    /* gyro setup */
-    orient = inv_orientation_matrix_to_scalar(mGyroOrientation);
-    inv_set_gyro_orientation_and_scale(orient, 2000L << 15);
-
-    /* accel setup */
-    orient = inv_orientation_matrix_to_scalar(mAccelOrientation);
-    /* use for third party accel input subsystem driver
-    inv_set_accel_orientation_and_scale(orient, 1LL << 22);
-    */
-    inv_set_accel_orientation_and_scale(orient, mAccelScale << 15);
-
-    /* compass setup */
-    signed char orientMtx[9];
-    mCompassSensor->getOrientationMatrix(orientMtx);
-    orient =
-        inv_orientation_matrix_to_scalar(orientMtx);
-    long sensitivity;
-    sensitivity = mCompassSensor->getSensitivity();
-    inv_set_compass_orientation_and_scale(orient, sensitivity);
-}
-
-void MPLSensor::loadDMP()
-{
-    int res, fd;
-    FILE *fptr;
-
-    if (isMpu3050()) {
-        //DMP support only for MPU6xxx/9xxx currently
-        return;
-    }
-
-    /* load DMP firmware */
-    LOGV_IF(SYSFS_VERBOSE,
-            "HAL:sysfs:cat %s (%lld)", mpu.firmware_loaded, getTimestamp());
-    fd = open(mpu.firmware_loaded, O_RDONLY);
-    if(fd < 0) {
-        LOGE("HAL:could not open dmp state");
-        return;
-    }
-    if(inv_read_dmp_state(fd)) {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:DMP is already loaded");
-        return;
-    }
-
-    LOGV_IF(EXTRA_VERBOSE, "HAL:load dmp: %s", mpu.dmp_firmware);
-    fptr = fopen(mpu.dmp_firmware, "w");
-    if(!fptr) {
-        LOGE("HAL:could open %s for write. %s", mpu.dmp_firmware, strerror(errno));
-        return;
-    }
-    res = inv_load_dmp(fptr);
-    if(res < 0) {
-        LOGE("HAL:load DMP failed");
-    } else {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:DMP loaded");
-    }
-    fclose(fptr);
-}
-
-void MPLSensor::inv_get_sensors_orientation()
-{
-    FILE *fptr;
-
-    // get gyro orientation
-    LOGV_IF(SYSFS_VERBOSE,
-            "HAL:sysfs:cat %s (%lld)", mpu.gyro_orient, getTimestamp());
-    fptr = fopen(mpu.gyro_orient, "r");
-    if (fptr != NULL) {
-        int om[9];
-        fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
-               &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
-               &om[6], &om[7], &om[8]);
-        fclose(fptr);
-
-        LOGV_IF(EXTRA_VERBOSE,
-                "HAL:gyro mounting matrix: "
-                "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
-                om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
-
-        mGyroOrientation[0] = om[0];
-        mGyroOrientation[1] = om[1];
-        mGyroOrientation[2] = om[2];
-        mGyroOrientation[3] = om[3];
-        mGyroOrientation[4] = om[4];
-        mGyroOrientation[5] = om[5];
-        mGyroOrientation[6] = om[6];
-        mGyroOrientation[7] = om[7];
-        mGyroOrientation[8] = om[8];
-    } else {
-        LOGE("HAL:Couldn't read gyro mounting matrix");
-    }
-
-    // get accel orientation
-    LOGV_IF(SYSFS_VERBOSE,
-            "HAL:sysfs:cat %s (%lld)", mpu.accel_orient, getTimestamp());
-    fptr = fopen(mpu.accel_orient, "r");
-    if (fptr != NULL) {
-        int om[9];
-        fscanf(fptr, "%d,%d,%d,%d,%d,%d,%d,%d,%d",
-               &om[0], &om[1], &om[2], &om[3], &om[4], &om[5],
-               &om[6], &om[7], &om[8]);
-        fclose(fptr);
-
-        LOGV_IF(EXTRA_VERBOSE,
-                "HAL:accel mounting matrix: "
-                "%+d %+d %+d %+d %+d %+d %+d %+d %+d",
-                om[0], om[1], om[2], om[3], om[4], om[5], om[6], om[7], om[8]);
-
-        mAccelOrientation[0] = om[0];
-        mAccelOrientation[1] = om[1];
-        mAccelOrientation[2] = om[2];
-        mAccelOrientation[3] = om[3];
-        mAccelOrientation[4] = om[4];
-        mAccelOrientation[5] = om[5];
-        mAccelOrientation[6] = om[6];
-        mAccelOrientation[7] = om[7];
-        mAccelOrientation[8] = om[8];
-    } else {
-        LOGE("HAL:Couldn't read accel mounting matrix");
-    }
-}
-
-MPLSensor::~MPLSensor()
-{
-    VFUNC_LOG;
-
-    mCompassSensor = NULL;
-
-    /* Close open fds */
-    if (iio_fd > 0)
-        close(iio_fd);
-    if( accel_fd > 0 )
-        close(accel_fd );
-    if (gyro_temperature_fd > 0)
-        close(gyro_temperature_fd);
-    if (sysfs_names_ptr)
-        free(sysfs_names_ptr);
-
-    if (isDmpDisplayOrientationOn()) {
-        closeDmpOrientFd();
-    }
-
-    /* Turn off Gyro master enable          */
-    /* A workaround until driver handles it */
-    /* TODO: Turn off and close all sensors */
-    if(write_sysfs_int(mpu.chip_enable, 0) < 0) {
-        LOGE("HAL:could not disable gyro master enable");
-    }
-
-#ifdef INV_PLAYBACK_DBG
-    inv_turn_off_data_logging();
-    fclose(logfile);
-#endif
-}
-
-#define GY_ENABLED (((1 << ID_GY) | (1 << ID_RG)) & enabled_sensors)
-#define A_ENABLED  ((1 << ID_A)  & enabled_sensors)
-#define M_ENABLED  ((1 << ID_M)  & enabled_sensors)
-#define O_ENABLED  ((1 << ID_O)  & enabled_sensors)
-#define LA_ENABLED ((1 << ID_LA) & enabled_sensors)
-#define GR_ENABLED ((1 << ID_GR) & enabled_sensors)
-#define RV_ENABLED ((1 << ID_RV) & enabled_sensors)
-
-/* TODO: this step is optional, remove?  */
-int MPLSensor::setGyroInitialState()
-{
-    VFUNC_LOG;
-
-    int res = 0;
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
-            HW_GYRO_RATE_HZ, mpu.gyro_fifo_rate, getTimestamp());
-    int fd = open(mpu.gyro_fifo_rate, O_RDWR);
-    res = errno;
-    if(fd < 0) {
-        LOGE("HAL:open of %s failed with '%s' (%d)",
-             mpu.gyro_fifo_rate, strerror(res), res);
-        return res;
-    }
-    res = write_attribute_sensor(fd, HW_GYRO_RATE_HZ);
-    if(res < 0) {
-        LOGE("HAL:write_attribute_sensor : error writing %s with %d",
-             mpu.gyro_fifo_rate, HW_GYRO_RATE_HZ);
-        return res;
-    }
-
-    // Setting LPF is deprecated
-
-    return 0;
-}
-
-/* this applies to BMA250 Input Subsystem Driver only */
-int MPLSensor::setAccelInitialState()
-{
-    VFUNC_LOG;
-
-    struct input_absinfo absinfo_x;
-    struct input_absinfo absinfo_y;
-    struct input_absinfo absinfo_z;
-    float value;
-    if (!ioctl(accel_fd, EVIOCGABS(EVENT_TYPE_ACCEL_X), &absinfo_x) &&
-        !ioctl(accel_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Y), &absinfo_y) &&
-        !ioctl(accel_fd, EVIOCGABS(EVENT_TYPE_ACCEL_Z), &absinfo_z)) {
-        value = absinfo_x.value;
-        mPendingEvents[Accelerometer].data[0] = value * CONVERT_A_X;
-        value = absinfo_y.value;
-        mPendingEvents[Accelerometer].data[1] = value * CONVERT_A_Y;
-        value = absinfo_z.value;
-        mPendingEvents[Accelerometer].data[2] = value * CONVERT_A_Z;
-    }
-    return 0;
-}
-
-int MPLSensor::onPower(int en)
-{
-    VFUNC_LOG;
-
-    int res;
-
-    int curr_power_state;
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
-            en, mpu.power_state, getTimestamp());
-    res = read_sysfs_int(mpu.power_state, &curr_power_state);
-    if (res < 0) {
-        LOGE("HAL:Error reading power state");
-        // will set power_state anyway
-        curr_power_state = -1;
-    }
-    if (en != curr_power_state) {
-        if((res = write_sysfs_int(mpu.power_state, en)) < 0) {
-                LOGE("HAL:Couldn't write power state");
-        }
-    } else {
-        LOGV_IF(EXTRA_VERBOSE,
-                "HAL:Power state already enable/disable curr=%d new=%d",
-                curr_power_state, en);
-    }
-    return res;
-}
-
-int MPLSensor::onDMP(int en)
-{
-    VFUNC_LOG;
-
-    int res = -1;
-    int status;
-
-    //Sequence to enable DMP
-    //1. Turn On power if not already on
-    //2. Load DMP image if not already loaded
-    //3. Either Gyro or Accel must be enabled/configured before next step
-    //4. Enable DMP
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
-            mpu.firmware_loaded, getTimestamp());
-    res = read_sysfs_int(mpu.firmware_loaded, &status);
-    if (res < 0){
-        LOGE("HAL:ERR can't get firmware_loaded status");
-        return res;
-    }
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs: %s status=%d", mpu.firmware_loaded, status);
-
-    if (status) {
-        //Write only if curr DMP state <> request
-        LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:cat %s (%lld)",
-                mpu.dmp_on, getTimestamp());
-        if (read_sysfs_int(mpu.dmp_on, &status) < 0) {
-            LOGE("HAL:ERR can't read DMP state");
-        } else if (status != en) {
-            res = write_sysfs_int(mpu.dmp_on, en);
-            //Enable DMP interrupt
-            if (write_sysfs_int(mpu.dmp_int_on, en) < 0) {
-                LOGE("HAL:ERR can't en/dis DMP interrupt");
-            }
-        } else {
-            res = 0;    //DMP already set as requested
-        }
-    } else {
-        LOGE("HAL:ERR No DMP image");
-    }
-    return res;
-}
-
-int MPLSensor::checkLPQuaternion(void)
-{
-    VFUNC_LOG;
-
-    return ((mFeatureActiveMask & INV_DMP_QUATERNION)? 1:0);
-}
-
-int MPLSensor::enableLPQuaternion(int en)
-{
-    VFUNC_LOG;
-
-    if (!en) {
-        enableQuaternionData(0);
-        onDMP(0);
-        mFeatureActiveMask &= ~INV_DMP_QUATERNION;
-        LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat disabled");
-    } else {
-        if (enableQuaternionData(1) < 0 || onDMP(1) < 0) {
-            LOGE("HAL:ERR can't enable LP Quaternion");
-        } else {
-            mFeatureActiveMask |= INV_DMP_QUATERNION;
-            LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat enabled");
-        }
-    }
-    return 0;
-}
-
-int MPLSensor::enableQuaternionData(int en)
-{
-    int res = 0;
-    VFUNC_LOG;
-
-    // Enable DMP quaternion
-    res = write_sysfs_int(mpu.quaternion_on, en);
-
-    if (!en) {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:Disabling quat scan elems");
-    } else {
-
-        LOGV_IF(PROCESS_VERBOSE, "HAL:Enabling quat scan elems");
-    }
-    write_sysfs_int(mpu.in_quat_r_en, en);
-    write_sysfs_int(mpu.in_quat_x_en, en);
-    write_sysfs_int(mpu.in_quat_y_en, en);
-    write_sysfs_int(mpu.in_quat_z_en, en);
-
-    LOGV_IF(EXTRA_VERBOSE, "HAL:DMP quaternion data was turned off");
-
-    if (!en) {
-        inv_quaternion_sensor_was_turned_off();
-    }
-
-    return res;
-}
-
-int MPLSensor::enableTap(int /*en*/)
-{
-    VFUNC_LOG;
-
-    return 0;
-}
-
-int MPLSensor::enableFlick(int /*en*/)
-{
-    VFUNC_LOG;
-
-    return 0;
-}
-
-int MPLSensor::enablePedometer(int /*en*/)
-{
-    VFUNC_LOG;
-
-    return 0;
-}
-
-int MPLSensor::masterEnable(int en)
-{
-    VFUNC_LOG;
-    return write_sysfs_int(mpu.chip_enable, en);
-}
-
-int MPLSensor::enableGyro(int en)
-{
-    VFUNC_LOG;
-
-    /* TODO: FIX error handling. Handle or ignore it appropriately for hw. */
-    int res;
-
-    /* need to also turn on/off the master enable */
-    res = write_sysfs_int(mpu.gyro_enable, en);
-
-    if (!en) {
-        LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_gyro_was_turned_off");
-        inv_gyro_was_turned_off();
-    } else {
-        write_sysfs_int(mpu.gyro_x_fifo_enable, en);
-        write_sysfs_int(mpu.gyro_y_fifo_enable, en);
-        res = write_sysfs_int(mpu.gyro_z_fifo_enable, en);
-    }
-
-    return res;
-}
-
-int MPLSensor::enableAccel(int en)
-{
-    VFUNC_LOG;
-
-    /* TODO: FIX error handling. Handle or ignore it appropriately for hw. */
-    int res;
-
-    /* need to also turn on/off the master enable */
-    res = write_sysfs_int(mpu.accel_enable, en);
-
-    if (!en) {
-        LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_accel_was_turned_off");
-        inv_accel_was_turned_off();
-    } else {
-        write_sysfs_int(mpu.accel_x_fifo_enable, en);
-        write_sysfs_int(mpu.accel_y_fifo_enable, en);
-        res = write_sysfs_int(mpu.accel_z_fifo_enable, en);
-    }
-
-    return res;
-}
-
-int MPLSensor::enableCompass(int en)
-{
-    VFUNC_LOG;
-
-    int res = mCompassSensor->enable(ID_M, en);
-    if (!en) {
-        LOGV_IF(EXTRA_VERBOSE, "HAL:MPL:inv_compass_was_turned_off");
-        inv_compass_was_turned_off();
-    }
-    return res;
-}
-
-void MPLSensor::computeLocalSensorMask(int enabled_sensors)
-{
-    VFUNC_LOG;
-
-    do {
-        if (LA_ENABLED || GR_ENABLED || RV_ENABLED || O_ENABLED) {
-            LOGV_IF(ENG_VERBOSE, "FUSION ENABLED");
-            mLocalSensorMask = ALL_MPL_SENSORS_NP;
-            break;
-        }
-
-        if(!A_ENABLED && !M_ENABLED && !GY_ENABLED) {
-            /* Invensense compass cal */
-            LOGV_IF(ENG_VERBOSE, "ALL DISABLED");
-            mLocalSensorMask = 0;
-            break;
-        }
-
-        if (GY_ENABLED) {
-            LOGV_IF(ENG_VERBOSE, "G ENABLED");
-            mLocalSensorMask |= INV_THREE_AXIS_GYRO;
-        } else {
-            LOGV_IF(ENG_VERBOSE, "G DISABLED");
-            mLocalSensorMask &= ~INV_THREE_AXIS_GYRO;
-        }
-
-        if (A_ENABLED) {
-            LOGV_IF(ENG_VERBOSE, "A ENABLED");
-            mLocalSensorMask |= INV_THREE_AXIS_ACCEL;
-        } else {
-            LOGV_IF(ENG_VERBOSE, "A DISABLED");
-            mLocalSensorMask &= ~INV_THREE_AXIS_ACCEL;
-        }
-
-        /* Invensense compass calibration */
-        if (M_ENABLED) {
-            LOGV_IF(ENG_VERBOSE, "M ENABLED");
-            mLocalSensorMask |= INV_THREE_AXIS_COMPASS;
-        } else {
-            LOGV_IF(ENG_VERBOSE, "M DISABLED");
-            mLocalSensorMask &= ~INV_THREE_AXIS_COMPASS;
-        }
-    } while (0);
-}
-
-int MPLSensor::enableOneSensor(int en, const char *name, int (MPLSensor::*enabler)(int)) {
-    LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - %s %s", en ? "enabled" : "disable", name);
-    return (this->*enabler)(en);
-}
-
-int MPLSensor::enableSensors(unsigned long sensors, int /*en*/, uint32_t changed) {
-    VFUNC_LOG;
-
-    inv_error_t res = -1;
-    bool store_cal = false;
-    bool ext_compass_changed = false;
-
-    // Sequence to enable or disable a sensor
-    // 1. enable Power state
-    // 2. reset master enable (=0)
-    // 3. enable or disable a sensor
-    // 4. set master enable (=1)
-
-    pthread_mutex_lock(&GlobalHalMutex);
-
-    uint32_t all_changeables = (1 << Gyro) | (1 << RawGyro) | (1 << Accelerometer)
-            | (1 << MagneticField);
-    uint32_t all_integrated_changeables = all_changeables;
-
-    if (!mCompassSensor->isIntegrated()) {
-        ext_compass_changed = changed & (1 << MagneticField);
-        all_integrated_changeables = all_changeables & ~(1 << MagneticField);
-    }
-
-    if (isLowPowerQuatEnabled() || (changed & all_integrated_changeables)) {
-        /* ensure power state is on */
-        onPower(1);
-
-        /* reset master enable */
-        res = masterEnable(0);
-        if(res < 0) {
-            goto unlock_res;
-        }
-    }
-
-    LOGV_IF(PROCESS_VERBOSE, "HAL:enableSensors - sensors: 0x%0x", (unsigned int)sensors);
-
-    if (changed & ((1 << Gyro) | (1 << RawGyro))) {
-        res = enableOneSensor(sensors & INV_THREE_AXIS_GYRO, "gyro", &MPLSensor::enableGyro);
-        if(res < 0) {
-            goto unlock_res;
-        }
-    }
-
-    if (changed & (1 << Accelerometer)) {
-        res = enableOneSensor(sensors & INV_THREE_AXIS_ACCEL, "accel", &MPLSensor::enableAccel);
-        if(res < 0) {
-            goto unlock_res;
-        }
-    }
-
-    if (changed & (1 << MagneticField)) {
-        /* Invensense compass calibration */
-        res = enableOneSensor(sensors & INV_THREE_AXIS_COMPASS, "compass", &MPLSensor::enableCompass);
-        if(res < 0) {
-            goto unlock_res;
-        }
-    }
-
-    if ( isLowPowerQuatEnabled() ) {
-        // Enable LP Quat
-        if ((mEnabled & ((1 << Orientation) | (1 << RotationVector) |
-                (1 << LinearAccel) | (1 << Gravity)))) {
-            if (!(changed & all_integrated_changeables)) {
-                /* ensure power state is on */
-                onPower(1);
-                /* reset master enable */
-                res = masterEnable(0);
-                if(res < 0) {
-                    goto unlock_res;
-                }
-            }
-            if (!checkLPQuaternion()) {
-                enableLPQuaternion(1);
-            } else {
-                LOGV_IF(PROCESS_VERBOSE, "HAL:LP Quat already enabled");
-            }
-        } else if (checkLPQuaternion()) {
-            enableLPQuaternion(0);
-        }
-    }
-
-    if (changed & all_integrated_changeables) {
-        if (sensors &
-            (INV_THREE_AXIS_GYRO
-                | INV_THREE_AXIS_ACCEL
-                | (INV_THREE_AXIS_COMPASS * mCompassSensor->isIntegrated()))) {
-            if ( isLowPowerQuatEnabled() ||
-                    (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) ) {
-                // disable DMP event interrupt only (w/ data interrupt)
-                if (write_sysfs_int(mpu.dmp_event_int_on, 0) < 0) {
-                    res = -1;
-                    LOGE("HAL:ERR can't disable DMP event interrupt");
-                    goto unlock_res;
-                }
-            }
-
-            if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
-                // enable DMP
-                onDMP(1);
-
-                res = enableAccel(1);
-                if(res < 0) {
-                    goto unlock_res;
-                }
-
-                if ((sensors & INV_THREE_AXIS_ACCEL) == 0) {
-                    res = turnOffAccelFifo();
-                }
-                if(res < 0) {
-                    goto unlock_res;
-                }
-            }
-
-            res = masterEnable(1);
-            if(res < 0) {
-                goto unlock_res;
-            }
-        } else { // all sensors idle -> reduce power
-            if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
-                // enable DMP
-                onDMP(1);
-                // enable DMP event interrupt only (no data interrupt)
-                if (write_sysfs_int(mpu.dmp_event_int_on, 1) < 0) {
-                    res = -1;
-                    LOGE("HAL:ERR can't enable DMP event interrupt");
-                }
-                res = enableAccel(1);
-                if(res < 0) {
-                    goto unlock_res;
-                }
-                if ((sensors & INV_THREE_AXIS_ACCEL) == 0) {
-                    res = turnOffAccelFifo();
-                }
-                if(res < 0) {
-                    goto unlock_res;
-                }
-                res = masterEnable(1);
-                if(res < 0) {
-                    goto unlock_res;
-                }
-            }
-            else {
-                res = onPower(0);
-                if(res < 0) {
-                    goto unlock_res;
-                }
-            }
-            store_cal = true;
-        }
-    } else if (ext_compass_changed &&
-            !(sensors & (INV_THREE_AXIS_GYRO | INV_THREE_AXIS_ACCEL
-                | (INV_THREE_AXIS_COMPASS * (!mCompassSensor->isIntegrated()))))) {
-            store_cal = true;
-    }
-
-    if (store_cal || ((changed & all_changeables) != all_changeables)) {
-        storeCalibration();
-    }
-
-unlock_res:
-    pthread_mutex_unlock(&GlobalHalMutex);
-    return res;
-}
-
-/* Store calibration file */
-void MPLSensor::storeCalibration()
-{
-    if(mHaveGoodMpuCal || mAccelAccuracy >= 2 || mCompassAccuracy >= 3) {
-       int res = inv_store_calibration();
-       if (res) {
-           LOGE("HAL:Cannot store calibration on file");
-       } else {
-           LOGV_IF(PROCESS_VERBOSE, "HAL:Cal file updated");
-       }
-    }
-}
-
-void MPLSensor::cbProcData()
-{
-    mNewData = 1;
-    mSampleCount++;
-    LOGV_IF(EXTRA_VERBOSE, "HAL:new data");
-}
-
-/*  these handlers transform mpl data into one of the Android sensor types */
-int MPLSensor::gyroHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_gyroscope(s->gyro.v, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:gyro data : %+f %+f %+f -- %lld - %d",
-            s->gyro.v[0], s->gyro.v[1], s->gyro.v[2], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::rawGyroHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_gyroscope_raw(s->gyro.v, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:raw gyro data : %+f %+f %+f -- %lld - %d",
-            s->gyro.v[0], s->gyro.v[1], s->gyro.v[2], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::accelHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_accelerometer(
-        s->acceleration.v, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:accel data : %+f %+f %+f -- %lld - %d",
-            s->acceleration.v[0], s->acceleration.v[1], s->acceleration.v[2],
-            s->timestamp, update);
-    mAccelAccuracy = status;
-    return update;
-}
-
-int MPLSensor::compassHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int update;
-    update = inv_get_sensor_type_magnetic_field(
-        s->magnetic.v, &s->magnetic.status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:compass data: %+f %+f %+f -- %lld - %d",
-            s->magnetic.v[0], s->magnetic.v[1], s->magnetic.v[2], s->timestamp, update);
-    mCompassAccuracy = s->magnetic.status;
-    return update;
-}
-
-int MPLSensor::rvHandler(sensors_event_t* s)
-{
-    // rotation vector does not have an accuracy or status
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_rotation_vector(s->data, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:rv data: %+f %+f %+f %+f - %+lld - %d",
-            s->data[0], s->data[1], s->data[2], s->data[3], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::laHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_linear_acceleration(
-            s->gyro.v, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:la data: %+f %+f %+f - %lld - %d",
-            s->gyro.v[0], s->gyro.v[1], s->gyro.v[2], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::gravHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int8_t status;
-    int update;
-    update = inv_get_sensor_type_gravity(s->gyro.v, &status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:gr data: %+f %+f %+f - %lld - %d",
-            s->gyro.v[0], s->gyro.v[1], s->gyro.v[2], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::orienHandler(sensors_event_t* s)
-{
-    VHANDLER_LOG;
-    int update;
-    update = inv_get_sensor_type_orientation(
-            s->orientation.v, &s->orientation.status, &s->timestamp);
-    LOGV_IF(HANDLER_DATA, "HAL:or data: %f %f %f - %lld - %d",
-            s->orientation.v[0], s->orientation.v[1], s->orientation.v[2], s->timestamp, update);
-    return update;
-}
-
-int MPLSensor::enable(int32_t handle, int en)
-{
-    VFUNC_LOG;
-
-    android::String8 sname;
-    int what = -1, err = 0;
-
-    switch (handle) {
-    case ID_SO:
-        sname = "Screen Orientation";
-        LOGV_IF(PROCESS_VERBOSE, "HAL:enable - sensor %s (handle %d) %s -> %s", sname.string(), handle,
-            (mDmpOrientationEnabled? "en": "dis"),
-            (en? "en" : "dis"));
-        enableDmpOrientation(en && isDmpDisplayOrientationOn());
-        /* TODO: stop manually testing/using 0 and 1 instead of
-         * false and true, but just use 0 and non-0.
-         * This allows  passing 0 and non-0 ints around instead of
-         * having to convert to 1 and test against 1.
-         */
-        mDmpOrientationEnabled = en;
-        return 0;
-    case ID_A:
-        what = Accelerometer;
-        sname = "Accelerometer";
-        break;
-    case ID_M:
-        what = MagneticField;
-        sname = "MagneticField";
-        break;
-    case ID_O:
-        what = Orientation;
-        sname = "Orientation";
-        break;
-    case ID_GY:
-        what = Gyro;
-        sname = "Gyro";
-        break;
-    case ID_RG:
-        what = RawGyro;
-        sname = "RawGyro";
-        break;
-    case ID_GR:
-        what = Gravity;
-        sname = "Gravity";
-        break;
-    case ID_RV:
-        what = RotationVector;
-        sname = "RotationVector";
-        break;
-    case ID_LA:
-        what = LinearAccel;
-        sname = "LinearAccel";
-        break;
-    default: //this takes care of all the gestures
-        what = handle;
-        sname = "Others";
-        break;
-    }
-
-    if (uint32_t(what) >= numSensors)
-        return -EINVAL;
-
-    int newState = en ? 1 : 0;
-    unsigned long sen_mask;
-
-    LOGV_IF(PROCESS_VERBOSE, "HAL:enable - sensor %s (handle %d) %s -> %s", sname.string(), handle,
-            ((mEnabled & (1 << what)) ? "en" : "dis"),
-            ((uint32_t(newState) << what) ? "en" : "dis"));
-    LOGV_IF(PROCESS_VERBOSE,
-            "HAL:%s sensor state change what=%d", sname.string(), what);
-
-    if ((uint32_t(newState) << what) != (mEnabled & (1 << what))) {
-        short flags = newState;
-        uint32_t lastEnabled = mEnabled, changed = 0;
-
-        mEnabled &= ~(1 << what);
-        mEnabled |= (uint32_t(flags) << what);
-
-        LOGV_IF(PROCESS_VERBOSE, "HAL:handle = %d", handle);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:flags = %d", flags);
-        computeLocalSensorMask(mEnabled);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:enable : mEnabled = %d", mEnabled);
-        sen_mask = mLocalSensorMask & mMasterSensorMask;
-        mSensorMask = sen_mask;
-        LOGV_IF(PROCESS_VERBOSE, "HAL:sen_mask= 0x%0lx", sen_mask);
-
-        switch (what) {
-            case Gyro:
-            case RawGyro:
-            case Accelerometer:
-            case MagneticField:
-                if (!(mEnabled & ((1 << Orientation) | (1 << RotationVector) |
-                        (1 << LinearAccel) | (1 << Gravity))) &&
-                        ((lastEnabled & (1 << what)) != (mEnabled & (1 << what)))) {
-                    changed |= (1 << what);
-                }
-                break;
-
-            case Orientation:
-            case RotationVector:
-            case LinearAccel:
-            case Gravity:
-                if ((en && !(lastEnabled & ((1 << Orientation) | (1 << RotationVector) |
-                        (1 << LinearAccel) | (1 << Gravity)))) ||
-                        (!en && !(mEnabled & ((1 << Orientation) | (1 << RotationVector) |
-                        (1 << LinearAccel) | (1 << Gravity))))) {
-                    for (int i = Gyro; i <= MagneticField; i++) {
-                        if (!(mEnabled & (1 << i))) {
-                            changed |= (1 << i);
-                        }
-                    }
-                }
-                break;
-        }
-        LOGV_IF(PROCESS_VERBOSE, "HAL:changed = %d", changed);
-        enableSensors(sen_mask, flags, changed);
-    }
-
-#ifdef INV_PLAYBACK_DBG
-    /* apparently the logging needs to be go through this sequence
-       to properly flush the log file */
-    inv_turn_off_data_logging();
-    fclose(logfile);
-    logfile = fopen("/data/playback.bin", "ab");
-    if (logfile)
-        inv_turn_on_data_logging(logfile);
-#endif
-
-    return err;
-}
-
-int MPLSensor::setDelay(int32_t handle, int64_t ns)
-{
-    VFUNC_LOG;
-
-    android::String8 sname;
-    int what = -1;
-
-    switch (handle) {
-        case ID_SO:
-            return update_delay();
-        case ID_A:
-            what = Accelerometer;
-            sname = "Accelerometer";
-            break;
-        case ID_M:
-            what = MagneticField;
-            sname = "MagneticField";
-            break;
-        case ID_O:
-            what = Orientation;
-            sname = "Orientation";
-            break;
-        case ID_GY:
-            what = Gyro;
-            sname = "Gyro";
-            break;
-        case ID_RG:
-            what = RawGyro;
-            sname = "RawGyro";
-            break;
-        case ID_GR:
-            what = Gravity;
-            sname = "Gravity";
-            break;
-        case ID_RV:
-            what = RotationVector;
-            sname = "RotationVector";
-            break;
-        case ID_LA:
-            what = LinearAccel;
-            sname = "LinearAccel";
-            break;
-        default: // this takes care of all the gestures
-            what = handle;
-            sname = "Others";
-            break;
-    }
-
-#if 0
-    // skip the 1st call for enalbing sensors called by ICS/JB sensor service
-    static int counter_delay = 0;
-    if (!(mEnabled & (1 << what))) {
-        counter_delay = 0;
-    } else {
-        if (++counter_delay == 1) {
-            return 0;
-        }
-        else {
-            counter_delay = 0;
-        }
-    }
-#endif
-
-    if (uint32_t(what) >= numSensors)
-        return -EINVAL;
-
-    if (ns < 0)
-        return -EINVAL;
-
-    LOGV_IF(PROCESS_VERBOSE, "setDelay : %llu ns, (%.2f Hz)", ns, 1000000000.f / ns);
-
-    // limit all rates to reasonable ones */
-    if (ns < 5000000LL) {
-        ns = 5000000LL;
-    }
-
-    /* store request rate to mDelays array for each sensor */
-    mDelays[what] = ns;
-
-    switch (what) {
-        case Gyro:
-        case RawGyro:
-        case Accelerometer:
-            for (int i = Gyro; i <= Accelerometer + mCompassSensor->isIntegrated();
-                    i++) {
-                if (i != what && (mEnabled & (1 << i)) && ns > mDelays[i]) {
-                    LOGV_IF(PROCESS_VERBOSE, "HAL:ignore delay set due to sensor %d", i);
-                    return 0;
-                }
-            }
-            break;
-
-        case MagneticField:
-            if (mCompassSensor->isIntegrated() &&
-                    (((mEnabled & (1 << Gyro)) && ns > mDelays[Gyro]) ||
-                    ((mEnabled & (1 << RawGyro)) && ns > mDelays[RawGyro]) ||
-                    ((mEnabled & (1 << Accelerometer)) && ns > mDelays[Accelerometer]))) {
-                 LOGV_IF(PROCESS_VERBOSE, "HAL:ignore delay set due to gyro/accel");
-                 return 0;
-            }
-            break;
-
-        case Orientation:
-        case RotationVector:
-        case LinearAccel:
-        case Gravity:
-            if (isLowPowerQuatEnabled()) {
-                LOGV_IF(PROCESS_VERBOSE, "HAL:need to update delay due to LPQ");
-                break;
-            }
-
-            for (int i = 0; i < numSensors; i++) {
-                if (i != what && (mEnabled & (1 << i)) && ns > mDelays[i]) {
-                    LOGV_IF(PROCESS_VERBOSE, "HAL:ignore delay set due to sensor %d", i);
-                    return 0;
-                }
-            }
-            break;
-    }
-
-    int res = update_delay();
-    return res;
-}
-
-int MPLSensor::update_delay() {
-    VHANDLER_LOG;
-
-    int res = 0;
-    int64_t got;
-
-    pthread_mutex_lock(&GlobalHalMutex);
-    if (mEnabled) {
-        int64_t wanted = 1000000000;
-        int64_t wanted_3rd_party_sensor = 1000000000;
-
-        // Sequence to change sensor's FIFO rate
-        // 1. enable Power state
-        // 2. reset master enable
-        // 3. Update delay
-        // 4. set master enable
-
-        // ensure power on
-        onPower(1);
-
-        // reset master enable
-        masterEnable(0);
-
-        /* search the minimum delay requested across all enabled sensors */
-        for (int i = 0; i < numSensors; i++) {
-            if (mEnabled & (1 << i)) {
-                int64_t ns = mDelays[i];
-                wanted = wanted < ns ? wanted : ns;
-            }
-        }
-
-        // same delay for 3rd party Accel or Compass
-        wanted_3rd_party_sensor = wanted;
-
-        /* mpl rate in us in future maybe different for
-           gyro vs compass vs accel */
-        int rateInus = (int)wanted / 1000LL;
-        int mplGyroRate = rateInus;
-        int mplAccelRate = rateInus;
-        int mplCompassRate = rateInus;
-
-        LOGV_IF(PROCESS_VERBOSE, "HAL:wanted rate for all sensors : "
-             "%llu ns, mpl rate: %d us, (%.2f Hz)",
-             wanted, rateInus, 1000000000.f / wanted);
-
-        /* set rate in MPL */
-        /* compass can only do 100Hz max */
-        inv_set_gyro_sample_rate(mplGyroRate);
-        inv_set_accel_sample_rate(mplAccelRate);
-        inv_set_compass_sample_rate(mplCompassRate);
-#ifdef LIBMLLITE_FROM_SOURCE
-        inv_set_linear_acceleration_sample_rate(rateInus);
-        inv_set_gravity_sample_rate(rateInus);
-#endif
-
-        /* TODO: Test 200Hz */
-        // inv_set_gyro_sample_rate(5000);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:MPL gyro sample rate: %d", mplGyroRate);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:MPL accel sample rate: %d", mplAccelRate);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:MPL compass sample rate: %d", mplCompassRate);
-
-        int enabled_sensors = mEnabled;
-        int tempFd = -1;
-        if (LA_ENABLED || GR_ENABLED || RV_ENABLED || O_ENABLED) {
-            if (isLowPowerQuatEnabled() ||
-                    (isDmpDisplayOrientationOn() && mDmpOrientationEnabled)) {
-                bool setDMPrate= 0;
-                // Set LP Quaternion sample rate if enabled
-                if (checkLPQuaternion()) {
-                    if (wanted < RATE_200HZ) {
-                        enableLPQuaternion(0);
-                    } else {
-                        inv_set_quat_sample_rate(rateInus);
-                        setDMPrate= 1;
-                    }
-                }
-
-                if (checkDMPOrientation() || setDMPrate==1) {
-                    getDmpRate(&wanted);
-                }
-            }
-
-            int64_t tempRate = wanted;
-            LOGV_IF(EXTRA_VERBOSE, "HAL:setDelay - Fusion");
-            //nsToHz
-            LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
-                    1000000000.f / tempRate, mpu.gyro_fifo_rate,
-                    getTimestamp());
-            tempFd = open(mpu.gyro_fifo_rate, O_RDWR);
-            res = write_attribute_sensor(tempFd, 1000000000.f / tempRate);
-            if(res < 0) {
-                LOGE("HAL:GYRO update delay error");
-            }
-
-            //nsToHz (BMA250)
-            if(USE_THIRD_PARTY_ACCEL) {
-                LOGV_IF(SYSFS_VERBOSE, "echo %lld > %s (%lld)",
-                        wanted_3rd_party_sensor / 1000000L, mpu.accel_fifo_rate,
-                        getTimestamp());
-                tempFd = open(mpu.accel_fifo_rate, O_RDWR);
-                res = write_attribute_sensor(tempFd, wanted_3rd_party_sensor / 1000000L);
-                LOGE_IF(res < 0, "HAL:ACCEL update delay error");
-            }
-
-            if (!mCompassSensor->isIntegrated()) {
-                LOGV_IF(PROCESS_VERBOSE, "HAL:Ext compass rate %.2f Hz", 1000000000.f / wanted_3rd_party_sensor);
-                mCompassSensor->setDelay(ID_M, wanted_3rd_party_sensor);
-                got = mCompassSensor->getDelay(ID_M);
-                inv_set_compass_sample_rate(got / 1000);
-            }
-
-        } else {
-
-            if (GY_ENABLED) {
-                wanted = (mDelays[Gyro] <= mDelays[RawGyro]?
-                    (mEnabled & (1 << Gyro)? mDelays[Gyro]: mDelays[RawGyro]):
-                    (mEnabled & (1 << RawGyro)? mDelays[RawGyro]: mDelays[Gyro]));
-
-                if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
-                    getDmpRate(&wanted);
-                }
-
-                LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
-                        1000000000.f / wanted, mpu.gyro_fifo_rate, getTimestamp());
-                tempFd = open(mpu.gyro_fifo_rate, O_RDWR);
-                res = write_attribute_sensor(tempFd, 1000000000.f / wanted);
-                LOGE_IF(res < 0, "HAL:GYRO update delay error");
-            }
-
-            if (A_ENABLED) { /* else if because there is only 1 fifo rate for MPUxxxx */
-                if (GY_ENABLED && mDelays[Gyro] < mDelays[Accelerometer]) {
-                    wanted = mDelays[Gyro];
-                }
-                else if (GY_ENABLED && mDelays[RawGyro] < mDelays[Accelerometer]) {
-                    wanted = mDelays[RawGyro];
-
-                } else {
-                    wanted = mDelays[Accelerometer];
-                }
-
-                if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
-                    getDmpRate(&wanted);
-                }
-
-                /* TODO: use function pointers to calculate delay value specific to vendor */
-                LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %.0f > %s (%lld)",
-                        1000000000.f / wanted, mpu.accel_fifo_rate, getTimestamp());
-                tempFd = open(mpu.accel_fifo_rate, O_RDWR);
-                if(USE_THIRD_PARTY_ACCEL) {
-                    //BMA250 in ms
-                    res = write_attribute_sensor(tempFd, wanted / 1000000L);
-                }
-                else {
-                    //MPUxxxx in hz
-                    res = write_attribute_sensor(tempFd, 1000000000.f/wanted);
-                }
-                LOGE_IF(res < 0, "HAL:ACCEL update delay error");
-            }
-
-            /* Invensense compass calibration */
-            if (M_ENABLED) {
-                if (!mCompassSensor->isIntegrated()) {
-                    wanted = mDelays[MagneticField];
-                } else {
-                    if (GY_ENABLED && mDelays[Gyro] < mDelays[MagneticField]) {
-                        wanted = mDelays[Gyro];
-                    }
-                    else if (GY_ENABLED && mDelays[RawGyro] < mDelays[MagneticField]) {
-                        wanted = mDelays[RawGyro];
-                    } else if (A_ENABLED && mDelays[Accelerometer] < mDelays[MagneticField]) {
-                        wanted = mDelays[Accelerometer];
-                    } else {
-                        wanted = mDelays[MagneticField];
-                    }
-
-                    if (isDmpDisplayOrientationOn() && mDmpOrientationEnabled) {
-                        getDmpRate(&wanted);
-                    }
-                }
-
-                mCompassSensor->setDelay(ID_M, wanted);
-                got = mCompassSensor->getDelay(ID_M);
-                inv_set_compass_sample_rate(got / 1000);
-            }
-
-        }
-
-        unsigned long sensors = mLocalSensorMask & mMasterSensorMask;
-        if (sensors &
-            (INV_THREE_AXIS_GYRO
-                | INV_THREE_AXIS_ACCEL
-                | (INV_THREE_AXIS_COMPASS * mCompassSensor->isIntegrated()))) {
-            res = masterEnable(1);
-        } else { // all sensors idle -> reduce power
-            res = onPower(0);
-        }
-    }
-    pthread_mutex_unlock(&GlobalHalMutex);
-    return res;
-}
-
-/* For Third Party Accel Input Subsystem Drivers only */
-/* TODO: FIX! data is not used and count not decremented, results is hardcoded to 0 */
-int MPLSensor::readAccelEvents(sensors_event_t* /*data*/, int count)
-{
-    VHANDLER_LOG;
-
-    if (count < 1)
-        return -EINVAL;
-
-    ssize_t n = mAccelInputReader.fill(accel_fd);
-    if (n < 0) {
-        LOGE("HAL:missed accel events, exit");
-        return n;
-    }
-
-    int numEventReceived = 0;
-    input_event const* event;
-    int done = 0;
-
-    while (!done && count && mAccelInputReader.readEvent(&event)) {
-        int type = event->type;
-        if (type == EV_ABS) {
-            if (event->code == EVENT_TYPE_ACCEL_X) {
-                mPendingMask |= 1 << Accelerometer;
-                mCachedAccelData[0] = event->value;
-            } else if (event->code == EVENT_TYPE_ACCEL_Y) {
-                mPendingMask |= 1 << Accelerometer;
-                mCachedAccelData[1] = event->value;
-            } else if (event->code == EVENT_TYPE_ACCEL_Z) {
-                mPendingMask |= 1 << Accelerometer;
-                mCachedAccelData[2] =event-> value;
-            }
-        } else if (type == EV_SYN) {
-            done = 1;
-            if (mLocalSensorMask & INV_THREE_AXIS_ACCEL) {
-                inv_build_accel(mCachedAccelData, 0, getTimestamp());
-            }
-        } else {
-            LOGE("HAL:AccelSensor: unknown event (type=%d, code=%d)",
-                    type, event->code);
-        }
-        mAccelInputReader.next();
-    }
-
-    return numEventReceived;
-}
-
-/**
- *  Should be called after reading at least one of gyro
- *  compass or accel data. (Also okay for handling all of them).
- *  @returns 0, if successful, error number if not.
- */
-/* TODO: This should probably be called "int readEvents(...)"
- *  and readEvents() called "void cacheData(void)".
- */
-int MPLSensor::executeOnData(sensors_event_t* data, int count)
-{
-    VFUNC_LOG;
-
-    inv_execute_on_data();
-
-    int numEventReceived = 0;
-
-    long msg;
-    msg = inv_get_message_level_0(1);
-    if (msg) {
-        if (msg & INV_MSG_MOTION_EVENT) {
-            LOGV_IF(PROCESS_VERBOSE, "HAL:**** Motion ****\n");
-        }
-        if (msg & INV_MSG_NO_MOTION_EVENT) {
-            LOGV_IF(PROCESS_VERBOSE, "HAL:***** No Motion *****\n");
-            /* after the first no motion, the gyro should be
-               calibrated well */
-            mGyroAccuracy = SENSOR_STATUS_ACCURACY_HIGH;
-            /* if gyros are on and we got a no motion, set a flag
-               indicating that the cal file can be written. */
-            mHaveGoodMpuCal = true;
-        }
-    }
-
-    // load up virtual sensors
-    for (int i = 0; i < numSensors; i++) {
-        int update;
-        if (mEnabled & (1 << i)) {
-            update = CALL_MEMBER_FN(this, mHandlers[i])(mPendingEvents + i);
-            mPendingMask |= (1 << i);
-
-            if (update && (count > 0)) {
-                *data++ = mPendingEvents[i];
-                count--;
-                numEventReceived++;
-            }
-        }
-    }
-
-    return numEventReceived;
-}
-
-// collect data for MPL (but NOT sensor service currently), from driver layer
-/* TODO: FIX! data and count are not used, results is hardcoded to 0 */
-/* TODO: This should probably be called "void cacheEvents(void)"
- * And executeOnData() should be int readEvents(data,count)
- */
-int MPLSensor::readEvents(sensors_event_t* /*data*/, int /*count*/) {
-
-
-    int lp_quaternion_on = 0, nbyte;
-    int i, mask = 0, numEventReceived = 0,
-        sensors = ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 1 : 0) +
-            ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 1 : 0) +
-            (((mLocalSensorMask & INV_THREE_AXIS_COMPASS) && mCompassSensor->isIntegrated())? 1 : 0);
-    char *rdata = mIIOBuffer;
-
-    nbyte= (8 * sensors + 8) * 1;
-
-    if (isLowPowerQuatEnabled()) {
-        lp_quaternion_on = checkLPQuaternion();
-        if (lp_quaternion_on) {
-            nbyte += sizeof(mCachedQuaternionData);             //currently 16 bytes for Q data
-        }
-    }
-
-    ssize_t rsize = read(iio_fd, rdata, nbyte);
-    if (sensors == 0) {
-        rsize = read(iio_fd, rdata, sizeof(mIIOBuffer));
-    }
-
-#ifdef TESTING
-    LOGI("get one sample of IIO data with size: %d", rsize);
-    LOGI("sensors: %d", sensors);
-
-    LOGI_IF(mLocalSensorMask & INV_THREE_AXIS_GYRO, "gyro x/y/z: %d/%d/%d",
-        *((short *) (rdata + 0)), *((short *) (rdata + 2)),
-        *((short *) (rdata + 4)));
-    LOGI_IF(mLocalSensorMask & INV_THREE_AXIS_ACCEL, "accel x/y/z: %d/%d/%d",
-        *((short *) (rdata + 0 + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0))),
-        *((short *) (rdata + 2 + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0))),
-        *((short *) (rdata + 4) + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0)));
-
-    LOGI_IF(mLocalSensorMask & INV_THREE_AXIS_COMPASS &
-        mCompassSensor->isIntegrated(), "compass x/y/z: %d/%d/%d",
-        *((short *) (rdata + 0 + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0) +
-            ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 6: 0))),
-        *((short *) (rdata + 2 + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0) +
-            ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 6: 0))),
-        *((short *) (rdata + 4) + ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0) +
-            ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 6: 0)));
-#endif
-
-    if (rsize != nbyte) {
-        LOGE("HAL:ERR Full data packet was not read. rsize=%zd nbyte=%d sensors=%d errno=%d(%s)",
-             rsize, nbyte, sensors, errno, strerror(errno));
-        rsize = read(iio_fd, rdata, sizeof(mIIOBuffer));
-        return -1;
-    }
-
-    if (isLowPowerQuatEnabled() && lp_quaternion_on) {
-
-        for (i=0; i< 4; i++) {
-            mCachedQuaternionData[i]= *(long*)rdata;
-            rdata += sizeof(long);
-        }
-    }
-
-    for (i = 0; i < 3; i++) {
-        if (mLocalSensorMask & INV_THREE_AXIS_GYRO) {
-            mCachedGyroData[i] = *((short *) (rdata + i * 2));
-        }
-        if (mLocalSensorMask & INV_THREE_AXIS_ACCEL) {
-            mCachedAccelData[i] = *((short *) (rdata + i * 2 +
-                ((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 6: 0)));
-        }
-        if ((mLocalSensorMask & INV_THREE_AXIS_COMPASS) && mCompassSensor->isIntegrated()) {
-            mCachedCompassData[i] = *((short *) (rdata + i * 2 + 6 * (sensors - 1)));
-        }
-    }
-
-    mask |= (((mLocalSensorMask & INV_THREE_AXIS_GYRO)? 1 << Gyro: 0) +
-        ((mLocalSensorMask & INV_THREE_AXIS_ACCEL)? 1 << Accelerometer: 0));
-    if ((mLocalSensorMask & INV_THREE_AXIS_COMPASS) && mCompassSensor->isIntegrated() &&
-            (mCachedCompassData[0] != 0 || mCachedCompassData[1] != 0 || mCachedCompassData[0] != 0)) {
-        mask |= 1 << MagneticField;
-    }
-
-    mSensorTimestamp = *((long long *) (rdata + 8 * sensors));
-    if (mCompassSensor->isIntegrated()) {
-        mCompassTimestamp = mSensorTimestamp;
-    }
-
-    if (mask & (1 << Gyro)) {
-        // send down temperature every 0.5 seconds
-        // with timestamp measured in "driver" layer
-        if(mSensorTimestamp - mTempCurrentTime >= 500000000LL) {
-            mTempCurrentTime = mSensorTimestamp;
-            long long temperature[2];
-            if(inv_read_temperature(temperature) == 0) {
-                LOGV_IF(INPUT_DATA,
-                        "HAL:inv_read_temperature = %lld, timestamp= %lld",
-                        temperature[0], temperature[1]);
-                inv_build_temp(temperature[0], temperature[1]);
-            }
-#ifdef TESTING
-            long bias[3], temp, temp_slope[3];
-            inv_get_gyro_bias(bias, &temp);
-            inv_get_gyro_ts(temp_slope);
-
-            LOGI("T: %.3f "
-                 "GB: %+13f %+13f %+13f "
-                 "TS: %+13f %+13f %+13f "
-                 "\n",
-                 (float)temperature[0] / 65536.f,
-                 (float)bias[0] / 65536.f / 16.384f,
-                 (float)bias[1] / 65536.f / 16.384f,
-                 (float)bias[2] / 65536.f / 16.384f,
-                 temp_slope[0] / 65536.f,
-                 temp_slope[1] / 65536.f,
-                 temp_slope[2] / 65536.f);
-#endif
-        }
-
-        mPendingMask |= 1 << Gyro;
-        mPendingMask |= 1 << RawGyro;
-
-        if (mLocalSensorMask & INV_THREE_AXIS_GYRO) {
-            inv_build_gyro(mCachedGyroData, mSensorTimestamp);
-            LOGV_IF(INPUT_DATA,
-                    "HAL:inv_build_gyro: %+8d %+8d %+8d - %lld",
-                    mCachedGyroData[0], mCachedGyroData[1],
-                    mCachedGyroData[2], mSensorTimestamp);
-        }
-    }
-
-    if (mask & (1 << Accelerometer)) {
-        mPendingMask |= 1 << Accelerometer;
-        if (mLocalSensorMask & INV_THREE_AXIS_ACCEL) {
-            inv_build_accel(mCachedAccelData, 0, mSensorTimestamp);
-             LOGV_IF(INPUT_DATA,
-                    "HAL:inv_build_accel: %+8ld %+8ld %+8ld - %lld",
-                    mCachedAccelData[0], mCachedAccelData[1],
-                    mCachedAccelData[2], mSensorTimestamp);
-        }
-    }
-
-    if ((mask & (1 << MagneticField)) && mCompassSensor->isIntegrated()) {
-        int status = 0;
-        if (mCompassSensor->providesCalibration()) {
-            status = mCompassSensor->getAccuracy();
-            status |= INV_CALIBRATED;
-        }
-        if (mLocalSensorMask & INV_THREE_AXIS_COMPASS) {
-            inv_build_compass(mCachedCompassData, status,
-                              mCompassTimestamp);
-            LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
-                    mCachedCompassData[0], mCachedCompassData[1],
-                    mCachedCompassData[2], mCompassTimestamp);
-        }
-    }
-
-    if (isLowPowerQuatEnabled() && lp_quaternion_on) {
-
-        inv_build_quat(mCachedQuaternionData, 32 /*default 32 for now (16/32bits)*/, mSensorTimestamp);
-        LOGV_IF(INPUT_DATA, "HAL:inv_build_quat: %+8ld %+8ld %+8ld %+8ld - %lld",
-                    mCachedQuaternionData[0], mCachedQuaternionData[1],
-                    mCachedQuaternionData[2], mCachedQuaternionData[3], mSensorTimestamp);
-    }
-
-    return numEventReceived;
-}
-
-/* use for both MPUxxxx and third party compass */
-int MPLSensor::readCompassEvents(sensors_event_t* /*data*/, int count)
-{
-    VHANDLER_LOG;
-
-    if (count < 1)
-        return -EINVAL;
-
-    int numEventReceived = 0;
-    int done = 0;
-
-    done = mCompassSensor->readSample(mCachedCompassData, &mCompassTimestamp);
-#ifdef COMPASS_YAS53x
-    if (mCompassSensor->checkCoilsReset()) {
-       //Reset relevant compass settings
-       resetCompass();
-    }
-#endif
-    if (done > 0) {
-        int status = 0;
-        if (mCompassSensor->providesCalibration()) {
-            status = mCompassSensor->getAccuracy();
-            status |= INV_CALIBRATED;
-        }
-        if (mLocalSensorMask & INV_THREE_AXIS_COMPASS) {
-            inv_build_compass(mCachedCompassData, status,
-                              mCompassTimestamp);
-            LOGV_IF(INPUT_DATA, "HAL:inv_build_compass: %+8ld %+8ld %+8ld - %lld",
-                    mCachedCompassData[0], mCachedCompassData[1],
-                    mCachedCompassData[2], mCompassTimestamp);
-        }
-    }
-
-    return numEventReceived;
-}
-
-#ifdef COMPASS_YAS53x
-int MPLSensor::resetCompass()
-{
-    VFUNC_LOG;
-
-    //Reset compass cal if enabled
-    if (mFeatureActiveMask & INV_COMPASS_CAL) {
-       LOGV_IF(EXTRA_VERBOSE, "HAL:Reset compass cal");
-       inv_init_vector_compass_cal();
-    }
-
-    //Reset compass fit if enabled
-    if (mFeatureActiveMask & INV_COMPASS_FIT) {
-       LOGV_IF(EXTRA_VERBOSE, "HAL:Reset compass fit");
-       inv_init_compass_fit();
-    }
-
-    return 0;
-}
-#endif
-
-int MPLSensor::getFd() const
-{
-    VFUNC_LOG;
-    LOGV_IF(EXTRA_VERBOSE, "MPLSensor::getFd returning %d", iio_fd);
-    return iio_fd;
-}
-
-int MPLSensor::getAccelFd() const
-{
-    VFUNC_LOG;
-    LOGV_IF(EXTRA_VERBOSE, "MPLSensor::getAccelFd returning %d", accel_fd);
-    return accel_fd;
-}
-
-int MPLSensor::getCompassFd() const
-{
-    VFUNC_LOG;
-    int fd = mCompassSensor->getFd();
-    LOGV_IF(EXTRA_VERBOSE, "MPLSensor::getCompassFd returning %d", fd);
-    return fd;
-}
-
-int MPLSensor::turnOffAccelFifo() {
-    int i, res;
-    char *accel_fifo_enable[3] = {mpu.accel_x_fifo_enable,
-        mpu.accel_y_fifo_enable, mpu.accel_z_fifo_enable};
-
-    for (i = 0; i < 3; i++) {
-        res = write_sysfs_int(accel_fifo_enable[i], 0);
-        if (res < 0) {
-            return res;
-        }
-    }
-    return 0;
-}
-
-int MPLSensor::enableDmpOrientation(int en)
-{
-    VFUNC_LOG;
-    /* TODO: FIX error handling. Handle or ignore it appropriately for hw. */
-    int res = 0;
-    int enabled_sensors = mEnabled;
-
-    if (isMpu3050())
-        return res;
-
-    pthread_mutex_lock(&GlobalHalMutex);
-
-    // on power if not already On
-    res = onPower(1);
-    // reset master enable
-    res = masterEnable(0);
-
-    if (en) {
-        //Enable DMP orientation
-        if (write_sysfs_int(mpu.display_orientation_on, en) < 0) {
-            LOGE("HAL:ERR can't enable Android orientation");
-            res = -1; // indicate an err
-        }
-
-        // open DMP Orient Fd
-        res = openDmpOrientFd();
-
-        // enable DMP
-        res = onDMP(1);
-
-        // default DMP output rate to FIFO
-        if (write_sysfs_int(mpu.dmp_output_rate, 5) < 0) {
-            LOGE("HAL:ERR can't default DMP output rate");
-        }
-
-        // set DMP rate to 200Hz
-        if (write_sysfs_int(mpu.accel_fifo_rate, 200) < 0) {
-            res = -1;
-            LOGE("HAL:ERR can't set DMP rate to 200Hz");
-        }
-
-        // enable accel engine
-        res = enableAccel(1);
-
-        // disable accel FIFO
-        if (!A_ENABLED) {
-            res = turnOffAccelFifo();
-        }
-
-        mFeatureActiveMask |= INV_DMP_DISPL_ORIENTATION;
-    } else {
-        // disable DMP
-        res = onDMP(0);
-
-        // disable accel engine
-        if (!A_ENABLED) {
-            res = enableAccel(0);
-        }
-    }
-
-    res = masterEnable(1);
-    pthread_mutex_unlock(&GlobalHalMutex);
-    return res;
-}
-
-int MPLSensor::openDmpOrientFd()
-{
-    VFUNC_LOG;
-
-    if (!isDmpDisplayOrientationOn() || dmp_orient_fd >= 0) {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:DMP display orientation disabled or file desc opened");
-        return -1;
-    }
-
-    dmp_orient_fd = open(mpu.event_display_orientation, O_RDONLY| O_NONBLOCK);
-    if (dmp_orient_fd < 0) {
-        LOGE("HAL:ERR couldn't open dmpOrient node");
-        return -1;
-    } else {
-        LOGV_IF(PROCESS_VERBOSE, "HAL:dmp_orient_fd opened : %d", dmp_orient_fd);
-        return 0;
-    }
-}
-
-int MPLSensor::closeDmpOrientFd()
-{
-    VFUNC_LOG;
-    if (dmp_orient_fd >= 0)
-        close(dmp_orient_fd);
-    return 0;
-}
-
-int MPLSensor::dmpOrientHandler(int orient)
-{
-    VFUNC_LOG;
-
-    LOGV_IF(PROCESS_VERBOSE, "HAL:orient %x", orient);
-    return 0;
-}
-
-int MPLSensor::readDmpOrientEvents(sensors_event_t* data, int count) {
-    VFUNC_LOG;
-
-    char dummy[4];
-    int screen_orientation = 0;
-    FILE *fp;
-
-    fp = fopen(mpu.event_display_orientation, "r");
-    if (fp == NULL) {
-        LOGE("HAL:cannot open event_display_orientation");
-        return 0;
-    }
-    fscanf(fp, "%d\n", &screen_orientation);
-    fclose(fp);
-
-    int numEventReceived = 0;
-
-    if (mDmpOrientationEnabled && count > 0) {
-        sensors_event_t temp;
-
-        bzero(&temp, sizeof(temp));  /* Let's hope that SENSOR_TYPE_NONE is 0 */
-        temp.version = sizeof(sensors_event_t);
-        temp.sensor = ID_SO;
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
-        temp.type = SENSOR_TYPE_SCREEN_ORIENTATION;
-        temp.screen_orientation = screen_orientation;
-#endif
-        struct timespec ts;
-        clock_gettime(CLOCK_MONOTONIC, &ts);
-        temp.timestamp = (int64_t) ts.tv_sec * 1000000000 + ts.tv_nsec;
-
-        *data++ = temp;
-        count--;
-        numEventReceived++;
-    }
-
-    // read dummy data per driver's request
-    dmpOrientHandler(screen_orientation);
-    read(dmp_orient_fd, dummy, 4);
-
-    return numEventReceived;
-}
-
-int MPLSensor::getDmpOrientFd()
-{
-    VFUNC_LOG;
-
-    LOGV_IF(EXTRA_VERBOSE, "MPLSensor::getDmpOrientFd returning %d", dmp_orient_fd);
-    return dmp_orient_fd;
-
-}
-
-int MPLSensor::checkDMPOrientation()
-{
-    VFUNC_LOG;
-    return ((mFeatureActiveMask & INV_DMP_DISPL_ORIENTATION) ? 1 : 0);
-}
-
-int MPLSensor::getDmpRate(int64_t *wanted)
-{
-    if (checkDMPOrientation() || checkLPQuaternion()) {
-        // set DMP output rate to FIFO
-        write_sysfs_int(mpu.dmp_output_rate, 1000000000.f / *wanted);
-        LOGV_IF(PROCESS_VERBOSE, "HAL:DMP FIFO rate %.2f Hz", 1000000000.f / *wanted);
-
-        //DMP running rate must be @ 200Hz
-        *wanted= RATE_200HZ;
-        LOGV_IF(PROCESS_VERBOSE, "HAL:DMP rate= %.2f Hz", 1000000000.f / *wanted);
-    }
-    return 0;
-}
-
-int MPLSensor::getPollTime()
-{
-    VHANDLER_LOG;
-    return mPollTime;
-}
-
-bool MPLSensor::hasPendingEvents() const
-{
-    VHANDLER_LOG;
-    // if we are using the polling workaround, force the main
-    // loop to check for data every time
-    return (mPollTime != -1);
-}
-
-/* TODO: support resume suspend when we gain more info about them*/
-void MPLSensor::sleepEvent()
-{
-    VFUNC_LOG;
-}
-
-void MPLSensor::wakeEvent()
-{
-    VFUNC_LOG;
-}
-
-int MPLSensor::inv_float_to_q16(float *fdata, long *ldata)
-{
-    VHANDLER_LOG;
-
-    if (!fdata || !ldata)
-        return -1;
-    ldata[0] = (long)(fdata[0] * 65536.f);
-    ldata[1] = (long)(fdata[1] * 65536.f);
-    ldata[2] = (long)(fdata[2] * 65536.f);
-    return 0;
-}
-
-int MPLSensor::inv_long_to_q16(long *fdata, long *ldata)
-{
-    VHANDLER_LOG;
-
-    if (!fdata || !ldata)
-        return -1;
-    ldata[0] = (fdata[1] * 65536.f);
-    ldata[1] = (fdata[2] * 65536.f);
-    ldata[2] = (fdata[3] * 65536.f);
-    return 0;
-}
-
-int MPLSensor::inv_float_to_round(float *fdata, long *ldata)
-{
-    VHANDLER_LOG;
-
-    if (!fdata || !ldata)
-            return -1;
-    ldata[0] = (long)fdata[0];
-    ldata[1] = (long)fdata[1];
-    ldata[2] = (long)fdata[2];
-    return 0;
-}
-
-int MPLSensor::inv_float_to_round2(float *fdata, short *ldata)
-{
-    VHANDLER_LOG;
-
-    if (!fdata || !ldata)
-        return -1;
-    ldata[0] = (short)fdata[0];
-    ldata[1] = (short)fdata[1];
-    ldata[2] = (short)fdata[2];
-    return 0;
-}
-
-int MPLSensor::inv_read_temperature(long long *data)
-{
-    VHANDLER_LOG;
-
-    int count = 0;
-    char raw_buf[40];
-    long raw = 0;
-
-    long long timestamp = 0;
-
-    memset(raw_buf, 0, sizeof(raw_buf));
-    count = read_attribute_sensor(gyro_temperature_fd, raw_buf,
-                                  sizeof(raw_buf));
-    if(count < 1) {
-        LOGE("HAL:error reading gyro temperature");
-        return -1;
-    }
-
-    count = sscanf(raw_buf, "%ld%lld", &raw, &timestamp);
-
-    if(count < 0) {
-        return -1;
-    }
-
-    LOGV_IF(ENG_VERBOSE,
-            "HAL:temperature raw = %ld, timestamp = %lld, count = %d",
-            raw, timestamp, count);
-    data[0] = raw;
-    data[1] = timestamp;
-
-    return 0;
-}
-
-int MPLSensor::inv_read_dmp_state(int fd)
-{
-    VFUNC_LOG;
-
-    if(fd < 0)
-        return -1;
-
-    int count = 0;
-    char raw_buf[10];
-    short raw = 0;
-
-    memset(raw_buf, 0, sizeof(raw_buf));
-    count = read_attribute_sensor(fd, raw_buf, sizeof(raw_buf));
-    if(count < 1) {
-        LOGE("HAL:error reading dmp state");
-        close(fd);
-        return -1;
-    }
-    count = sscanf(raw_buf, "%hd", &raw);
-    if(count < 0) {
-        LOGE("HAL:dmp state data is invalid");
-        close(fd);
-        return -1;
-    }
-    LOGV_IF(EXTRA_VERBOSE, "HAL:dmp state = %d, count = %d", raw, count);
-    close(fd);
-    return (int)raw;
-}
-
-int MPLSensor::inv_read_sensor_bias(int fd, long *data)
-{
-    VFUNC_LOG;
-
-    if(fd == -1) {
-        return -1;
-    }
-
-    char buf[50];
-    char x[15], y[15], z[15];
-
-    memset(buf, 0, sizeof(buf));
-    int count = read_attribute_sensor(fd, buf, sizeof(buf));
-    if(count < 1) {
-        LOGE("HAL:Error reading gyro bias");
-        return -1;
-    }
-    count = sscanf(buf, "%[^','],%[^','],%[^',']", x, y, z);
-    if(count) {
-        /* scale appropriately for MPL */
-        LOGV_IF(ENG_VERBOSE,
-                "HAL:pre-scaled bias: X:Y:Z (%ld, %ld, %ld)",
-                atol(x), atol(y), atol(z));
-
-        data[0] = (long)(atol(x) / 10000 * (1L << 16));
-        data[1] = (long)(atol(y) / 10000 * (1L << 16));
-        data[2] = (long)(atol(z) / 10000 * (1L << 16));
-
-        LOGV_IF(ENG_VERBOSE,
-                "HAL:scaled bias: X:Y:Z (%ld, %ld, %ld)",
-                data[0], data[1], data[2]);
-    }
-    return 0;
-}
-
-/** fill in the sensor list based on which sensors are configured.
- *  return the number of configured sensors.
- *  parameter list must point to a memory region of at least 7*sizeof(sensor_t)
- *  parameter len gives the length of the buffer pointed to by list
- */
-int MPLSensor::populateSensorList(struct sensor_t *list, int len)
-{
-    VFUNC_LOG;
-
-    int numsensors;
-
-    if(len < (int)((sizeof(sSensorList) / sizeof(sensor_t)) * sizeof(sensor_t))) {
-        LOGE("HAL:sensor list too small, not populating.");
-        return -(sizeof(sSensorList) / sizeof(sensor_t));
-    }
-
-    /* fill in the base values */
-    memcpy(list, sSensorList, sizeof (struct sensor_t) * (sizeof(sSensorList) / sizeof(sensor_t)));
-
-    /* first add gyro, accel and compass to the list */
-
-    /* fill in gyro/accel values */
-    fillGyro(chip_ID, list);
-    fillAccel(chip_ID, list);
-
-    // TODO: need fixes for unified HAL and 3rd-party solution
-    mCompassSensor->fillList(&list[MagneticField]);
-
-    if(1) {
-        numsensors = (sizeof(sSensorList) / sizeof(sensor_t));
-        /* all sensors will be added to the list
-           fill in orientation values */
-        fillOrientation(list);
-        /* fill in rotation vector values */
-        fillRV(list);
-        /* fill in gravity values */
-        fillGravity(list);
-        /* fill in Linear accel values */
-        fillLinearAccel(list);
-    } else {
-        /* no 9-axis sensors, zero fill that part of the list */
-        numsensors = 3;
-        memset(list + 3, 0, 4 * sizeof(struct sensor_t));
-    }
-
-    return numsensors;
-}
-
-void MPLSensor::fillAccel(const char* accel, struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    if (accel) {
-        if(accel != NULL && strcmp(accel, "BMA250") == 0) {
-            list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
-            list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
-            list[Accelerometer].power = ACCEL_BMA250_POWER;
-            list[Accelerometer].minDelay = ACCEL_BMA250_MINDELAY;
-            return;
-        } else if (accel != NULL && strcmp(accel, "MPU6050") == 0) {
-            list[Accelerometer].maxRange = ACCEL_MPU6050_RANGE;
-            list[Accelerometer].resolution = ACCEL_MPU6050_RESOLUTION;
-            list[Accelerometer].power = ACCEL_MPU6050_POWER;
-            list[Accelerometer].minDelay = ACCEL_MPU6050_MINDELAY;
-            return;
-        } else if (accel != NULL && strcmp(accel, "MPU6500") == 0) {
-            list[Accelerometer].maxRange = ACCEL_MPU6500_RANGE;
-            list[Accelerometer].resolution = ACCEL_MPU6500_RESOLUTION;
-            list[Accelerometer].power = ACCEL_MPU6500_POWER;
-            list[Accelerometer].minDelay = ACCEL_MPU6500_MINDELAY;
-
-            return;
-        } else if (accel != NULL && strcmp(accel, "MPU9150") == 0) {
-            list[Accelerometer].maxRange = ACCEL_MPU9150_RANGE;
-            list[Accelerometer].resolution = ACCEL_MPU9150_RESOLUTION;
-            list[Accelerometer].power = ACCEL_MPU9150_POWER;
-            list[Accelerometer].minDelay = ACCEL_MPU9150_MINDELAY;
-            return;
-        } else if (accel != NULL && strcmp(accel, "MPU3050") == 0) {
-            list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
-            list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
-            list[Accelerometer].power = ACCEL_BMA250_POWER;
-            list[Accelerometer].minDelay = ACCEL_BMA250_MINDELAY;
-            return;
-        }
-    }
-
-    LOGE("HAL:unknown accel id %s -- "
-         "params default to bma250 and might be wrong.",
-         accel);
-    list[Accelerometer].maxRange = ACCEL_BMA250_RANGE;
-    list[Accelerometer].resolution = ACCEL_BMA250_RESOLUTION;
-    list[Accelerometer].power = ACCEL_BMA250_POWER;
-    list[Accelerometer].minDelay = ACCEL_BMA250_MINDELAY;
-}
-
-void MPLSensor::fillGyro(const char* gyro, struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    if ( gyro != NULL && strcmp(gyro, "MPU3050") == 0) {
-        list[Gyro].maxRange = GYRO_MPU3050_RANGE;
-        list[Gyro].resolution = GYRO_MPU3050_RESOLUTION;
-        list[Gyro].power = GYRO_MPU3050_POWER;
-        list[Gyro].minDelay = GYRO_MPU3050_MINDELAY;
-    } else if( gyro != NULL && strcmp(gyro, "MPU6050") == 0) {
-        list[Gyro].maxRange = GYRO_MPU6050_RANGE;
-        list[Gyro].resolution = GYRO_MPU6050_RESOLUTION;
-        list[Gyro].power = GYRO_MPU6050_POWER;
-        list[Gyro].minDelay = GYRO_MPU6050_MINDELAY;
-    } else if( gyro != NULL && strcmp(gyro, "MPU6500") == 0) {
-        list[Gyro].maxRange = GYRO_MPU6500_RANGE;
-        list[Gyro].resolution = GYRO_MPU6500_RESOLUTION;
-        list[Gyro].power = GYRO_MPU6500_POWER;
-        list[Gyro].minDelay = GYRO_MPU6500_MINDELAY;
-    } else if( gyro != NULL && strcmp(gyro, "MPU9150") == 0) {
-        list[Gyro].maxRange = GYRO_MPU9150_RANGE;
-        list[Gyro].resolution = GYRO_MPU9150_RESOLUTION;
-        list[Gyro].power = GYRO_MPU9150_POWER;
-        list[Gyro].minDelay = GYRO_MPU9150_MINDELAY;
-    } else {
-        LOGE("HAL:unknown gyro id -- gyro params will be wrong.");
-        LOGE("HAL:default to use mpu3050 params");
-        list[Gyro].maxRange = GYRO_MPU3050_RANGE;
-        list[Gyro].resolution = GYRO_MPU3050_RESOLUTION;
-        list[Gyro].power = GYRO_MPU3050_POWER;
-        list[Gyro].minDelay = GYRO_MPU3050_MINDELAY;
-    }
-
-    list[RawGyro].maxRange = list[Gyro].maxRange;
-    list[RawGyro].resolution = list[Gyro].resolution;
-    list[RawGyro].power = list[Gyro].power;
-    list[RawGyro].minDelay = list[Gyro].minDelay;
-
-    return;
-}
-
-/* fillRV depends on values of accel and compass in the list */
-void MPLSensor::fillRV(struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    /* compute power on the fly */
-    list[RotationVector].power = list[Gyro].power +
-                                 list[Accelerometer].power +
-                                 list[MagneticField].power;
-    list[RotationVector].resolution = .00001;
-    list[RotationVector].maxRange = 1.0;
-    list[RotationVector].minDelay = 5000;
-
-    return;
-}
-
-void MPLSensor::fillOrientation(struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    list[Orientation].power = list[Gyro].power +
-                              list[Accelerometer].power +
-                              list[MagneticField].power;
-    list[Orientation].resolution = .00001;
-    list[Orientation].maxRange = 360.0;
-    list[Orientation].minDelay = 5000;
-
-    return;
-}
-
-void MPLSensor::fillGravity( struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    list[Gravity].power = list[Gyro].power +
-                          list[Accelerometer].power +
-                          list[MagneticField].power;
-    list[Gravity].resolution = .00001;
-    list[Gravity].maxRange = 9.81;
-    list[Gravity].minDelay = 5000;
-
-    return;
-}
-
-void MPLSensor::fillLinearAccel(struct sensor_t *list)
-{
-    VFUNC_LOG;
-
-    list[LinearAccel].power = list[Gyro].power +
-                          list[Accelerometer].power +
-                          list[MagneticField].power;
-    list[LinearAccel].resolution = list[Accelerometer].resolution;
-    list[LinearAccel].maxRange = list[Accelerometer].maxRange;
-    list[LinearAccel].minDelay = 5000;
-
-    return;
-}
-
-int MPLSensor::inv_init_sysfs_attributes(void)
-{
-    VFUNC_LOG;
-
-    unsigned char i;
-    char sysfs_path[MAX_SYSFS_NAME_LEN], iio_trigger_path[MAX_SYSFS_NAME_LEN];
-    char *sptr;
-    char **dptr;
-
-    sysfs_names_ptr =
-            (char*)calloc(1, sizeof(char[MAX_SYSFS_ATTRB][MAX_SYSFS_NAME_LEN]));
-    sptr = sysfs_names_ptr;
-    if (sptr == NULL) {
-        LOGE("HAL:couldn't alloc mem for sysfs paths");
-        return -1;
-    }
-
-    dptr = (char**)&mpu;
-    i = 0;
-    do {
-        *dptr++ = sptr;
-        sptr += sizeof(char[MAX_SYSFS_NAME_LEN]);
-    } while (++i < MAX_SYSFS_ATTRB);
-
-    // get proper (in absolute/relative) IIO path & build MPU's sysfs paths
-    // inv_get_sysfs_abs_path(sysfs_path);
-    if(INV_SUCCESS != inv_get_sysfs_path(sysfs_path)) {
-        ALOGE("MPLSensor failed get sysfs path");
-        return -1;
-    }
-
-    if(INV_SUCCESS != inv_get_iio_trigger_path(iio_trigger_path)) {
-        ALOGE("MPLSensor failed get iio trigger path");
-        return -1;
-    }
-
-    sprintf(mpu.key, "%s%s", sysfs_path, "/key");
-    sprintf(mpu.chip_enable, "%s%s", sysfs_path, "/buffer/enable");
-    sprintf(mpu.buffer_length, "%s%s", sysfs_path, "/buffer/length");
-    sprintf(mpu.power_state, "%s%s", sysfs_path, "/power_state");
-    sprintf(mpu.in_timestamp_en, "%s%s", sysfs_path, "/scan_elements/in_timestamp_en");
-    sprintf(mpu.trigger_name, "%s%s", iio_trigger_path, "/name");
-    sprintf(mpu.current_trigger, "%s%s", sysfs_path, "/trigger/current_trigger");
-
-    sprintf(mpu.dmp_firmware, "%s%s", sysfs_path,"/dmp_firmware");
-    sprintf(mpu.firmware_loaded,"%s%s", sysfs_path, "/firmware_loaded");
-    sprintf(mpu.dmp_on,"%s%s", sysfs_path, "/dmp_on");
-    sprintf(mpu.dmp_int_on,"%s%s", sysfs_path, "/dmp_int_on");
-    sprintf(mpu.dmp_event_int_on,"%s%s", sysfs_path, "/dmp_event_int_on");
-    sprintf(mpu.dmp_output_rate,"%s%s", sysfs_path, "/dmp_output_rate");
-    sprintf(mpu.tap_on, "%s%s", sysfs_path, "/tap_on");
-
-    // TODO: for self test
-    sprintf(mpu.self_test, "%s%s", sysfs_path, "/self_test");
-
-    sprintf(mpu.temperature, "%s%s", sysfs_path, "/temperature");
-    sprintf(mpu.gyro_enable, "%s%s", sysfs_path, "/gyro_enable");
-    sprintf(mpu.gyro_fifo_rate, "%s%s", sysfs_path, "/sampling_frequency");
-    sprintf(mpu.gyro_orient, "%s%s", sysfs_path, "/gyro_matrix");
-    sprintf(mpu.gyro_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_anglvel_x_en");
-    sprintf(mpu.gyro_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_anglvel_y_en");
-    sprintf(mpu.gyro_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_anglvel_z_en");
-
-    sprintf(mpu.accel_enable, "%s%s", sysfs_path, "/accl_enable");
-    sprintf(mpu.accel_fifo_rate, "%s%s", sysfs_path, "/sampling_frequency");
-    sprintf(mpu.accel_orient, "%s%s", sysfs_path, "/accl_matrix");
-
-
-#ifndef THIRD_PARTY_ACCEL //MPUxxxx
-    sprintf(mpu.accel_fsr, "%s%s", sysfs_path, "/in_accel_scale");
-    // TODO: for bias settings
-    sprintf(mpu.accel_bias, "%s%s", sysfs_path, "/accl_bias");
-#endif
-
-    sprintf(mpu.accel_x_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_x_en");
-    sprintf(mpu.accel_y_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_y_en");
-    sprintf(mpu.accel_z_fifo_enable, "%s%s", sysfs_path, "/scan_elements/in_accel_z_en");
-
-    sprintf(mpu.quaternion_on, "%s%s", sysfs_path, "/quaternion_on");
-    sprintf(mpu.in_quat_r_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_r_en");
-    sprintf(mpu.in_quat_x_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_x_en");
-    sprintf(mpu.in_quat_y_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_y_en");
-    sprintf(mpu.in_quat_z_en, "%s%s", sysfs_path, "/scan_elements/in_quaternion_z_en");
-
-    sprintf(mpu.display_orientation_on, "%s%s", sysfs_path, "/display_orientation_on");
-    sprintf(mpu.event_display_orientation, "%s%s", sysfs_path, "/event_display_orientation");
-
-#if SYSFS_VERBOSE
-    // test print sysfs paths
-    dptr = (char**)&mpu;
-    for (i = 0; i < MAX_SYSFS_ATTRB; i++) {
-        LOGE("HAL:sysfs path: %s", *dptr++);
-    }
-#endif
-    return 0;
-}
-
-/* TODO: stop manually testing/using 0 and 1 instead of
- * false and true, but just use 0 and non-0.
- * This allows  passing 0 and non-0 ints around instead of
- * having to convert to 1 and test against 1.
- */
-bool MPLSensor::isMpu3050()
-{
-    return !strcmp(chip_ID, "mpu3050") || !strcmp(chip_ID, "MPU3050");
-}
-
-int MPLSensor::isLowPowerQuatEnabled()
-{
-#ifdef ENABLE_LP_QUAT_FEAT
-    return !isMpu3050();
-#else
-    return 0;
-#endif
-}
-
-int MPLSensor::isDmpDisplayOrientationOn()
-{
-#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
-    return !isMpu3050();
-#else
-    return 0;
-#endif
-}
diff --git a/60xx/libsensors_iio/MPLSensor.h b/60xx/libsensors_iio/MPLSensor.h
deleted file mode 100644
index 4698f33..0000000
--- a/60xx/libsensors_iio/MPLSensor.h
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
-* 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 <utils/Vector.h>
-#include <utils/KeyedVector.h>
-#include "sensors.h"
-#include "SensorBase.h"
-#include "InputEventReader.h"
-
-#ifdef INVENSENSE_COMPASS_CAL
-
-#ifdef COMPASS_YAS53x
-#pragma message "unified HAL for YAS53x"
-#include "CompassSensor.IIO.primary.h"
-#elif COMPASS_AMI306
-#pragma message "unified HAL for AMI306"
-#include "CompassSensor.IIO.primary.h"
-#else
-#pragma message "unified HAL for MPU9150"
-#include "CompassSensor.IIO.9150.h"
-#endif
-#else
-#pragma message "unified HAL for AKM"
-#include "CompassSensor.AKM.h"
-#endif
-
-/*****************************************************************************/
-/* 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_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
-
-// bit mask of current active features (mFeatureActiveMask)
-#define INV_COMPASS_CAL              0x01
-#define INV_COMPASS_FIT              0x02
-#define INV_DMP_QUATERNION           0x04
-#define INV_DMP_DISPL_ORIENTATION    0x08
-
-/* Uncomment to enable Low Power Quaternion */
-#define ENABLE_LP_QUAT_FEAT
-
-/* Uncomment to enable DMP display orientation 
-   (within the HAL, see below for Java framework) */
-// #define ENABLE_DMP_DISPL_ORIENT_FEAT
-
-#ifdef ENABLE_DMP_DISPL_ORIENT_FEAT
-/* Uncomment following to expose the SENSOR_TYPE_SCREEN_ORIENTATION 
-   sensor type (DMP screen orientation) to the Java framework.
-   NOTE:
-       need Invensense customized 
-       'hardware/libhardware/include/hardware/sensors.h' to compile correctly.
-   NOTE:
-       need Invensense java framework changes to:
-       'frameworks/base/core/java/android/view/WindowOrientationListener.java'
-       'frameworks/base/core/java/android/hardware/Sensor.java'
-       'frameworks/base/core/java/android/hardware/SensorEvent.java'
-       for the 'Auto-rotate screen' to use this feature.
-*/
-#define ENABLE_DMP_SCREEN_AUTO_ROTATION
-#warning "ENABLE_DMP_DISPL_ORIENT_FEAT is defined, framework changes are necessary for HAL to work properly"
-#endif
-
-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:
-
-    enum {
-        Gyro = 0,
-        RawGyro,
-        Accelerometer,
-        MagneticField,
-        Orientation,
-        RotationVector,
-        LinearAccel,
-        Gravity,
-        numSensors
-    };
-
-    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);
-    int32_t getEnableMask() { return mEnabled; }
-
-    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 bool hasPendingEvents() const;
-    virtual void sleepEvent();
-    virtual void wakeEvent();
-    int populateSensorList(struct sensor_t *list, int len);
-    void cbProcData();
-
-    //static pointer to the object that will handle callbacks
-    static MPLSensor* gMPLSensor;
-
-    //AKM HAL Integration
-    //void set_compass(long ready, long x, long y, long z, long accuracy);
-    int executeOnData(sensors_event_t* data, int count);
-    int readAccelEvents(sensors_event_t* data, int count);
-    int readCompassEvents(sensors_event_t* data, int count);
-
-    int turnOffAccelFifo();
-    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();
-
-protected:
-    CompassSensor *mCompassSensor;
-
-    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 rvHandler(sensors_event_t *data);
-    int laHandler(sensors_event_t *data);
-    int gravHandler(sensors_event_t *data);
-    int orienHandler(sensors_event_t *data);
-    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 setGyroInitialState();
-    int setAccelInitialState();
-    int masterEnable(int en);
-    int onPower(int en);
-    int enableLPQuaternion(int);
-    int enableQuaternionData(int);
-    int onDMP(int);
-    int enableOneSensor(int en, const char *name, int (MPLSensor::*enabler)(int));
-    int enableGyro(int en);
-    int enableAccel(int en);
-    int enableCompass(int en);
-    void computeLocalSensorMask(int enabled_sensors);
-    int enableSensors(unsigned long sensors, int en, uint32_t changed);
-    int inv_read_gyro_buffer(int fd, short *data, long long *timestamp);
-    int inv_float_to_q16(float *fdata, long *ldata);
-    int inv_long_to_q16(long *fdata, long *ldata);
-    int inv_float_to_round(float *fdata, long *ldata);
-    int inv_float_to_round2(float *fdata, short *sdata);
-    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);
-#ifdef COMPASS_YAS53x
-    int resetCompass(void);
-#endif
-    void setCompassDelay(int64_t ns);
-    void enable_iio_sysfs(void);
-    int enableTap(int);
-    int enableFlick(int);
-    int enablePedometer(int);
-    int checkLPQuaternion();
-
-    int mNewData;   // flag indicating that the MPL calculated new output values
-    int mDmpStarted;
-    long mMasterSensorMask;
-    long mLocalSensorMask;
-    int mPollTime;
-    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];
-    int mSampleCount;
-    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 dmp_orient_fd;
-
-    int mDmpOrientationEnabled;
-
-
-    uint32_t mEnabled;
-    uint32_t mOldEnabledMask;
-    sensors_event_t mPendingEvents[numSensors];
-    int64_t mDelays[numSensors];
-    hfunc_t mHandlers[numSensors];
-    short mCachedGyroData[3];
-    long mCachedAccelData[3];
-    long mCachedCompassData[3];
-    long mCachedQuaternionData[4];
-    android::KeyedVector<int, int> mIrqFds;
-
-    InputEventCircularReader mAccelInputReader;
-    InputEventCircularReader mGyroInputReader;
-
-    bool mFirstRead;
-    short mTempScale;
-    short mTempOffset;
-    int64_t mTempCurrentTime;
-    int mAccelScale;
-
-    uint32_t mPendingMask;
-    unsigned long mSensorMask;
-
-    char chip_ID[MAX_CHIP_ID_LEN];
-
-    signed char mGyroOrientation[9];
-    signed char mAccelOrientation[9];
-
-    int64_t mSensorTimestamp;
-    int64_t mCompassTimestamp;
-
-    struct sysfs_attrbs {
-       char *chip_enable;
-       char *power_state;
-       char *dmp_firmware;
-       char *firmware_loaded;
-       char *dmp_on;
-       char *dmp_int_on;
-       char *dmp_event_int_on;
-       char *dmp_output_rate;
-       char *tap_on;
-       char *key;
-       char *self_test;
-       char *temperature;
-
-       char *gyro_enable;
-       char *gyro_fifo_rate;
-       char *gyro_orient;
-       char *gyro_x_fifo_enable;
-       char *gyro_y_fifo_enable;
-       char *gyro_z_fifo_enable;
-
-       char *accel_enable;
-       char *accel_fifo_rate;
-       char *accel_fsr;
-       char *accel_bias;
-       char *accel_orient;
-       char *accel_x_fifo_enable;
-       char *accel_y_fifo_enable;
-       char *accel_z_fifo_enable;
-
-       char *quaternion_on;
-       char *in_quat_r_en;
-       char *in_quat_x_en;
-       char *in_quat_y_en;
-       char *in_quat_z_en;
-
-       char *in_timestamp_en;
-       char *trigger_name;
-       char *current_trigger;
-       char *buffer_length;
-
-       char *display_orientation_on;
-       char *event_display_orientation;
-    } mpu;
-
-    char *sysfs_names_ptr;
-    int mFeatureActiveMask;
-
-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 fillOrientation(struct sensor_t *list);
-    void fillGravity(struct sensor_t *list);
-    void fillLinearAccel(struct sensor_t *list);
-    void storeCalibration();
-    void loadDMP();
-    bool isMpu3050();
-    int isLowPowerQuatEnabled();
-    int isDmpDisplayOrientationOn();
-
-
-};
-
-extern "C" {
-    void setCallbackObject(MPLSensor*);
-    MPLSensor *getCallbackObject();
-}
-
-#endif  // ANDROID_MPL_SENSOR_H
diff --git a/60xx/libsensors_iio/MPLSupport.cpp b/60xx/libsensors_iio/MPLSupport.cpp
deleted file mode 100644
index 9773562..0000000
--- a/60xx/libsensors_iio/MPLSupport.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
-* 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.
-*/
-
-#define LOG_NDEBUG 0
-
-#include <MPLSupport.h>
-#include <string.h>
-#include <stdio.h>
-#include <fcntl.h>
-
-#include "log.h"
-#include "SensorBase.h"
-
-#include "ml_sysfs_helper.h"
-#include "local_log_def.h"
-
-int64_t getTimestamp()
-{
-    struct timespec t;
-    t.tv_sec = t.tv_nsec = 0;
-    clock_gettime(CLOCK_MONOTONIC, &t);
-    return int64_t(t.tv_sec) * 1000000000LL + t.tv_nsec;
-}
-
-int64_t timevalToNano(timeval const& t) {
-    return t.tv_sec * 1000000000LL + t.tv_usec * 1000;
-}
-
-int inv_read_data(char *fname, long *data)
-{
-    VFUNC_LOG;
-
-    char buf[sizeof(long) * 4];
-    int count, fd;
-
-    fd = open(fname, O_RDONLY);
-    if(fd < 0) {
-        LOGE("HAL:Error opening %s", fname);
-        return -1;
-    }
-    memset(buf, 0, sizeof(buf));
-    count = read_attribute_sensor(fd, buf, sizeof(buf));
-    if(count < 1) {
-        close(fd);
-        return -1;
-    } else {
-        count = sscanf(buf, "%ld", data);
-        if(count)
-            LOGV_IF(EXTRA_VERBOSE, "HAL:Data= %ld", *data);
-    }
-    close(fd);
-
-    return 0;
-}
-
-/* This one DOES NOT close FDs for you */
-int read_attribute_sensor(int fd, char* data, unsigned int size)
-{
-    VFUNC_LOG;
-
-    int count = 0;
-    if (fd > 0) {
-        count = pread(fd, data, size, 0);
-        if(count < 1) {
-            LOGE("HAL:read fails with error code=%d", count);
-        }
-    }
-    return count;
-}
-
-/**
- *  @brief  Enable a sensor through the sysfs file descriptor
- *          provided.
- *  @note   this function one closes FD after the write
- *  @param  fd
- *              the file descriptor to write into
- *  @param  en
- *              the value to write, typically 1 or 0
- *  @return the errno whenever applicable.
- */
-int enable_sysfs_sensor(int fd, int en)
-{
-    VFUNC_LOG;
-
-    int nb;
-    int err = 0;
-
-    char c = en ? '1' : '0';
-    nb = write(fd, &c, 1);
-
-    if (nb <= 0) {
-        err = errno;
-        LOGE("HAL:enable_sysfs_sensor - write %c returned %d (%s / %d)",
-             c, nb, strerror(err), err);
-    }
-    close(fd);
-
-
-    return err;
-}
-
-/* This one closes FDs for you */
-int write_attribute_sensor(int fd, long data)
-{
-    VFUNC_LOG;
-
-    int num_b = 0;
-
-    if (fd >= 0) {
-        char buf[80];
-        sprintf(buf, "%ld", data);
-        num_b = write(fd, buf, strlen(buf) + 1);
-        if (num_b <= 0) {
-            int err = errno;
-            LOGE("HAL:write fd %d returned '%s' (%d)", fd, strerror(err), err);
-        } else {
-            LOGV_IF(EXTRA_VERBOSE, "HAL:fd=%d write attribute to %ld", fd, data);
-        }
-        close(fd);
-    }
-
-    return num_b;
-}
-
-int read_sysfs_int(char *filename, int *var)
-{
-    int res=0;
-    FILE  *sysfsfp;
-
-    sysfsfp = fopen(filename, "r");
-    if (sysfsfp != NULL) {
-        if (fscanf(sysfsfp, "%d\n", var) < 1) {
-           LOGE("HAL:ERR failed to read an int from %s.", filename);
-           res = -EINVAL;
-        }
-        fclose(sysfsfp);
-    } else {
-        res = -errno;
-        LOGE("HAL:ERR open file %s to read with error %d", filename, res);
-    }
-    return res;
-}
-
-int write_sysfs_int(char *filename, int var)
-{
-    int res = 0;
-    FILE  *sysfsfp;
-
-    LOGV_IF(SYSFS_VERBOSE, "HAL:sysfs:echo %d > %s (%lld)",
-            var, filename, getTimestamp());
-    sysfsfp = fopen(filename, "w");
-    if (sysfsfp == NULL) {
-        res = -errno;
-        LOGE("HAL:ERR open file %s to write with error %d", filename, res);
-        return res;
-    }
-    int fpres, fcres = 0;
-    fpres = fprintf(sysfsfp, "%d\n", var);
-    /* fprintf() can succeed because it never actually writes to the
-     * underlying sysfs node.
-     */
-    if (fpres < 0) {
-       res = -errno;
-       fclose(sysfsfp);
-    } else {
-        fcres = fclose(sysfsfp);
-        /* Check for errors from: fflush(), write(), and close() */
-        if (fcres < 0) {
-            res = -errno;
-        }
-    }
-    if (fpres < 0 || fcres < 0) {
-        LOGE("HAL:ERR failed to write %d to %s (err=%d) print/close=%d/%d",
-            var, filename, res, fpres, fcres);
-    }
-    return res;
-}
diff --git a/60xx/libsensors_iio/MPLSupport.h b/60xx/libsensors_iio/MPLSupport.h
deleted file mode 100644
index 98e4497..0000000
--- a/60xx/libsensors_iio/MPLSupport.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-* 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_SUPPORT_H
-#define ANDROID_MPL_SUPPORT_H
-
-#include <stdint.h>
-#include <time.h>
-
-int64_t getTimestamp();
-int64_t timevalToNano(timeval const& t);
-
-int inv_read_data(char *fname, long *data);
-int read_attribute_sensor(int fd, char* data, unsigned int size);
-int enable_sysfs_sensor(int fd, int en);
-int write_attribute_sensor(int fd, long data);
-int read_sysfs_int(char*, int*);
-int write_sysfs_int(char*, int);
-
-#endif //  ANDROID_MPL_SUPPORT_H
diff --git a/60xx/libsensors_iio/SensorBase.cpp b/60xx/libsensors_iio/SensorBase.cpp
deleted file mode 100644
index 587aaf5..0000000
--- a/60xx/libsensors_iio/SensorBase.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-* 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.
-*/
-
-#include <fcntl.h>
-#include <errno.h>
-#include <math.h>
-#include <poll.h>
-#include <dirent.h>
-#include <string.h>
-#include <sys/select.h>
-#include <cutils/log.h>
-#include <linux/input.h>
-
-#include "SensorBase.h"
-#include "local_log_def.h"
-
-/*****************************************************************************/
-
-SensorBase::SensorBase(const char* dev_name,
-                       const char* data_name) : dev_name(dev_name),
-                                                data_name(data_name),
-                                                dev_fd(-1),
-                                                data_fd(-1)
-{
-    if (data_name) {
-        data_fd = openInput(data_name);
-    }
-}
-
-SensorBase::~SensorBase()
-{
-    if (data_fd >= 0) {
-        close(data_fd);
-    }
-    if (dev_fd >= 0) {
-        close(dev_fd);
-    }
-}
-
-int SensorBase::open_device()
-{
-    if (dev_fd<0 && dev_name) {
-        dev_fd = open(dev_name, O_RDONLY);
-        LOGE_IF(dev_fd<0, "Couldn't open %s (%s)", dev_name, strerror(errno));
-    }
-    return 0;
-}
-
-int SensorBase::close_device()
-{
-    if (dev_fd >= 0) {
-        close(dev_fd);
-        dev_fd = -1;
-    }
-    return 0;
-}
-
-int SensorBase::getFd() const
-{
-    if (!data_name) {
-        return dev_fd;
-    }
-    return data_fd;
-}
-
-int SensorBase::setDelay(int32_t /*handle*/, int64_t /*ns*/)
-{
-    return 0;
-}
-
-bool SensorBase::hasPendingEvents() const
-{
-    return false;
-}
-
-int SensorBase::openInput(const char *inputName)
-{
-    int fd = -1;
-    const char *dirname = "/dev/input";
-    char devname[PATH_MAX];
-    char *filename;
-    DIR *dir;
-    struct dirent *de;
-    dir = opendir(dirname);
-    if(dir == NULL)
-        return -1;
-    strcpy(devname, dirname);
-    filename = devname + strlen(devname);
-    *filename++ = '/';
-    while((de = readdir(dir))) {
-        if(de->d_name[0] == '.' &&
-                (de->d_name[1] == '\0' ||
-                        (de->d_name[1] == '.' && de->d_name[2] == '\0')))
-            continue;
-        strcpy(filename, de->d_name);
-        fd = open(devname, O_RDONLY);
-        LOGV_IF(EXTRA_VERBOSE, "path open %s", devname);
-        LOGI("path open %s", devname);
-        if (fd >= 0) {
-            char name[80];
-            if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
-                name[0] = '\0';
-            }
-            LOGV_IF(EXTRA_VERBOSE, "name read %s", name);
-            if (!strcmp(name, inputName)) {
-                strcpy(input_name, filename);
-                break;
-            } else {
-                close(fd);
-                fd = -1;
-            }
-        }
-    }
-    closedir(dir);
-    LOGE_IF(fd < 0, "couldn't find '%s' input device", inputName);
-    return fd;
-}
-
-int SensorBase::enable(int32_t /*handle*/, int /*enabled*/)
-{
-    return 0;
-}
diff --git a/60xx/libsensors_iio/SensorBase.h b/60xx/libsensors_iio/SensorBase.h
deleted file mode 100644
index fef47c7..0000000
--- a/60xx/libsensors_iio/SensorBase.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-* 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_SENSOR_BASE_H
-#define ANDROID_SENSOR_BASE_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#define CALL_MEMBER_FN(pobject, ptrToMember) ((pobject)->*(ptrToMember))
-
-#define MAX_SYSFS_NAME_LEN  (100)
-#define IIO_BUFFER_LENGTH   (480)
-
-/*****************************************************************************/
-
-struct sensors_event_t;
-
-class SensorBase {
-protected:
-    const char *dev_name;
-    const char *data_name;
-    char input_name[PATH_MAX];
-    int dev_fd;
-    int data_fd;
-
-    int openInput(const char* inputName);
-
-    int open_device();
-    int close_device();
-
-public:
-            SensorBase(const char* dev_name, const char* data_name);
-
-    virtual ~SensorBase();
-
-    virtual int readEvents(sensors_event_t* data, int count) = 0;
-    virtual bool hasPendingEvents() const;
-    virtual int getFd() const;
-    virtual int setDelay(int32_t handle, int64_t ns);
-    virtual int enable(int32_t handle, int enabled);
-};
-
-/*****************************************************************************/
-
-#endif  // ANDROID_SENSOR_BASE_H
diff --git a/60xx/libsensors_iio/libmllite.so b/60xx/libsensors_iio/libmllite.so
deleted file mode 100755
index 9bdd5bc..0000000
--- a/60xx/libsensors_iio/libmllite.so
+++ /dev/null
Binary files differ
diff --git a/60xx/libsensors_iio/libmplmpu.so b/60xx/libsensors_iio/libmplmpu.so
deleted file mode 100644
index 205ab9a..0000000
--- a/60xx/libsensors_iio/libmplmpu.so
+++ /dev/null
Binary files differ
diff --git a/60xx/libsensors_iio/local_log_def.h b/60xx/libsensors_iio/local_log_def.h
deleted file mode 100644
index 9135992..0000000
--- a/60xx/libsensors_iio/local_log_def.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef LOCAL_LOG_DEF_H
-#define LOCAL_LOG_DEF_H
-
-/* Log enablers, each of these independent */
-
-#define PROCESS_VERBOSE (0) /* process log messages */
-#define EXTRA_VERBOSE   (0) /* verbose log messages */
-#define SYSFS_VERBOSE   (0) /* log sysfs interactions as cat/echo for repro
-                               purpose on a shell */
-#define FUNC_ENTRY      (0) /* log entry in all one-time functions */
-
-/* Note that enabling this logs may affect performance */
-#define HANDLER_ENTRY   (0) /* log entry in all handler functions */
-#define ENG_VERBOSE     (0) /* log some a lot more info about the internals */
-#define INPUT_DATA      (0) /* log the data input from the events */
-#define HANDLER_DATA    (0) /* log the data fetched from the handlers */
-
-#if defined ANDROID_JELLYBEAN
-#define LOGV            ALOGV
-#define LOGV_IF         ALOGV_IF
-#define LOGD            ALOGD
-#define LOGD_IF         ALOGD_IF
-#define LOGI            ALOGI
-#define LOGI_IF         ALOGI_IF
-#define LOGW            ALOGW
-#define LOGW_IF         ALOGW_IF
-#define LOGE            ALOGE
-#define LOGE_IF         ALOGE_IF
-#define IF_LOGV         IF_ALOGV
-#define IF_LOGD         IF_ALOGD
-#define IF_LOGI         IF_ALOGI
-#define IF_LOGW         IF_ALOGW
-#define IF_LOGE         IF_ALOGE
-#define LOG_ASSERT      ALOG_ASSERT
-#define LOG                     ALOG
-#define IF_LOG          IF_ALOG
-#else
-#warning "build for ICS or earlier version"
-#endif
-
-
-#define FUNC_LOG \
-            LOGV("%s", __PRETTY_FUNCTION__)
-#define VFUNC_LOG \
-            LOGV_IF(FUNC_ENTRY, "Entering function '%s'", __PRETTY_FUNCTION__)
-#define VHANDLER_LOG \
-            LOGV_IF(HANDLER_ENTRY, "Entering handler '%s'", __PRETTY_FUNCTION__)
-
-#endif /*ifndef LOCAL_LOG_DEF_H */
diff --git a/60xx/libsensors_iio/sensor_params.h b/60xx/libsensors_iio/sensor_params.h
deleted file mode 100644
index eef0b3b..0000000
--- a/60xx/libsensors_iio/sensor_params.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
-* 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 INV_SENSOR_PARAMS_H
-#define INV_SENSOR_PARAMS_H
-
-/* Physical parameters of the sensors supported by Invensense MPL */
-#define SENSORS_ROTATION_VECTOR_HANDLE    (ID_RV)
-#define SENSORS_LINEAR_ACCEL_HANDLE       (ID_LA)
-#define SENSORS_GRAVITY_HANDLE            (ID_GR)
-#define SENSORS_GYROSCOPE_HANDLE          (ID_GY)
-#define SENSORS_RAW_GYROSCOPE_HANDLE      (ID_RG)
-#define SENSORS_ACCELERATION_HANDLE       (ID_A)
-#define SENSORS_MAGNETIC_FIELD_HANDLE     (ID_M)
-#define SENSORS_ORIENTATION_HANDLE        (ID_O)
-#define SENSORS_SCREEN_ORIENTATION_HANDLE (ID_SO)
-
-/******************************************/
-//MPU9250 INV_COMPASS
-#define COMPASS_MPU9250_RANGE           (9830.f)
-#define COMPASS_MPU9250_RESOLUTION      (0.15f)
-#define COMPASS_MPU9250_POWER           (10.f)
-#define COMPASS_MPU9250_MINDELAY        (10000)
-//MPU9150 INV_COMPASS
-#define COMPASS_MPU9150_RANGE           (9830.f)
-#define COMPASS_MPU9150_RESOLUTION      (0.285f)
-#define COMPASS_MPU9150_POWER           (10.f)
-#define COMPASS_MPU9150_MINDELAY        (10000)
-//COMPASS_ID_AK8975
-#define COMPASS_AKM8975_RANGE           (9830.f)
-#define COMPASS_AKM8975_RESOLUTION      (0.285f)
-#define COMPASS_AKM8975_POWER           (10.f)
-#define COMPASS_AKM8975_MINDELAY        (10000)
-//COMPASS_ID_AK8963C
-#define COMPASS_AKM8963_RANGE           (9830.f)
-#define COMPASS_AKM8963_RESOLUTION      (0.15f)
-#define COMPASS_AKM8963_POWER           (10.f)
-#define COMPASS_AKM8963_MINDELAY        (10000)
-//COMPASS_ID_AMI30X
-#define COMPASS_AMI30X_RANGE            (5461.f)
-#define COMPASS_AMI30X_RESOLUTION       (0.9f)
-#define COMPASS_AMI30X_POWER            (0.15f)
-//COMPASS_ID_AMI306
-#define COMPASS_AMI306_RANGE            (5461.f)
-#define COMPASS_AMI306_RESOLUTION       (0.9f)
-#define COMPASS_AMI306_POWER            (0.15f)
-#define COMPASS_AMI306_MINDELAY         (10000)
-//COMPASS_ID_YAS529
-#define COMPASS_YAS529_RANGE            (19660.f)
-#define COMPASS_YAS529_RESOLUTION       (0.012f)
-#define COMPASS_YAS529_POWER            (4.f)
-//COMPASS_ID_YAS53x
-#define COMPASS_YAS53x_RANGE            (8001.f)
-#define COMPASS_YAS53x_RESOLUTION       (0.012f)
-#define COMPASS_YAS53x_POWER            (4.f)
-#define COMPASS_YAS53x_MINDELAY         (10000)
-//COMPASS_ID_HMC5883
-#define COMPASS_HMC5883_RANGE           (10673.f)
-#define COMPASS_HMC5883_RESOLUTION      (10.f)
-#define COMPASS_HMC5883_POWER           (0.24f)
-//COMPASS_ID_LSM303DLH
-#define COMPASS_LSM303DLH_RANGE         (10240.f)
-#define COMPASS_LSM303DLH_RESOLUTION    (1.f)
-#define COMPASS_LSM303DLH_POWER         (1.f)
-//COMPASS_ID_LSM303DLM
-#define COMPASS_LSM303DLM_RANGE         (10240.f)
-#define COMPASS_LSM303DLM_RESOLUTION    (1.f)
-#define COMPASS_LSM303DLM_POWER         (1.f)
-//COMPASS_ID_MMC314X
-#define COMPASS_MMC314X_RANGE           (400.f)
-#define COMPASS_MMC314X_RESOLUTION      (2.f)
-#define COMPASS_MMC314X_POWER           (0.55f)
-//COMPASS_ID_HSCDTD002B
-#define COMPASS_HSCDTD002B_RANGE        (9830.f)
-#define COMPASS_HSCDTD002B_RESOLUTION   (1.f)
-#define COMPASS_HSCDTD002B_POWER        (1.f)
-//COMPASS_ID_HSCDTD004A
-#define COMPASS_HSCDTD004A_RANGE        (9830.f)
-#define COMPASS_HSCDTD004A_RESOLUTION   (1.f)
-#define COMPASS_HSCDTD004A_POWER        (1.f)
-/*******************************************/
-//ACCEL_ID_MPU6500
-#define ACCEL_MPU6500_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU6500_RESOLUTION        (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU6500_POWER             (0.f)
-#define ACCEL_MPU6500_MINDELAY          (1000)
-//ACCEL_ID_MPU9250
-#define ACCEL_MPU9250_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU9250_RESOLUTION        (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU9250_POWER             (0.f)
-#define ACCEL_MPU9250_MINDELAY          (1000)
-//ACCEL_ID_MPU9150
-#define ACCEL_MPU9150_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU9150_RESOLUTION        (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU9150_POWER             (0.f)
-#define ACCEL_MPU9150_MINDELAY          (1000)
-//ACCEL_ID_LIS331
-#define ACCEL_LIS331_RANGE              (2.48f * GRAVITY_EARTH)
-#define ACCEL_LIS331_RESOLUTION         (0.001f * GRAVITY_EARTH)
-#define ACCEL_LIS331_POWER              (1.f)
-//ACCEL_ID_LSM303DLX
-#define ACCEL_LSM303DLX_RANGE           (2.48f * GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_RESOLUTION      (0.001f * GRAVITY_EARTH)
-#define ACCEL_LSM303DLX_POWER           (1.f)
-//ACCEL_ID_LIS3DH
-#define ACCEL_LIS3DH_RANGE              (2.48f * GRAVITY_EARTH)
-#define ACCEL_LIS3DH_RESOLUTION         (0.001f * GRAVITY_EARTH)
-#define ACCEL_LIS3DH_POWER              (1.f)
-//ACCEL_ID_KXSD9
-#define ACCEL_KXSD9_RANGE               (2.5006f * GRAVITY_EARTH)
-#define ACCEL_KXSD9_RESOLUTION          (0.001f * GRAVITY_EARTH)
-#define ACCEL_KXSD9_POWER               (1.f)
-//ACCEL_ID_KXTF9
-#define ACCEL_KXTF9_RANGE               (1.f * GRAVITY_EARTH)
-#define ACCEL_KXTF9_RESOLUTION          (0.033f * GRAVITY_EARTH)
-#define ACCEL_KXTF9_POWER               (0.35f)
-//ACCEL_ID_BMA150
-#define ACCEL_BMA150_RANGE              (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA150_RESOLUTION         (0.004f * GRAVITY_EARTH)
-#define ACCEL_BMA150_POWER              (0.2f)
-//ACCEL_ID_BMA222
-#define ACCEL_BMA222_RANGE              (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA222_RESOLUTION         (0.001f * GRAVITY_EARTH)
-#define ACCEL_BMA222_POWER              (0.1f)
-//ACCEL_ID_BMA250
-#define ACCEL_BMA250_RANGE              (2.f * GRAVITY_EARTH)
-#define ACCEL_BMA250_RESOLUTION         (0.00391f * GRAVITY_EARTH)
-#define ACCEL_BMA250_POWER              (0.139f)
-#define ACCEL_BMA250_MINDELAY           (1000)
-//ACCEL_ID_ADXL34X
-#define ACCEL_ADXL34X_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_ADXL34X_RESOLUTION        (0.001f * GRAVITY_EARTH)
-#define ACCEL_ADXL34X_POWER             (1.f)
-//ACCEL_ID_MMA8450
-#define ACCEL_MMA8450_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MMA8450_RESOLUTION        (0.001f * GRAVITY_EARTH)
-#define ACCEL_MMA8450_POWER             (1.0f)
-//ACCEL_ID_MMA845X
-#define ACCEL_MMA845X_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MMA845X_RESOLUTION        (0.001f * GRAVITY_EARTH)
-#define ACCEL_MMA845X_POWER             (1.f)
-//ACCEL_ID_MPU6050
-#define ACCEL_MPU6050_RANGE             (2.f * GRAVITY_EARTH)
-#define ACCEL_MPU6050_RESOLUTION        (0.004f * GRAVITY_EARTH)
-#define ACCEL_MPU6050_POWER             (0.f)
-#define ACCEL_MPU6050_MINDELAY          (5000)
-/******************************************/
-//GYRO MPU3050
-#define RAD_P_DEG                       (3.14159f / 180.f)
-#define GYRO_MPU3050_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_MPU3050_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU3050_POWER              (6.1f)
-#define GYRO_MPU3050_MINDELAY           (1000)
-//GYRO MPU6050
-#define GYRO_MPU6050_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_MPU6050_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU6050_POWER              (5.5f)
-#define GYRO_MPU6050_MINDELAY           (5000)
-//GYRO MPU9150
-#define GYRO_MPU9150_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_MPU9150_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU9150_POWER              (5.5f)
-#define GYRO_MPU9150_MINDELAY           (1000)
-//GYRO MPU9250
-#define GYRO_MPU9250_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_MPU9250_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU9250_POWER              (5.5f)
-#define GYRO_MPU9250_MINDELAY           (1000)
-//GYRO MPU6500
-#define GYRO_MPU6500_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_MPU6500_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_MPU6500_POWER              (5.5f)
-#define GYRO_MPU6500_MINDELAY           (1000)
-//GYRO ITG3500
-#define GYRO_ITG3500_RANGE              (2000.f * RAD_P_DEG)
-#define GYRO_ITG3500_RESOLUTION         (2000.f / 32768.f * RAD_P_DEG)
-#define GYRO_ITG3500_POWER              (5.5f)
-#define GYRO_ITG3500_MINDELAY           (1000)
-
-#endif  /* INV_SENSOR_PARAMS_H */
-
diff --git a/60xx/libsensors_iio/sensors.h b/60xx/libsensors_iio/sensors.h
deleted file mode 100644
index f698fc5..0000000
--- a/60xx/libsensors_iio/sensors.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
-* 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_SENSORS_H
-#define ANDROID_SENSORS_H
-
-#include <stdint.h>
-#include <errno.h>
-#include <sys/cdefs.h>
-#include <sys/types.h>
-
-#include <linux/input.h>
-
-#include <hardware/hardware.h>
-#include <hardware/sensors.h>
-
-__BEGIN_DECLS
-
-/*****************************************************************************/
-
-#ifndef ARRAY_SIZE
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
-#endif
-
-enum {
-    ID_GY = 0,
-    ID_RG,
-    ID_A,
-    ID_M,
-    ID_O,
-    ID_RV,
-    ID_LA,
-    ID_GR,
-    ID_SO
-};
-
-/*****************************************************************************/
-
-/*
- * The SENSORS Module
- */
-
-/* ITG3500 */
-#define EVENT_TYPE_GYRO_X          REL_X
-#define EVENT_TYPE_GYRO_Y          REL_Y
-#define EVENT_TYPE_GYRO_Z          REL_Z
-/* MPU6050 MPU9150 */
-#define EVENT_TYPE_IACCEL_X        REL_RX
-#define EVENT_TYPE_IACCEL_Y        REL_RY
-#define EVENT_TYPE_IACCEL_Z        REL_RZ
-/* MPU6050 MPU9150 */
-#define EVENT_TYPE_ICOMPASS_X      REL_X
-#define EVENT_TYPE_ICOMPASS_Y      REL_Y
-#define EVENT_TYPE_ICOMPASS_Z      REL_Z
-/* MPUxxxx */
-#define EVENT_TYPE_TIMESTAMP_HI    REL_MISC
-#define EVENT_TYPE_TIMESTAMP_LO    REL_WHEEL
-
-/* Accel BMA250 */
-#define EVENT_TYPE_ACCEL_X          ABS_X
-#define EVENT_TYPE_ACCEL_Y          ABS_Y
-#define EVENT_TYPE_ACCEL_Z          ABS_Z
-#define LSG                         (1000.0f)
-
-// conversion of acceleration data to SI units (m/s^2)
-#define RANGE_A                     (4*GRAVITY_EARTH)
-#define RESOLUTION_A                (GRAVITY_EARTH / LSG)
-#define CONVERT_A                   (GRAVITY_EARTH / LSG)
-#define CONVERT_A_X                 (CONVERT_A)
-#define CONVERT_A_Y                 (CONVERT_A)
-#define CONVERT_A_Z                 (CONVERT_A)
-
-/* Compass AKM8975 */
-#define EVENT_TYPE_MAGV_X           ABS_RX
-#define EVENT_TYPE_MAGV_Y           ABS_RY
-#define EVENT_TYPE_MAGV_Z           ABS_RZ
-#define EVENT_TYPE_MAGV_STATUS      ABS_RUDDER
-
-// conversion of magnetic data to uT units
-#define CONVERT_M                   (0.06f)
-
-__END_DECLS
-
-#endif  // ANDROID_SENSORS_H
diff --git a/60xx/libsensors_iio/sensors_mpl.cpp b/60xx/libsensors_iio/sensors_mpl.cpp
deleted file mode 100644
index 4aef514..0000000
--- a/60xx/libsensors_iio/sensors_mpl.cpp
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
-* 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.
-*/
-
-#define FUNC_LOG LOGV("%s", __PRETTY_FUNCTION__)
-
-#include <hardware/sensors.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <dirent.h>
-#include <math.h>
-#include <poll.h>
-#include <pthread.h>
-#include <stdlib.h>
-
-#include <linux/input.h>
-
-#include <utils/Atomic.h>
-#include <utils/Log.h>
-
-#include "sensors.h"
-#include "MPLSensor.h"
-
-/*****************************************************************************/
-/* The SENSORS Module */
-
-#ifdef ENABLE_DMP_SCREEN_AUTO_ROTATION
-#define LOCAL_SENSORS (MPLSensor::numSensors + 1)
-#else
-#define LOCAL_SENSORS MPLSensor::numSensors
-#endif
-
-/* Vendor-defined Accel Load Calibration File Method
-* @param[out] Accel bias, length 3.  In HW units scaled by 2^16 in body frame
-* @return '0' for a successful load, '1' otherwise
-* example: int AccelLoadConfig(long* offset);
-* End of Vendor-defined Accel Load Cal Method
-*/
-
-static struct sensor_t sSensorList[LOCAL_SENSORS];
-static int sensors = (sizeof(sSensorList) / sizeof(sensor_t));
-
-static int open_sensors(const struct hw_module_t* module, const char* id,
-                        struct hw_device_t** device);
-
-static int sensors__get_sensors_list(struct sensors_module_t* module,
-                                     struct sensor_t const** list)
-{
-    *list = sSensorList;
-    return sensors;
-}
-
-static struct hw_module_methods_t sensors_module_methods = {
-        open: open_sensors
-};
-
-struct sensors_module_t HAL_MODULE_INFO_SYM = {
-        common: {
-                tag: HARDWARE_MODULE_TAG,
-                version_major: 1,
-                version_minor: 0,
-                id: SENSORS_HARDWARE_MODULE_ID,
-                name: "Invensense module",
-                author: "Invensense Inc.",
-                methods: &sensors_module_methods,
-        },
-        get_sensors_list: sensors__get_sensors_list,
-};
-
-struct sensors_poll_context_t {
-    struct sensors_poll_device_t device; // must be first
-
-    sensors_poll_context_t();
-    ~sensors_poll_context_t();
-    int activate(int handle, int enabled);
-    int setDelay(int handle, int64_t ns);
-    int pollEvents(sensors_event_t* data, int count);
-
-private:
-    enum {
-        mpl = 0,
-        compass,
-        dmpOrient,
-        numSensorDrivers,   // wake pipe goes here
-        numFds,
-    };
-
-    struct pollfd mPollFds[numSensorDrivers];
-    SensorBase *mSensor;
-};
-
-/******************************************************************************/
-
-sensors_poll_context_t::sensors_poll_context_t() {
-    VFUNC_LOG;
-
-    mCompassSensor = new CompassSensor();
-    MPLSensor *mplSensor = new MPLSensor(mCompassSensor);
-
-   /* For Vendor-defined Accel Calibration File Load
-    * Use the Following Constructor and Pass Your Load Cal File Function
-    *
-    * MPLSensor *mplSensor = new MPLSensor(mCompassSensor, AccelLoadConfig);
-    */
-
-    // setup the callback object for handing mpl callbacks
-    setCallbackObject(mplSensor);
-
-    // populate the sensor list
-    sensors =
-            mplSensor->populateSensorList(sSensorList, sizeof(sSensorList));
-
-    mSensor = mplSensor;
-    mPollFds[mpl].fd = mSensor->getFd();
-    mPollFds[mpl].events = POLLIN;
-    mPollFds[mpl].revents = 0;
-
-    mPollFds[compass].fd = mCompassSensor->getFd();
-    mPollFds[compass].events = POLLIN;
-    mPollFds[compass].revents = 0;
-
-    mPollFds[dmpOrient].fd = ((MPLSensor*) mSensor)->getDmpOrientFd();
-    mPollFds[dmpOrient].events = POLLPRI;
-    mPollFds[dmpOrient].revents = 0;
-}
-
-sensors_poll_context_t::~sensors_poll_context_t() {
-    FUNC_LOG;
-    delete mSensor;
-}
-
-int sensors_poll_context_t::activate(int handle, int enabled) {
-    FUNC_LOG;
-    return mSensor->enable(handle, enabled);
-}
-
-int sensors_poll_context_t::setDelay(int handle, int64_t ns)
-{
-    FUNC_LOG;
-    return mSensor->setDelay(handle, ns);
-}
-
-int sensors_poll_context_t::pollEvents(sensors_event_t *data, int count)
-{
-    VHANDLER_LOG;
-
-    int nbEvents = 0;
-    int nb, polltime = -1;
-
-    // look for new events
-    nb = poll(mPollFds, numSensorDrivers, polltime);
-
-    if (nb > 0) {
-        for (int i = 0; count && i < numSensorDrivers; i++) {
-            if (mPollFds[i].revents & (POLLIN | POLLPRI)) {
-                nb = 0;
-                if (i == mpl) {
-                    /* Ignore res */
-                    mSensor->readEvents(NULL, 0);
-                    mPollFds[i].revents = 0;
-                }
-                else if (i == compass) {
-                    /* Ignore res */
-                    ((MPLSensor*) mSensor)->readCompassEvents(NULL, count);
-                    mPollFds[i].revents = 0;
-                }
-            }
-        }
-        nb = ((MPLSensor*) mSensor)->executeOnData(data, count);
-        if (nb > 0) {
-            count -= nb;
-            nbEvents += nb;
-            data += nb;
-        }
-
-        if (mPollFds[dmpOrient].revents & (POLLIN | POLLPRI)) {
-            nb = ((MPLSensor*) mSensor)->readDmpOrientEvents(data, count);
-            mPollFds[dmpOrient].revents= 0;
-            if (isDmpScreenAutoRotationEnabled() && nb > 0) {
-                count -= nb;
-                nbEvents += nb;
-                data += nb;
-            }
-        }
-    }
-
-    return nbEvents;
-}
-
-/******************************************************************************/
-
-static int poll__close(struct hw_device_t *dev)
-{
-    FUNC_LOG;
-    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
-    if (ctx) {
-        delete ctx;
-    }
-    return 0;
-}
-
-static int poll__activate(struct sensors_poll_device_t *dev,
-                          int handle, int enabled)
-{
-    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
-    return ctx->activate(handle, enabled);
-}
-
-static int poll__setDelay(struct sensors_poll_device_t *dev,
-                          int handle, int64_t ns)
-{
-    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
-    int s= ctx->setDelay(handle, ns);
-    return s;
-}
-
-static int poll__poll(struct sensors_poll_device_t *dev,
-                      sensors_event_t* data, int count)
-{
-    sensors_poll_context_t *ctx = (sensors_poll_context_t *)dev;
-    return ctx->pollEvents(data, count);
-}
-
-/******************************************************************************/
-
-/** Open a new instance of a sensor device using name */
-static int open_sensors(const struct hw_module_t* module, const char* id,
-                        struct hw_device_t** device)
-{
-    FUNC_LOG;
-    int status = -EINVAL;
-    sensors_poll_context_t *dev = new sensors_poll_context_t();
-
-    memset(&dev->device, 0, sizeof(sensors_poll_device_t));
-
-    dev->device.common.tag = HARDWARE_DEVICE_TAG;
-    dev->device.common.version  = 0;
-    dev->device.common.module   = const_cast<hw_module_t*>(module);
-    dev->device.common.close    = poll__close;
-    dev->device.activate        = poll__activate;
-    dev->device.setDelay        = poll__setDelay;
-    dev->device.poll            = poll__poll;
-
-    *device = &dev->device.common;
-    status = 0;
-
-    return status;
-}
diff --git a/60xx/libsensors_iio/software/build/android/common.mk b/60xx/libsensors_iio/software/build/android/common.mk
deleted file mode 100644
index 84e7e9b..0000000
--- a/60xx/libsensors_iio/software/build/android/common.mk
+++ /dev/null
@@ -1,87 +0,0 @@
-# Use bash for additional echo fancyness
-SHELL = /bin/bash
-
-####################################################################################################
-## defines
-
-# Build for Jellybean 
-BUILD_ANDROID_JELLYBEAN = 1
-
-## libraries ##
-LIB_PREFIX = lib
-
-STATIC_LIB_EXT = a
-SHARED_LIB_EXT = so
-
-# normally, overridden from outside 
-# ?= assignment sets it only if not already defined
-TARGET ?= android
-
-MLLITE_LIB_NAME     ?= mllite
-MPL_LIB_NAME        ?= mplmpu
-
-## applications ##
-SHARED_APP_SUFFIX = -shared
-STATIC_APP_SUFFIX = -static
-
-####################################################################################################
-## compile, includes, and linker
-
-ifeq ($(BUILD_ANDROID_JELLYBEAN),1)
-ANDROID_COMPILE = -DANDROID_JELLYBEAN=1
-endif
-
-ANDROID_LINK  = -nostdlib
-ANDROID_LINK += -fpic
-ANDROID_LINK += -Wl,--gc-sections 
-ANDROID_LINK += -Wl,--no-whole-archive 
-ANDROID_LINK += -L$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib 
-ANDROID_LINK += -L$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
-
-ANDROID_LINK_EXECUTABLE  = $(ANDROID_LINK)
-ANDROID_LINK_EXECUTABLE += -Wl,-dynamic-linker,/system/bin/linker
-ifneq ($(BUILD_ANDROID_JELLYBEAN),1)
-ANDROID_LINK_EXECUTABLE += -Wl,-T,$(ANDROID_ROOT)/build/core/armelf.x
-endif
-ANDROID_LINK_EXECUTABLE += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtbegin_dynamic.o
-ANDROID_LINK_EXECUTABLE += $(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib/crtend_android.o
-
-ANDROID_INCLUDES  = -I$(ANDROID_ROOT)/system/core/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/hardware/libhardware/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/hardware/ril/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/dalvik/libnativehelper/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/frameworks/base/include   # ICS
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/frameworks/native/include # Jellybean
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/external/skia/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/out/target/product/generic/obj/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libc/arch-arm/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libc/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libstdc++/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libc/kernel/common
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libc/kernel/arch-arm
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libm/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libm/include/arch/arm
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libthread_db/include
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libm/arm
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/bionic/libm
-ANDROID_INCLUDES += -I$(ANDROID_ROOT)/out/target/product/generic/obj/SHARED_LIBRARIES/libm_intermediates
-
-KERNEL_INCLUDES  = -I$(KERNEL_ROOT)/include
-
-INV_INCLUDES  = -I$(INV_ROOT)/software/core/driver/include
-INV_INCLUDES += -I$(MLLITE_DIR)
-INV_INCLUDES += -I$(MLLITE_DIR)/linux
-
-INV_DEFINES += -DINV_CACHE_DMP=1
-
-####################################################################################################
-## macros
-
-ifndef echo_in_colors
-define echo_in_colors
-	echo -ne "\e[1;32m"$(1)"\e[0m"
-endef 
-endif
-
-
-
diff --git a/60xx/libsensors_iio/software/build/android/shared.mk b/60xx/libsensors_iio/software/build/android/shared.mk
deleted file mode 100644
index 47dedfe..0000000
--- a/60xx/libsensors_iio/software/build/android/shared.mk
+++ /dev/null
@@ -1,74 +0,0 @@
-SHELL=/bin/bash
-
-TARGET       ?= android
-PRODUCT      ?= beagleboard
-ANDROID_ROOT ?= /Android/trunk/0xdroid/beagle-eclair
-KERNEL_ROOT  ?= /Android/trunk/0xdroid/kernel
-MLSDK_ROOT   ?= $(CURDIR)
-
-ifeq ($(VERBOSE),1)
-	DUMP=1>/dev/stdout
-else
-	DUMP=1>/dev/null
-endif
-
-include common.mk
-
-################################################################################
-## targets
-
-INV_ROOT = ../..
-LIB_FOLDERS  = $(INV_ROOT)/core/mllite/build/$(TARGET)
-ifeq ($(BUILD_MPL),1)
-	LIB_FOLDERS += $(INV_ROOT)/core/mpl/build/$(TARGET)
-endif
-APP_FOLDERS  = $(INV_ROOT)/simple_apps/mpu_iio/build/$(TARGET)
-APP_FOLDERS += $(INV_ROOT)/simple_apps/self_test/build/$(TARGET)
-APP_FOLDERS += $(INV_ROOT)/simple_apps/gesture_test/build/$(TARGET)
-
-INSTALL_DIR = $(CURDIR)
-
-################################################################################
-## macros
-
-define echo_in_colors
-	echo -ne "\e[1;34m"$(1)"\e[0m"
-endef
-
-################################################################################
-## rules
-
-.PHONY : all mllite mpl clean
-
-all:
-	for DIR in $(LIB_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-	for DIR in $(APP_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-
-clean: 
-	for DIR in $(LIB_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-	for DIR in $(APP_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-
-cleanall:
-	for DIR in $(LIB_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-	for DIR in $(APP_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-
-install:
-	for DIR in $(LIB_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-	for DIR in $(APP_FOLDERS); do (				\
-		cd $$DIR && $(MAKE) -f shared.mk $@ ); 	\
-	done
-
diff --git a/60xx/libsensors_iio/software/core/driver/include/log.h b/60xx/libsensors_iio/software/core/driver/include/log.h
deleted file mode 100644
index c519691..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/log.h
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*
- * This file incorporates work covered by the following copyright and
- * permission notice:
- *
- * Copyright (C) 2005 The Android Open Source Project
- *
- * 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.
- */
-
-/*
- * C/C++ logging functions.  See the logging documentation for API details.
- *
- * We'd like these to be available from C code (in case we import some from
- * somewhere), so this has a C interface.
- *
- * The output will be correct when the log file is shared between multiple
- * threads and/or multiple processes so long as the operating system
- * supports O_APPEND.  These calls have mutex-protected data structures
- * and so are NOT reentrant.  Do not use MPL_LOG in a signal handler.
- */
-#ifndef _LIBS_CUTILS_MPL_LOG_H
-#define _LIBS_CUTILS_MPL_LOG_H
-
-#include <stdlib.h>
-#include <stdarg.h>
-
-#ifdef ANDROID
-#ifdef NDK_BUILD
-#include "log_macros.h"
-#else
-#include <utils/Log.h>		/* For the LOG macro */
-#endif
-#endif
-
-#ifdef __KERNEL__
-#include <linux/kernel.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
- * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
- * at the top of your source file) to change that behavior.
- */
-#ifndef MPL_LOG_NDEBUG
-#ifdef NDEBUG
-#define MPL_LOG_NDEBUG 1
-#else
-#define MPL_LOG_NDEBUG 0
-#endif
-#endif
-
-#ifdef __KERNEL__
-#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
-#define MPL_LOG_DEFAULT KERN_DEFAULT
-#define MPL_LOG_VERBOSE KERN_CONT
-#define MPL_LOG_DEBUG   KERN_NOTICE
-#define MPL_LOG_INFO    KERN_INFO
-#define MPL_LOG_WARN    KERN_WARNING
-#define MPL_LOG_ERROR   KERN_ERR
-#define MPL_LOG_SILENT  MPL_LOG_VERBOSE
-
-#else
-	/* Based off the log priorities in android
-	   /system/core/include/android/log.h */
-#define MPL_LOG_UNKNOWN		(0)
-#define MPL_LOG_DEFAULT		(1)
-#define MPL_LOG_VERBOSE		(2)
-#define MPL_LOG_DEBUG		(3)
-#define MPL_LOG_INFO		(4)
-#define MPL_LOG_WARN		(5)
-#define MPL_LOG_ERROR		(6)
-#define MPL_LOG_SILENT		(8)
-#endif
-
-
-/*
- * This is the local tag used for the following simplified
- * logging macros.  You can change this preprocessor definition
- * before using the other macros to change the tag.
- */
-#ifndef MPL_LOG_TAG
-#ifdef __KERNEL__
-#define MPL_LOG_TAG
-#else
-#define MPL_LOG_TAG NULL
-#endif
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGV
-#if MPL_LOG_NDEBUG
-#ifdef _WIN32
-#define MPL_LOGV(fmt, ...)						\
-	do {								\
-        __pragma (warning(suppress : 4127 )) \
-		if (0)							\
-			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
-            __pragma (warning(suppress : 4127 )) \
-    } while (0)
-#else
-#define MPL_LOGV(fmt, ...)						\
-	do {								\
-		if (0)							\
-			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
-    } while (0)
-#endif
-
-#else
-#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef CONDITION
-#define CONDITION(cond)     ((cond) != 0)
-#endif
-
-#ifndef MPL_LOGV_IF
-#if MPL_LOG_NDEBUG
-#define MPL_LOGV_IF(cond, fmt, ...)  \
-	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
-#else
-#define MPL_LOGV_IF(cond, fmt, ...) \
-	((CONDITION(cond))						\
-		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
-		: (void)0)
-#endif
-#endif
-
-/*
- * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGD
-#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-
-#ifndef MPL_LOGD_IF
-#define MPL_LOGD_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send an info log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGI
-#ifdef __KERNEL__
-#define MPL_LOGI(fmt, ...) pr_info(KERN_INFO MPL_LOG_TAG fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef MPL_LOGI_IF
-#define MPL_LOGI_IF(cond, fmt, ...) \
-	((CONDITION(cond))                                              \
-		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGW
-#ifdef __KERNEL__
-#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef MPL_LOGW_IF
-#define MPL_LOGW_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send an error log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGE
-#ifdef __KERNEL__
-#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef MPL_LOGE_IF
-#define MPL_LOGE_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
-		: (void)0)
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Log a fatal error.  If the given condition fails, this stops program
- * execution like a normal assertion, but also generating the given message.
- * It is NOT stripped from release builds.  Note that the condition test
- * is -inverted- from the normal assert() semantics.
- */
-#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
-	((CONDITION(cond))					   \
-		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
-						fmt, ##__VA_ARGS__))	\
-		: (void)0)
-
-#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
-	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
-
-/*
- * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
- * are stripped out of release builds.
- */
-#if MPL_LOG_NDEBUG
-#define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
-	do {								\
-		if (0)							\
-			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
-	} while (0)
-#define MPL_LOG_FATAL(fmt, ...)						\
-	do {								\
-		if (0)							\
-			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
-	} while (0)
-#else
-#define MPL_LOG_FATAL_IF(cond, fmt, ...) \
-	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
-#define MPL_LOG_FATAL(fmt, ...) \
-	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
-#endif
-
-/*
- * Assertion that generates a log message when the assertion fails.
- * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
- */
-#define MPL_LOG_ASSERT(cond, fmt, ...)			\
-	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Basic log message macro.
- *
- * Example:
- *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
- *
- * The second argument may be NULL or "" to indicate the "global" tag.
- */
-#ifndef MPL_LOG
-#define MPL_LOG(priority, tag, fmt, ...)		\
-	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
-#endif
-
-/*
- * Log macro that allows you to specify a number for the priority.
- */
-#ifndef MPL_LOG_PRI
-#ifdef ANDROID
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-	ALOG(priority, tag, fmt, ##__VA_ARGS__)
-#elif defined __KERNEL__
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-/*
- * Log macro that allows you to pass in a varargs ("args" is a va_list).
- */
-#ifndef MPL_LOG_PRI_VA
-#ifdef ANDROID
-#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
-	android_vprintLog(priority, NULL, tag, fmt, args)
-#elif defined __KERNEL__
-/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
-#else
-#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
-	_MLPrintVaLog(priority, NULL, tag, fmt, args)
-#endif
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * ===========================================================================
- *
- * The stuff in the rest of this file should not be used directly.
- */
-
-#ifndef ANDROID
-int _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
-int _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
-/* Final implementation of actual writing to a character device */
-int _MLWriteLog(const char *buf, int buflen);
-#endif
-
-static inline void __print_result_location(int result,
-					   const char *file,
-					   const char *func, int line)
-{
-	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
-}
-
-#ifdef _WIN32
-/* The pragma removes warning about expression being constant */
-#define LOG_RESULT_LOCATION(condition) \
-    do {								\
-		__print_result_location((int)(condition), __FILE__,	\
-					__func__, __LINE__);		\
-        __pragma (warning(suppress : 4127 )) \
-	} while (0)
-#else
-#define LOG_RESULT_LOCATION(condition) \
-    do {								\
-		__print_result_location((int)(condition), __FILE__,	\
-					__func__, __LINE__);		\
-	} while (0)
-#endif
-
-
-#define INV_ERROR_CHECK(r_1329) \
-    if (r_1329) { \
-        LOG_RESULT_LOCATION(r_1329); \
-        return r_1329; \
-    }
-
-#ifdef __cplusplus
-}
-#endif
-#endif				/* _LIBS_CUTILS_MPL_LOG_H */
diff --git a/60xx/libsensors_iio/software/core/driver/include/mlinclude.h b/60xx/libsensors_iio/software/core/driver/include/mlinclude.h
deleted file mode 100644
index 9725199..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/mlinclude.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-#ifndef INV_INCLUDE_H__
-#define INV_INCLUDE_H__
-
-#define INVENSENSE_FUNC_START  typedef int invensensePutFunctionCallsHere
-
-#ifdef COVERAGE
-#include "utestCommon.h"
-#endif
-#ifdef PROFILE
-#include "profile.h"
-#endif
-
-#ifdef WIN32
-#ifdef COVERAGE
-
-extern int functionEnterLog(const char *file, const char *func);
-extern int functionExitLog(const char *file, const char *func);
-
-#undef INVENSENSE_FUNC_START
-#define INVENSENSE_FUNC_START  __pragma(message(__FILE__ "|"__FUNCTION__ )) \
-    int dslkQjDsd = functionEnterLog(__FILE__, __FUNCTION__)
-#endif // COVERAGE
-#endif // WIN32
-
-#ifdef PROFILE
-#undef INVENSENSE_FUNC_START
-#define INVENSENSE_FUNC_START int dslkQjDsd = profileEnter(__FILE__, __FUNCTION__)
-#define return if ( profileExit(__FILE__, __FUNCTION__) ) return
-#endif // PROFILE
-
-// #define return if ( functionExitLog(__FILE__, __FUNCTION__) ) return
-
-#endif //INV_INCLUDE_H__
diff --git a/60xx/libsensors_iio/software/core/driver/include/mlmath.h b/60xx/libsensors_iio/software/core/driver/include/mlmath.h
deleted file mode 100644
index 37194d6..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/mlmath.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-/*******************************************************************************
- *
- * $Id: mlmath.h 5629 2011-06-11 03:13:08Z mcaramello $ 
- * 
- *******************************************************************************/
-
-#ifndef _ML_MATH_H_
-#define	_ML_MATH_H_
-
-#ifndef MLMATH
-// This define makes Microsoft pickup things like M_PI
-#define _USE_MATH_DEFINES
-#include <math.h>
-
-#ifdef WIN32
-// Microsoft doesn't follow standards
-#define  round(x)(((double)((long long)((x)>0?(x)+.5:(x)-.5))))
-#define roundf(x)(((float )((long long)((x)>0?(x)+.5f:(x)-.5f))))
-#endif
-
-#else  // MLMATH
-
-#ifdef __cplusplus 
-extern "C" {
-#endif
-/* MPL needs below functions */
-double	ml_asin(double);
-double	ml_atan(double);
-double	ml_atan2(double, double);
-double	ml_log(double);
-double	ml_sqrt(double);
-double	ml_ceil(double);
-double	ml_floor(double);
-double  ml_cos(double);
-double  ml_sin(double);
-double  ml_acos(double);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-/*
- * We rename functions here to provide the hook for other 
- * customized math functions.
- */
-#define	sqrt(x)      ml_sqrt(x)
-#define	log(x)       ml_log(x)
-#define	asin(x)      ml_asin(x)
-#define	atan(x)      ml_atan(x)
-#define	atan2(x,y)   ml_atan2(x,y)
-#define	ceil(x)      ml_ceil(x)
-#define	floor(x)     ml_floor(x)
-#define fabs(x)      (((x)<0)?-(x):(x))
-#define round(x)     (((double)((long long)((x)>0?(x)+.5:(x)-.5))))
-#define roundf(x)    (((float )((long long)((x)>0?(x)+.5f:(x)-.5f))))
-#define cos(x)       ml_cos(x)
-#define sin(x)       ml_sin(x)
-#define acos(x)      ml_acos(x)
-
-#define pow(x,y)     ml_pow(x,y)
-
-#ifdef LINUX
-/* stubs for float version of math functions */
-#define cosf(x)      ml_cos(x)
-#define sinf(x)      ml_sin(x)
-#define atan2f(x,y)  ml_atan2(x,y)
-#define sqrtf(x)     ml_sqrt(x)
-#endif
-
-
-
-#endif // MLMATH
-
-#ifndef M_PI
-#define M_PI 3.14159265358979
-#endif
-
-#ifndef ABS
-#define ABS(x) (((x)>=0)?(x):-(x))
-#endif
-
-#ifndef MIN
-#define MIN(x,y) (((x)<(y))?(x):(y))
-#endif
-
-#ifndef MAX
-#define MAX(x,y) (((x)>(y))?(x):(y))
-#endif
-
-/*---------------------------*/
-#endif /* !_ML_MATH_H_ */
diff --git a/60xx/libsensors_iio/software/core/driver/include/mlsl.h b/60xx/libsensors_iio/software/core/driver/include/mlsl.h
deleted file mode 100644
index 12f2901..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/mlsl.h
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-#ifndef __MLSL_H__
-#define __MLSL_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- *  @defgroup   MLSL
- *  @brief      Motion Library - Serial Layer.
- *              The Motion Library System Layer provides the Motion Library
- *              with the communication interface to the hardware.
- *
- *              The communication interface is assumed to support serial
- *              transfers in burst of variable length up to
- *              SERIAL_MAX_TRANSFER_SIZE.
- *              The default value for SERIAL_MAX_TRANSFER_SIZE is 128 bytes.
- *              Transfers of length greater than SERIAL_MAX_TRANSFER_SIZE, will
- *              be subdivided in smaller transfers of length <=
- *              SERIAL_MAX_TRANSFER_SIZE.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be modified to
- *              overcome any host processor transfer size limitation down to
- *              1 B, the minimum.
- *              An higher value for SERIAL_MAX_TRANSFER_SIZE will favor
- *              performance and efficiency while requiring higher resource usage
- *              (mostly buffering). A smaller value will increase overhead and
- *              decrease efficiency but allows to operate with more resource
- *              constrained processor and master serial controllers.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
- *              mlsl.h header file and master serial controllers.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
- *              mlsl.h header file.
- *
- *  @{
- *      @file   mlsl.h
- *      @brief  The Motion Library System Layer.
- *
- */
-
-/*
- * NOTE : to properly support Yamaha compass reads,
- *	  the max transfer size should be at least 9 B.
- *	  Length in bytes, typically a power of 2 >= 2
- */
-#define SERIAL_MAX_TRANSFER_SIZE 31
-
-#ifndef __KERNEL__
-/**
- *  inv_serial_open() - used to open the serial port.
- *  @port	The COM port specification associated with the device in use.
- *  @sl_handle	a pointer to the file handle to the serial device to be open
- *		for the communication.
- *	This port is used to send and receive data to the device.
- *
- *	This function is called by inv_serial_start().
- *	Unlike previous MPL Software releases, explicitly calling
- *	inv_serial_start() is mandatory to instantiate the communication
- *	with the device.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_open(char const *port, void **sl_handle);
-
-/**
- *  inv_serial_close() - used to close the serial port.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *
- *	This port is used to send and receive data to the device.
- *
- *	This function is called by inv_serial_stop().
- *	Unlike previous MPL Software releases, explicitly calling
- *	inv_serial_stop() is mandatory to properly shut-down the
- *	communication with the device.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_close(void *sl_handle);
-
-/**
- *  inv_serial_reset() - used to reset any buffering the driver may be doing
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_reset(void *sl_handle);
-#endif
-
-/**
- *  inv_serial_single_write() - used to write a single byte of data.
- *  @sl_handle		pointer to the serial device used for the communication.
- *  @slave_addr		I2C slave address of device.
- *  @register_addr	Register address to write.
- *  @data		Single byte of data to write.
- *
- *	It is called by the MPL to write a single byte of data to the MPU.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_single_write(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char register_addr,
-	unsigned char data);
-
-/**
- *  inv_serial_write() - used to write multiple bytes of data to registers.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @register_addr	Register address to write.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_write(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short length,
-	unsigned char const *data);
-
-/**
- *  inv_serial_read() - used to read multiple bytes of data from registers.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @register_addr	Register address to read.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-int inv_serial_read(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char register_addr,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_read_mem() - used to read multiple bytes of data from the memory.
- *	    This should be sent by I2C or SPI.
- *
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @mem_addr	The location in the memory to read from.
- *  @length	Length of burst data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-int inv_serial_read_mem(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short mem_addr,
-	unsigned char bank_reg,
-	unsigned char addr_reg,
-	unsigned char mem_reg,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_write_mem() - used to write multiple bytes of data to the memory.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @mem_addr	The location in the memory to write to.
- *  @length	Length of burst data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-int inv_serial_write_mem(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short mem_addr,
-	unsigned char bank_reg,
-	unsigned char addr_reg,
-	unsigned char mem_reg,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_read_fifo() - used to read multiple bytes of data from the fifo.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-int inv_serial_read_fifo(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char fifo_reg,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_write_fifo() - used to write multiple bytes of data to the fifo.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-int inv_serial_write_fifo(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char fifo_reg,
-	unsigned short length,
-	unsigned char const *data);
-
-#ifndef __KERNEL__
-/**
- *  inv_serial_read_cfg() - used to get the configuration data.
- *  @cfg	Pointer to the configuration data.
- *  @len	Length of the configuration data.
- *
- *		Is called by the MPL to get the configuration data
- *		used by the motion library.
- *		This data would typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_read_cfg(unsigned char *cfg, unsigned int len);
-
-/**
- *  inv_serial_write_cfg() - used to save the configuration data.
- *  @cfg	Pointer to the configuration data.
- *  @len	Length of the configuration data.
- *
- *		Is called by the MPL to save the configuration data used by the
- *		motion library.
- *		This data would typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_write_cfg(unsigned char *cfg, unsigned int len);
-
-/**
- *  inv_serial_read_cal() - used to get the calibration data.
- *  @cfg	Pointer to the calibration data.
- *  @len	Length of the calibration data.
- *
- *		It is called by the MPL to get the calibration data used by the
- *		motion library.
- *		This data is typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_read_cal(unsigned char *cal, unsigned int len);
-
-/**
- *  inv_serial_write_cal() - used to save the calibration data.
- *
- *  @cfg	Pointer to the calibration data.
- *  @len	Length of the calibration data.
- *
- *	    It is called by the MPL to save the calibration data used by the
- *	    motion library.
- *	    This data is typically be saved in non-volatile memory.
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_write_cal(unsigned char *cal, unsigned int len);
-
-/**
- *  inv_serial_get_cal_length() - Get the calibration length from the storage.
- *  @len	lenght to be returned
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-int inv_serial_get_cal_length(unsigned int *len);
-#endif
-#ifdef __cplusplus
-}
-#endif
-/**
- * @}
- */
-#endif				/* __MLSL_H__ */
diff --git a/60xx/libsensors_iio/software/core/driver/include/mltypes.h b/60xx/libsensors_iio/software/core/driver/include/mltypes.h
deleted file mode 100644
index 09eccce..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/mltypes.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/**
- *  @defgroup MLERROR
- *  @brief  Motion Library - Error definitions.
- *          Definition of the error codes used within the MPL and
- *          returned to the user.
- *          Every function tries to return a meaningful error code basing
- *          on the occuring error condition. The error code is numeric.
- *
- *          The available error codes and their associated values are:
- *          - (0)               INV_SUCCESS
- *          - (32)              INV_ERROR
- *          - (22 / EINVAL)     INV_ERROR_INVALID_PARAMETER
- *          - (1  / EPERM)      INV_ERROR_FEATURE_NOT_ENABLED
- *          - (36)              INV_ERROR_FEATURE_NOT_IMPLEMENTED
- *          - (38)              INV_ERROR_DMP_NOT_STARTED
- *          - (39)              INV_ERROR_DMP_STARTED
- *          - (40)              INV_ERROR_NOT_OPENED
- *          - (41)              INV_ERROR_OPENED
- *          - (19 / ENODEV)     INV_ERROR_INVALID_MODULE
- *          - (12 / ENOMEM)     INV_ERROR_MEMORY_EXAUSTED
- *          - (44)              INV_ERROR_DIVIDE_BY_ZERO
- *          - (45)              INV_ERROR_ASSERTION_FAILURE
- *          - (46)              INV_ERROR_FILE_OPEN
- *          - (47)              INV_ERROR_FILE_READ
- *          - (48)              INV_ERROR_FILE_WRITE
- *          - (49)              INV_ERROR_INVALID_CONFIGURATION
- *          - (52)              INV_ERROR_SERIAL_CLOSED
- *          - (53)              INV_ERROR_SERIAL_OPEN_ERROR
- *          - (54)              INV_ERROR_SERIAL_READ
- *          - (55)              INV_ERROR_SERIAL_WRITE
- *          - (56)              INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED
- *          - (57)              INV_ERROR_SM_TRANSITION
- *          - (58)              INV_ERROR_SM_IMPROPER_STATE
- *          - (62)              INV_ERROR_FIFO_OVERFLOW
- *          - (63)              INV_ERROR_FIFO_FOOTER
- *          - (64)              INV_ERROR_FIFO_READ_COUNT
- *          - (65)              INV_ERROR_FIFO_READ_DATA
- *          - (72)              INV_ERROR_MEMORY_SET
- *          - (82)              INV_ERROR_LOG_MEMORY_ERROR
- *          - (83)              INV_ERROR_LOG_OUTPUT_ERROR
- *          - (92)              INV_ERROR_OS_BAD_PTR
- *          - (93)              INV_ERROR_OS_BAD_HANDLE
- *          - (94)              INV_ERROR_OS_CREATE_FAILED
- *          - (95)              INV_ERROR_OS_LOCK_FAILED
- *          - (102)             INV_ERROR_COMPASS_DATA_OVERFLOW
- *          - (103)             INV_ERROR_COMPASS_DATA_UNDERFLOW
- *          - (104)             INV_ERROR_COMPASS_DATA_NOT_READY
- *          - (105)             INV_ERROR_COMPASS_DATA_ERROR
- *          - (107)             INV_ERROR_CALIBRATION_LOAD
- *          - (108)             INV_ERROR_CALIBRATION_STORE
- *          - (109)             INV_ERROR_CALIBRATION_LEN
- *          - (110)             INV_ERROR_CALIBRATION_CHECKSUM
- *          - (111)             INV_ERROR_ACCEL_DATA_OVERFLOW
- *          - (112)             INV_ERROR_ACCEL_DATA_UNDERFLOW
- *          - (113)             INV_ERROR_ACCEL_DATA_NOT_READY
- *          - (114)             INV_ERROR_ACCEL_DATA_ERROR
- *
- *          The available warning codes and their associated values are:
- *          - (115)             INV_WARNING_MOTION_RACE
- *          - (116)             INV_WARNING_QUAT_TRASHED
- *
- *  @{
- *      @file mltypes.h
- *  @}
- */
-
-#ifndef MLTYPES_H
-#define MLTYPES_H
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#include <asm-generic/errno-base.h>
-#else
-#include "stdint_invensense.h"
-#include <errno.h>
-#endif
-#include <limits.h>
-
-#ifndef REMOVE_INV_ERROR_T
-/*---------------------------
- *    ML Types
- *--------------------------*/
-
-/**
- *  @struct inv_error_t mltypes.h "mltypes"
- *  @brief  The MPL Error Code return type.
- *
- *  @code
- *      typedef unsigned char inv_error_t;
- *  @endcode
- */
-//typedef unsigned char inv_error_t;
-typedef int inv_error_t;
-#endif
-
-typedef long long inv_time_t;
-
-#if !defined __GNUC__ && !defined __KERNEL__
-typedef int8_t   __s8;
-typedef int16_t  __s16;
-typedef int32_t  __s32;
-typedef int32_t  __s64;
-
-typedef uint8_t   __u8;
-typedef uint16_t  __u16;
-typedef uint32_t  __u32;
-typedef uint64_t  __u64;
-#elif !defined __KERNEL__
-#include <sys/types.h>
-#endif
-
-#ifndef __cplusplus
-#ifndef __KERNEL__
-typedef int_fast8_t bool;
-
-#ifndef false
-#define false 0
-#endif
-
-#ifndef true
-#define true 1
-#endif
-
-#endif
-#endif
-
-/*---------------------------
- *    ML Defines
- *--------------------------*/
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#ifndef __KERNEL__
-#ifndef ARRAY_SIZE
-/* Dimension of an array */
-#define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
-#endif
-#endif
-/* - ML Errors. - */
-#define ERROR_NAME(x)   (#x)
-#define ERROR_CHECK_FIRST(first, x) \
-	{ if (INV_SUCCESS == first) first = x; }
-
-#define INV_SUCCESS                       (0)
-/* Generic Error code.  Proprietary Error Codes only */
-#define INV_ERROR_BASE                    (0x20)
-#define INV_ERROR                         (INV_ERROR_BASE)
-
-/* Compatibility and other generic error codes */
-#define INV_ERROR_INVALID_PARAMETER             (EINVAL)
-#define INV_ERROR_FEATURE_NOT_ENABLED           (EPERM)
-#define INV_ERROR_FEATURE_NOT_IMPLEMENTED       (INV_ERROR_BASE + 4)
-#define INV_ERROR_DMP_NOT_STARTED               (INV_ERROR_BASE + 6)
-#define INV_ERROR_DMP_STARTED                   (INV_ERROR_BASE + 7)
-#define INV_ERROR_NOT_OPENED                    (INV_ERROR_BASE + 8)
-#define INV_ERROR_OPENED                        (INV_ERROR_BASE + 9)
-#define INV_ERROR_INVALID_MODULE                (ENODEV)
-#define INV_ERROR_MEMORY_EXAUSTED               (ENOMEM)
-#define INV_ERROR_DIVIDE_BY_ZERO                (INV_ERROR_BASE + 12)
-#define INV_ERROR_ASSERTION_FAILURE             (INV_ERROR_BASE + 13)
-#define INV_ERROR_FILE_OPEN                     (INV_ERROR_BASE + 14)
-#define INV_ERROR_FILE_READ                     (INV_ERROR_BASE + 15)
-#define INV_ERROR_FILE_WRITE                    (INV_ERROR_BASE + 16)
-#define INV_ERROR_INVALID_CONFIGURATION         (INV_ERROR_BASE + 17)
-#define INV_ERROR_NOT_AUTHORIZED                (INV_ERROR_BASE + 18)
-
-/* Serial Communication */
-#define INV_ERROR_SERIAL_CLOSED                 (INV_ERROR_BASE + 20)
-#define INV_ERROR_SERIAL_OPEN_ERROR             (INV_ERROR_BASE + 21)
-#define INV_ERROR_SERIAL_READ                   (INV_ERROR_BASE + 22)
-#define INV_ERROR_SERIAL_WRITE                  (INV_ERROR_BASE + 23)
-#define INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED  (INV_ERROR_BASE + 24)
-
-/* SM = State Machine */
-#define INV_ERROR_SM_TRANSITION                 (INV_ERROR_BASE + 25)
-#define INV_ERROR_SM_IMPROPER_STATE             (INV_ERROR_BASE + 26)
-
-/* Fifo */
-#define INV_ERROR_FIFO_OVERFLOW                 (INV_ERROR_BASE + 30)
-#define INV_ERROR_FIFO_FOOTER                   (INV_ERROR_BASE + 31)
-#define INV_ERROR_FIFO_READ_COUNT               (INV_ERROR_BASE + 32)
-#define INV_ERROR_FIFO_READ_DATA                (INV_ERROR_BASE + 33)
-
-/* Memory & Registers, Set & Get */
-#define INV_ERROR_MEMORY_SET                    (INV_ERROR_BASE + 40)
-
-#define INV_ERROR_LOG_MEMORY_ERROR              (INV_ERROR_BASE + 50)
-#define INV_ERROR_LOG_OUTPUT_ERROR              (INV_ERROR_BASE + 51)
-
-/* OS interface errors */
-#define INV_ERROR_OS_BAD_PTR                    (INV_ERROR_BASE + 60)
-#define INV_ERROR_OS_BAD_HANDLE                 (INV_ERROR_BASE + 61)
-#define INV_ERROR_OS_CREATE_FAILED              (INV_ERROR_BASE + 62)
-#define INV_ERROR_OS_LOCK_FAILED                (INV_ERROR_BASE + 63)
-
-/* Compass errors */
-#define INV_ERROR_COMPASS_DATA_OVERFLOW         (INV_ERROR_BASE + 70)
-#define INV_ERROR_COMPASS_DATA_UNDERFLOW        (INV_ERROR_BASE + 71)
-#define INV_ERROR_COMPASS_DATA_NOT_READY        (INV_ERROR_BASE + 72)
-#define INV_ERROR_COMPASS_DATA_ERROR            (INV_ERROR_BASE + 73)
-
-/* Load/Store calibration */
-#define INV_ERROR_CALIBRATION_LOAD              (INV_ERROR_BASE + 75)
-#define INV_ERROR_CALIBRATION_STORE             (INV_ERROR_BASE + 76)
-#define INV_ERROR_CALIBRATION_LEN               (INV_ERROR_BASE + 77)
-#define INV_ERROR_CALIBRATION_CHECKSUM          (INV_ERROR_BASE + 78)
-
-/* Accel errors */
-#define INV_ERROR_ACCEL_DATA_OVERFLOW           (INV_ERROR_BASE + 79)
-#define INV_ERROR_ACCEL_DATA_UNDERFLOW          (INV_ERROR_BASE + 80)
-#define INV_ERROR_ACCEL_DATA_NOT_READY          (INV_ERROR_BASE + 81)
-#define INV_ERROR_ACCEL_DATA_ERROR              (INV_ERROR_BASE + 82)
-
-/* No Motion Warning States */
-#define INV_WARNING_MOTION_RACE                 (INV_ERROR_BASE + 83)
-#define INV_WARNING_QUAT_TRASHED                (INV_ERROR_BASE + 84)
-#define INV_WARNING_GYRO_MAG                    (INV_ERROR_BASE + 85)
-
-#define INV_WARNING_SEMAPHORE_TIMEOUT           (INV_ERROR_BASE + 86)
-
-
-/* For Linux coding compliance */
-#ifndef __KERNEL__
-#define EXPORT_SYMBOL(x)
-#endif
-
-#endif				/* MLTYPES_H */
diff --git a/60xx/libsensors_iio/software/core/driver/include/stdint_invensense.h b/60xx/libsensors_iio/software/core/driver/include/stdint_invensense.h
deleted file mode 100644
index b8c2511..0000000
--- a/60xx/libsensors_iio/software/core/driver/include/stdint_invensense.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-#ifndef STDINT_INVENSENSE_H
-#define STDINT_INVENSENSE_H
-
-#ifndef WIN32
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#else
-
-#include <windows.h>
-
-typedef signed char int8_t;
-typedef short int16_t;
-typedef long int32_t;
-typedef long long int64_t;
-
-typedef unsigned char uint8_t;
-typedef unsigned short uint16_t;
-typedef unsigned long uint32_t;
-typedef unsigned long long uint64_t;
-
-typedef int int_fast8_t;
-typedef int int_fast16_t;
-typedef long int_fast32_t;
-
-typedef unsigned int uint_fast8_t;
-typedef unsigned int uint_fast16_t;
-typedef unsigned long uint_fast32_t;
-
-#endif
-
-#endif // STDINT_INVENSENSE_H
diff --git a/60xx/libsensors_iio/software/core/mllite/build/android/libmllite.so b/60xx/libsensors_iio/software/core/mllite/build/android/libmllite.so
deleted file mode 100755
index 9bdd5bc..0000000
--- a/60xx/libsensors_iio/software/core/mllite/build/android/libmllite.so
+++ /dev/null
Binary files differ
diff --git a/60xx/libsensors_iio/software/core/mllite/build/android/shared.mk b/60xx/libsensors_iio/software/core/mllite/build/android/shared.mk
deleted file mode 100644
index 1418450..0000000
--- a/60xx/libsensors_iio/software/core/mllite/build/android/shared.mk
+++ /dev/null
@@ -1,87 +0,0 @@
-MLLITE_LIB_NAME = mllite
-LIBRARY = $(LIB_PREFIX)$(MLLITE_LIB_NAME).$(SHARED_LIB_EXT)
-
-MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
-
-CROSS ?= $(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
-COMP  ?= $(CROSS)gcc
-LINK  ?= $(CROSS)gcc 
-
-OBJFOLDER = $(CURDIR)/obj
-
-INV_ROOT = ../../../../..
-MLLITE_DIR  = $(INV_ROOT)/software/core/mllite
-
-include $(INV_ROOT)/software/build/android/common.mk
-
-CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
-CFLAGS += -Wall
-CFLAGS += -fpic
-CFLAGS += -nostdlib
-CFLAGS += -DNDEBUG
-CFLAGS += -D_REENTRANT
-CFLAGS += -DLINUX
-CFLAGS += -DANDROID
-CFLAGS += -mthumb-interwork
-CFLAGS += -fno-exceptions
-CFLAGS += -ffunction-sections
-CFLAGS += -funwind-tables
-CFLAGS += -fstack-protector
-CFLAGS += -fno-short-enums
-CFLAGS += -fmessage-length=0
-CFLAGS += -I$(MLLITE_DIR)
-CFLAGS += -I$(INV_ROOT)/simple_apps/common
-CFLAGS += $(INV_INCLUDES)
-CFLAGS += $(INV_DEFINES)
-
-LLINK  = -lc 
-LLINK += -lm 
-LLINK += -lutils 
-LLINK += -lcutils 
-LLINK += -lgcc 
-LLINK += -ldl
-
-LFLAGS += $(CMDLINE_LFLAGS)
-LFLAGS += -shared 
-LFLAGS += -Wl,-soname,$(LIBRARY)
-LFLAGS += -Wl,-shared,-Bsymbolic
-LFLAGS += $(ANDROID_LINK)
-LFLAGS += -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
-
-####################################################################################################
-## sources
-
-#INV_SOURCES provided by Makefile.filelist
-include ../filelist.mk
-
-INV_OBJS := $(addsuffix .o,$(INV_SOURCES))
-INV_OBJS_DST = $(addprefix $(OBJFOLDER)/,$(addsuffix .o, $(notdir $(INV_SOURCES))))
-
-####################################################################################################
-## rules
-
-.PHONY: all mllite clean cleanall makefiles
-
-all: mllite
-
-mllite: $(LIBRARY) $(MK_NAME)
-
-$(LIBRARY) : $(OBJFOLDER) $(INV_OBJS_DST) $(MK_NAME)
-	@$(call echo_in_colors, "\n<linking $(LIBRARY) with objects $(INV_OBJS_DST)\n")
-	$(LINK) $(LFLAGS) -o $(LIBRARY) $(INV_OBJS_DST) $(LLINK) $(INV_LIBS) $(LLINK)
-
-$(OBJFOLDER) :
-	@$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
-	mkdir obj
-
-$(INV_OBJS_DST) : $(OBJFOLDER)/%.c.o : %.c  $(MK_NAME)
-	@$(call echo_in_colors, "\n<compile $< to $(OBJFOLDER)/$(notdir $@)>\n")
-	$(COMP) $(ANDROID_INCLUDES) $(KERNEL_INCLUDES) $(CFLAGS) -o $@ -c $<
-
-clean : 
-	rm -fR $(OBJFOLDER)
-
-cleanall : 
-	rm -fR $(LIBRARY) $(OBJFOLDER)
-
diff --git a/60xx/libsensors_iio/software/core/mllite/build/filelist.mk b/60xx/libsensors_iio/software/core/mllite/build/filelist.mk
deleted file mode 100644
index 011120c..0000000
--- a/60xx/libsensors_iio/software/core/mllite/build/filelist.mk
+++ /dev/null
@@ -1,42 +0,0 @@
-#### filelist.mk for mllite ####
-
-# headers only
-HEADERS := $(MLLITE_DIR)/invensense.h
-
-# headers for sources
-HEADERS += $(MLLITE_DIR)/data_builder.h
-HEADERS += $(MLLITE_DIR)/hal_outputs.h
-HEADERS += $(MLLITE_DIR)/message_layer.h
-HEADERS += $(MLLITE_DIR)/ml_math_func.h
-HEADERS += $(MLLITE_DIR)/mpl.h
-HEADERS += $(MLLITE_DIR)/results_holder.h
-HEADERS += $(MLLITE_DIR)/start_manager.h
-HEADERS += $(MLLITE_DIR)/storage_manager.h
-
-# headers (linux specific)
-HEADERS += $(MLLITE_DIR)/linux/mlos.h
-HEADERS += $(MLLITE_DIR)/linux/ml_stored_data.h
-HEADERS += $(MLLITE_DIR)/linux/ml_load_dmp.h
-HEADERS += $(MLLITE_DIR)/linux/ml_sysfs_helper.h
-
-# sources
-SOURCES := $(MLLITE_DIR)/data_builder.c
-SOURCES += $(MLLITE_DIR)/hal_outputs.c
-SOURCES += $(MLLITE_DIR)/message_layer.c
-SOURCES += $(MLLITE_DIR)/ml_math_func.c
-SOURCES += $(MLLITE_DIR)/mpl.c
-SOURCES += $(MLLITE_DIR)/results_holder.c
-SOURCES += $(MLLITE_DIR)/start_manager.c
-SOURCES += $(MLLITE_DIR)/storage_manager.c
-
-# sources (linux specific)
-SOURCES += $(MLLITE_DIR)/linux/mlos_linux.c
-SOURCES += $(MLLITE_DIR)/linux/ml_stored_data.c
-SOURCES += $(MLLITE_DIR)/linux/ml_load_dmp.c
-SOURCES += $(MLLITE_DIR)/linux/ml_sysfs_helper.c
-
-
-INV_SOURCES += $(SOURCES)
-
-VPATH += $(MLLITE_DIR) $(MLLITE_DIR)/linux
-
diff --git a/60xx/libsensors_iio/software/core/mllite/data_builder.c b/60xx/libsensors_iio/software/core/mllite/data_builder.c
deleted file mode 100644
index 0aa418d..0000000
--- a/60xx/libsensors_iio/software/core/mllite/data_builder.c
+++ /dev/null
@@ -1,1228 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
- 
-/**
- *   @defgroup  Data_Builder data_builder
- *   @brief     Motion Library - Data Builder
- *              Constructs and Creates the data for MPL
- *
- *   @{
- *       @file data_builder.c
- *       @brief Data Builder.
- */
-
-#undef MPL_LOG_NDEBUG
-#define MPL_LOG_NDEBUG 0 /* Use 0 to turn on MPL_LOGV output */
-
-#include <string.h>
-
-#include "ml_math_func.h"
-#include "data_builder.h"
-#include "mlmath.h"
-#include "storage_manager.h"
-#include "message_layer.h"
-#include "results_holder.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL"
-
-typedef inv_error_t (*inv_process_cb_func)(struct inv_sensor_cal_t *data);
-
-struct process_t {
-    inv_process_cb_func func;
-    int priority;
-    int data_required;
-};
-
-struct inv_db_save_t {
-    /** Compass Bias in Chip Frame in Hardware units scaled by 2^16 */
-    long compass_bias[3];
-    /** Gyro Bias in Chip Frame in Hardware units scaled by 2^16 */
-    long gyro_bias[3];
-    /** Temperature when *gyro_bias was stored. */
-    long gyro_temp;
-    /** Accel Bias in Chip Frame in Hardware units scaled by 2^16 */
-    long accel_bias[3];
-    /** Temperature when accel bias was stored. */
-    long accel_temp;
-    long gyro_temp_slope[3];
-    /** Sensor Accuracy */
-    int gyro_accuracy;
-    int accel_accuracy;
-    int compass_accuracy;
-};
-
-struct inv_data_builder_t {
-    int num_cb;
-    struct process_t process[INV_MAX_DATA_CB];
-    struct inv_db_save_t save;
-    int compass_disturbance;
-    int mode;
-#ifdef INV_PLAYBACK_DBG
-    int debug_mode;
-    int last_mode;
-    FILE *file;
-#endif
-};
-
-void inv_apply_calibration(struct inv_single_sensor_t *sensor, const long *bias);
-static void inv_set_contiguous(void);
-
-static struct inv_data_builder_t inv_data_builder;
-static struct inv_sensor_cal_t sensors;
-
-/** Change this key if the data being stored by this file changes */
-#define INV_DB_SAVE_KEY 53395
-
-#ifdef INV_PLAYBACK_DBG
-
-/** Turn on data logging to allow playback of same scenario at a later time.
-* @param[in] file File to write to, must be open.
-*/
-void inv_turn_on_data_logging(FILE *file)
-{
-    MPL_LOGV("input data logging started\n");
-    inv_data_builder.file = file;
-    inv_data_builder.debug_mode = RD_RECORD;
-}
-
-/** Turn off data logging to allow playback of same scenario at a later time.
-* File passed to inv_turn_on_data_logging() must be closed after calling this.
-*/
-void inv_turn_off_data_logging()
-{
-    MPL_LOGV("input data logging stopped\n");
-    inv_data_builder.debug_mode = RD_NO_DEBUG;
-    inv_data_builder.file = NULL;
-}
-#endif
-
-/** This function receives the data that was stored in non-volatile memory between power off */
-static inv_error_t inv_db_load_func(const unsigned char *data)
-{
-    memcpy(&inv_data_builder.save, data, sizeof(inv_data_builder.save));
-    // copy in the saved accuracy in the actual sensors accuracy
-    sensors.gyro.accuracy = inv_data_builder.save.gyro_accuracy;
-    sensors.accel.accuracy = inv_data_builder.save.accel_accuracy;
-    sensors.compass.accuracy = inv_data_builder.save.compass_accuracy;
-    // TODO
-    if (sensors.compass.accuracy == 3) {
-        inv_set_compass_bias_found(1);
-    }
-    return INV_SUCCESS;
-}
-
-/** This function returns the data to be stored in non-volatile memory between power off */
-static inv_error_t inv_db_save_func(unsigned char *data)
-{
-    memcpy(data, &inv_data_builder.save, sizeof(inv_data_builder.save));
-    return INV_SUCCESS;
-}
-
-/** Initialize the data builder
-*/
-inv_error_t inv_init_data_builder(void)
-{
-    /* TODO: Hardcode temperature scale/offset here. */
-    memset(&inv_data_builder, 0, sizeof(inv_data_builder));
-    memset(&sensors, 0, sizeof(sensors));
-    return inv_register_load_store(inv_db_load_func, inv_db_save_func,
-                                   sizeof(inv_data_builder.save),
-                                   INV_DB_SAVE_KEY);
-}
-
-/** Gyro sensitivity.
-* @return A scale factor to convert device units to degrees per second scaled by 2^16
-* such that degrees_per_second  = device_units * sensitivity / 2^30. Typically
-* it works out to be the maximum rate * 2^15.
-*/
-long inv_get_gyro_sensitivity()
-{
-    return sensors.gyro.sensitivity;
-}
-
-/** Accel sensitivity.
-* @return A scale factor to convert device units to g's scaled by 2^16
-* such that g_s  = device_units * sensitivity / 2^30. Typically
-* it works out to be the maximum accel value in g's * 2^15.
-*/
-long inv_get_accel_sensitivity(void)
-{
-    return sensors.accel.sensitivity;
-}
-
-/** Compass sensitivity.
-* @return A scale factor to convert device units to micro Tesla scaled by 2^16
-* such that uT  = device_units * sensitivity / 2^30. Typically
-* it works out to be the maximum uT * 2^15.
-*/
-long inv_get_compass_sensitivity(void)
-{
-    return sensors.compass.sensitivity;
-}
-
-/** Sets orientation and sensitivity field for a sensor.
-* @param[out] sensor Structure to apply settings to
-* @param[in] orientation Orientation description of how part is mounted.
-* @param[in] sensitivity A Scale factor to convert from hardware units to
-*            standard units (dps, uT, g).
-*/
-void set_sensor_orientation_and_scale(struct inv_single_sensor_t *sensor,
-                                 int orientation, long sensitivity)
-{
-    sensor->sensitivity = sensitivity;
-    sensor->orientation = orientation;
-}
-
-/** Sets the Orientation and Sensitivity of the gyro data.
-* @param[in] orientation A scalar defining the transformation from chip mounting
-*            to the body frame. The function inv_orientation_matrix_to_scalar()
-*            can convert the transformation matrix to this scalar and describes the
-*            scalar in further detail.
-* @param[in] sensitivity A scale factor to convert device units to degrees per second scaled by 2^16
-*            such that degrees_per_second  = device_units * sensitivity / 2^30. Typically
-*            it works out to be the maximum rate * 2^15.
-*/
-void inv_set_gyro_orientation_and_scale(int orientation, long sensitivity)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_G_ORIENT;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&orientation, sizeof(orientation), 1, inv_data_builder.file);
-        fwrite(&sensitivity, sizeof(sensitivity), 1, inv_data_builder.file);
-    }
-#endif
-    set_sensor_orientation_and_scale(&sensors.gyro, orientation,
-                                     sensitivity);
-}
-
-/** Set Gyro Sample rate in micro seconds.
-* @param[in] sample_rate_us Set Gyro Sample rate in us
-*/
-void inv_set_gyro_sample_rate(long sample_rate_us)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_G_SAMPLE_RATE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&sample_rate_us, sizeof(sample_rate_us), 1, inv_data_builder.file);
-    }
-#endif
-    sensors.gyro.sample_rate_us = sample_rate_us;
-    sensors.gyro.sample_rate_ms = sample_rate_us / 1000;
-    if (sensors.gyro.bandwidth == 0) {
-        sensors.gyro.bandwidth = (int)(1000000L / sample_rate_us);
-    }
-}
-
-/** Set Accel Sample rate in micro seconds.
-* @param[in] sample_rate_us Set Accel Sample rate in us
-*/
-void inv_set_accel_sample_rate(long sample_rate_us)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_A_SAMPLE_RATE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&sample_rate_us, sizeof(sample_rate_us), 1, inv_data_builder.file);
-    }
-#endif
-    sensors.accel.sample_rate_us = sample_rate_us;
-    sensors.accel.sample_rate_ms = sample_rate_us / 1000;
-    if (sensors.accel.bandwidth == 0) {
-        sensors.accel.bandwidth = (int)(1000000L / sample_rate_us);
-    }
-}
-
-/** Pick the smallest non-negative number. Priority to td1 on equal
-* If both are negative, return the largest.
-*/
-static int inv_pick_best_time_difference(long td1, long td2)
-{
-    if (td1 >= 0) {
-        if (td2 >= 0) {
-            if (td1 <= td2) {
-                // td1
-                return 0;
-            } else {
-                // td2
-                return 1;
-            }
-        } else {
-            // td1
-            return 0;
-        }
-    } else if (td2 >= 0) {
-        // td2
-        return 1;
-    } else {
-        // Both are negative
-        if (td1 >= td2) {
-            // td1
-            return 0;
-        } else {
-            // td2
-            return 1;
-        }
-    }
-}
-
-/** Returns timestame based upon a raw sensor, and returns if that sample has a new piece of data.
-*/
-static int inv_raw_sensor_timestamp(int sensor_number, inv_time_t *ts)
-{
-    int status = 0;
-    switch (sensor_number) {
-    case 0: // Quat
-        *ts = sensors.quat.timestamp;
-        if (inv_data_builder.mode & INV_QUAT_NEW)
-            if (sensors.quat.timestamp_prev != sensors.quat.timestamp)
-                status = 1;
-        return status;
-    case 1: // Gyro
-        *ts = sensors.gyro.timestamp;
-        if (inv_data_builder.mode & INV_GYRO_NEW)
-            if (sensors.gyro.timestamp_prev != sensors.gyro.timestamp)
-                status = 1;
-        return status;
-    case 2: // Accel
-        *ts = sensors.accel.timestamp;
-        if (inv_data_builder.mode & INV_ACCEL_NEW)
-            if (sensors.accel.timestamp_prev != sensors.accel.timestamp)
-                status = 1;
-        return status;
-   case 3: // Compass
-        *ts = sensors.compass.timestamp;
-        if (inv_data_builder.mode & INV_MAG_NEW)
-            if (sensors.compass.timestamp_prev != sensors.compass.timestamp)
-                status = 1;
-        return status;
-    default:
-        *ts = 0;
-        return 0;
-    }
-    return 0;
-}
-
-/** Gets best timestamp and if there is a new piece of data for a 9-axis sensor combination.
-* It does this by finding a raw sensor that has the closest sample rate that is at least as
-* often desired. It also returns if that raw sensor has a new piece of data.
-* Priority is Quaternion-6axis, Quaternion 3-axis, Gyro, Accel
-* @return Returns 1, if the raw sensor being attached has new data, 0 otherwise.
-*/
-int inv_get_6_axis_gyro_accel_timestamp(long sample_rate_us, inv_time_t *ts)
-{
-    long td[2];
-    int idx;
-
-    if ((sensors.quat.status & (INV_QUAT_6AXIS | INV_SENSOR_ON)) == (INV_QUAT_6AXIS | INV_SENSOR_ON)) {
-        // Sensor number is 0 (Quat)
-        return inv_raw_sensor_timestamp(0, ts);
-    } else if ((sensors.accel.status & INV_SENSOR_ON) == 0) {
-        return 0; // Accel must be on or 6-axis quat must be on
-    }
-
-    // At this point, we know accel is on. Check if 3-axis quat is on
-    td[0] = sample_rate_us - sensors.quat.sample_rate_us;
-    td[1] = sample_rate_us - sensors.accel.sample_rate_us;
-    if ((sensors.quat.status & (INV_QUAT_3AXIS | INV_SENSOR_ON)) == (INV_QUAT_3AXIS | INV_SENSOR_ON)) {
-        idx = inv_pick_best_time_difference(td[0], td[1]);
-        idx *= 2;
-        // 0 = quat, 3=accel
-        return inv_raw_sensor_timestamp(idx, ts);
-    }
-
-    // No Quaternion data from outside, Gyro must be on
-    if ((sensors.gyro.status & INV_SENSOR_ON) == 0) {
-        return 0; // Gyro must be on
-    }
-
-    td[0] = sample_rate_us - sensors.gyro.sample_rate_us;
-    idx = inv_pick_best_time_difference(td[0], td[1]);
-    idx *= 2; // 0=gyro 2=accel
-    idx++;
-    // 1 = gyro, 3=accel
-    return inv_raw_sensor_timestamp(idx, ts);
-}
-
-/** Set Compass Sample rate in micro seconds.
-* @param[in] sample_rate_us Set Gyro Sample rate in micro seconds.
-*/
-void inv_set_compass_sample_rate(long sample_rate_us)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_C_SAMPLE_RATE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&sample_rate_us, sizeof(sample_rate_us), 1, inv_data_builder.file);
-    }
-#endif
-    sensors.compass.sample_rate_us = sample_rate_us;
-    sensors.compass.sample_rate_ms = sample_rate_us / 1000;
-    if (sensors.compass.bandwidth == 0) {
-        sensors.compass.bandwidth = (int)(1000000L / sample_rate_us);
-    }
-}
-
-void inv_get_gyro_sample_rate_ms(long *sample_rate_ms)
-{
-	*sample_rate_ms = sensors.gyro.sample_rate_ms;
-}
-
-void inv_get_accel_sample_rate_ms(long *sample_rate_ms)
-{
-	*sample_rate_ms = sensors.accel.sample_rate_ms;
-}
-
-void inv_get_compass_sample_rate_ms(long *sample_rate_ms)
-{
-	*sample_rate_ms = sensors.compass.sample_rate_ms;
-}
-
-/** Set Quat Sample rate in micro seconds.
-* @param[in] sample_rate_us Set Quat Sample rate in us
-*/
-void inv_set_quat_sample_rate(long sample_rate_us)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_Q_SAMPLE_RATE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&sample_rate_us, sizeof(sample_rate_us), 1, inv_data_builder.file);
-    }
-#endif
-    sensors.quat.sample_rate_us = sample_rate_us;
-    sensors.quat.sample_rate_ms = sample_rate_us / 1000;
-}
-
-/** Set Gyro Bandwidth in Hz
-* @param[in] bandwidth_hz Gyro bandwidth in Hz
-*/
-void inv_set_gyro_bandwidth(int bandwidth_hz)
-{
-    sensors.gyro.bandwidth = bandwidth_hz;
-}
-
-/** Set Accel Bandwidth in Hz
-* @param[in] bandwidth_hz Gyro bandwidth in Hz
-*/
-void inv_set_accel_bandwidth(int bandwidth_hz)
-{
-    sensors.accel.bandwidth = bandwidth_hz;
-}
-
-/** Set Compass Bandwidth in Hz
-* @param[in]  bandwidth_hz Gyro bandwidth in Hz
-*/
-void inv_set_compass_bandwidth(int bandwidth_hz)
-{
-    sensors.compass.bandwidth = bandwidth_hz;
-}
-
-/** Helper function stating whether the compass is on or off.
- * @return TRUE if compass if on, 0 if compass if off
-*/
-int inv_get_compass_on()
-{
-    return (sensors.compass.status & INV_SENSOR_ON) == INV_SENSOR_ON;
-}
-
-/** Helper function stating whether the gyro is on or off.
- * @return TRUE if gyro if on, 0 if gyro if off
-*/
-int inv_get_gyro_on()
-{
-    return (sensors.gyro.status & INV_SENSOR_ON) == INV_SENSOR_ON;
-}
-
-/** Helper function stating whether the acceleromter is on or off.
- * @return TRUE if accel if on, 0 if accel if off
-*/
-int inv_get_accel_on()
-{
-    return (sensors.accel.status & INV_SENSOR_ON) == INV_SENSOR_ON;
-}
-
-/** Get last timestamp across all 3 sensors that are on.
-* This find out which timestamp has the largest value for sensors that are on.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_time_t inv_get_last_timestamp()
-{
-    inv_time_t timestamp = 0;
-    if (sensors.accel.status & INV_SENSOR_ON) {
-        timestamp = sensors.accel.timestamp;
-    }
-    if (sensors.gyro.status & INV_SENSOR_ON) {
-        if (timestamp < sensors.gyro.timestamp) {
-            timestamp = sensors.gyro.timestamp;
-        }
-    }
-    if (sensors.compass.status & INV_SENSOR_ON) {
-        if (timestamp < sensors.compass.timestamp) {
-            timestamp = sensors.compass.timestamp;
-        }
-    }
-    if (sensors.temp.status & INV_SENSOR_ON) {
-        if (timestamp < sensors.temp.timestamp)
-            timestamp = sensors.temp.timestamp;
-    }
-    return timestamp;
-}
-
-/** Sets the orientation and sensitivity of the gyro data.
-* @param[in] orientation A scalar defining the transformation from chip mounting
-*            to the body frame. The function inv_orientation_matrix_to_scalar()
-*            can convert the transformation matrix to this scalar and describes the
-*            scalar in further detail.
-* @param[in] sensitivity A scale factor to convert device units to g's
-*            such that g's = device_units * sensitivity / 2^30. Typically
-*            it works out to be the maximum g_value * 2^15.
-*/
-void inv_set_accel_orientation_and_scale(int orientation, long sensitivity)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_A_ORIENT;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&orientation, sizeof(orientation), 1, inv_data_builder.file);
-        fwrite(&sensitivity, sizeof(sensitivity), 1, inv_data_builder.file);
-    }
-#endif
-    set_sensor_orientation_and_scale(&sensors.accel, orientation,
-                                     sensitivity);
-}
-
-/** Sets the Orientation and Sensitivity of the gyro data.
-* @param[in] orientation A scalar defining the transformation from chip mounting
-*            to the body frame. The function inv_orientation_matrix_to_scalar()
-*            can convert the transformation matrix to this scalar and describes the
-*            scalar in further detail.
-* @param[in] sensitivity A scale factor to convert device units to uT
-*            such that uT = device_units * sensitivity / 2^30. Typically
-*            it works out to be the maximum uT_value * 2^15.
-*/
-void inv_set_compass_orientation_and_scale(int orientation, long sensitivity)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_C_ORIENT;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&orientation, sizeof(orientation), 1, inv_data_builder.file);
-        fwrite(&sensitivity, sizeof(sensitivity), 1, inv_data_builder.file);
-    }
-#endif
-    set_sensor_orientation_and_scale(&sensors.compass, orientation, sensitivity);
-}
-
-void inv_matrix_vector_mult(const long *A, const long *x, long *y)
-{
-    y[0] = inv_q30_mult(A[0], x[0]) + inv_q30_mult(A[1], x[1]) + inv_q30_mult(A[2], x[2]);
-    y[1] = inv_q30_mult(A[3], x[0]) + inv_q30_mult(A[4], x[1]) + inv_q30_mult(A[5], x[2]);
-    y[2] = inv_q30_mult(A[6], x[0]) + inv_q30_mult(A[7], x[1]) + inv_q30_mult(A[8], x[2]);
-}
-
-/** Takes raw data stored in the sensor, removes bias, and converts it to
-* calibrated data in the body frame. Also store raw data for body frame.
-* @param[in,out] sensor structure to modify
-* @param[in] bias bias in the mounting frame, in hardware units scaled by
-*                 2^16. Length 3.
-*/
-void inv_apply_calibration(struct inv_single_sensor_t *sensor, const long *bias)
-{
-    long raw32[3];
-
-    // Convert raw to calibrated
-    raw32[0] = (long)sensor->raw[0] << 15;
-    raw32[1] = (long)sensor->raw[1] << 15;
-    raw32[2] = (long)sensor->raw[2] << 15;
-
-    inv_convert_to_body_with_scale(sensor->orientation, sensor->sensitivity << 1, raw32, sensor->raw_scaled);
-
-    raw32[0] -= bias[0] >> 1;
-    raw32[1] -= bias[1] >> 1;
-    raw32[2] -= bias[2] >> 1;
-
-    inv_convert_to_body_with_scale(sensor->orientation, sensor->sensitivity << 1, raw32, sensor->calibrated);
-
-    sensor->status |= INV_CALIBRATED;
-}
-
-/** Returns the current bias for the compass
-* @param[out] bias Compass bias in hardware units scaled by 2^16. In mounting frame.
-*             Length 3.
-*/
-void inv_get_compass_bias(long *bias)
-{
-    if (bias != NULL) {
-        memcpy(bias, inv_data_builder.save.compass_bias, sizeof(inv_data_builder.save.compass_bias));
-    }
-}
-
-void inv_set_compass_bias(const long *bias, int accuracy)
-{
-    if (memcmp(inv_data_builder.save.compass_bias, bias, sizeof(inv_data_builder.save.compass_bias))) {
-        memcpy(inv_data_builder.save.compass_bias, bias, sizeof(inv_data_builder.save.compass_bias));
-        inv_apply_calibration(&sensors.compass, inv_data_builder.save.compass_bias);
-    }
-    sensors.compass.accuracy = accuracy;
-    inv_data_builder.save.compass_accuracy = accuracy;
-    inv_set_message(INV_MSG_NEW_CB_EVENT, INV_MSG_NEW_CB_EVENT, 0);
-}
-
-/** Set the state of a compass disturbance
-* @param[in] dist 1=disturbance, 0=no disturbance
-*/
-void inv_set_compass_disturbance(int dist)
-{
-    inv_data_builder.compass_disturbance = dist;
-}
-
-int inv_get_compass_disturbance(void) {
-    return inv_data_builder.compass_disturbance;
-}
-/** Sets the accel bias.
-* @param[in] bias Accel bias, length 3. In HW units scaled by 2^16 in body frame
-* @param[in] accuracy Accuracy rating from 0 to 3, with 3 being most accurate.
-*/
-void inv_set_accel_bias(const long *bias, int accuracy)
-{
-    if (bias) {
-        if (memcmp(inv_data_builder.save.accel_bias, bias, sizeof(inv_data_builder.save.accel_bias))) {
-            memcpy(inv_data_builder.save.accel_bias, bias, sizeof(inv_data_builder.save.accel_bias));
-            inv_apply_calibration(&sensors.accel, inv_data_builder.save.accel_bias);
-        }
-    }
-    sensors.accel.accuracy = accuracy;
-    inv_data_builder.save.accel_accuracy = accuracy;
-    inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
-}
-
-/** Sets the accel accuracy.
-* @param[in] accuracy Accuracy rating from 0 to 3, with 3 being most accurate.
-*/
-void inv_set_accel_accuracy(int accuracy)
-{
-    sensors.accel.accuracy = accuracy;
-    inv_data_builder.save.accel_accuracy = accuracy;
-    inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
-}
-
-/** Sets the accel bias with control over which axis.
-* @param[in] bias Accel bias, length 3. In HW units scaled by 2^16 in body frame
-* @param[in] accuracy Accuracy rating from 0 to 3, with 3 being most accurate.
-* @param[in] mask Mask to select axis to apply bias set.
-*/
-void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask)
-{
-    if (bias) {
-        if (mask & 1){
-            inv_data_builder.save.accel_bias[0] = bias[0];
-        }
-        if (mask & 2){
-            inv_data_builder.save.accel_bias[1] = bias[1];
-        }
-        if (mask & 4){
-            inv_data_builder.save.accel_bias[2] = bias[2];
-        }
-
-        inv_apply_calibration(&sensors.accel, inv_data_builder.save.accel_bias);
-    }
-    sensors.accel.accuracy = accuracy;
-    inv_data_builder.save.accel_accuracy = accuracy;
-    inv_set_message(INV_MSG_NEW_AB_EVENT, INV_MSG_NEW_AB_EVENT, 0);
-}
-
-
-/** Sets the gyro bias
-* @param[in] bias Gyro bias in hardware units scaled by 2^16. In chip mounting frame.
-*            Length 3.
-* @param[in] accuracy Accuracy of bias. 0 = least accurate, 3 = most accurate.
-*/
-void inv_set_gyro_bias(const long *bias, int accuracy)
-{
-    if (bias != NULL) {
-        if (memcmp(inv_data_builder.save.gyro_bias, bias, sizeof(inv_data_builder.save.gyro_bias))) {
-            memcpy(inv_data_builder.save.gyro_bias, bias, sizeof(inv_data_builder.save.gyro_bias));
-            inv_apply_calibration(&sensors.gyro, inv_data_builder.save.gyro_bias);
-        }
-    }
-    sensors.gyro.accuracy = accuracy;
-    inv_data_builder.save.gyro_accuracy = accuracy;
-
-    /* TODO: What should we do if there's no temperature data? */
-    if (sensors.temp.calibrated[0])
-        inv_data_builder.save.gyro_temp = sensors.temp.calibrated[0];
-    else
-        /* Set to 27 deg C for now until we've got a better solution. */
-        inv_data_builder.save.gyro_temp = 1769472L;
-    inv_set_message(INV_MSG_NEW_GB_EVENT, INV_MSG_NEW_GB_EVENT, 0);
-}
-
-/* TODO: Add this information to inv_sensor_cal_t */
-/** 
- *  Get the gyro biases and temperature record from MPL 
- *  @param[in] bias 
- *              Gyro bias in hardware units scaled by 2^16. 
- *              In chip mounting frame.
- *              Length 3.
- *  @param[in] temp
- *              Tempearature in degrees C. 
- */
-void inv_get_gyro_bias(long *bias, long *temp)
-{
-    if (bias != NULL)
-        memcpy(bias, inv_data_builder.save.gyro_bias,
-               sizeof(inv_data_builder.save.gyro_bias));
-    if (temp != NULL)
-        temp[0] = inv_data_builder.save.gyro_temp;
-}
-
-/** Get Accel Bias
-* @param[out] bias Accel bias where
-* @param[out] temp Temperature where 1 C = 2^16
-*/
-void inv_get_accel_bias(long *bias, long *temp)
-{
-    if (bias != NULL)
-        memcpy(bias, inv_data_builder.save.accel_bias,
-               sizeof(inv_data_builder.save.accel_bias));
-    if (temp != NULL)
-        temp[0] = inv_data_builder.save.accel_temp;
-}
-
-/** 
- *  Record new accel data for use when inv_execute_on_data() is called
- *  @param[in]  accel accel data. 
- *              Length 3. 
- *              Calibrated data is in m/s^2 scaled by 2^16 in body frame. 
- *              Raw data is in device units in chip mounting frame.
- *  @param[in]  status 
- *              Lower 2 bits are the accuracy, with 0 being inaccurate, and 3 
- *              being most accurate.
- *              The upper bit INV_CALIBRATED, is set if the data was calibrated 
- *              outside MPL and it is not set if the data being passed is raw. 
- *              Raw data should be in device units, typically in a 16-bit range.
- *  @param[in]  timestamp 
- *              Monotonic time stamp, for Android it's in nanoseconds.
- *  @return     Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_build_accel(const long *accel, int status, inv_time_t timestamp)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_ACCEL;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(accel, sizeof(accel[0]), 3, inv_data_builder.file);
-        fwrite(&timestamp, sizeof(timestamp), 1, inv_data_builder.file);
-    }
-#endif
-
-    if ((status & INV_CALIBRATED) == 0) {
-        sensors.accel.raw[0] = (short)accel[0];
-        sensors.accel.raw[1] = (short)accel[1];
-        sensors.accel.raw[2] = (short)accel[2];
-        sensors.accel.status |= INV_RAW_DATA;
-        inv_apply_calibration(&sensors.accel, inv_data_builder.save.accel_bias);
-    } else {
-        sensors.accel.calibrated[0] = accel[0];
-        sensors.accel.calibrated[1] = accel[1];
-        sensors.accel.calibrated[2] = accel[2];
-        sensors.accel.status |= INV_CALIBRATED;
-        sensors.accel.accuracy = status & 3;
-        inv_data_builder.save.accel_accuracy = status & 3;
-    }
-    sensors.accel.status |= INV_NEW_DATA | INV_SENSOR_ON;
-    sensors.accel.timestamp_prev = sensors.accel.timestamp;
-    sensors.accel.timestamp = timestamp;
-
-    return INV_SUCCESS;
-}
-
-/** Record new gyro data and calls inv_execute_on_data() if previous
-* sample has not been processed.
-* @param[in] gyro Data is in device units. Length 3.
-* @param[in] timestamp Monotonic time stamp, for Android it's in nanoseconds.
-* @param[out] executed Set to 1 if data processing was done.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_build_gyro(const short *gyro, inv_time_t timestamp)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_GYRO;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(gyro, sizeof(gyro[0]), 3, inv_data_builder.file);
-        fwrite(&timestamp, sizeof(timestamp), 1, inv_data_builder.file);
-    }
-#endif
-
-    memcpy(sensors.gyro.raw, gyro, 3 * sizeof(short));
-    sensors.gyro.status |= INV_NEW_DATA | INV_RAW_DATA | INV_SENSOR_ON;
-    sensors.gyro.timestamp_prev = sensors.gyro.timestamp;
-    sensors.gyro.timestamp = timestamp;
-    inv_apply_calibration(&sensors.gyro, inv_data_builder.save.gyro_bias);
-
-    return INV_SUCCESS;
-}
-
-/** Record new compass data for use when inv_execute_on_data() is called
-* @param[in] compass Compass data, if it was calibrated outside MPL, the units are uT scaled by 2^16.
-*            Length 3.
-* @param[in] status Lower 2 bits are the accuracy, with 0 being inaccurate, and 3 being most accurate.
-*            The upper bit INV_CALIBRATED, is set if the data was calibrated outside MPL and it is
-*            not set if the data being passed is raw. Raw data should be in device units, typically
-*            in a 16-bit range.
-* @param[in] timestamp Monotonic time stamp, for Android it's in nanoseconds.
-* @param[out] executed Set to 1 if data processing was done.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_build_compass(const long *compass, int status,
-                              inv_time_t timestamp)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_COMPASS;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(compass, sizeof(compass[0]), 3, inv_data_builder.file);
-        fwrite(&timestamp, sizeof(timestamp), 1, inv_data_builder.file);
-    }
-#endif
-
-    if ((status & INV_CALIBRATED) == 0) {
-        sensors.compass.raw[0] = (short)compass[0];
-        sensors.compass.raw[1] = (short)compass[1];
-        sensors.compass.raw[2] = (short)compass[2];
-        inv_apply_calibration(&sensors.compass, inv_data_builder.save.compass_bias);
-        sensors.compass.status |= INV_RAW_DATA;
-    } else {
-        sensors.compass.calibrated[0] = compass[0];
-        sensors.compass.calibrated[1] = compass[1];
-        sensors.compass.calibrated[2] = compass[2];
-        sensors.compass.status |= INV_CALIBRATED;
-        sensors.compass.accuracy = status & 3;
-        inv_data_builder.save.compass_accuracy = status & 3;
-    }
-    sensors.compass.timestamp_prev = sensors.compass.timestamp;
-    sensors.compass.timestamp = timestamp;
-    sensors.compass.status |= INV_NEW_DATA | INV_SENSOR_ON;
-
-    return INV_SUCCESS;
-}
-
-/** Record new temperature data for use when inv_execute_on_data() is called.
- *  @param[in]  temp Temperature data in q16 format.
- *  @param[in]  timestamp   Monotonic time stamp; for Android it's in
- *                          nanoseconds.
-* @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_build_temp(const long temp, inv_time_t timestamp)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_TEMPERATURE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(&temp, sizeof(temp), 1, inv_data_builder.file);
-        fwrite(&timestamp, sizeof(timestamp), 1, inv_data_builder.file);
-    }
-#endif
-    sensors.temp.calibrated[0] = temp;
-    sensors.temp.status |= INV_NEW_DATA | INV_RAW_DATA | INV_SENSOR_ON;
-    sensors.temp.timestamp_prev = sensors.temp.timestamp;
-    sensors.temp.timestamp = timestamp;
-    /* TODO: Apply scale, remove offset. */
-
-    return INV_SUCCESS;
-}
-/** quaternion data
-* @param[in] quat Quaternion data. 2^30 = 1.0 or 2^14=1 for 16-bit data. 
-*                 Real part first. Length 4.  
-* @param[in] status number of axis, 16-bit or 32-bit
-* @param[in] timestamp
-* @param[in]  timestamp   Monotonic time stamp; for Android it's in
-*                         nanoseconds.
-* @param[out] executed Set to 1 if data processing was done.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_build_quat(const long *quat, int status, inv_time_t timestamp)
-{
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_QUAT;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-        fwrite(quat, sizeof(quat[0]), 4, inv_data_builder.file);
-        fwrite(&timestamp, sizeof(timestamp), 1, inv_data_builder.file);
-    }
-#endif
-    
-    memcpy(sensors.quat.raw, quat, sizeof(sensors.quat.raw));
-    sensors.quat.timestamp = timestamp;
-    sensors.quat.status |= INV_NEW_DATA | INV_RAW_DATA | INV_SENSOR_ON;
-    sensors.quat.status |= (INV_BIAS_APPLIED & status);
-
-    return INV_SUCCESS;
-}
-
-/** This should be called when the accel has been turned off. This is so
-* that we will know if the data is contiguous.
-*/
-void inv_accel_was_turned_off()
-{
-    sensors.accel.status = 0;
-}
-
-/** This should be called when the compass has been turned off. This is so
-* that we will know if the data is contiguous.
-*/
-void inv_compass_was_turned_off()
-{
-    sensors.compass.status = 0;
-}
-
-/** This should be called when the quaternion data from the DMP has been turned off. This is so
-* that we will know if the data is contiguous.
-*/
-void inv_quaternion_sensor_was_turned_off(void)
-{
-    sensors.quat.status = 0;
-}
-
-/** This should be called when the gyro has been turned off. This is so
-* that we will know if the data is contiguous.
-*/
-void inv_gyro_was_turned_off()
-{
-    sensors.gyro.status = 0;
-}
-
-/** This should be called when the temperature sensor has been turned off.
- *  This is so that we will know if the data is contiguous.
- */
-void inv_temperature_was_turned_off()
-{
-    sensors.temp.status = 0;
-}
-
-/** Registers to receive a callback when there is new sensor data.
-* @internal
-* @param[in] func Function pointer to receive callback when there is new sensor data
-* @param[in] priority Lower priority numbers receive a callback before larger numbers. All priority
-*            numbers must be unique.
-* @param[in] sensor_type Sets the type of data that triggers the callback. Must be non-zero. May be
-*            a combination. INV_ACCEL_NEW = accel data, INV_GYRO_NEW =
-*            gyro data, INV_MAG_NEW = compass data. So passing in
-*            INV_ACCEL_NEW | INV_MAG_NEW, a
-*            callback would be generated if there was new magnetomer data OR new accel data.
-*/
-inv_error_t inv_register_data_cb(
-    inv_error_t (*func)(struct inv_sensor_cal_t *data),
-    int priority, int sensor_type)
-{
-    inv_error_t result = INV_SUCCESS;
-    int kk, nn;
-
-    // Make sure we haven't registered this function already
-    // Or used the same priority
-    for (kk = 0; kk < inv_data_builder.num_cb; ++kk) {
-        if ((inv_data_builder.process[kk].func == func) ||
-                (inv_data_builder.process[kk].priority == priority)) {
-            return INV_ERROR_INVALID_PARAMETER;    //fixme give a warning
-        }
-    }
-
-    // Make sure we have not filled up our number of allowable callbacks
-    if (inv_data_builder.num_cb <= INV_MAX_DATA_CB - 1) {
-        kk = 0;
-        if (inv_data_builder.num_cb != 0) {
-            // set kk to be where this new callback goes in the array
-            while ((kk < inv_data_builder.num_cb) &&
-                    (inv_data_builder.process[kk].priority < priority)) {
-                kk++;
-            }
-            if (kk != inv_data_builder.num_cb) {
-                // We need to move the others
-                for (nn = inv_data_builder.num_cb; nn > kk; --nn) {
-                    inv_data_builder.process[nn] =
-                        inv_data_builder.process[nn - 1];
-                }
-            }
-        }
-        // Add new callback
-        inv_data_builder.process[kk].func = func;
-        inv_data_builder.process[kk].priority = priority;
-        inv_data_builder.process[kk].data_required = sensor_type;
-        inv_data_builder.num_cb++;
-    } else {
-        MPL_LOGE("Unable to add feature callback as too many were already registered\n");
-        result = INV_ERROR_MEMORY_EXAUSTED;
-    }
-
-    return result;
-}
-
-/** Unregisters the callback that happens when new sensor data is received.
-* @internal
-* @param[in] func Function pointer to receive callback when there is new sensor data
-* @param[in] priority Lower priority numbers receive a callback before larger numbers. All priority
-*            numbers must be unique.
-* @param[in] sensor_type Sets the type of data that triggers the callback. Must be non-zero. May be
-*            a combination. INV_ACCEL_NEW = accel data, INV_GYRO_NEW =
-*            gyro data, INV_MAG_NEW = compass data. So passing in
-*            INV_ACCEL_NEW | INV_MAG_NEW, a
-*            callback would be generated if there was new magnetomer data OR new accel data.
-*/
-inv_error_t inv_unregister_data_cb(
-    inv_error_t (*func)(struct inv_sensor_cal_t *data))
-{
-    int kk, nn;
-
-    for (kk = 0; kk < inv_data_builder.num_cb; ++kk) {
-        if (inv_data_builder.process[kk].func == func) {
-            // Delete this callback
-            for (nn = kk + 1; nn < inv_data_builder.num_cb; ++nn) {
-                inv_data_builder.process[nn - 1] =
-                    inv_data_builder.process[nn];
-            }
-            inv_data_builder.num_cb--;
-            return INV_SUCCESS;
-        }
-    }
-
-    return INV_SUCCESS;    // We did not find the callback
-}
-
-/** After at least one of inv_build_gyro(), inv_build_accel(), or
-* inv_build_compass() has been called, this function should be called.
-* It will process the data it has received and update all the internal states
-* and features that have been turned on.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_execute_on_data(void)
-{
-    inv_error_t result, first_error;
-    int kk;
-
-#ifdef INV_PLAYBACK_DBG
-    if (inv_data_builder.debug_mode == RD_RECORD) {
-        int type = PLAYBACK_DBG_TYPE_EXECUTE;
-        fwrite(&type, sizeof(type), 1, inv_data_builder.file);
-    }
-#endif
-    // Determine what new data we have
-    inv_data_builder.mode = 0;
-    if (sensors.gyro.status & INV_NEW_DATA)
-        inv_data_builder.mode |= INV_GYRO_NEW;
-    if (sensors.accel.status & INV_NEW_DATA)
-        inv_data_builder.mode |= INV_ACCEL_NEW;
-    if (sensors.compass.status & INV_NEW_DATA)
-        inv_data_builder.mode |= INV_MAG_NEW;
-    if (sensors.temp.status & INV_NEW_DATA)
-        inv_data_builder.mode |= INV_TEMP_NEW;
-    if (sensors.quat.status & INV_QUAT_NEW)
-        inv_data_builder.mode |= INV_QUAT_NEW;
-
-    first_error = INV_SUCCESS;
-
-    for (kk = 0; kk < inv_data_builder.num_cb; ++kk) {
-        if (inv_data_builder.mode & inv_data_builder.process[kk].data_required) {
-            result = inv_data_builder.process[kk].func(&sensors);
-            if (result && !first_error) {
-                first_error = result;
-            }
-        }
-    }
-
-    inv_set_contiguous();
-
-    return first_error;
-}
-
-/** Cleans up status bits after running all the callbacks. It sets the contiguous flag.
-*
-*/
-static void inv_set_contiguous(void)
-{
-    inv_time_t current_time = 0;
-    if (sensors.gyro.status & INV_NEW_DATA) {
-        sensors.gyro.status |= INV_CONTIGUOUS;
-        current_time = sensors.gyro.timestamp;
-    }
-    if (sensors.accel.status & INV_NEW_DATA) {
-        sensors.accel.status |= INV_CONTIGUOUS;
-        current_time = MAX(current_time, sensors.accel.timestamp);
-    }
-    if (sensors.compass.status & INV_NEW_DATA) {
-        sensors.compass.status |= INV_CONTIGUOUS;
-        current_time = MAX(current_time, sensors.compass.timestamp);
-    }
-    if (sensors.temp.status & INV_NEW_DATA) {
-        sensors.temp.status |= INV_CONTIGUOUS;
-        current_time = MAX(current_time, sensors.temp.timestamp);
-    }
-    if (sensors.quat.status & INV_NEW_DATA) {
-        sensors.quat.status |= INV_CONTIGUOUS;
-        current_time = MAX(current_time, sensors.quat.timestamp);
-    }
-
-#if 0
-    /* See if sensors are still on. These should be turned off by inv_*_was_turned_off()
-     * type functions. This is just in case that breaks down. We make sure
-     * all the data is within 2 seconds of the newest piece of data*/
-    if (inv_delta_time_ms(current_time, sensors.gyro.timestamp) >= 2000)
-        inv_gyro_was_turned_off();
-    if (inv_delta_time_ms(current_time, sensors.accel.timestamp) >= 2000)
-        inv_accel_was_turned_off();
-    if (inv_delta_time_ms(current_time, sensors.compass.timestamp) >= 2000)
-        inv_compass_was_turned_off();
-    /* TODO: Temperature might not need to be read this quickly. */
-    if (inv_delta_time_ms(current_time, sensors.temp.timestamp) >= 2000)
-        inv_temperature_was_turned_off();
-#endif
-
-    /* clear bits */
-    sensors.gyro.status &= ~INV_NEW_DATA;
-    sensors.accel.status &= ~INV_NEW_DATA;
-    sensors.compass.status &= ~INV_NEW_DATA;
-    sensors.temp.status &= ~INV_NEW_DATA;
-    sensors.quat.status &= ~INV_NEW_DATA;
-}
-
-/** Gets a whole set of accel data including data, accuracy and timestamp.
- * @param[out] data Accel Data where 1g = 2^16
- * @param[out] accuracy Accuracy 0 being not accurate, and 3 being most accurate.
- * @param[out] timestamp The timestamp of the data sample.
-*/
-void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t *timestamp)
-{
-    if (data != NULL) {
-        memcpy(data, sensors.accel.calibrated, sizeof(sensors.accel.calibrated));
-    }
-    if (timestamp != NULL) {
-        *timestamp = sensors.accel.timestamp;
-    }
-    if (accuracy != NULL) {
-        *accuracy = sensors.accel.accuracy;
-    }
-}
-
-/** Gets a whole set of gyro data including data, accuracy and timestamp.
- * @param[out] data Gyro Data where 1 dps = 2^16
- * @param[out] accuracy Accuracy 0 being not accurate, and 3 being most accurate.
- * @param[out] timestamp The timestamp of the data sample.
-*/
-void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t *timestamp)
-{
-    memcpy(data, sensors.gyro.calibrated, sizeof(sensors.gyro.calibrated));
-    if (timestamp != NULL) {
-        *timestamp = sensors.gyro.timestamp;
-    }
-    if (accuracy != NULL) {
-        *accuracy = sensors.gyro.accuracy;
-    }
-}
-
-/** Gets a whole set of gyro raw data including data, accuracy and timestamp.
- * @param[out] data Gyro Data where 1 dps = 2^16
- * @param[out] accuracy Accuracy 0 being not accurate, and 3 being most accurate.
- * @param[out] timestamp The timestamp of the data sample.
-*/
-void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t *timestamp)
-{
-    memcpy(data, sensors.gyro.raw_scaled, sizeof(sensors.gyro.raw_scaled));
-    if (timestamp != NULL) {
-        *timestamp = sensors.gyro.timestamp;
-    }
-    if (accuracy != NULL) {
-        *accuracy = sensors.gyro.accuracy;
-    }
-}
-
-/** Get's latest gyro data.
-* @param[out] gyro Gyro Data, Length 3. 1 dps = 2^16.
-*/
-void inv_get_gyro(long *gyro)
-{
-    memcpy(gyro, sensors.gyro.calibrated, sizeof(sensors.gyro.calibrated));
-}
-
-/** Gets a whole set of compass data including data, accuracy and timestamp.
- * @param[out] data Compass Data where 1 uT = 2^16
- * @param[out] accuracy Accuracy 0 being not accurate, and 3 being most accurate.
- * @param[out] timestamp The timestamp of the data sample.
-*/
-void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t *timestamp)
-{
-    memcpy(data, sensors.compass.calibrated, sizeof(sensors.compass.calibrated));
-    if (timestamp != NULL) {
-        *timestamp = sensors.compass.timestamp;
-    }
-    if (accuracy != NULL) {
-        if (inv_data_builder.compass_disturbance)
-            *accuracy = 0;
-        else
-            *accuracy = sensors.compass.accuracy;
-    }
-}
-
-/** Gets a whole set of temperature data including data, accuracy and timestamp.
- *  @param[out] data        Temperature data where 1 degree C = 2^16
- *  @param[out] accuracy    0 to 3, where 3 is most accurate.
- *  @param[out] timestamp   The timestamp of the data sample.
- */
-void inv_get_temp_set(long *data, int *accuracy, inv_time_t *timestamp)
-{
-    data[0] = sensors.temp.calibrated[0];
-    if (timestamp)
-        *timestamp = sensors.temp.timestamp;
-    if (accuracy)
-        *accuracy = sensors.temp.accuracy;
-}
-
-/** Returns accuracy of gyro.
- * @return Accuracy of gyro with 0 being not accurate, and 3 being most accurate.
-*/
-int inv_get_gyro_accuracy(void)
-{
-    return sensors.gyro.accuracy;
-}
-
-/** Returns accuracy of compass.
- * @return Accuracy of compass with 0 being not accurate, and 3 being most accurate.
-*/
-int inv_get_mag_accuracy(void)
-{
-    if (inv_data_builder.compass_disturbance)
-        return 0;
-    return sensors.compass.accuracy;
-}
-
-/** Returns accuracy of accel.
- * @return Accuracy of accel with 0 being not accurate, and 3 being most accurate.
-*/
-int inv_get_accel_accuracy(void)
-{
-    return sensors.accel.accuracy;
-}
-
-inv_error_t inv_get_gyro_orient(int *orient)
-{
-    *orient = sensors.gyro.orientation;
-    return 0;
-}
-
-inv_error_t inv_get_accel_orient(int *orient)
-{
-    *orient = sensors.accel.orientation;
-    return 0;
-}
-
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/data_builder.h b/60xx/libsensors_iio/software/core/mllite/data_builder.h
deleted file mode 100644
index c8c18cf..0000000
--- a/60xx/libsensors_iio/software/core/mllite/data_builder.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#include "mltypes.h"
-
-#ifndef INV_DATA_BUILDER_H__
-#define INV_DATA_BUILDER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Uncomment this flag to enable playback debug and record or playback scenarios
-//#define INV_PLAYBACK_DBG
-
-/** This is a new sample of accel data */
-#define INV_ACCEL_NEW 1
-/** This is a new sample of gyro data */
-#define INV_GYRO_NEW 2
-/** This is a new sample of compass data */
-#define INV_MAG_NEW 4
-/** This is a new sample of temperature data */
-#define INV_TEMP_NEW 8
-/** This is a new sample of quaternion data */
-#define INV_QUAT_NEW 16
-/** Set if quaternion is 6-axis from DMP */
-#define INV_QUAT_6AXIS 1024
-/** Set if quaternion is 3-axis from DMP */
-#define INV_QUAT_3AXIS 4096
-
-/** Set if the data is contiguous. Typically not set if a sample was skipped */
-#define INV_CONTIGUOUS 16
-/** Set if the calibrated data has been solved for */
-#define INV_CALIBRATED 32
-/* INV_NEW_DATA set for a new set of data, cleared if not available. */
-#define INV_NEW_DATA 64
-/* Set if raw data exists */
-#define INV_RAW_DATA 128
-/* Set if the sensor is on */
-#define INV_SENSOR_ON 256
-/* Set if quaternion has bias correction applied */
-#define INV_BIAS_APPLIED 512
-
-#define INV_PRIORITY_MOTION_NO_MOTION          100
-#define INV_PRIORITY_GYRO_TC                   150
-#define INV_PRIORITY_QUATERNION_GYRO_ACCEL     200
-#define INV_PRIORITY_QUATERNION_NO_GYRO        250
-#define INV_PRIORITY_MAGNETIC_DISTURBANCE      300
-#define INV_PRIORITY_HEADING_FROM_GYRO         350
-#define INV_PRIORITY_COMPASS_BIAS_W_GYRO       375
-#define INV_PRIORITY_COMPASS_VECTOR_CAL        400
-#define INV_PRIORITY_COMPASS_ADV_BIAS          500
-#define INV_PRIORITY_9_AXIS_FUSION             600
-#define INV_PRIORITY_QUATERNION_ADJUST_9_AXIS  700
-#define INV_PRIORITY_QUATERNION_ACCURACY       750
-#define INV_PRIORITY_RESULTS_HOLDER            800
-#define INV_PRIORITY_INUSE_AUTO_CALIBRATION    850
-#define INV_PRIORITY_HAL_OUTPUTS               900
-#define INV_PRIORITY_GLYPH                     950
-#define INV_PRIORITY_SHAKE                     975
-#define INV_PRIORITY_SM                        1000
-
-struct inv_single_sensor_t {
-    /** Orientation Descriptor. Describes how to go from the mounting frame to the body frame when
-    * the rotation matrix could be thought of only having elements of 0,1,-1.
-    * 2 bits are used to describe the column of the 1 or -1 and the 3rd bit is used for the sign.
-    * Bit 8 is sign of +/- 1 in third row. Bit 6-7 is column of +/-1 in third row.
-    * Bit 5 is sign of +/- 1 in second row. Bit 3-4 is column of +/-1 in second row.
-    * Bit 2 is sign of +/- 1 in first row. Bit 0-1 is column of +/-1 in first row.
-    */
-    int orientation;
-    /** The raw data in raw data units in the mounting frame */
-    short raw[3];
-    /** Raw data in body frame */
-    long raw_scaled[3];
-    /** Calibrated data */
-    long calibrated[3];
-    long sensitivity;
-    /** Sample rate in microseconds */
-    long sample_rate_us;
-    long sample_rate_ms;
-    /** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
-    * skipped due to power savings turning off this sensor.
-    * INV_NEW_DATA set for a new set of data, cleared if not available.
-    * INV_CALIBRATED_SET if calibrated data has been solved for */
-    int status;
-    /** 0 to 3 for how well sensor data and biases are known. 3 is most accurate. */
-    int accuracy;
-    inv_time_t timestamp;
-    inv_time_t timestamp_prev;
-    /** Bandwidth in Hz */
-    int bandwidth;
-};
-struct inv_quat_sensor_t {
-    long raw[4];
-    /** INV_CONTIGUOUS is set for contiguous data. Will not be set if there was a sample
-    * skipped due to power savings turning off this sensor.
-    * INV_NEW_DATA set for a new set of data, cleared if not available.
-    * INV_CALIBRATED_SET if calibrated data has been solved for */
-    int status;
-    inv_time_t timestamp;
-    inv_time_t timestamp_prev;
-    long sample_rate_us;
-    long sample_rate_ms;
-};
-
-struct inv_sensor_cal_t {
-    struct inv_single_sensor_t gyro;
-    struct inv_single_sensor_t accel;
-    struct inv_single_sensor_t compass;
-    struct inv_single_sensor_t temp;
-    struct inv_quat_sensor_t quat;
-    /** Combinations of INV_GYRO_NEW, INV_ACCEL_NEW, INV_MAG_NEW to indicate
-    * which data is a new sample as these data points may have different sample rates.
-    */
-    int status;
-};
-
-// Useful for debug record and playback
-typedef enum {
-    RD_NO_DEBUG,
-    RD_RECORD,
-    RD_PLAYBACK
-} rd_dbg_mode;
-
-typedef enum {
-    PLAYBACK_DBG_TYPE_GYRO,
-    PLAYBACK_DBG_TYPE_ACCEL,
-    PLAYBACK_DBG_TYPE_COMPASS,
-    PLAYBACK_DBG_TYPE_TEMPERATURE,
-    PLAYBACK_DBG_TYPE_EXECUTE,
-    PLAYBACK_DBG_TYPE_A_ORIENT,
-    PLAYBACK_DBG_TYPE_G_ORIENT,
-    PLAYBACK_DBG_TYPE_C_ORIENT,
-    PLAYBACK_DBG_TYPE_A_SAMPLE_RATE,
-    PLAYBACK_DBG_TYPE_C_SAMPLE_RATE,
-    PLAYBACK_DBG_TYPE_G_SAMPLE_RATE,
-    PLAYBACK_DBG_TYPE_GYRO_OFF,
-    PLAYBACK_DBG_TYPE_ACCEL_OFF,
-    PLAYBACK_DBG_TYPE_COMPASS_OFF,
-    PLAYBACK_DBG_TYPE_Q_SAMPLE_RATE,
-    PLAYBACK_DBG_TYPE_QUAT
-
-} inv_rd_dbg_states;
-
-/** Maximum number of data callbacks that are supported. Safe to increase if needed.*/
-#define INV_MAX_DATA_CB 20
-
-#ifdef INV_PLAYBACK_DBG
-#include <stdio.h>
-void inv_turn_on_data_logging(FILE *file);
-void inv_turn_off_data_logging();
-#endif
-
-void inv_set_gyro_orientation_and_scale(int orientation, long sensitivity);
-void inv_set_accel_orientation_and_scale(int orientation,
-        long sensitivity);
-void inv_set_compass_orientation_and_scale(int orientation,
-        long sensitivity);
-void inv_set_gyro_sample_rate(long sample_rate_us);
-void inv_set_compass_sample_rate(long sample_rate_us);
-void inv_set_quat_sample_rate(long sample_rate_us);
-void inv_set_accel_sample_rate(long sample_rate_us);
-void inv_set_gyro_bandwidth(int bandwidth_hz);
-void inv_set_accel_bandwidth(int bandwidth_hz);
-void inv_set_compass_bandwidth(int bandwidth_hz);
-
-void inv_get_gyro_sample_rate_ms(long *sample_rate_ms);
-void inv_get_accel_sample_rate_ms(long *sample_rate_ms);
-void inv_get_compass_sample_rate_ms(long *sample_rate_ms);
-
-inv_error_t inv_register_data_cb(inv_error_t (*func)
-                                 (struct inv_sensor_cal_t * data), int priority,
-                                 int sensor_type);
-inv_error_t inv_unregister_data_cb(inv_error_t (*func)
-                                   (struct inv_sensor_cal_t * data));
-
-inv_error_t inv_build_gyro(const short *gyro, inv_time_t timestamp);
-inv_error_t inv_build_compass(const long *compass, int status,
-                                  inv_time_t timestamp);
-inv_error_t inv_build_accel(const long *accel, int status,
-                            inv_time_t timestamp);
-inv_error_t inv_build_temp(const long temp, inv_time_t timestamp);
-inv_error_t inv_build_quat(const long *quat, int status, inv_time_t timestamp);
-inv_error_t inv_execute_on_data(void);
-
-void inv_get_compass_bias(long *bias);
-
-void inv_set_compass_bias(const long *bias, int accuracy);
-void inv_set_compass_disturbance(int dist);
-void inv_set_gyro_bias(const long *bias, int accuracy);
-void inv_set_accel_bias(const long *bias, int accuracy);
-void inv_set_accel_accuracy(int accuracy);
-void inv_set_accel_bias_mask(const long *bias, int accuracy, int mask);
-
-void inv_get_gyro_bias(long *bias, long *temp);
-void inv_get_accel_bias(long *bias, long *temp);
-
-void inv_gyro_was_turned_off(void);
-void inv_accel_was_turned_off(void);
-void inv_compass_was_turned_off(void);
-void inv_quaternion_sensor_was_turned_off(void);
-inv_error_t inv_init_data_builder(void);
-long inv_get_gyro_sensitivity(void);
-long inv_get_accel_sensitivity(void);
-long inv_get_compass_sensitivity(void);
-
-void inv_get_accel_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
-void inv_get_gyro_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
-void inv_get_gyro_set_raw(long *data, int8_t *accuracy, inv_time_t * timestamp);
-void inv_get_compass_set(long *data, int8_t *accuracy, inv_time_t * timestamp);
-
-void inv_get_gyro(long *gyro);
-
-int inv_get_gyro_accuracy(void);
-int inv_get_accel_accuracy(void);
-int inv_get_mag_accuracy(void);
-
-int inv_get_compass_on(void);
-int inv_get_gyro_on(void);
-int inv_get_accel_on(void);
-
-inv_time_t inv_get_last_timestamp(void);
-int inv_get_compass_disturbance(void);
-
-//New DMP Cal Functions
-inv_error_t inv_get_gyro_orient(int *orient);
-inv_error_t inv_get_accel_orient(int *orient);
-
-// internal
-int inv_get_6_axis_gyro_accel_timestamp(long sample_rate_us, inv_time_t *ts);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* INV_DATA_BUILDER_H__ */
diff --git a/60xx/libsensors_iio/software/core/mllite/hal_outputs.c b/60xx/libsensors_iio/software/core/mllite/hal_outputs.c
deleted file mode 100644
index caa1db7..0000000
--- a/60xx/libsensors_iio/software/core/mllite/hal_outputs.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/**
- *   @defgroup  HAL_Outputs hal_outputs
- *   @brief     Motion Library - HAL Outputs
- *              Sets up common outputs for HAL
- *
- *   @{
- *       @file  hal_outputs.c
- *       @brief HAL Outputs.
- */
-
-#include <string.h>
-
-#include "hal_outputs.h"
-#include "log.h"
-#include "ml_math_func.h"
-#include "mlmath.h"
-#include "start_manager.h"
-#include "data_builder.h"
-#include "results_holder.h"
-
-struct hal_output_t {
-    int accuracy_mag;    /**< Compass accuracy */
-//    int accuracy_gyro;   /**< Gyro Accuracy */
-//    int accuracy_accel;  /**< Accel Accuracy */
-    int accuracy_quat;   /**< quat Accuracy */
-
-    inv_time_t nav_timestamp;
-    inv_time_t gam_timestamp;
-//    inv_time_t accel_timestamp;
-    inv_time_t mag_timestamp;
-    long nav_quat[4];
-    int gyro_status;
-    int accel_status;
-    int compass_status;
-    int nine_axis_status;
-    inv_biquad_filter_t lp_filter[3];
-    float compass_float[3];
-    long linear_acceleration_sample_rate_us;
-    long gravity_sample_rate_us;
-};
-
-static struct hal_output_t hal_out;
-
-void inv_set_linear_acceleration_sample_rate(long sample_rate_us)
-{
-    hal_out.linear_acceleration_sample_rate_us = sample_rate_us;
-}
-
-void inv_set_gravity_sample_rate(long sample_rate_us)
-{
-    hal_out.gravity_sample_rate_us = sample_rate_us;
-}
-
-/** Acceleration (m/s^2) in body frame.
-* @param[out] values Acceleration in m/s^2 includes gravity. So while not in motion, it
-*             should return a vector of magnitude near 9.81 m/s^2
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-*             inv_build_accel().
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_accelerometer(float *values, int8_t *accuracy,
-                                       inv_time_t * timestamp)
-{
-    int status;
-    /* Converts fixed point to m/s^2. Fixed point has 1g = 2^16.
-     * So this 9.80665 / 2^16 */
-#define ACCEL_CONVERSION 0.000149637603759766f
-    long accel[3];
-    inv_get_accel_set(accel, accuracy, timestamp);
-    values[0] = accel[0] * ACCEL_CONVERSION;
-    values[1] = accel[1] * ACCEL_CONVERSION;
-    values[2] = accel[2] * ACCEL_CONVERSION;
-    if (hal_out.accel_status & INV_NEW_DATA)
-        status = 1;
-    else
-        status = 0;
-    return status;
-}
-
-/** Linear Acceleration (m/s^2) in Body Frame.
-* @param[out] values Linear Acceleration in body frame, length 3, (m/s^2). May show
-*             accel biases while at rest.
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-*             inv_build_accel().
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_linear_acceleration(float *values, int8_t *accuracy,
-        inv_time_t * timestamp)
-{
-    long gravity[3], accel[3];
-    inv_time_t timestamp1;
-
-    inv_get_accel_set(accel, accuracy, &timestamp1);
-    inv_get_gravity(gravity);
-    accel[0] -= gravity[0] >> 14;
-    accel[1] -= gravity[1] >> 14;
-    accel[2] -= gravity[2] >> 14;
-    values[0] = accel[0] * ACCEL_CONVERSION;
-    values[1] = accel[1] * ACCEL_CONVERSION;
-    values[2] = accel[2] * ACCEL_CONVERSION;
-
-    return inv_get_6_axis_gyro_accel_timestamp(hal_out.linear_acceleration_sample_rate_us, timestamp);
-}
-
-/** Gravity vector (m/s^2) in Body Frame.
-* @param[out] values Gravity vector in body frame, length 3, (m/s^2)
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-*             inv_build_accel().
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_gravity(float *values, int8_t *accuracy,
-                                 inv_time_t * timestamp)
-{
-    long gravity[3];
-
-    *accuracy = (int8_t) hal_out.accuracy_quat;
-    inv_get_gravity(gravity);
-    values[0] = (gravity[0] >> 14) * ACCEL_CONVERSION;
-    values[1] = (gravity[1] >> 14) * ACCEL_CONVERSION;
-    values[2] = (gravity[2] >> 14) * ACCEL_CONVERSION;
-    return inv_get_6_axis_gyro_accel_timestamp(hal_out.gravity_sample_rate_us, timestamp);
-}
-
-/* Converts fixed point to rad/sec. Fixed point has 1 dps = 2^16.
- * So this is: pi / 2^16 / 180 */
-#define GYRO_CONVERSION 2.66316109007924e-007f
-
-/** Gyroscope calibrated data (rad/s) in body frame.
-* @param[out] values Rotation Rate in rad/sec.
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-*             inv_build_gyro().
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_gyroscope(float *values, int8_t *accuracy,
-                                   inv_time_t * timestamp)
-{
-    long gyro[3];
-    int status;
-
-    inv_get_gyro_set(gyro, accuracy, timestamp);
-    values[0] = gyro[0] * GYRO_CONVERSION;
-    values[1] = gyro[1] * GYRO_CONVERSION;
-    values[2] = gyro[2] * GYRO_CONVERSION;
-    if (hal_out.gyro_status & INV_NEW_DATA)
-        status = 1;
-    else
-        status = 0;
-    return status;
-}
-
-/** Gyroscope raw data (rad/s) in body frame.
-* @param[out] values Rotation Rate in rad/sec.
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor. Derived from the timestamp sent to
-*             inv_build_gyro().
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_gyroscope_raw(float *values, int8_t *accuracy,
-                                   inv_time_t * timestamp)
-{
-    long gyro[3];
-    int status;
-
-    inv_get_gyro_set_raw(gyro, accuracy, timestamp);
-    values[0] = gyro[0] * GYRO_CONVERSION;
-    values[1] = gyro[1] * GYRO_CONVERSION;
-    values[2] = gyro[2] * GYRO_CONVERSION;
-    if (hal_out.gyro_status & INV_NEW_DATA)
-        status = 1;
-    else
-        status = 0;
-    return status;
-}
-
-/**
-* This corresponds to Sensor.TYPE_ROTATION_VECTOR.
-* The rotation vector represents the orientation of the device as a combination
-* of an angle and an axis, in which the device has rotated through an angle @f$\theta@f$
-* around an axis {x, y, z}. <br>
-* The three elements of the rotation vector are
-* {x*sin(@f$\theta@f$/2), y*sin(@f$\theta@f$/2), z*sin(@f$\theta@f$/2)}, such that the magnitude of the rotation
-* vector is equal to sin(@f$\theta@f$/2), and the direction of the rotation vector is
-* equal to the direction of the axis of rotation.
-*
-* The three elements of the rotation vector are equal to the last three components of a unit quaternion
-* {x*sin(@f$\theta@f$/2), y*sin(@f$\theta@f$/2), z*sin(@f$\theta@f$/2)>. The 4th element is cos(@f$\theta@f$/2).
-*
-* Elements of the rotation vector are unitless. The x,y and z axis are defined in the same way as the acceleration sensor.
-* The reference coordinate system is defined as a direct orthonormal basis, where:
-
-    -X is defined as the vector product Y.Z (It is tangential to the ground at the device's current location and roughly points East).
-    -Y is tangential to the ground at the device's current location and points towards the magnetic North Pole.
-    -Z points towards the sky and is perpendicular to the ground.
-* @param[out] values Length 4.
-* @param[out] accuracy Accuracy 0 to 3, 3 = most accurate
-* @param[out] timestamp Timestamp. In (ns) for Android.
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_rotation_vector(float *values, int8_t *accuracy,
-        inv_time_t * timestamp)
-{
-    *accuracy = (int8_t) hal_out.accuracy_quat;
-    *timestamp = hal_out.nav_timestamp;
-
-    if (hal_out.nav_quat[0] >= 0) {
-        values[0] = hal_out.nav_quat[1] * INV_TWO_POWER_NEG_30;
-        values[1] = hal_out.nav_quat[2] * INV_TWO_POWER_NEG_30;
-        values[2] = hal_out.nav_quat[3] * INV_TWO_POWER_NEG_30;
-        values[3] = hal_out.nav_quat[0] * INV_TWO_POWER_NEG_30;
-    } else {
-        values[0] = -hal_out.nav_quat[1] * INV_TWO_POWER_NEG_30;
-        values[1] = -hal_out.nav_quat[2] * INV_TWO_POWER_NEG_30;
-        values[2] = -hal_out.nav_quat[3] * INV_TWO_POWER_NEG_30;
-        values[3] = -hal_out.nav_quat[0] * INV_TWO_POWER_NEG_30;
-    }
-    values[4] = inv_get_heading_confidence_interval();
-
-    return hal_out.nine_axis_status;
-}
-
-
-/** Compass data (uT) in body frame.
-* @param[out] values Compass data in (uT), length 3. May be calibrated by having
-*             biases removed and sensitivity adjusted
-* @param[out] accuracy Accuracy 0 to 3, 3 = most accurate
-* @param[out] timestamp Timestamp. In (ns) for Android.
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_magnetic_field(float *values, int8_t *accuracy,
-                                        inv_time_t * timestamp)
-{
-    int status;
-    /* Converts fixed point to uT. Fixed point has 1 uT = 2^16.
-     * So this is: 1 / 2^16*/
-//#define COMPASS_CONVERSION 1.52587890625e-005f
-    int i;
-
-    *timestamp = hal_out.mag_timestamp;
-    *accuracy = (int8_t) hal_out.accuracy_mag;
-
-    for (i=0; i<3; i++)  {
-        values[i] = hal_out.compass_float[i];
-    }
-    if (hal_out.compass_status & INV_NEW_DATA)
-        status = 1;
-    else
-        status = 0;
-    return status;
-}
-
-static void inv_get_rotation(float r[3][3])
-{
-    long rot[9];
-    float conv = 1.f / (1L<<30);
-
-    inv_quaternion_to_rotation(hal_out.nav_quat, rot);
-    r[0][0] = rot[0]*conv;
-    r[0][1] = rot[1]*conv;
-    r[0][2] = rot[2]*conv;
-    r[1][0] = rot[3]*conv;
-    r[1][1] = rot[4]*conv;
-    r[1][2] = rot[5]*conv;
-    r[2][0] = rot[6]*conv;
-    r[2][1] = rot[7]*conv;
-    r[2][2] = rot[8]*conv;
-}
-
-static void google_orientation(float *g)
-{
-    float rad2deg = (float)(180.0 / M_PI);
-    float R[3][3];
-
-    inv_get_rotation(R);
-
-    g[0] = atan2f(-R[1][0], R[0][0]) * rad2deg;
-    g[1] = atan2f(-R[2][1], R[2][2]) * rad2deg;
-    g[2] = asinf ( R[2][0])          * rad2deg;
-    if (g[0] < 0)
-        g[0] += 360;
-}
-
-
-/** This corresponds to Sensor.TYPE_ORIENTATION. All values are angles in degrees.
-* @param[out] values Length 3, Degrees.<br>
-*        - values[0]: Azimuth, angle between the magnetic north direction
-*         and the y-axis, around the z-axis (0 to 359). 0=North, 90=East, 180=South, 270=West<br>
-*        - values[1]: Pitch, rotation around x-axis (-180 to 180), with positive values
-*         when the z-axis moves toward the y-axis.<br>
-*        - values[2]: Roll, rotation around y-axis (-90 to 90), with positive
-*          values when the x-axis moves toward the z-axis.<br>
-*
-* @note  This definition is different from yaw, pitch and roll used in aviation
-*        where the X axis is along the long side of the plane (tail to nose).
-*        Note: This sensor type exists for legacy reasons, please use getRotationMatrix()
-*        in conjunction with remapCoordinateSystem() and getOrientation() to compute
-*        these values instead.
-*        Important note: For historical reasons the roll angle is positive in the
-*        clockwise direction (mathematically speaking, it should be positive in
-*        the counter-clockwise direction).
-* @param[out] accuracy Accuracy of the measurment, 0 is least accurate, while 3 is most accurate.
-* @param[out] timestamp The timestamp for this sensor.
-* @return     Returns 1 if the data was updated or 0 if it was not updated.
-*/
-int inv_get_sensor_type_orientation(float *values, int8_t *accuracy,
-                                     inv_time_t * timestamp)
-{
-    *accuracy = (int8_t) hal_out.accuracy_quat;
-    *timestamp = hal_out.nav_timestamp;
-
-    google_orientation(values);
-
-    return hal_out.nine_axis_status;
-}
-
-/** Main callback to generate HAL outputs. Typically not called by library users.
-* @param[in] sensor_cal Input variable to take sensor data whenever there is new
-* sensor data.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_generate_hal_outputs(struct inv_sensor_cal_t *sensor_cal)
-{
-    int use_sensor = 0;
-    long sr = 1000;
-    long compass[3];
-    int8_t accuracy;
-    int i;
-    (void) sensor_cal;
-
-    inv_get_quaternion_set(hal_out.nav_quat, &hal_out.accuracy_quat,
-                           &hal_out.nav_timestamp);
-    hal_out.gyro_status = sensor_cal->gyro.status;
-    hal_out.accel_status = sensor_cal->accel.status;
-    hal_out.compass_status = sensor_cal->compass.status;
-
-    // Find the highest sample rate and tie generating 9-axis to that one.
-    if (sensor_cal->gyro.status & INV_SENSOR_ON) {
-        sr = sensor_cal->gyro.sample_rate_ms;
-        use_sensor = 0;
-    }
-    if ((sensor_cal->accel.status & INV_SENSOR_ON) && (sr > sensor_cal->accel.sample_rate_ms)) {
-        sr = sensor_cal->accel.sample_rate_ms;
-        use_sensor = 1;
-    }
-    if ((sensor_cal->compass.status & INV_SENSOR_ON) && (sr > sensor_cal->compass.sample_rate_ms)) {
-        sr = sensor_cal->compass.sample_rate_ms;
-        use_sensor = 2;
-    }
-    if ((sensor_cal->quat.status & INV_SENSOR_ON) && (sr > sensor_cal->quat.sample_rate_ms)) {
-        sr = sensor_cal->quat.sample_rate_ms;
-        use_sensor = 3;
-    }
-
-    // Only output 9-axis if all 9 sensors are on.
-    if (sensor_cal->quat.status & INV_SENSOR_ON) {
-        // If quaternion sensor is on, gyros are not required as quaternion already has that part
-        if ((sensor_cal->accel.status & sensor_cal->compass.status & INV_SENSOR_ON) == 0) {
-            use_sensor = -1;
-        }
-    } else {
-        if ((sensor_cal->gyro.status & sensor_cal->accel.status & sensor_cal->compass.status & INV_SENSOR_ON) == 0) {
-            use_sensor = -1;
-        }
-    }
-
-    switch (use_sensor) {
-    case 0:
-        hal_out.nine_axis_status = (sensor_cal->gyro.status & INV_NEW_DATA) ? 1 : 0;
-        hal_out.nav_timestamp = sensor_cal->gyro.timestamp;
-        break;
-    case 1:
-        hal_out.nine_axis_status = (sensor_cal->accel.status & INV_NEW_DATA) ? 1 : 0;
-        hal_out.nav_timestamp = sensor_cal->accel.timestamp;
-        break;
-    case 2:
-        hal_out.nine_axis_status = (sensor_cal->compass.status & INV_NEW_DATA) ? 1 : 0;
-        hal_out.nav_timestamp = sensor_cal->compass.timestamp;
-        break;
-    case 3:
-        hal_out.nine_axis_status = (sensor_cal->quat.status & INV_NEW_DATA) ? 1 : 0;
-        hal_out.nav_timestamp = sensor_cal->quat.timestamp;
-        break;
-    default:
-        hal_out.nine_axis_status = 0; // Don't output quaternion related info
-        break;
-    }
-
-    /* Converts fixed point to uT. Fixed point has 1 uT = 2^16.
-     * So this is: 1 / 2^16*/
-    #define COMPASS_CONVERSION 1.52587890625e-005f
-
-    inv_get_compass_set(compass, &accuracy, &(hal_out.mag_timestamp) );
-    hal_out.accuracy_mag = (int ) accuracy;
-
-    for (i=0; i<3; i++) {
-        if ((sensor_cal->compass.status & (INV_NEW_DATA | INV_CONTIGUOUS)) ==
-                                                             INV_NEW_DATA )  {
-            // set the state variables to match output with input
-            inv_calc_state_to_match_output(&hal_out.lp_filter[i], (float ) compass[i]);
-        }
-
-        if ((sensor_cal->compass.status & (INV_NEW_DATA | INV_RAW_DATA)) ==
-                                         (INV_NEW_DATA | INV_RAW_DATA)   )  {
-
-            hal_out.compass_float[i] = inv_biquad_filter_process(&hal_out.lp_filter[i],
-                                           (float ) compass[i]) * COMPASS_CONVERSION;
-
-        } else if ((sensor_cal->compass.status & INV_NEW_DATA) == INV_NEW_DATA )  {
-            hal_out.compass_float[i] = (float ) compass[i] * COMPASS_CONVERSION;
-        }
-
-    }
-    return INV_SUCCESS;
-}
-
-/** Turns off generation of HAL outputs.
-* @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_stop_hal_outputs(void)
-{
-    inv_error_t result;
-    result = inv_unregister_data_cb(inv_generate_hal_outputs);
-    return result;
-}
-
-/** Turns on generation of HAL outputs. This should be called after inv_stop_hal_outputs()
-* to turn generation of HAL outputs back on. It is automatically called by inv_enable_hal_outputs().
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_start_hal_outputs(void)
-{
-    inv_error_t result;
-    result =
-        inv_register_data_cb(inv_generate_hal_outputs,
-                             INV_PRIORITY_HAL_OUTPUTS,
-                             INV_GYRO_NEW | INV_ACCEL_NEW | INV_MAG_NEW);
-    return result;
-}
-/* file name: lowPassFilterCoeff_1_6.c */
-float compass_low_pass_filter_coeff[5] =
-{+2.000000000000f, +1.000000000000f, -1.279632424998f, +0.477592250073f, +0.049489956269f};
-
-/** Initializes hal outputs class. This is called automatically by the
-* enable function. It may be called any time the feature is enabled, but
-* is typically not needed to be called by outside callers.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_init_hal_outputs(void)
-{
-    int i;
-    memset(&hal_out, 0, sizeof(hal_out));
-    for (i=0; i<3; i++)  {
-        inv_init_biquad_filter(&hal_out.lp_filter[i], compass_low_pass_filter_coeff);
-    }
-
-    return INV_SUCCESS;
-}
-
-/** Turns on creation and storage of HAL type results.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_enable_hal_outputs(void)
-{
-    inv_error_t result;
-
-	// don't need to check the result for inv_init_hal_outputs
-	// since it's always INV_SUCCESS
-	inv_init_hal_outputs();
-
-    result = inv_register_mpl_start_notification(inv_start_hal_outputs);
-    return result;
-}
-
-/** Turns off creation and storage of HAL type results.
-*/
-inv_error_t inv_disable_hal_outputs(void)
-{
-    inv_error_t result;
-
-    inv_stop_hal_outputs(); // Ignore error if we have already stopped this
-    result = inv_unregister_mpl_start_notification(inv_start_hal_outputs);
-    return result;
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/hal_outputs.h b/60xx/libsensors_iio/software/core/mllite/hal_outputs.h
deleted file mode 100644
index 41b72c6..0000000
--- a/60xx/libsensors_iio/software/core/mllite/hal_outputs.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#include "mltypes.h"
-
-#ifndef INV_HAL_OUTPUTS_H__
-#define INV_HAL_OUTPUTS_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    int inv_get_sensor_type_orientation(float *values, int8_t *accuracy,
-                                         inv_time_t * timestamp);
-    int inv_get_sensor_type_accelerometer(float *values, int8_t *accuracy,
-                                           inv_time_t * timestamp);
-    int inv_get_sensor_type_gyroscope(float *values, int8_t *accuracy,
-                                       inv_time_t * timestamp);
-    int inv_get_sensor_type_gyroscope_raw(float *values, int8_t *accuracy,
-                                       inv_time_t * timestamp);
-    int inv_get_sensor_type_magnetic_field(float *values, int8_t *accuracy,
-                                            inv_time_t * timestamp);
-    int inv_get_sensor_type_rotation_vector(float *values, int8_t *accuracy,
-            inv_time_t * timestamp);
-
-    int inv_get_sensor_type_linear_acceleration(float *values,
-            int8_t *accuracy,
-            inv_time_t * timestamp);
-    int inv_get_sensor_type_gravity(float *values, int8_t *accuracy,
-                                     inv_time_t * timestamp);
-
-    inv_error_t inv_enable_hal_outputs(void);
-    inv_error_t inv_disable_hal_outputs(void);
-    inv_error_t inv_init_hal_outputs(void);
-    inv_error_t inv_start_hal_outputs(void);
-    inv_error_t inv_stop_hal_outputs(void);
-
-    // Set data rates for virtual sensors
-    void inv_set_linear_acceleration_sample_rate(long sample_rate_us);
-    void inv_set_gravity_sample_rate(long sample_rate_us);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif                          // INV_HAL_OUTPUTS_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/invensense.h b/60xx/libsensors_iio/software/core/mllite/invensense.h
deleted file mode 100644
index fb8e12b..0000000
--- a/60xx/libsensors_iio/software/core/mllite/invensense.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-/**
- *  Main header file for Invensense's basic library.
- */
-
-#include "data_builder.h"
-#include "hal_outputs.h"
-#include "message_layer.h"
-#include "mlmath.h"
-#include "ml_math_func.h"
-#include "mpl.h"
-#include "results_holder.h"
-#include "start_manager.h"
-#include "storage_manager.h"
-#include "log.h"
-#include "mlinclude.h"
-//#include "..\HAL\include\mlos.h"
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c b/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c
deleted file mode 100644
index 72940f7..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.c
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- $License:
-    Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/******************************************************************************
- *
- * $Id:$
- *
- *****************************************************************************/
-
-/**
- * @defgroup ML_LOAD_DMP
- *
- * @{
- *      @file     ml_load_dmp.c
- *      @brief    functions for writing dmp firmware.
- */
-#include <stdio.h>
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-loaddmp"
-
-#include "ml_load_dmp.h"
-#include "mlos.h"
-
-#define LOADDMP_LOG MPL_LOGI
-#define LOADDMP_LOG MPL_LOGI
-
-#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0]))
-#define DMP_CODE_SIZE 3065
-
-static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
-   /* bank # 0 */
-    0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 
-    0x00, 0x65, 0x00, 0x54, 0xff, 0xef, 0x00, 0x00, 0xfa, 0x80, 0x00, 0x0b, 0x12, 0x82, 0x00, 0x01, 
-    0x03, 0x0c, 0x30, 0xc3, 0x0e, 0x8c, 0x8c, 0xe9, 0x14, 0xd5, 0x40, 0x02, 0x13, 0x71, 0x0f, 0x8e, 
-    0x38, 0x83, 0xf8, 0x83, 0x30, 0x00, 0xf8, 0x83, 0x25, 0x8e, 0xf8, 0x83, 0x30, 0x00, 0xf8, 0x83, 
-    0x00, 0x00, 0x00, 0x01, 0x0f, 0xfe, 0xa9, 0xd6, 0x24, 0x00, 0x04, 0x00, 0x1a, 0x82, 0x79, 0xa1, 
-    0xff, 0xff, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x12, 0x00, 0x02, 
-    0x00, 0x3e, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xca, 0xe3, 0x09, 0x3e, 0x80, 0x00, 0x00, 
-    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-    0x00, 0x0c, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x6e, 0x00, 0x00, 0x06, 0x92, 0x0a, 0x16, 0xc0, 0xdf, 
-    0xff, 0xff, 0x02, 0x56, 0xfd, 0x8c, 0xd3, 0x77, 0xff, 0xe1, 0xc4, 0x96, 0xe0, 0xc5, 0xbe, 0xaa, 
-    0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x2b, 0x00, 0x00, 0x16, 0x57, 0x00, 0x00, 0x03, 0x59, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xfa, 0x00, 0x02, 0x6c, 0x1d, 0x00, 0x00, 0x00, 0x00, 
-    0x3f, 0xff, 0xdf, 0xeb, 0x00, 0x3e, 0xb3, 0xb6, 0x00, 0x0d, 0x22, 0x78, 0x00, 0x00, 0x2f, 0x3c, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x42, 0xb5, 0x00, 0x00, 0x39, 0xa2, 0x00, 0x00, 0xb3, 0x65, 
-    0x3f, 0x84, 0x05, 0x99, 0xf2, 0xbc, 0x3a, 0x39, 0xf1, 0x53, 0x7a, 0x76, 0xd9, 0x0e, 0x9f, 0xc8, 
-    0x00, 0x00, 0x00, 0x00, 0xf2, 0xbc, 0x3a, 0x39, 0xf1, 0x53, 0x7a, 0x76, 0xd9, 0x0e, 0x9f, 0xc8, 
-    /* bank # 1 */
-    0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0xfa, 0x92, 0x10, 0x00, 0x22, 0x5e, 0x00, 0x0d, 0x22, 0x9f, 
-    0x00, 0x01, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0xff, 0x46, 0x00, 0x00, 0x63, 0xd4, 0x00, 0x00, 
-    0x10, 0x00, 0x00, 0x00, 0x04, 0xd6, 0x00, 0x00, 0x04, 0xcc, 0x00, 0x00, 0x04, 0xcc, 0x00, 0x00, 
-    0x00, 0x00, 0x10, 0x72, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x06, 0x00, 0x02, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x64, 0x00, 0x20, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x03, 0x00, 
-    0x00, 0x00, 0x00, 0x32, 0xf8, 0x98, 0x00, 0x00, 0xff, 0x65, 0x00, 0x00, 0x83, 0x0f, 0x00, 0x00, 
-    0xff, 0x9b, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xb2, 0x6a, 0x00, 0x02, 0x00, 0x00, 
-    0x00, 0x01, 0xfb, 0x83, 0x00, 0x68, 0x00, 0x00, 0x00, 0xd9, 0xfc, 0x00, 0x7c, 0xf1, 0xff, 0x83, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x64, 0x03, 0xe8, 0x00, 0x64, 0x00, 0x28, 
-    0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x16, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 
-    0x00, 0x00, 0x10, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x10, 0x00, 
-    /* bank # 2 */
-    0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x45, 0x81, 0xff, 0xff, 0xfa, 0x72, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 
-    0x00, 0x00, 0x25, 0x4d, 0x00, 0x2f, 0x70, 0x6d, 0x00, 0x00, 0x05, 0xae, 0x00, 0x0c, 0x02, 0xd0, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x78, 0xa2, 
-    0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x0e, 
-    0x00, 0x00, 0x0a, 0xc7, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xff, 0xff, 0xff, 0x9c, 
-    0x00, 0x00, 0x0b, 0x2b, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 
-    0xff, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    /* bank # 3 */
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x24, 0x26, 0xd3, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, 0x96, 0x00, 0x3c, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x0c, 0x0a, 0x4e, 0x68, 0xcd, 0xcf, 0x77, 0x09, 0x50, 0x16, 0x67, 0x59, 0xc6, 0x19, 0xce, 0x82, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xd7, 0x84, 0x00, 0x03, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x93, 0x8f, 0x9d, 0x1e, 0x1b, 0x1c, 0x19, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x03, 0x18, 0x85, 0x00, 0x00, 0x40, 0x00, 
-    0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x67, 0x7d, 0xdf, 0x7e, 0x72, 0x90, 0x2e, 0x55, 0x4c, 0xf6, 0xe6, 0x88, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-
-    /* bank # 4 */
-    0xd8, 0xdc, 0xb4, 0xb8, 0xb0, 0xd8, 0xb9, 0xab, 0xf3, 0xf8, 0xfa, 0xb3, 0xb7, 0xbb, 0x8e, 0x9e, 
-    0xae, 0xf1, 0x32, 0xf5, 0x1b, 0xf1, 0xb4, 0xb8, 0xb0, 0x80, 0x97, 0xf1, 0xa9, 0xdf, 0xdf, 0xdf, 
-    0xaa, 0xdf, 0xdf, 0xdf, 0xf2, 0xaa, 0xc5, 0xcd, 0xc7, 0xa9, 0x0c, 0xc9, 0x2c, 0x97, 0x97, 0x97, 
-    0x97, 0xf1, 0xa9, 0x89, 0x26, 0x46, 0x66, 0xb2, 0x89, 0x99, 0xa9, 0x2d, 0x55, 0x7d, 0xb0, 0x99, 
-    0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 
-    0x99, 0x99, 0xb0, 0x8a, 0xa8, 0x96, 0x36, 0x56, 0x76, 0xf1, 0xba, 0xa3, 0xb4, 0xb2, 0x80, 0xc0, 
-    0xb8, 0xa8, 0x97, 0x11, 0xb2, 0x83, 0x98, 0xba, 0xa3, 0xf0, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 
-    0xb2, 0xb9, 0xb4, 0x98, 0x83, 0xf1, 0xa3, 0x29, 0x55, 0x7d, 0xba, 0xb5, 0xb1, 0xa3, 0x83, 0x93, 
-    0xf0, 0x00, 0x28, 0x50, 0xf5, 0xb2, 0xb6, 0xaa, 0x83, 0x93, 0x28, 0x54, 0x7c, 0xb9, 0xf1, 0xa3, 
-    0x82, 0x93, 0x61, 0xba, 0xa2, 0xda, 0xde, 0xdf, 0xdb, 0x8b, 0x9a, 0xb9, 0xae, 0xf5, 0x60, 0x68, 
-    0x70, 0xf1, 0xda, 0xba, 0xa2, 0xdf, 0xd9, 0xa2, 0xfa, 0xb9, 0xa3, 0x82, 0x92, 0xdb, 0x31, 0xba, 
-    0xa2, 0xd9, 0xf8, 0xdf, 0xa4, 0x83, 0xc2, 0xc5, 0xc7, 0x85, 0xc1, 0xb8, 0xa2, 0xdf, 0xdf, 0xdf, 
-    0xba, 0xa0, 0xdf, 0xdf, 0xdf, 0xd8, 0xd8, 0xf1, 0xb8, 0xa8, 0xb3, 0x8d, 0xb4, 0x98, 0x0d, 0x35, 
-    0x5d, 0xb8, 0xaa, 0x98, 0xb0, 0x87, 0x2d, 0x35, 0x3d, 0xb2, 0xb6, 0xba, 0xaf, 0x8c, 0x96, 0x19, 
-    0x8f, 0x9f, 0xa7, 0x0e, 0x16, 0x1e, 0xb4, 0x9a, 0xb8, 0xaa, 0x87, 0x2c, 0x54, 0x7c, 0xd8, 0xb8, 
-    0xb4, 0xb0, 0xf1, 0x99, 0x82, 0xa8, 0x2d, 0x55, 0x7d, 0x98, 0xa8, 0x0e, 0x16, 0x1e, 0xa2, 0x2c, 
-    /* bank # 5 */
-    0x54, 0x7c, 0xa8, 0x92, 0xf5, 0x2c, 0x54, 0x88, 0x98, 0xf1, 0x35, 0xd9, 0xf4, 0x18, 0xd8, 0xf1, 
-    0xa2, 0xd0, 0xf8, 0xf9, 0xa8, 0x84, 0xd9, 0xc7, 0xdf, 0xf8, 0xf8, 0x83, 0xc5, 0xda, 0xdf, 0x69, 
-    0xdf, 0x83, 0xc1, 0xd8, 0xf4, 0x01, 0x14, 0xf1, 0xa8, 0x82, 0x4e, 0xa8, 0x84, 0xf3, 0x11, 0xd1, 
-    0x82, 0xf5, 0xd9, 0x92, 0x28, 0x97, 0x88, 0xf1, 0x09, 0xf4, 0x1c, 0x1c, 0xd8, 0x84, 0xa8, 0xf3, 
-    0xc0, 0xf9, 0xd1, 0xd9, 0x97, 0x82, 0xf1, 0x29, 0xf4, 0x0d, 0xd8, 0xf3, 0xf9, 0xf9, 0xd1, 0xd9, 
-    0x82, 0xf4, 0xc2, 0x03, 0xd8, 0xde, 0xdf, 0x1a, 0xd8, 0xf1, 0xa2, 0xfa, 0xf9, 0xa8, 0x84, 0x98, 
-    0xd9, 0xc7, 0xdf, 0xf8, 0xf8, 0xf8, 0x83, 0xc7, 0xda, 0xdf, 0x69, 0xdf, 0xf8, 0x83, 0xc3, 0xd8, 
-    0xf4, 0x01, 0x14, 0xf1, 0x98, 0xa8, 0x82, 0x2e, 0xa8, 0x84, 0xf3, 0x11, 0xd1, 0x82, 0xf5, 0xd9, 
-    0x92, 0x50, 0x97, 0x88, 0xf1, 0x09, 0xf4, 0x1c, 0xd8, 0x84, 0xa8, 0xf3, 0xc0, 0xf8, 0xf9, 0xd1, 
-    0xd9, 0x97, 0x82, 0xf1, 0x49, 0xf4, 0x0d, 0xd8, 0xf3, 0xf9, 0xf9, 0xd1, 0xd9, 0x82, 0xf4, 0xc4, 
-    0x03, 0xd8, 0xde, 0xdf, 0xd8, 0xf1, 0xad, 0x88, 0x98, 0xcc, 0xa8, 0x09, 0xf9, 0xd9, 0x82, 0x92, 
-    0xa4, 0xf0, 0x2c, 0x50, 0x78, 0xa8, 0x82, 0xf5, 0x7c, 0xf1, 0x88, 0x3a, 0xcf, 0x94, 0x4a, 0x6e, 
-    0x98, 0xdb, 0x69, 0x31, 0xd9, 0x84, 0xc4, 0xcd, 0xfc, 0xdb, 0x6d, 0xd9, 0xa8, 0xfc, 0xdb, 0x25, 
-    0xda, 0xad, 0xf2, 0xde, 0xf9, 0xd8, 0xf2, 0xa5, 0xf8, 0x8d, 0x94, 0xd1, 0xda, 0xf4, 0x19, 0xd8, 
-    0xa8, 0xf2, 0x05, 0xd1, 0xa4, 0xda, 0xc0, 0xa5, 0xf7, 0xde, 0xf9, 0xd8, 0xa5, 0xf8, 0x85, 0x95, 
-    0x18, 0xdf, 0xf1, 0xad, 0x8e, 0xc3, 0xc5, 0xc7, 0xd8, 0xf2, 0xa5, 0xf8, 0xd1, 0xd9, 0xf1, 0xad, 
-    /* bank # 6 */
-    0x8f, 0xc3, 0xc5, 0xc7, 0xd8, 0xa5, 0xf2, 0xf9, 0xf9, 0xa8, 0x8d, 0x9d, 0xf0, 0x28, 0x50, 0x78, 
-    0x84, 0x98, 0xf1, 0x26, 0x84, 0x95, 0x2d, 0x88, 0x98, 0x11, 0x52, 0x87, 0x12, 0x12, 0x88, 0x31, 
-    0xf9, 0xd9, 0xf1, 0x8d, 0x9d, 0x7a, 0xf5, 0x7c, 0xf1, 0x88, 0x7a, 0x98, 0x45, 0x8e, 0x0e, 0xf5, 
-    0x82, 0x92, 0x7c, 0x88, 0xf1, 0x5a, 0x98, 0x5a, 0x82, 0x92, 0x7e, 0x88, 0x94, 0x69, 0x98, 0x1e, 
-    0x11, 0x08, 0xd0, 0xf5, 0x04, 0xf1, 0x1e, 0x97, 0x02, 0x02, 0x98, 0x36, 0x25, 0xdb, 0xf9, 0xd9, 
-    0xf0, 0x8d, 0x92, 0xa8, 0x49, 0x30, 0x2c, 0x50, 0x8e, 0xc9, 0x88, 0x98, 0x34, 0xf5, 0x04, 0xf1, 
-    0x61, 0xdb, 0xf9, 0xd9, 0xf2, 0xa5, 0xf8, 0xdb, 0xf9, 0xd9, 0xf3, 0xfa, 0xd8, 0xf2, 0xa5, 0xf8, 
-    0xf9, 0xd9, 0xf1, 0xaf, 0x8e, 0xc3, 0xc5, 0xc7, 0xae, 0x82, 0xc3, 0xc5, 0xc7, 0xd8, 0xa4, 0xf2, 
-    0xf8, 0xd1, 0xa5, 0xf3, 0xd9, 0xde, 0xf9, 0xdf, 0xd8, 0xa4, 0xf2, 0xf9, 0xa5, 0xf8, 0xf8, 0xd1, 
-    0xda, 0xf9, 0xf9, 0xf4, 0x18, 0xd8, 0xf2, 0xf9, 0xf9, 0xf3, 0xfb, 0xf9, 0xd1, 0xda, 0xf4, 0x1d, 
-    0xd9, 0xf3, 0xa4, 0x84, 0xc8, 0xa8, 0x9f, 0x01, 0xdb, 0xd1, 0xd8, 0xf4, 0x10, 0x1c, 0xd8, 0xbb, 
-    0xaf, 0xd0, 0xf2, 0xde, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xb8, 0xd8, 0xf3, 0xaf, 
-    0x84, 0xc0, 0xa5, 0xfa, 0xf8, 0xf2, 0x85, 0xa5, 0xc6, 0xd8, 0xd8, 0xf2, 0xf9, 0xf6, 0xb5, 0xb9, 
-    0xb0, 0x8a, 0x95, 0xa3, 0xde, 0x3c, 0xa3, 0xd9, 0xf8, 0xd8, 0x5c, 0xa3, 0xd9, 0xf8, 0xd8, 0x7c, 
-    0xa3, 0xd9, 0xf8, 0xd8, 0xf8, 0xf9, 0xd1, 0xa5, 0xd9, 0xdf, 0xda, 0xfa, 0xd8, 0xb1, 0x85, 0x30, 
-    0xf7, 0xd9, 0xde, 0xd8, 0xf8, 0x30, 0xad, 0xda, 0xde, 0xd8, 0xf2, 0xb4, 0x8c, 0x99, 0xa3, 0x2d, 
-    /* bank # 7 */
-    0x55, 0x7d, 0xa0, 0x83, 0xdf, 0xdf, 0xdf, 0xb5, 0x91, 0xa0, 0xf6, 0x29, 0xd9, 0xfb, 0xd8, 0xa0, 
-    0xfc, 0x29, 0xd9, 0xfa, 0xd8, 0xa0, 0xd0, 0x51, 0xd9, 0xf8, 0xd8, 0xfc, 0x51, 0xd9, 0xf9, 0xd8, 
-    0x79, 0xd9, 0xfb, 0xd8, 0xa0, 0xd0, 0xfc, 0x79, 0xd9, 0xfa, 0xd8, 0xa1, 0xf9, 0xf9, 0xf9, 0xf9, 
-    0xf9, 0xa0, 0xda, 0xdf, 0xdf, 0xdf, 0xd8, 0xa1, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xac, 0xde, 0xf8, 
-    0xad, 0xde, 0x83, 0x93, 0xac, 0x2c, 0x54, 0x7c, 0xf1, 0xa8, 0xdf, 0xdf, 0xdf, 0xf6, 0x9d, 0x2c, 
-    0xda, 0xa0, 0xdf, 0xd9, 0xfa, 0xdb, 0x2d, 0xf8, 0xd8, 0xa8, 0x50, 0xda, 0xa0, 0xd0, 0xde, 0xd9, 
-    0xd0, 0xf8, 0xf8, 0xf8, 0xdb, 0x55, 0xf8, 0xd8, 0xa8, 0x78, 0xda, 0xa0, 0xd0, 0xdf, 0xd9, 0xd0, 
-    0xfa, 0xf8, 0xf8, 0xf8, 0xf8, 0xdb, 0x7d, 0xf8, 0xd8, 0x9c, 0xa8, 0x8c, 0xf5, 0x30, 0xdb, 0x38, 
-    0xd9, 0xd0, 0xde, 0xdf, 0xa0, 0xd0, 0xde, 0xdf, 0xd8, 0xa8, 0x48, 0xdb, 0x58, 0xd9, 0xdf, 0xd0, 
-    0xde, 0xa0, 0xdf, 0xd0, 0xde, 0xd8, 0xa8, 0x68, 0xdb, 0x70, 0xd9, 0xdf, 0xdf, 0xa0, 0xdf, 0xdf, 
-    0xd8, 0xf1, 0xa8, 0x88, 0x90, 0x2c, 0x54, 0x7c, 0x98, 0xa8, 0xd0, 0x5c, 0x38, 0xd1, 0xda, 0xf2, 
-    0xae, 0x8c, 0xdf, 0xf9, 0xd8, 0xb0, 0x87, 0xa8, 0xc1, 0xc1, 0xb1, 0x88, 0xa8, 0xc6, 0xf9, 0xf9, 
-    0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xa8, 0xf9, 0xda, 
-    0x36, 0xd8, 0xa8, 0xf9, 0xda, 0x36, 0xd8, 0xf7, 0x8d, 0x9d, 0xad, 0xf8, 0x18, 0xda, 0xf2, 0xae, 
-    0xdf, 0xd8, 0xf7, 0xad, 0xfa, 0x30, 0xd9, 0xa4, 0xde, 0xf9, 0xd8, 0xf2, 0xae, 0xde, 0xfa, 0xf9, 
-    0x83, 0xa7, 0xd9, 0xc3, 0xc5, 0xc7, 0xf1, 0x88, 0x9b, 0xa7, 0x7a, 0xad, 0xf7, 0xde, 0xdf, 0xa4, 
-    /* bank # 8 */
-    0xf8, 0x84, 0x94, 0x08, 0xa7, 0x97, 0xf3, 0x00, 0xae, 0xf2, 0x98, 0x19, 0xa4, 0x88, 0xc6, 0xa3, 
-    0x94, 0x88, 0xf6, 0x32, 0xdf, 0xf2, 0x83, 0x93, 0xdb, 0x09, 0xd9, 0xf2, 0xaa, 0xdf, 0xd8, 0xd8, 
-    0xae, 0xf8, 0xf9, 0xd1, 0xda, 0xf3, 0xa4, 0xde, 0xa7, 0xf1, 0x88, 0x9b, 0x7a, 0xd8, 0xf3, 0x84, 
-    0x94, 0xae, 0x19, 0xf9, 0xda, 0xaa, 0xf1, 0xdf, 0xd8, 0xa8, 0x81, 0xc0, 0xc3, 0xc5, 0xc7, 0xa3, 
-    0x92, 0x83, 0xf6, 0x28, 0xad, 0xde, 0xd9, 0xf8, 0xd8, 0xa3, 0x50, 0xad, 0xd9, 0xf8, 0xd8, 0xa3, 
-    0x78, 0xad, 0xd9, 0xf8, 0xd8, 0xf8, 0xf9, 0xd1, 0xa1, 0xda, 0xde, 0xc3, 0xc5, 0xc7, 0xd8, 0xa1, 
-    0x81, 0x94, 0xf8, 0x18, 0xf2, 0xb0, 0x89, 0xac, 0xc3, 0xc5, 0xc7, 0xf1, 0xd8, 0xb8, 0xb4, 0xb0, 
-    0x97, 0x86, 0xa8, 0x31, 0x9b, 0x06, 0x99, 0x07, 0xab, 0x97, 0x28, 0x88, 0x9b, 0xf0, 0x0c, 0x20, 
-    0x14, 0x40, 0xb0, 0xb4, 0xb8, 0xf0, 0xa8, 0x8a, 0x9a, 0x28, 0x50, 0x78, 0xb7, 0x9b, 0xa8, 0x29, 
-    0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0xf1, 0xbb, 0xab, 0x88, 0x00, 
-    0x2c, 0x54, 0x7c, 0xf0, 0xb3, 0x8b, 0xb8, 0xa8, 0x04, 0x28, 0x50, 0x78, 0xf1, 0xb0, 0x88, 0xb4, 
-    0x97, 0x26, 0xa8, 0x59, 0x98, 0xbb, 0xab, 0xb3, 0x8b, 0x02, 0x26, 0x46, 0x66, 0xb0, 0xb8, 0xf0, 
-    0x8a, 0x9c, 0xa8, 0x29, 0x51, 0x79, 0x8b, 0x29, 0x51, 0x79, 0x8a, 0x24, 0x70, 0x59, 0x8b, 0x20, 
-    0x58, 0x71, 0x8a, 0x44, 0x69, 0x38, 0x8b, 0x39, 0x40, 0x68, 0x8a, 0x64, 0x48, 0x31, 0x8b, 0x30, 
-    0x49, 0x60, 0x88, 0xf1, 0xac, 0x00, 0x2c, 0x54, 0x7c, 0xf0, 0x8c, 0xa8, 0x04, 0x28, 0x50, 0x78, 
-    0xf1, 0x88, 0x97, 0x26, 0xa8, 0x59, 0x98, 0xac, 0x8c, 0x02, 0x26, 0x46, 0x66, 0xf0, 0x89, 0x9c, 
-    /* bank # 9 */
-    0xa8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0xa9, 0x88, 0x09, 
-    0x20, 0x59, 0x70, 0xab, 0x11, 0x38, 0x40, 0x69, 0xa8, 0x19, 0x31, 0x48, 0x60, 0x8c, 0xa8, 0x3c, 
-    0x41, 0x5c, 0x20, 0x7c, 0x00, 0xf1, 0x87, 0x98, 0x19, 0x86, 0xa8, 0x6e, 0x76, 0x7e, 0xa9, 0x99, 
-    0x88, 0x2d, 0x55, 0x7d, 0xf5, 0xb0, 0xb4, 0xb8, 0x88, 0x98, 0xad, 0x2c, 0x54, 0x7c, 0xb5, 0xb9, 
-    0x9e, 0xa3, 0xdf, 0xdf, 0xdf, 0xf6, 0xa3, 0x30, 0xd9, 0xfa, 0xdb, 0x35, 0xf8, 0xd8, 0xa3, 0x50, 
-    0xd0, 0xd9, 0xf8, 0xdb, 0x55, 0xf8, 0xd8, 0xa3, 0x70, 0xd0, 0xd9, 0xfa, 0xdb, 0x75, 0xf8, 0xd8, 
-    0xa3, 0xb4, 0x8d, 0x9d, 0x30, 0xdb, 0x38, 0xd9, 0xd0, 0xde, 0xdf, 0xd8, 0xa3, 0x48, 0xdb, 0x58, 
-    0xd9, 0xdf, 0xd0, 0xde, 0xd8, 0xa3, 0x68, 0xdb, 0x70, 0xd9, 0xdf, 0xdf, 0xd8, 0xf1, 0xa3, 0xb1, 
-    0xb5, 0x82, 0xc0, 0x83, 0x93, 0x0e, 0x0a, 0x0a, 0x16, 0x12, 0x1e, 0x58, 0x38, 0x1a, 0xa3, 0x8f, 
-    0x7c, 0x83, 0x0e, 0xa3, 0x12, 0x86, 0x61, 0xd1, 0xd9, 0xc7, 0xc7, 0xd8, 0xa3, 0x6d, 0xd1, 0xd9, 
-    0xc7, 0xd8, 0xa3, 0x71, 0xd1, 0xa6, 0xd9, 0xc5, 0xda, 0xdf, 0xd8, 0x9f, 0x83, 0xf3, 0xa3, 0x65, 
-    0xd1, 0xaf, 0xc6, 0xd9, 0xfa, 0xda, 0xdf, 0xd8, 0xa3, 0x8f, 0xdf, 0x1d, 0xd1, 0xa3, 0xd9, 0xfa, 
-    0xd8, 0xa3, 0x31, 0xda, 0xfa, 0xd9, 0xaf, 0xdf, 0xd8, 0xa3, 0xfa, 0xf9, 0xd1, 0xd9, 0xaf, 0xd0, 
-    0x96, 0xc1, 0xae, 0xd0, 0x0c, 0x8e, 0x94, 0xa3, 0xf7, 0x72, 0xdf, 0xf3, 0x83, 0x93, 0xdb, 0x09, 
-    0xd9, 0xf2, 0xaa, 0xd0, 0xde, 0xd8, 0xd8, 0xd8, 0xf2, 0xab, 0xf8, 0xf9, 0xd9, 0xb0, 0x87, 0xc4, 
-    0xaa, 0xf1, 0xdf, 0xdf, 0xbb, 0xaf, 0xdf, 0xdf, 0xb9, 0xd8, 0xb1, 0xf1, 0xa3, 0x97, 0x8e, 0x60, 
-    /* bank # 10 */
-    0xdf, 0xb0, 0x84, 0xf2, 0xc8, 0x93, 0x85, 0xf1, 0x4a, 0xb1, 0x83, 0xa3, 0x08, 0xb5, 0x83, 0x9a, 
-    0x08, 0x10, 0xb7, 0x9f, 0x10, 0xb5, 0xd8, 0xf1, 0xb0, 0xba, 0xae, 0xb0, 0x8a, 0xc2, 0xb2, 0xb6, 
-    0x8e, 0x9e, 0xf1, 0xfb, 0xd9, 0xf4, 0x1d, 0xd8, 0xf9, 0xd9, 0x0c, 0xf1, 0xd8, 0xf8, 0xf8, 0xad, 
-    0x61, 0xd9, 0xae, 0xfb, 0xd8, 0xf4, 0x0c, 0xf1, 0xd8, 0xf8, 0xf8, 0xad, 0x19, 0xd9, 0xae, 0xfb, 
-    0xdf, 0xd8, 0xf4, 0x16, 0xf1, 0xd8, 0xf8, 0xad, 0x8d, 0x61, 0xd9, 0xf4, 0xf4, 0xac, 0xf5, 0x9c, 
-    0x9c, 0x8d, 0xdf, 0x2b, 0xba, 0xb6, 0xae, 0xfa, 0xf8, 0xf4, 0x0b, 0xd8, 0xf1, 0xae, 0xd0, 0xf8, 
-    0xad, 0x51, 0xda, 0xae, 0xfa, 0xf8, 0xf1, 0xd8, 0xb9, 0xb1, 0xb6, 0xa3, 0x83, 0x9c, 0x08, 0xb9, 
-    0xb1, 0x83, 0x9a, 0xb5, 0xaa, 0xc0, 0xfd, 0x30, 0x83, 0xb7, 0x9f, 0x10, 0xb5, 0x8b, 0x93, 0xf2, 
-    0x02, 0x02, 0xd1, 0xab, 0xda, 0xde, 0xd8, 0xd8, 0xb1, 0xb9, 0xf3, 0x8b, 0xa3, 0x91, 0xb6, 0x09, 
-    0xb4, 0xd9, 0xab, 0xde, 0xb0, 0x87, 0x9c, 0xb9, 0xa3, 0xdd, 0xf1, 0xb3, 0x8b, 0x8b, 0x8b, 0x8b, 
-    0x8b, 0xb0, 0x87, 0xa3, 0xa3, 0xa3, 0xa3, 0xb4, 0x90, 0x80, 0xf2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 
-    0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xf1, 0x87, 0xb5, 0x9a, 0xa3, 0xf3, 0x9b, 0xa3, 0xa3, 0xdc, 0xba, 
-    0xac, 0xdf, 0xb9, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 
-    0xa3, 0xa3, 0xa3, 0xd8, 0xd8, 0xd8, 0xbb, 0xb3, 0xb7, 0xf1, 0xaa, 0xf9, 0xda, 0xff, 0xd9, 0x80, 
-    0x9a, 0xaa, 0x28, 0xb4, 0x80, 0x98, 0xa7, 0x20, 0xb7, 0x97, 0x87, 0xa8, 0x66, 0x88, 0xf0, 0x79, 
-    0x51, 0xf1, 0x90, 0x2c, 0x87, 0x0c, 0xa7, 0x81, 0x97, 0x62, 0x93, 0xf0, 0x71, 0x71, 0x60, 0x85, 
-    /* bank # 11 */
-    0x94, 0x01, 0x29, 0x51, 0x79, 0x90, 0xa5, 0xf1, 0x28, 0x4c, 0x6c, 0x87, 0x0c, 0x95, 0x18, 0x85, 
-    0x78, 0xa3, 0x83, 0x90, 0x28, 0x4c, 0x6c, 0x88, 0x6c, 0xd8, 0xf3, 0xa2, 0x82, 0x00, 0xf2, 0x10, 
-    0xa8, 0x92, 0x19, 0x80, 0xa2, 0xf2, 0xd9, 0x26, 0xd8, 0xf1, 0x88, 0xa8, 0x4d, 0xd9, 0x48, 0xd8, 
-    0x96, 0xa8, 0x39, 0x80, 0xd9, 0x3c, 0xd8, 0x95, 0x80, 0xa8, 0x39, 0xa6, 0x86, 0x98, 0xd9, 0x2c, 
-    0xda, 0x87, 0xa7, 0x2c, 0xd8, 0xa8, 0x89, 0x95, 0x19, 0xa9, 0x80, 0xd9, 0x38, 0xd8, 0xa8, 0x89, 
-    0x39, 0xa9, 0x80, 0xda, 0x3c, 0xd8, 0xa8, 0x2e, 0xa8, 0x39, 0x90, 0xd9, 0x0c, 0xd8, 0xa8, 0x95, 
-    0x31, 0x98, 0xd9, 0x0c, 0xd8, 0xa8, 0x09, 0xd9, 0xff, 0xd8, 0x01, 0xda, 0xff, 0xd8, 0x95, 0x39, 
-    0xa9, 0xda, 0x26, 0xff, 0xd8, 0x90, 0xa8, 0x0d, 0x89, 0x99, 0xa8, 0x10, 0x80, 0x98, 0x21, 0xda, 
-    0x2e, 0xd8, 0x89, 0x99, 0xa8, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x86, 0x96, 0x31, 0x80, 0xda, 
-    0x2e, 0xd8, 0xa8, 0x87, 0x31, 0x80, 0xda, 0x2e, 0xd8, 0xa8, 0x82, 0x92, 0xf3, 0x41, 0x80, 0xf1, 
-    0xd9, 0x2e, 0xd8, 0xa8, 0x82, 0xf3, 0x19, 0x80, 0xf1, 0xd9, 0x2e, 0xd8, 0x82, 0xac, 0xf3, 0xc0, 
-    0xa2, 0x80, 0x22, 0xf1, 0xa6, 0x2e, 0xa7, 0x2e, 0xa9, 0x22, 0x98, 0xa8, 0x29, 0xda, 0xac, 0xde, 
-    0xff, 0xd8, 0xa2, 0xf2, 0x2a, 0xf1, 0xa9, 0x2e, 0x82, 0x92, 0xa8, 0xf2, 0x31, 0x80, 0xa6, 0x96, 
-    0xf1, 0xd9, 0x00, 0xac, 0x8c, 0x9c, 0x0c, 0x30, 0xac, 0xde, 0xd0, 0xde, 0xff, 0xd8, 0x8c, 0x9c, 
-    0xac, 0xd0, 0x10, 0xac, 0xde, 0x80, 0x92, 0xa2, 0xf2, 0x4c, 0x82, 0xa8, 0xf1, 0xca, 0xf2, 0x35, 
-    0xf1, 0x96, 0x88, 0xa6, 0xd9, 0x00, 0xd8, 0xf1, 0xff
-};
-
-#define DMP_VERSION (dmpMemory)
-
-inv_error_t inv_write_dmp_data(FILE *fd, const unsigned char *dmp, size_t len)
-{
-    inv_error_t result = INV_SUCCESS;
-    int bytesWritten = 0;
-   
-    if (len <= 0) {
-        MPL_LOGE("Nothing to write");
-        return INV_ERROR_FILE_WRITE;
-    } else {
-        MPL_LOGI("dmp firmware size to write = %d", len);
-    }
-    if (fd == NULL) {
-        return INV_ERROR_FILE_OPEN;
-    }
-    bytesWritten = fwrite(dmp, 1, len, fd);
-    if (bytesWritten != len) {
-        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
-                 bytesWritten, len);
-        result = INV_ERROR_FILE_WRITE;
-    } else {
-        MPL_LOGI("Bytes written = %d", bytesWritten);
-    }
-    return result;
-}
-
-inv_error_t inv_load_dmp(FILE *fd)
-{
-    inv_error_t result = INV_SUCCESS;
-    result = inv_write_dmp_data(fd, DMP_VERSION, DMP_CODE_SIZE);
-    return result;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.h b/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.h
deleted file mode 100644
index 4d98692..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_load_dmp.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- $License:
-    Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-#ifndef INV_LOAD_DMP_H
-#define INV_LOAD_DMP_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    Includes.
-*/
-#include "mltypes.h"
-
-/*
-    APIs
-*/
-inv_error_t inv_load_dmp(FILE  *fd);
-
-#ifdef __cplusplus
-}
-#endif
-#endif  /* INV_LOAD_DMP_H */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.c b/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.c
deleted file mode 100644
index b4c4249..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/******************************************************************************
- *
- * $Id: ml_stored_data.c 6132 2011-10-01 03:17:27Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- * @defgroup ML_STORED_DATA
- *
- * @{
- *      @file     ml_stored_data.c
- *      @brief    functions for reading and writing stored data sets.
- *                Typically, these functions process stored calibration data.
- */
-
-#include <stdio.h>
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-storeload"
-
-#include "ml_stored_data.h"
-#include "storage_manager.h"
-#include "mlos.h"
-
-#define LOADCAL_DEBUG    0
-#define STORECAL_DEBUG   0
-
-#define DEFAULT_KEY 29681
-
-#define STORECAL_LOG MPL_LOGI
-#define LOADCAL_LOG  MPL_LOGI
-
-inv_error_t inv_read_cal(unsigned char **calData, size_t *bytesRead)
-{
-    FILE *fp;
-    inv_error_t result = INV_SUCCESS;
-    size_t fsize;
-
-    fp = fopen(MLCAL_FILE,"rb");
-    if (fp == NULL) {
-        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-
-    // obtain file size
-    fseek (fp, 0 , SEEK_END);
-    fsize = ftell (fp);
-    rewind (fp);
-  
-    *calData = (unsigned char *)inv_malloc(fsize);
-    if (*calData==NULL) {
-        MPL_LOGE("Could not allocate buffer of %d bytes - "
-                 "aborting\n", fsize);
-        fclose(fp);
-        return INV_ERROR_MEMORY_EXAUSTED;
-    }
-
-    *bytesRead = fread(*calData, 1, fsize, fp);
-    if (*bytesRead != fsize) {
-        MPL_LOGE("bytes read (%d) don't match file size (%d)\n",
-                 *bytesRead, fsize);
-        result = INV_ERROR_FILE_READ;
-        goto read_cal_end;
-    }
-    else {
-        MPL_LOGI("Bytes read = %d", *bytesRead);
-    }
-
-read_cal_end:
-    fclose(fp);
-    return result;
-}
-
-inv_error_t inv_write_cal(unsigned char *cal, size_t len)
-{
-    FILE *fp;
-    int bytesWritten;
-    inv_error_t result = INV_SUCCESS;
-   
-    if (len <= 0) {
-        MPL_LOGE("Nothing to write");
-        return INV_ERROR_FILE_WRITE;
-    }
-    else {
-        MPL_LOGI("cal data size to write = %d", len);
-    }
-    fp = fopen(MLCAL_FILE,"wb");
-    if (fp == NULL) {
-        MPL_LOGE("Cannot open file \"%s\" for write\n", MLCAL_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-    bytesWritten = fwrite(cal, 1, len, fp);
-    if (bytesWritten != len) {
-        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
-                 bytesWritten, len);
-        result = INV_ERROR_FILE_WRITE;
-    }
-    else {
-        MPL_LOGI("Bytes written = %d", bytesWritten);
-    }
-    fclose(fp);
-    return result;
-}
-
-/**
- *  @brief  Loads a type 0 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature compensation : temperature data points,
- *          - temperature compensation : gyro biases data points for X, Y,
- *              and Z axes.
- *          - accel biases for X, Y, Z axes.
- *          This calibration data is produced internally by the MPL and its
- *          size is 2777 bytes (header and checksum included).
- *          Calibration format type 1 is currently used for ITG3500
- *
- *  @pre    inv_init_storage_manager()
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V0(unsigned char *calData, size_t len)
-{
-    inv_error_t result;
-
-    LOADCAL_LOG("Entering inv_load_cal_V0\n");
-
-    /*if (len != expLen) {
-        MPL_LOGE("Calibration data type 0 must be %d bytes long (got %d)\n",
-                 expLen, len);
-        return INV_ERROR_FILE_READ;
-    }*/
-
-    result = inv_load_mpl_states(calData, len);
-    return result;
-}
-
-/**
- *  @brief  Loads a type 1 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature,
- *          - gyro biases for X, Y, Z axes,
- *          - accel biases for X, Y, Z axes.
- *          This calibration data would normally be produced by the MPU Self
- *          Test and its size is 36 bytes (header and checksum included).
- *          Calibration format type 1 is produced by the MPU Self Test and
- *          substitutes the type 0 : inv_load_cal_V0().
- *
- *  @pre    
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V1(unsigned char *calData, size_t len)
-{
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   Loads a set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *
- * @pre     
- *          
- *
- * @param   calData
- *              A pointer to an array of bytes to be parsed.
- *
- * @return  INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal(unsigned char *calData)
-{
-    int calType = 0;
-    int len = 0;
-    //int ptr;
-    //uint32_t chk = 0;
-    //uint32_t cmp_chk = 0;
-
-    /*load_func_t loaders[] = {
-        inv_load_cal_V0,
-        inv_load_cal_V1,
-    };
-    */
-
-    inv_load_cal_V0(calData, len);
-
-    /* read the header (type and len)
-       len is the total record length including header and checksum */
-    len = 0;
-    len += 16777216L * ((int)calData[0]);
-    len += 65536L * ((int)calData[1]);
-    len += 256 * ((int)calData[2]);
-    len += (int)calData[3];
-
-    calType = ((int)calData[4]) * 256 + ((int)calData[5]);
-    if (calType > 5) {
-        MPL_LOGE("Unsupported calibration file format %d. "
-                 "Valid types 0..5\n", calType);
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    /* call the proper method to read in the data */
-    //return loaders[calType] (calData, len);
-    return 0;
-}
-
-/**
- *  @brief  Stores a set of calibration data.
- *          It generates a binary data set containing calibration data.
- *          The binary data set is intended to be stored into a file.
- *
- *  @pre    inv_dmp_open()
- *
- *  @param  calData
- *              A pointer to an array of bytes to be stored.
- *  @param  length
- *              The amount of bytes available in the array.
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_store_cal(unsigned char *calData, size_t length)
-{
-    inv_error_t res = 0;
-    size_t size;
-
-    STORECAL_LOG("Entering inv_store_cal\n");
-
-    inv_get_mpl_state_size(&size);
-
-    MPL_LOGI("inv_get_mpl_state_size() : size=%d", size);
-
-    /* store data */
-    res = inv_save_mpl_states(calData, size);
-    if(res != 0)
-    {
-        MPL_LOGE("inv_save_mpl_states() failed");
-    }
-
-    STORECAL_LOG("Exiting inv_store_cal\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Load a calibration file.
- *
- *  @pre    Must be in INV_STATE_DMP_OPENED state.
- *          inv_dmp_open() or inv_dmp_stop() must have been called.
- *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
- *          been called.
- *
- *  @return 0 or error code.
- */
-inv_error_t inv_load_calibration(void)
-{
-    unsigned char *calData= NULL;
-    inv_error_t result = 0;
-    size_t bytesRead = 0;
-
-    result = inv_read_cal(&calData, &bytesRead);
-    if(result != INV_SUCCESS) {
-        MPL_LOGE("Could not load cal file - "
-                 "aborting\n");
-        goto free_mem_n_exit;
-    }
-
-    result = inv_load_mpl_states(calData, bytesRead);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("Could not load the calibration data - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-    }
-
-free_mem_n_exit:
-    inv_free(calData);
-    return result;
-}
-
-/**
- *  @brief  Store runtime calibration data to a file
- *
- *  @pre    Must be in INV_STATE_DMP_OPENED state.
- *          inv_dmp_open() or inv_dmp_stop() must have been called.
- *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
- *          been called.
- *
- *  @return 0 or error code.
- */
-inv_error_t inv_store_calibration(void)
-{
-    unsigned char *calData;
-    inv_error_t result;
-    size_t length;
-
-    result = inv_get_mpl_state_size(&length);
-    calData = (unsigned char *)inv_malloc(length);
-    if (!calData) {
-        MPL_LOGE("Could not allocate buffer of %d bytes - "
-                 "aborting\n", length);
-        return INV_ERROR_MEMORY_EXAUSTED;
-    }
-    else {
-        MPL_LOGI("mpl state size = %d", length);
-    }
-
-    result = inv_save_mpl_states(calData, length);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("Could not save mpl states - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-    }
-    else {
-        MPL_LOGE("calData from inv_save_mpl_states, size=%d", 
-                 strlen((char *)calData));
-    }
-
-    result = inv_write_cal(calData, length);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("Could not store calibrated data on file - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-
-    }
-
-free_mem_n_exit:
-    inv_free(calData);
-    return result;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.h b/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.h
deleted file mode 100644
index 115b34c..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_stored_data.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id: ml_stored_data.h 5873 2011-08-11 03:13:48Z mcaramello $
- *
- ******************************************************************************/
-
-#ifndef INV_MPL_STORED_DATA_H
-#define INV_MPL_STORED_DATA_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    Includes.
-*/
-#include "mltypes.h"
-
-/*
-    Defines
-*/
-#define MLCAL_FILE "/data/inv_cal_data.bin"
-
-/*
-    APIs
-*/
-inv_error_t inv_load_calibration(void);
-inv_error_t inv_store_calibration(void);
-
-/*
-    Internal APIs
-*/
-inv_error_t inv_read_cal(unsigned char **, size_t *);
-inv_error_t inv_write_cal(unsigned char *cal, size_t len);
-inv_error_t inv_load_cal_V0(unsigned char *calData, size_t len);
-inv_error_t inv_load_cal_V1(unsigned char *calData, size_t len);
-
-/*
-    Other prototypes
-*/
-inv_error_t inv_load_cal(unsigned char *calData);
-inv_error_t inv_store_cal(unsigned char *calData, size_t length);
-
-#ifdef __cplusplus
-}
-#endif
-#endif  /* INV_MPL_STORED_DATA_H */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c b/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c
deleted file mode 100644
index d0c4513..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.c
+++ /dev/null
@@ -1,423 +0,0 @@
-#include <string.h>
-#include <stdio.h>
-#include "ml_sysfs_helper.h"
-#include <dirent.h>
-#include <ctype.h>
-#define MPU_SYSFS_ABS_PATH "/sys/class/invensense/mpu"
-
-enum PROC_SYSFS_CMD {
-	CMD_GET_SYSFS_PATH,
-	CMD_GET_DMP_PATH,
-	CMD_GET_CHIP_NAME,
-	CMD_GET_SYSFS_KEY,
-	CMD_GET_TRIGGER_PATH,
-	CMD_GET_DEVICE_NODE
-};
-static char sysfs_path[100];
-static char *chip_name[] = {
-    "ITG3500", 
-    "MPU6050", 
-    "MPU9150", 
-    "MPU3050", 
-    "MPU6500"
-};
-static int chip_ind;
-static int initialized =0;
-static int status = 0;
-static int iio_initialized = 0;
-static int iio_dev_num = 0;
-
-#define IIO_MAX_NAME_LENGTH 30
-
-#define FORMAT_SCAN_ELEMENTS_DIR "%s/scan_elements"
-#define FORMAT_TYPE_FILE "%s_type"
-
-#define CHIP_NUM ARRAY_SIZE(chip_name)
-
-static const char *iio_dir = "/sys/bus/iio/devices/";
-
-/**
- * find_type_by_name() - function to match top level types by name
- * @name: top level type instance name
- * @type: the type of top level instance being sort
- *
- * Typical types this is used for are device and trigger.
- **/
-int find_type_by_name(const char *name, const char *type)
-{
-	const struct dirent *ent;
-	int number, numstrlen;
-
-	FILE *nameFile;
-	DIR *dp;
-	char thisname[IIO_MAX_NAME_LENGTH];
-	char *filename;
-
-	dp = opendir(iio_dir);
-	if (dp == NULL) {
-		printf("No industrialio devices available");
-		return -ENODEV;
-	}
-
-	while (ent = readdir(dp), ent != NULL) {
-		if (strcmp(ent->d_name, ".") != 0 &&
-			strcmp(ent->d_name, "..") != 0 &&
-			strlen(ent->d_name) > strlen(type) &&
-			strncmp(ent->d_name, type, strlen(type)) == 0) {
-			numstrlen = sscanf(ent->d_name + strlen(type),
-					   "%d",
-					   &number);
-			/* verify the next character is not a colon */
-			if (strncmp(ent->d_name + strlen(type) + numstrlen,
-					":",
-					1) != 0) {
-				filename = malloc(strlen(iio_dir)
-						+ strlen(type)
-						+ numstrlen
-						+ 6);
-				if (filename == NULL)
-					return -ENOMEM;
-				sprintf(filename, "%s%s%d/name",
-					iio_dir,
-					type,
-					number);
-				nameFile = fopen(filename, "r");
-				if (!nameFile)
-					continue;
-				free(filename);
-				fscanf(nameFile, "%s", thisname);
-				if (strcmp(name, thisname) == 0)
-					return number;
-				fclose(nameFile);
-			}
-		}
-	}
-	return -ENODEV;
-}
-
-/* mode 0: search for which chip in the system and fill sysfs path
-   mode 1: return event number
- */
-static int parsing_proc_input(int mode, char *name){
-	const char input[] = "/proc/bus/input/devices";
-	char line[4096], d;
-	char tmp[100];
-	FILE *fp;
-	int i, j, result, find_flag;
-	int event_number = -1;
-	int input_number = -1;
-
-	if(NULL == (fp = fopen(input, "rt")) ){
-		return -1;
-	}
-	result = 1;
-	find_flag = 0;
-	while(result != 0 && find_flag < 2){
-		i = 0;
-		d = 0;
-		memset(line, 0, 100);
-		while(d != '\n'){		
-			result = fread(&d, 1, 1, fp);
-			if(result == 0){
-				line[0] = 0;
-				break;
-			}
-			sprintf(&line[i], "%c", d);		
-			i ++;
-		}
-		if(line[0] == 'N'){
-			i = 1;
-			while(line[i] != '"'){
-				i++;
-			}
-			i++;
-			j = 0;
-			find_flag = 0;
-			if (mode == 0){
-				while(j < CHIP_NUM){
-					if(!memcmp(&line[i], chip_name[j], strlen(chip_name[j]))){
-						find_flag = 1;
-						chip_ind = j;
-					}
-					j++;
-				}
-			} else if (mode  != 0){
-				if(!memcmp(&line[i], name, strlen(name))){
-					find_flag = 1;
-				}
-			}
-		}		
-		if(find_flag){
-			if(mode == 0){
-				if(line[0] == 'S'){
-					memset(tmp, 0, 100);
-					i =1;
-					while(line[i] != '=') i++;
-					i++;
-					j = 0;
-					while(line[i] != '\n'){
-						tmp[j] = line[i];
-						i ++; j++;
-					}	
-					sprintf(sysfs_path, "%s%s", "/sys", tmp);
-					find_flag++;
-				}
-			} else if(mode == 1){
-				if(line[0] == 'H') {
-					i = 2;
-					while(line[i] != '=') i++;
-					while(line[i] != 't') i++;	
-					i++;
-					event_number = 0;
-					while(line[i] != '\n'){
-						if(line[i] >= '0' && line[i] <= '9')
-							event_number = event_number*10 + line[i]-0x30;
-						i ++;
-					}
-					find_flag ++;
-				}
-			} else if (mode == 2) {
-				if(line[0] == 'S'){
-					memset(tmp, 0, 100);
-					i =1;
-					while(line[i] != '=') i++;
-					i++;
-					j = 0;
-					while(line[i] != '\n'){
-						tmp[j] = line[i];
-						i ++; j++;
-					}
-					input_number = 0;
-					if(tmp[j-2] >= '0' && tmp[j-2] <= '9') 
-						input_number += (tmp[j-2]-0x30)*10;
-					if(tmp[j-1] >= '0' && tmp[j-1] <= '9') 
-						input_number += (tmp[j-1]-0x30);
-					find_flag++;
-				}
-			}
-		}
-	}
-	fclose(fp);
-	if(find_flag == 0){
-		return -1;
-	}
-	if(0 == mode)
-		status = 1;
-	if (mode == 1)
-		return event_number;
-	if (mode == 2)
-		return input_number;
-	return 0;
-
-}
-static void init_iio() {
-	int i, j;
-	char iio_chip[10];
-	int dev_num;
-	for(j=0; j< CHIP_NUM; j++) {
-		for (i=0; i<strlen(chip_name[j]); i++) {
-			iio_chip[i] = tolower(chip_name[j][i]);
-		}
-		iio_chip[strlen(chip_name[0])] = '\0';
-		dev_num = find_type_by_name(iio_chip, "iio:device");
-		if(dev_num >= 0) {
-			iio_initialized = 1;
-			iio_dev_num = dev_num;
-			chip_ind = j;
-		}
-	}
-}
-
-static int process_sysfs_request(enum PROC_SYSFS_CMD cmd, char *data)
-{
-	char key_path[100];
-	FILE *fp;
-	int i, result;
-	if(initialized == 0){
-		parsing_proc_input(0, NULL);
-		initialized = 1;
-	}
-	if(initialized && status == 0) {
-		init_iio();
-		if (iio_initialized == 0)
-			return -1;
-	}
-
-	memset(key_path, 0, 100);
-	switch(cmd){
-	case CMD_GET_SYSFS_PATH:
-		if (iio_initialized == 1)
-			sprintf(data, "/sys/bus/iio/devices/iio:device%d", iio_dev_num);
-		else
-			sprintf(data, "%s%s", sysfs_path, "/device/invensense/mpu");
-		break;
-	case CMD_GET_DMP_PATH:
-		if (iio_initialized == 1)
-			sprintf(data, "/sys/bus/iio/devices/iio:device%d/dmp_firmware", iio_dev_num);
-		else
-			sprintf(data, "%s%s", sysfs_path, "/device/invensense/mpu/dmp_firmware");
-		break;
-	case CMD_GET_CHIP_NAME:
-		sprintf(data, "%s", chip_name[chip_ind]);
-		break;
-	case CMD_GET_TRIGGER_PATH:
-		sprintf(data, "/sys/bus/iio/devices/trigger%d", iio_dev_num);
-		break;
-	case CMD_GET_DEVICE_NODE:
-		sprintf(data, "/dev/iio:device%d", iio_dev_num);
-		break;
-	case CMD_GET_SYSFS_KEY:
-		memset(key_path, 0, 100);
-		if (iio_initialized == 1)
-			sprintf(key_path, "/sys/bus/iio/devices/iio:device%d/key", iio_dev_num);
-		else	
-			sprintf(key_path, "%s%s", sysfs_path, "/device/invensense/mpu/key");
-
-		if((fp = fopen(key_path, "rt")) == NULL)
-			return -1;
-		for(i=0;i<16;i++){
-			fscanf(fp, "%02x", &result);
-			data[i] = (char)result;
-		}
-		
-		fclose(fp);
-		break;
-	default:
-		break;
-	}
-	return 0;
-}
-/** 
- *  @brief  return sysfs key. if the key is not available
- *          return false. So the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the key
- *           It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_sysfs_key(unsigned char *key)
-{
-	if (process_sysfs_request(CMD_GET_SYSFS_KEY, (char*)key) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
-
-/** 
- *  @brief  return the sysfs path. If the path is not 
- *          found yet. return false. So the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the sysfs
- *           path. It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_sysfs_path(char *name)
-{
-	if (process_sysfs_request(CMD_GET_SYSFS_PATH, name) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
-
-inv_error_t inv_get_sysfs_abs_path(char *name)
-{
-    strcpy(name, MPU_SYSFS_ABS_PATH);
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief  return the dmp file path. If the path is not 
- *          found yet. return false. So the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the dmp file
- *           path. It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_dmpfile(char *name)
-{
-   	if (process_sysfs_request(CMD_GET_DMP_PATH, name) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
-/** 
- *  @brief  return the chip name. If the chip is not 
- *          found yet. return false. So the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the chip name
- *           path(8 bytes). It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_chip_name(char *name)
-{
-   	if (process_sysfs_request(CMD_GET_CHIP_NAME, name) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
-/** 
- *  @brief  return event handler number. If the handler number is not found
- *          return false. the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the chip name
- *           path(8 bytes). It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- *  @int *num: event number store
- */
-inv_error_t  inv_get_handler_number(const char *name, int *num)
-{
-	initialized = 0;
-	if ((*num = parsing_proc_input(1, (char *)name)) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;	
-}
-
-/** 
- *  @brief  return input number. If the handler number is not found
- *          return false. the return value must be checked
- *          to make sure the path is valid.
- *  @unsigned char *name: This should be array big enough to hold the chip name
- *           path(8 bytes). It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- *  @int *num: input number store
- */
-inv_error_t  inv_get_input_number(const char *name, int *num)
-{
-	initialized = 0;
-	if ((*num = parsing_proc_input(2, (char *)name)) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else {
-		return INV_SUCCESS;
-	}	
-}
-
-/** 
- *  @brief  return iio trigger name. If iio is not initialized, return false.
- *          So the return must be checked to make sure the numeber is valid.
- *  @unsigned char *name: This should be array big enough to hold the trigger
- *           name. It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_iio_trigger_path(char *name)
-{
-	if (process_sysfs_request(CMD_GET_TRIGGER_PATH, (char *)name) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
-
-/** 
- *  @brief  return iio device node. If iio is not initialized, return false.
- *          So the return must be checked to make sure the numeber is valid.
- *  @unsigned char *name: This should be array big enough to hold the device
- *           node. It should be zeroed before calling this function.
- *           Or it could have unpredicable result.
- */
-inv_error_t inv_get_iio_device_node(char *name)
-{
-	if (process_sysfs_request(CMD_GET_DEVICE_NODE, (char *)name) < 0)
-		return INV_ERROR_NOT_OPENED;
-	else
-		return INV_SUCCESS;
-}
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.h b/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.h
deleted file mode 100644
index 9470874..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/ml_sysfs_helper.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id$
- *
- ******************************************************************************/
-
-#ifndef MLDMP_SYSFS_HELPER_H__
-#define MLDMP_SYSFS_HELPER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "invensense.h"
-
-int find_type_by_name(const char *name, const char *type);
-inv_error_t inv_get_sysfs_path(char *name);
-inv_error_t inv_get_sysfs_abs_path(char *name);
-inv_error_t inv_get_dmpfile(char *name);
-inv_error_t inv_get_chip_name(char *name);
-inv_error_t inv_get_sysfs_key(unsigned char *key);
-inv_error_t inv_get_handler_number(const char *name, int *num);
-inv_error_t inv_get_input_number(const char *name, int *num);
-inv_error_t inv_get_iio_trigger_path(char *name);
-inv_error_t inv_get_iio_device_node(char *name);
-
-#ifdef __cplusplus
-}
-#endif
-#endif	/* MLDMP_SYSFS_HELPER_H__ */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/mlos.h b/60xx/libsensors_iio/software/core/mllite/linux/mlos.h
deleted file mode 100644
index d4f8912..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/mlos.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-#ifndef _MLOS_H
-#define _MLOS_H
-
-#ifndef __KERNEL__
-#include <stdio.h>
-#endif
-#include <pthread.h>
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(LINUX) || defined(__KERNEL__)
-typedef pthread_mutex_t* HANDLE;
-#endif
-
-	/* ------------ */
-	/* - Defines. - */
-	/* ------------ */
-
-	/* - MLOSCreateFile defines. - */
-
-#define MLOS_GENERIC_READ         ((unsigned int)0x80000000)
-#define MLOS_GENERIC_WRITE        ((unsigned int)0x40000000)
-#define MLOS_FILE_SHARE_READ      ((unsigned int)0x00000001)
-#define MLOS_FILE_SHARE_WRITE     ((unsigned int)0x00000002)
-#define MLOS_OPEN_EXISTING        ((unsigned int)0x00000003)
-
-	/* ---------- */
-	/* - Enums. - */
-	/* ---------- */
-
-	/* --------------- */
-	/* - Structures. - */
-	/* --------------- */
-
-	/* --------------------- */
-	/* - Function p-types. - */
-	/* --------------------- */
-
-#ifndef __KERNEL__
-#include <string.h>
-	void *inv_malloc(unsigned int numBytes);
-	inv_error_t inv_free(void *ptr);
-	inv_error_t inv_create_mutex(HANDLE *mutex);
-	inv_error_t inv_lock_mutex(HANDLE mutex);
-	inv_error_t inv_unlock_mutex(HANDLE mutex);
-	FILE *inv_fopen(char *filename);
-	void inv_fclose(FILE *fp);
-
-	inv_error_t inv_destroy_mutex(HANDLE handle);
-
-	void inv_sleep(int mSecs);
-	unsigned long inv_get_tick_count(void);
-
-	/* Kernel implmentations */
-#define GFP_KERNEL (0x70)
-	static inline void *kmalloc(size_t size,
-				    unsigned int gfp_flags)
-	{
-        (void)gfp_flags;
-		return inv_malloc((unsigned int)size);
-	}
-	static inline void *kzalloc(size_t size, unsigned int gfp_flags)
-	{
-		void *tmp = inv_malloc((unsigned int)size);
-        (void)gfp_flags;
-		if (tmp)
-			memset(tmp, 0, size);
-		return tmp;
-	}
-	static inline void kfree(void *ptr)
-	{
-		inv_free(ptr);
-	}
-	static inline void msleep(long msecs)
-	{
-		inv_sleep(msecs);
-	}
-	static inline void udelay(unsigned long usecs)
-	{
-		inv_sleep((usecs + 999) / 1000);
-	}
-#else
-#include <linux/delay.h>
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-#endif				/* _MLOS_H */
diff --git a/60xx/libsensors_iio/software/core/mllite/linux/mlos_linux.c b/60xx/libsensors_iio/software/core/mllite/linux/mlos_linux.c
deleted file mode 100644
index 5424508..0000000
--- a/60xx/libsensors_iio/software/core/mllite/linux/mlos_linux.c
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- $License:
-    Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $
- *
- ******************************************************************************/
-
-/**
- *  @defgroup MLOS
- *  @brief OS Interface.
- *
- *  @{
- *      @file mlos.c
- *      @brief OS Interface.
- */
-
-/* ------------- */
-/* - Includes. - */
-/* ------------- */
-
-#include <sys/time.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#include "stdint_invensense.h"
-#include "mlos.h"
-
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-/**
- *  @brief  Allocate space
- *  @param  num_bytes  number of bytes
- *  @return pointer to allocated space
- */
-void *inv_malloc(unsigned int num_bytes)
-{
-    // Allocate space.
-    void *alloc_ptr = malloc(num_bytes);
-    return alloc_ptr;
-}
-
-
-/**
- *  @brief  Free allocated space
- *  @param  ptr pointer to space to deallocate
- *  @return error code.
- */
-inv_error_t inv_free(void *ptr)
-{
-    if (ptr)
-        free(ptr);
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex create function
- *  @param  mutex   pointer to mutex handle
- *  @return error code.
- */
-inv_error_t inv_create_mutex(HANDLE *mutex)
-{
-    int res;
-    pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t));
-    if(pm == NULL) 
-        return INV_ERROR;
-
-    res = pthread_mutex_init(pm, NULL);
-    if(res == -1) {
-        free(pm);
-        return INV_ERROR_OS_CREATE_FAILED;
-    }
-
-    *mutex = (HANDLE)pm;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex lock function
- *  @param  mutex   Mutex handle
- *  @return error code.
- */
-inv_error_t inv_lock_mutex(HANDLE mutex)
-{
-    int res;
-    pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
-
-    res = pthread_mutex_lock(pm);
-    if(res == -1)
-        return INV_ERROR_OS_LOCK_FAILED;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex unlock function
- *  @param  mutex   mutex handle
- *  @return error code.
- */
-inv_error_t inv_unlock_mutex(HANDLE mutex)
-{
-    int res;
-    pthread_mutex_t *pm = (pthread_mutex_t *)mutex;
-
-    res = pthread_mutex_unlock(pm);
-    if(res == -1) 
-        return INV_ERROR_OS_LOCK_FAILED;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  open file
- *  @param  filename    name of the file to open.
- *  @return error code.
- */
-FILE *inv_fopen(char *filename)
-{
-    FILE *fp = fopen(filename, "r");
-    return fp;
-}
-
-
-/**
- *  @brief  close the file.
- *  @param  fp  handle to file to close.
- *  @return error code.
- */
-void inv_fclose(FILE *fp)
-{
-    fclose(fp);
-}
-
-/**
- *  @brief  Close Handle
- *  @param  handle  handle to the resource.
- *  @return Zero if success, an error code otherwise.
- */
-inv_error_t inv_destroy_mutex(HANDLE handle)
-{
-    int error;
-    pthread_mutex_t *pm = (pthread_mutex_t *)handle;
-    error = pthread_mutex_destroy(pm);
-    if (error)
-        return errno;
-    free((void*) handle);
-
-    return INV_SUCCESS;}
-
-
-/**
- *  @brief  Sleep function.
- */
-void inv_sleep(int m_secs)
-{
-    usleep(m_secs * 1000);
-}
-
-
-/**
- *  @brief  get system's internal tick count.
- *          Used for time reference.
- *  @return current tick count.
- */
-unsigned long inv_get_tick_count()
-{
-    struct timeval tv;
-
-    if (gettimeofday(&tv, NULL) != 0)
-        return 0;
-
-    return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL);
-}
-
-/** @} */
-
diff --git a/60xx/libsensors_iio/software/core/mllite/message_layer.c b/60xx/libsensors_iio/software/core/mllite/message_layer.c
deleted file mode 100644
index 8317957..0000000
--- a/60xx/libsensors_iio/software/core/mllite/message_layer.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-/**
- *   @defgroup  Message_Layer message_layer
- *   @brief     Motion Library - Message Layer
- *              Holds Low Occurance messages
- *
- *   @{
- *       @file message_layer.c
- *       @brief Holds Low Occurance Messages.
- */
-#include "message_layer.h"
-#include "log.h"
-
-struct message_holder_t {
-    long message;
-};
-
-static struct message_holder_t mh;
-
-/** Sets a message.
-* @param[in] set The flags to set.
-* @param[in] clear Before setting anything this will clear these messages,
-*                  which is useful for mutually exclusive messages such
-*                  a motion or no motion message.
-* @param[in] level Level of the messages. It starts at 0, and may increase
-*            in the future to allow more messages if the bit storage runs out.
-*/
-void inv_set_message(long set, long clear, int level)
-{
-    if (level == 0) {
-        mh.message &= ~clear;
-        mh.message |= set;
-    }
-}
-
-/** Returns Message Flags for Level 0 Messages.
-* Levels are to allow expansion of more messages in the future.
-* @param[in] clear If set, will clear the message. Typically this will be set
-*  for one reader, so that you don't get the same message over and over.
-* @return bit field to corresponding message.
-*/
-long inv_get_message_level_0(int clear)
-{
-    long msg;
-    msg = mh.message;
-    if (clear) {
-        mh.message = 0;
-    }
-    return msg;
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/message_layer.h b/60xx/libsensors_iio/software/core/mllite/message_layer.h
deleted file mode 100644
index df0c0e2..0000000
--- a/60xx/libsensors_iio/software/core/mllite/message_layer.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INV_MESSAGE_LAYER_H__
-#define INV_MESSAGE_LAYER_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    /* Level 0 Type Messages */
-    /** A motion event has occured */
-#define INV_MSG_MOTION_EVENT    (0x01)
-    /** A no motion event has occured */
-#define INV_MSG_NO_MOTION_EVENT (0x02)
-    /** A setting of the gyro bias has occured */
-#define INV_MSG_NEW_GB_EVENT    (0x04)
-    /** A setting of the compass bias has occured */
-#define INV_MSG_NEW_CB_EVENT    (0x08)
-    /** A setting of the accel bias has occured */
-#define INV_MSG_NEW_AB_EVENT    (0x10)
-
-    void inv_set_message(long set, long clear, int level);
-    long inv_get_message_level_0(int clear);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // INV_MESSAGE_LAYER_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/ml_math_func.c b/60xx/libsensors_iio/software/core/mllite/ml_math_func.c
deleted file mode 100644
index c30d693..0000000
--- a/60xx/libsensors_iio/software/core/mllite/ml_math_func.c
+++ /dev/null
@@ -1,706 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-/**
- *   @defgroup  ML_MATH_FUNC ml_math_func
- *   @brief     Motion Library - Math Functions
- *              Common math functions the Motion Library
- *
- *   @{
- *       @file ml_math_func.c
- *       @brief Math Functions.
- */
-
-#include "mlmath.h"
-#include "ml_math_func.h"
-#include "mlinclude.h"
-#include <string.h>
-
-/** @internal
- * Does the cross product of compass by gravity, then converts that
- * to the world frame using the quaternion, then computes the angle that
- * is made.
- *
- * @param[in] compass Compass Vector (Body Frame), length 3
- * @param[in] grav Gravity Vector (Body Frame), length 3
- * @param[in] quat Quaternion, Length 4
- * @return Angle Cross Product makes after quaternion rotation.
- */
-float inv_compass_angle(const long *compass, const long *grav, const float *quat)
-{
-    float cgcross[4], q1[4], q2[4], qi[4];
-    float angW;
-
-    // Compass cross Gravity
-    cgcross[0] = 0.f;
-    cgcross[1] = (float)compass[1] * grav[2] - (float)compass[2] * grav[1];
-    cgcross[2] = (float)compass[2] * grav[0] - (float)compass[0] * grav[2];
-    cgcross[3] = (float)compass[0] * grav[1] - (float)compass[1] * grav[0];
-
-    // Now convert cross product into world frame
-    inv_q_multf(quat, cgcross, q1);
-    inv_q_invertf(quat, qi);
-    inv_q_multf(q1, qi, q2);
-
-    // Protect against atan2 of 0,0
-    if ((q2[2] == 0.f) && (q2[1] == 0.f))
-        return 0.f;
-
-    // This is the unfiltered heading correction
-    angW = -atan2f(q2[2], q2[1]);
-    return angW;
-}
-
-/**
- *  @brief  The gyro data magnitude squared :
- *          (1 degree per second)^2 = 2^6 = 2^GYRO_MAG_SQR_SHIFT.
- * @param[in] gyro Gyro data scaled with 1 dps = 2^16
- *  @return the computed magnitude squared output of the gyroscope.
- */
-unsigned long inv_get_gyro_sum_of_sqr(const long *gyro)
-{
-    unsigned long gmag = 0;
-    long temp;
-    int kk;
-
-    for (kk = 0; kk < 3; ++kk) {
-        temp = gyro[kk] >> (16 - (GYRO_MAG_SQR_SHIFT / 2));
-        gmag += temp * temp;
-    }
-
-    return gmag;
-}
-
-/** Performs a multiply and shift by 29. These are good functions to write in assembly on
- * with devices with small memory where you want to get rid of the long long which some
- * assemblers don't handle well
- * @param[in] a
- * @param[in] b
- * @return ((long long)a*b)>>29
-*/
-long inv_q29_mult(long a, long b)
-{
-#ifdef UMPL_ELIMINATE_64BIT
-    long result;
-    result = (long)((float)a * b / (1L << 29));
-    return result;
-#else
-    long long temp;
-    long result;
-    temp = (long long)a * b;
-    result = (long)(temp >> 29);
-    return result;
-#endif
-}
-
-/** Performs a multiply and shift by 30. These are good functions to write in assembly on
- * with devices with small memory where you want to get rid of the long long which some
- * assemblers don't handle well
- * @param[in] a
- * @param[in] b
- * @return ((long long)a*b)>>30
-*/
-long inv_q30_mult(long a, long b)
-{
-#ifdef UMPL_ELIMINATE_64BIT
-    long result;
-    result = (long)((float)a * b / (1L << 30));
-    return result;
-#else
-    long long temp;
-    long result;
-    temp = (long long)a * b;
-    result = (long)(temp >> 30);
-    return result;
-#endif
-}
-
-#ifndef UMPL_ELIMINATE_64BIT
-long inv_q30_div(long a, long b)
-{
-    long long temp;
-    long result;
-    temp = (((long long)a) << 30) / b;
-    result = (long)temp;
-    return result;
-}
-#endif
-
-/** Performs a multiply and shift by shift. These are good functions to write
- * in assembly on with devices with small memory where you want to get rid of
- * the long long which some assemblers don't handle well
- * @param[in] a First multicand
- * @param[in] b Second multicand
- * @param[in] shift Shift amount after multiplying
- * @return ((long long)a*b)<<shift
-*/
-#ifndef UMPL_ELIMINATE_64BIT
-long inv_q_shift_mult(long a, long b, int shift)
-{
-    long result;
-    result = (long)(((long long)a * b) >> shift);
-    return result;
-}
-#endif
-
-/** Performs a fixed point quaternion multiply.
-* @param[in] q1 First Quaternion Multicand, length 4. 1.0 scaled
-*            to 2^30
-* @param[in] q2 Second Quaternion Multicand, length 4. 1.0 scaled
-*            to 2^30
-* @param[out] qProd Product after quaternion multiply. Length 4.
-*             1.0 scaled to 2^30.
-*/
-void inv_q_mult(const long *q1, const long *q2, long *qProd)
-{
-    INVENSENSE_FUNC_START;
-    qProd[0] = inv_q30_mult(q1[0], q2[0]) - inv_q30_mult(q1[1], q2[1]) -
-               inv_q30_mult(q1[2], q2[2]) - inv_q30_mult(q1[3], q2[3]);
-
-    qProd[1] = inv_q30_mult(q1[0], q2[1]) + inv_q30_mult(q1[1], q2[0]) +
-               inv_q30_mult(q1[2], q2[3]) - inv_q30_mult(q1[3], q2[2]);
-
-    qProd[2] = inv_q30_mult(q1[0], q2[2]) - inv_q30_mult(q1[1], q2[3]) +
-               inv_q30_mult(q1[2], q2[0]) + inv_q30_mult(q1[3], q2[1]);
-
-    qProd[3] = inv_q30_mult(q1[0], q2[3]) + inv_q30_mult(q1[1], q2[2]) -
-               inv_q30_mult(q1[2], q2[1]) + inv_q30_mult(q1[3], q2[0]);
-}
-
-/** Performs a fixed point quaternion addition.
-* @param[in] q1 First Quaternion term, length 4. 1.0 scaled
-*            to 2^30
-* @param[in] q2 Second Quaternion term, length 4. 1.0 scaled
-*            to 2^30
-* @param[out] qSum Sum after quaternion summation. Length 4.
-*             1.0 scaled to 2^30.
-*/
-void inv_q_add(long *q1, long *q2, long *qSum)
-{
-    INVENSENSE_FUNC_START;
-    qSum[0] = q1[0] + q2[0];
-    qSum[1] = q1[1] + q2[1];
-    qSum[2] = q1[2] + q2[2];
-    qSum[3] = q1[3] + q2[3];
-}
-
-void inv_vector_normalize(long *vec, int length)
-{
-    INVENSENSE_FUNC_START;
-    double normSF = 0;
-    int ii;
-    for (ii = 0; ii < length; ii++) {
-        normSF +=
-            inv_q30_to_double(vec[ii]) * inv_q30_to_double(vec[ii]);
-    }
-    if (normSF > 0) {
-        normSF = 1 / sqrt(normSF);
-        for (ii = 0; ii < length; ii++) {
-            vec[ii] = (int)((double)vec[ii] * normSF);
-        }
-    } else {
-        vec[0] = 1073741824L;
-        for (ii = 1; ii < length; ii++) {
-            vec[ii] = 0;
-        }
-    }
-}
-
-void inv_q_normalize(long *q)
-{
-    INVENSENSE_FUNC_START;
-    inv_vector_normalize(q, 4);
-}
-
-void inv_q_invert(const long *q, long *qInverted)
-{
-    INVENSENSE_FUNC_START;
-    qInverted[0] = q[0];
-    qInverted[1] = -q[1];
-    qInverted[2] = -q[2];
-    qInverted[3] = -q[3];
-}
-
-double quaternion_to_rotation_angle(const long *quat) {
-    double quat0 = (double )quat[0] / 1073741824;
-    if (quat0 > 1.0f) {
-        quat0 = 1.0;
-    } else if (quat0 < -1.0f) {
-        quat0 = -1.0;
-    }
-
-    return acos(quat0)*2*180/M_PI;
-}
-
-/** Rotates a 3-element vector by Rotation defined by Q
-*/
-void inv_q_rotate(const long *q, const long *in, long *out)
-{
-    long q_temp1[4], q_temp2[4];
-    long in4[4], out4[4];
-
-    // Fixme optimize
-    in4[0] = 0;
-    memcpy(&in4[1], in, 3 * sizeof(long));
-    inv_q_mult(q, in4, q_temp1);
-    inv_q_invert(q, q_temp2);
-    inv_q_mult(q_temp1, q_temp2, out4);
-    memcpy(out, &out4[1], 3 * sizeof(long));
-}
-
-void inv_q_multf(const float *q1, const float *q2, float *qProd)
-{
-    INVENSENSE_FUNC_START;
-    qProd[0] =
-        (q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2] - q1[3] * q2[3]);
-    qProd[1] =
-        (q1[0] * q2[1] + q1[1] * q2[0] + q1[2] * q2[3] - q1[3] * q2[2]);
-    qProd[2] =
-        (q1[0] * q2[2] - q1[1] * q2[3] + q1[2] * q2[0] + q1[3] * q2[1]);
-    qProd[3] =
-        (q1[0] * q2[3] + q1[1] * q2[2] - q1[2] * q2[1] + q1[3] * q2[0]);
-}
-
-void inv_q_addf(const float *q1, const float *q2, float *qSum)
-{
-    INVENSENSE_FUNC_START;
-    qSum[0] = q1[0] + q2[0];
-    qSum[1] = q1[1] + q2[1];
-    qSum[2] = q1[2] + q2[2];
-    qSum[3] = q1[3] + q2[3];
-}
-
-void inv_q_normalizef(float *q)
-{
-    INVENSENSE_FUNC_START;
-    float normSF = 0;
-    float xHalf = 0;
-    normSF = (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-    if (normSF < 2) {
-        xHalf = 0.5f * normSF;
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        q[0] *= normSF;
-        q[1] *= normSF;
-        q[2] *= normSF;
-        q[3] *= normSF;
-    } else {
-        q[0] = 1.0;
-        q[1] = 0.0;
-        q[2] = 0.0;
-        q[3] = 0.0;
-    }
-    normSF = (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-}
-
-/** Performs a length 4 vector normalization with a square root.
-* @param[in,out] q vector to normalize. Returns [1,0,0,0] is magnitude is zero.
-*/
-void inv_q_norm4(float *q)
-{
-    float mag;
-    mag = sqrtf(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-    if (mag) {
-        q[0] /= mag;
-        q[1] /= mag;
-        q[2] /= mag;
-        q[3] /= mag;
-    } else {
-        q[0] = 1.f;
-        q[1] = 0.f;
-        q[2] = 0.f;
-        q[3] = 0.f;
-    }
-}
-
-void inv_q_invertf(const float *q, float *qInverted)
-{
-    INVENSENSE_FUNC_START;
-    qInverted[0] = q[0];
-    qInverted[1] = -q[1];
-    qInverted[2] = -q[2];
-    qInverted[3] = -q[3];
-}
-
-/**
- * Converts a quaternion to a rotation matrix.
- * @param[in] quat 4-element quaternion in fixed point. One is 2^30.
- * @param[out] rot Rotation matrix in fixed point. One is 2^30. The
- *             First 3 elements of the rotation matrix, represent
- *             the first row of the matrix. Rotation matrix multiplied
- *             by a 3 element column vector transform a vector from Body
- *             to World.
- */
-void inv_quaternion_to_rotation(const long *quat, long *rot)
-{
-    rot[0] =
-        inv_q29_mult(quat[1], quat[1]) + inv_q29_mult(quat[0],
-                quat[0]) -
-        1073741824L;
-    rot[1] =
-        inv_q29_mult(quat[1], quat[2]) - inv_q29_mult(quat[3], quat[0]);
-    rot[2] =
-        inv_q29_mult(quat[1], quat[3]) + inv_q29_mult(quat[2], quat[0]);
-    rot[3] =
-        inv_q29_mult(quat[1], quat[2]) + inv_q29_mult(quat[3], quat[0]);
-    rot[4] =
-        inv_q29_mult(quat[2], quat[2]) + inv_q29_mult(quat[0],
-                quat[0]) -
-        1073741824L;
-    rot[5] =
-        inv_q29_mult(quat[2], quat[3]) - inv_q29_mult(quat[1], quat[0]);
-    rot[6] =
-        inv_q29_mult(quat[1], quat[3]) - inv_q29_mult(quat[2], quat[0]);
-    rot[7] =
-        inv_q29_mult(quat[2], quat[3]) + inv_q29_mult(quat[1], quat[0]);
-    rot[8] =
-        inv_q29_mult(quat[3], quat[3]) + inv_q29_mult(quat[0],
-                quat[0]) -
-        1073741824L;
-}
-
-/**
- * Converts a quaternion to a rotation vector. A rotation vector is
- * a method to represent a 4-element quaternion vector in 3-elements.
- * To get the quaternion from the 3-elements, The last 3-elements of
- * the quaternion will be the given rotation vector. The first element
- * of the quaternion will be the positive value that will be required
- * to make the magnitude of the quaternion 1.0 or 2^30 in fixed point units.
- * @param[in] quat 4-element quaternion in fixed point. One is 2^30.
- * @param[out] rot Rotation vector in fixed point. One is 2^30.
- */
-void inv_quaternion_to_rotation_vector(const long *quat, long *rot)
-{
-    rot[0] = quat[1];
-    rot[1] = quat[2];
-    rot[2] = quat[3];
-
-    if (quat[0] < 0.0) {
-        rot[0] = -rot[0];
-        rot[1] = -rot[1];
-        rot[2] = -rot[2];
-    }
-}
-
-/** Converts a 32-bit long to a big endian byte stream */
-unsigned char *inv_int32_to_big8(long x, unsigned char *big8)
-{
-    big8[0] = (unsigned char)((x >> 24) & 0xff);
-    big8[1] = (unsigned char)((x >> 16) & 0xff);
-    big8[2] = (unsigned char)((x >> 8) & 0xff);
-    big8[3] = (unsigned char)(x & 0xff);
-    return big8;
-}
-
-/** Converts a big endian byte stream into a 32-bit long */
-long inv_big8_to_int32(const unsigned char *big8)
-{
-    long x;
-    x = ((long)big8[0] << 24) | ((long)big8[1] << 16) | ((long)big8[2] << 8)
-        | ((long)big8[3]);
-    return x;
-}
-
-/** Converts a big endian byte stream into a 16-bit integer (short) */
-short inv_big8_to_int16(const unsigned char *big8)
-{
-    short x;
-    x = ((short)big8[0] << 8) | ((short)big8[1]);
-    return x;
-}
-
-/** Converts a little endian byte stream into a 16-bit integer (short) */
-short inv_little8_to_int16(const unsigned char *little8)
-{
-    short x;
-    x = ((short)little8[1] << 8) | ((short)little8[0]);
-    return x;
-}
-
-/** Converts a 16-bit short to a big endian byte stream */
-unsigned char *inv_int16_to_big8(short x, unsigned char *big8)
-{
-    big8[0] = (unsigned char)((x >> 8) & 0xff);
-    big8[1] = (unsigned char)(x & 0xff);
-    return big8;
-}
-
-void inv_matrix_det_inc(float *a, float *b, int *n, int x, int y)
-{
-    int k, l, i, j;
-    for (i = 0, k = 0; i < *n; i++, k++) {
-        for (j = 0, l = 0; j < *n; j++, l++) {
-            if (i == x)
-                i++;
-            if (j == y)
-                j++;
-            *(b + 6 * k + l) = *(a + 6 * i + j);
-        }
-    }
-    *n = *n - 1;
-}
-
-void inv_matrix_det_incd(double *a, double *b, int *n, int x, int y)
-{
-    int k, l, i, j;
-    for (i = 0, k = 0; i < *n; i++, k++) {
-        for (j = 0, l = 0; j < *n; j++, l++) {
-            if (i == x)
-                i++;
-            if (j == y)
-                j++;
-            *(b + 6 * k + l) = *(a + 6 * i + j);
-        }
-    }
-    *n = *n - 1;
-}
-
-float inv_matrix_det(float *p, int *n)
-{
-    float d[6][6], sum = 0;
-    int i, j, m;
-    m = *n;
-    if (*n == 2)
-        return (*p ** (p + 7) - *(p + 1) ** (p + 6));
-    for (i = 0, j = 0; j < m; j++) {
-        *n = m;
-        inv_matrix_det_inc(p, &d[0][0], n, i, j);
-        sum =
-            sum + *(p + 6 * i + j) * SIGNM(i +
-                                            j) *
-            inv_matrix_det(&d[0][0], n);
-    }
-
-    return (sum);
-}
-
-double inv_matrix_detd(double *p, int *n)
-{
-    double d[6][6], sum = 0;
-    int i, j, m;
-    m = *n;
-    if (*n == 2)
-        return (*p ** (p + 7) - *(p + 1) ** (p + 6));
-    for (i = 0, j = 0; j < m; j++) {
-        *n = m;
-        inv_matrix_det_incd(p, &d[0][0], n, i, j);
-        sum =
-            sum + *(p + 6 * i + j) * SIGNM(i +
-                                            j) *
-            inv_matrix_detd(&d[0][0], n);
-    }
-
-    return (sum);
-}
-
-/** Wraps angle from (-M_PI,M_PI]
- * @param[in] ang Angle in radians to wrap
- * @return Wrapped angle from (-M_PI,M_PI]
- */
-float inv_wrap_angle(float ang)
-{
-    if (ang > M_PI)
-        return ang - 2 * (float)M_PI;
-    else if (ang <= -(float)M_PI)
-        return ang + 2 * (float)M_PI;
-    else
-        return ang;
-}
-
-/** Finds the minimum angle difference ang1-ang2 such that difference
- * is between [-M_PI,M_PI]
- * @param[in] ang1
- * @param[in] ang2
- * @return angle difference ang1-ang2
- */
-float inv_angle_diff(float ang1, float ang2)
-{
-    float d;
-    ang1 = inv_wrap_angle(ang1);
-    ang2 = inv_wrap_angle(ang2);
-    d = ang1 - ang2;
-    if (d > M_PI)
-        d -= 2 * (float)M_PI;
-    else if (d < -(float)M_PI)
-        d += 2 * (float)M_PI;
-    return d;
-}
-
-/** bernstein hash, derived from public domain source */
-uint32_t inv_checksum(const unsigned char *str, int len)
-{
-    uint32_t hash = 5381;
-    int i, c;
-
-    for (i = 0; i < len; i++) {
-        c = *(str + i);
-        hash = ((hash << 5) + hash) + c;	/* hash * 33 + c */
-    }
-
-    return hash;
-}
-
-static unsigned short inv_row_2_scale(const signed char *row)
-{
-    unsigned short b;
-
-    if (row[0] > 0)
-        b = 0;
-    else if (row[0] < 0)
-        b = 4;
-    else if (row[1] > 0)
-        b = 1;
-    else if (row[1] < 0)
-        b = 5;
-    else if (row[2] > 0)
-        b = 2;
-    else if (row[2] < 0)
-        b = 6;
-    else
-        b = 7;		// error
-    return b;
-}
-
-
-/** Converts an orientation matrix made up of 0,+1,and -1 to a scalar representation.
-* @param[in] mtx Orientation matrix to convert to a scalar.
-* @return Description of orientation matrix. The lowest 2 bits (0 and 1) represent the column the one is on for the
-* first row, with the bit number 2 being the sign. The next 2 bits (3 and 4) represent
-* the column the one is on for the second row with bit number 5 being the sign.
-* The next 2 bits (6 and 7) represent the column the one is on for the third row with
-* bit number 8 being the sign. In binary the identity matrix would therefor be:
-* 010_001_000 or 0x88 in hex.
-*/
-unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx)
-{
-
-    unsigned short scalar;
-
-    /*
-       XYZ  010_001_000 Identity Matrix
-       XZY  001_010_000
-       YXZ  010_000_001
-       YZX  000_010_001
-       ZXY  001_000_010
-       ZYX  000_001_010
-     */
-
-    scalar = inv_row_2_scale(mtx);
-    scalar |= inv_row_2_scale(mtx + 3) << 3;
-    scalar |= inv_row_2_scale(mtx + 6) << 6;
-
-
-    return scalar;
-}
-
-/** Uses the scalar orientation value to convert from chip frame to body frame
-* @param[in] orientation A scalar that represent how to go from chip to body frame
-* @param[in] input Input vector, length 3
-* @param[out] output Output vector, length 3
-*/
-void inv_convert_to_body(unsigned short orientation, const long *input, long *output)
-{
-    output[0] = input[orientation      & 0x03] * SIGNSET(orientation & 0x004);
-    output[1] = input[(orientation>>3) & 0x03] * SIGNSET(orientation & 0x020);
-    output[2] = input[(orientation>>6) & 0x03] * SIGNSET(orientation & 0x100);
-}
-
-/** Uses the scalar orientation value to convert from body frame to chip frame
-* @param[in] orientation A scalar that represent how to go from chip to body frame
-* @param[in] input Input vector, length 3
-* @param[out] output Output vector, length 3
-*/
-void inv_convert_to_chip(unsigned short orientation, const long *input, long *output)
-{
-    output[orientation & 0x03]      = input[0] * SIGNSET(orientation & 0x004);
-    output[(orientation>>3) & 0x03] = input[1] * SIGNSET(orientation & 0x020);
-    output[(orientation>>6) & 0x03] = input[2] * SIGNSET(orientation & 0x100);
-}
-
-
-/** Uses the scalar orientation value to convert from chip frame to body frame and
-* apply appropriate scaling.
-* @param[in] orientation A scalar that represent how to go from chip to body frame
-* @param[in] sensitivity Sensitivity scale
-* @param[in] input Input vector, length 3
-* @param[out] output Output vector, length 3
-*/
-void inv_convert_to_body_with_scale(unsigned short orientation, long sensitivity, const long *input, long *output)
-{
-    output[0] = inv_q30_mult(input[orientation & 0x03] *
-                             SIGNSET(orientation & 0x004), sensitivity);
-    output[1] = inv_q30_mult(input[(orientation>>3) & 0x03] *
-                             SIGNSET(orientation & 0x020), sensitivity);
-    output[2] = inv_q30_mult(input[(orientation>>6) & 0x03] *
-                             SIGNSET(orientation & 0x100), sensitivity);
-}
-
-/** find a norm for a vector
-* @param[in] x a vector [3x1]
-* @return the normalize vector.
-*/
-double inv_vector_norm(const float *x)
-{
-    return sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
-}
-
-void inv_init_biquad_filter(inv_biquad_filter_t *pFilter, float *pBiquadCoeff) {
-    int i;
-    // initial state to zero
-    pFilter->state[0] = 0;
-    pFilter->state[1] = 0;
-
-    // set up coefficients
-    for (i=0; i<5; i++) {
-        pFilter->c[i] = pBiquadCoeff[i];
-    }
-}
-
-void inv_calc_state_to_match_output(inv_biquad_filter_t *pFilter, float input)
-{
-    pFilter->input = input;
-    pFilter->output = input;
-    pFilter->state[0] = input / (1 + pFilter->c[2] + pFilter->c[3]);
-    pFilter->state[1] = pFilter->state[0];
-}
-
-float inv_biquad_filter_process(inv_biquad_filter_t *pFilter, float input)  {
-    float stateZero;
-
-    pFilter->input = input;
-    // calculate the new state;
-    stateZero = pFilter->input - pFilter->c[2]*pFilter->state[0]
-                               - pFilter->c[3]*pFilter->state[1];
-
-    pFilter->output = stateZero + pFilter->c[0]*pFilter->state[0]
-                                + pFilter->c[1]*pFilter->state[1];
-
-    // update the output and state
-    pFilter->output = pFilter->output * pFilter->c[4];
-    pFilter->state[1] = pFilter->state[0];
-    pFilter->state[0] = stateZero;
-    return pFilter->output;
-}
-
-void inv_get_cross_product_vec(float *cgcross, float compass[3], float grav[3])  {
-
-    cgcross[0] = (float)compass[1] * grav[2] - (float)compass[2] * grav[1];
-    cgcross[1] = (float)compass[2] * grav[0] - (float)compass[0] * grav[2];
-    cgcross[2] = (float)compass[0] * grav[1] - (float)compass[1] * grav[0];
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/ml_math_func.h b/60xx/libsensors_iio/software/core/mllite/ml_math_func.h
deleted file mode 100644
index 535d849..0000000
--- a/60xx/libsensors_iio/software/core/mllite/ml_math_func.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INVENSENSE_INV_MATH_FUNC_H__
-#define INVENSENSE_INV_MATH_FUNC_H__
-
-#include "mltypes.h"
-
-#define GYRO_MAG_SQR_SHIFT 6
-#define NUM_ROTATION_MATRIX_ELEMENTS (9)
-#define ROT_MATRIX_SCALE_LONG  (1073741824L)
-#define ROT_MATRIX_SCALE_FLOAT (1073741824.0f)
-#define ROT_MATRIX_LONG_TO_FLOAT( longval ) \
-    ((float) ((longval) / ROT_MATRIX_SCALE_FLOAT ))
-#define SIGNM(k)((int)(k)&1?-1:1)
-#define SIGNSET(x) ((x) ? -1 : +1)
-
-#define INV_TWO_POWER_NEG_30 9.313225746154785e-010f
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-     typedef struct {
-        float state[4];
-        float c[5];
-        float input;
-        float output;
-    }   inv_biquad_filter_t;
-
-    static inline float inv_q30_to_float(long q30)
-    {
-        return (float) q30 / ((float)(1L << 30));
-    }
-
-    static inline double inv_q30_to_double(long q30)
-    {
-        return (double) q30 / ((double)(1L << 30));
-    }
-
-    static inline float inv_q16_to_float(long q16)
-    {
-        return (float) q16 / (1L << 16);
-    }
-
-    static inline double inv_q16_to_double(long q16)
-    {
-        return (double) q16 / (1L << 16);
-    }
-
-
-
-
-    long inv_q29_mult(long a, long b);
-    long inv_q30_mult(long a, long b);
-
-    /* UMPL_ELIMINATE_64BIT Notes:
-     * An alternate implementation using float instead of long long accudoublemulators
-     * is provided for q29_mult and q30_mult.
-     * When long long accumulators are used and an alternate implementation is not
-     * available, we eliminate the entire function and header with a macro.
-     */
-#ifndef UMPL_ELIMINATE_64BIT
-    long inv_q30_div(long a, long b);
-    long inv_q_shift_mult(long a, long b, int shift);
-#endif
-
-    void inv_q_mult(const long *q1, const long *q2, long *qProd);
-    void inv_q_add(long *q1, long *q2, long *qSum);
-    void inv_q_normalize(long *q);
-    void inv_q_invert(const long *q, long *qInverted);
-    void inv_q_multf(const float *q1, const float *q2, float *qProd);
-    void inv_q_addf(const float *q1, const float *q2, float *qSum);
-    void inv_q_normalizef(float *q);
-    void inv_q_norm4(float *q);
-    void inv_q_invertf(const float *q, float *qInverted);
-    void inv_quaternion_to_rotation(const long *quat, long *rot);
-    unsigned char *inv_int32_to_big8(long x, unsigned char *big8);
-    long inv_big8_to_int32(const unsigned char *big8);
-    short inv_big8_to_int16(const unsigned char *big8);
-    short inv_little8_to_int16(const unsigned char *little8);
-    unsigned char *inv_int16_to_big8(short x, unsigned char *big8);
-    float inv_matrix_det(float *p, int *n);
-    void inv_matrix_det_inc(float *a, float *b, int *n, int x, int y);
-    double inv_matrix_detd(double *p, int *n);
-    void inv_matrix_det_incd(double *a, double *b, int *n, int x, int y);
-    float inv_wrap_angle(float ang);
-    float inv_angle_diff(float ang1, float ang2);
-    void inv_quaternion_to_rotation_vector(const long *quat, long *rot);
-    unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx);
-    void inv_convert_to_body(unsigned short orientation, const long *input, long *output);
-    void inv_convert_to_chip(unsigned short orientation, const long *input, long *output);
-    void inv_convert_to_body_with_scale(unsigned short orientation, long sensitivity, const long *input, long *output);
-    void inv_q_rotate(const long *q, const long *in, long *out);
-	void inv_vector_normalize(long *vec, int length);
-    uint32_t inv_checksum(const unsigned char *str, int len);
-    float inv_compass_angle(const long *compass, const long *grav,
-                            const float *quat);
-    unsigned long inv_get_gyro_sum_of_sqr(const long *gyro);
-
-    static inline long inv_delta_time_ms(inv_time_t t1, inv_time_t t2)
-    {
-        return (long)((t1 - t2) / 1000000L);
-    }
-
-    double quaternion_to_rotation_angle(const long *quat);
-    double inv_vector_norm(const float *x);
-
-    void inv_init_biquad_filter(inv_biquad_filter_t *pFilter, float *pBiquadCoeff);
-    float inv_biquad_filter_process(inv_biquad_filter_t *pFilter, float input);
-    void inv_calc_state_to_match_output(inv_biquad_filter_t *pFilter, float input);
-    void inv_get_cross_product_vec(float *cgcross, float compass[3], float grav[3]);
-
-#ifdef __cplusplus
-}
-#endif
-#endif // INVENSENSE_INV_MATH_FUNC_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/mpl.c b/60xx/libsensors_iio/software/core/mllite/mpl.c
deleted file mode 100644
index 9141cc6..0000000
--- a/60xx/libsensors_iio/software/core/mllite/mpl.c
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-/**
- *   @defgroup  MPL mpl
- *   @brief     Motion Library - Start Point
- *              Initializes MPL.
- *
- *   @{
- *       @file  mpl.c
- *       @brief MPL start point.
- */
-
-#include "storage_manager.h"
-#include "log.h"
-#include "mpl.h"
-#include "start_manager.h"
-#include "data_builder.h"
-#include "results_holder.h"
-#include "mlinclude.h"
-
-/**
- * @brief  Initializes the MPL. Should be called first and once 
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_init_mpl(void)
-{
-    inv_init_storage_manager();
-
-    /* initialize the start callback manager */
-    INV_ERROR_CHECK(inv_init_start_manager());
-
-    /* initialize the data builder */
-    INV_ERROR_CHECK(inv_init_data_builder());
-
-    INV_ERROR_CHECK(inv_enable_results_holder());
-
-    return INV_SUCCESS;
-}
-
-const char ml_ver[] = "InvenSense MPL 5.1.2 beta RC9";
-
-/**
- *  @brief  used to get the MPL version.
- *  @param  version     a string where the MPL version gets stored.
- *  @return INV_SUCCESS if successful or a non-zero error code otherwise.
- */
-inv_error_t inv_get_version(char **version)
-{
-    INVENSENSE_FUNC_START;
-    /* cast out the const */
-    *version = (char *)&ml_ver;
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief  Starts the MPL. Typically called after inv_init_mpl() or after a
- *          inv_stop_mpl() to start the MPL back up an running.
- *  @return INV_SUCCESS if successful or a non-zero error code otherwise.
- */
-inv_error_t inv_start_mpl(void)
-{
-    INV_ERROR_CHECK(inv_execute_mpl_start_notification());
-    return INV_SUCCESS;
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/mpl.h b/60xx/libsensors_iio/software/core/mllite/mpl.h
deleted file mode 100644
index a6b5ac7..0000000
--- a/60xx/libsensors_iio/software/core/mllite/mpl.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#include "mltypes.h"
-
-#ifndef INV_MPL_H__
-#define INV_MPL_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_init_mpl(void);
-inv_error_t inv_start_mpl(void);
-inv_error_t inv_get_version(char **version);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_MPL_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/results_holder.c b/60xx/libsensors_iio/software/core/mllite/results_holder.c
deleted file mode 100644
index df58f40..0000000
--- a/60xx/libsensors_iio/software/core/mllite/results_holder.c
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-/**
- *   @defgroup  Results_Holder results_holder
- *   @brief     Motion Library - Results Holder
- *              Holds the data for MPL
- *
- *   @{
- *       @file results_holder.c
- *       @brief Results Holder for HAL.
- */
-
-#include <string.h>
-
-#include "results_holder.h"
-#include "ml_math_func.h"
-#include "mlmath.h"
-#include "start_manager.h"
-#include "data_builder.h"
-#include "message_layer.h"
-#include "log.h"
-
-// These 2 status bits are used to control when the 9 axis quaternion is updated
-#define INV_COMPASS_CORRECTION_SET 1
-#define INV_6_AXIS_QUAT_SET 2
-
-struct results_t {
-    long nav_quat[4];
-    long gam_quat[4];
-    inv_time_t nav_timestamp;
-    inv_time_t gam_timestamp;
-    long local_field[3]; /**< local earth's magnetic field */
-    long mag_scale[3]; /**< scale factor to apply to magnetic field reading */
-    long compass_correction[4]; /**< quaternion going from gyro,accel quaternion to 9 axis */
-    int acc_state; /**< Describes accel state */
-    int got_accel_bias; /**< Flag describing if accel bias is known */
-    long compass_bias_error[3]; /**< Error Squared */
-    unsigned char motion_state;
-    unsigned int motion_state_counter; /**< Incremented for each no motion event in a row */
-    long compass_count; /**< compass state internal counter */
-    int got_compass_bias; /**< Flag describing if compass bias is known */
-    int large_mag_field; /**< Flag describing if there is a large magnetic field */
-    int compass_state; /**< Internal compass state */
-    long status;
-    struct inv_sensor_cal_t *sensor;
-    float quat_confidence_interval;
-};
-static struct results_t rh;
-
-/** @internal
-* Store a quaternion more suitable for gaming. This quaternion is often determined
-* using only gyro and accel.
-* @param[in] quat Length 4, Quaternion scaled by 2^30
-*/
-void inv_store_gaming_quaternion(const long *quat, inv_time_t timestamp)
-{
-    rh.status |= INV_6_AXIS_QUAT_SET;
-    memcpy(&rh.gam_quat, quat, sizeof(rh.gam_quat));
-    rh.gam_timestamp = timestamp;
-}
-
-/** @internal
-* Sets the quaternion adjustment from 6 axis (accel, gyro) to 9 axis quaternion.
-* @param[in] data Quaternion Adjustment
-* @param[in] timestamp Timestamp of when this is valid
-*/
-void inv_set_compass_correction(const long *data, inv_time_t timestamp)
-{
-    rh.status |= INV_COMPASS_CORRECTION_SET;
-    memcpy(rh.compass_correction, data, sizeof(rh.compass_correction));
-    rh.nav_timestamp = timestamp;
-}
-
-/** @internal
-* Gets the quaternion adjustment from 6 axis (accel, gyro) to 9 axis quaternion.
-* @param[out] data Quaternion Adjustment
-* @param[out] timestamp Timestamp of when this is valid
-*/
-void inv_get_compass_correction(long *data, inv_time_t *timestamp)
-{
-    memcpy(data, rh.compass_correction, sizeof(rh.compass_correction));
-    *timestamp = rh.nav_timestamp;
-}
-
-/** Returns non-zero if there is a large magnetic field. See inv_set_large_mag_field() for setting this variable.
- * @return Returns non-zero if there is a large magnetic field.
- */
-int inv_get_large_mag_field()
-{
-    return rh.large_mag_field;
-}
-
-/** Set to non-zero if there as a large magnetic field. See inv_get_large_mag_field() for getting this variable.
- * @param[in] state value to set for magnetic field strength. Should be non-zero if it is large.
- */
-void inv_set_large_mag_field(int state)
-{
-    rh.large_mag_field = state;
-}
-
-/** Gets the accel state set by inv_set_acc_state()
- * @return accel state.
- */
-int inv_get_acc_state()
-{
-    return rh.acc_state;
-}
-
-/** Sets the accel state. See inv_get_acc_state() to get the value.
- * @param[in] state value to set accel state to.
- */
-void inv_set_acc_state(int state)
-{
-    rh.acc_state = state;
-    return;
-}
-
-/** Returns the motion state
-* @param[out] cntr Number of previous times a no motion event has occured in a row.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-int inv_get_motion_state(unsigned int *cntr)
-{
-    *cntr = rh.motion_state_counter;
-    return rh.motion_state;
-}
-
-/** Sets the motion state
- * @param[in] state motion state where INV_NO_MOTION is not moving
- *            and INV_MOTION is moving.
- */
-void inv_set_motion_state(unsigned char state)
-{
-    long set;
-    if (state == rh.motion_state) {
-        if (state == INV_NO_MOTION) {
-            rh.motion_state_counter++;
-        } else {
-            rh.motion_state_counter = 0;
-        }
-        return;
-    }
-    rh.motion_state_counter = 0;
-    rh.motion_state = state;
-    /* Equivalent to set = state, but #define's may change. */
-    if (state == INV_MOTION)
-        set = INV_MSG_MOTION_EVENT;
-    else
-        set = INV_MSG_NO_MOTION_EVENT;
-    inv_set_message(set, (INV_MSG_MOTION_EVENT | INV_MSG_NO_MOTION_EVENT), 0);
-}
-
-/** Sets the local earth's magnetic field
-* @param[in] data Local earth's magnetic field in uT scaled by 2^16.
-*            Length = 3. Y typically points north, Z typically points down in
-*                        northern hemisphere and up in southern hemisphere.
-*/
-void inv_set_local_field(const long *data)
-{
-    memcpy(rh.local_field, data, sizeof(rh.local_field));
-}
-
-/** Gets the local earth's magnetic field
-* @param[out] data Local earth's magnetic field in uT scaled by 2^16.
-*            Length = 3. Y typically points north, Z typically points down in
-*                        northern hemisphere and up in southern hemisphere.
-*/
-void inv_get_local_field(long *data)
-{
-    memcpy(data, rh.local_field, sizeof(rh.local_field));
-}
-
-/** Sets the compass sensitivity
- * @param[in] data Length 3, sensitivity for each compass axis
- *  scaled such that 1.0 = 2^30.
- */
-void inv_set_mag_scale(const long *data)
-{
-    memcpy(rh.mag_scale, data, sizeof(rh.mag_scale));
-}
-
-/** Gets the compass sensitivity
- * @param[out] data Length 3, sensitivity for each compass axis
- *  scaled such that 1.0 = 2^30.
- */
-void inv_get_mag_scale(long *data)
-{
-    memcpy(data, rh.mag_scale, sizeof(rh.mag_scale));
-}
-
-/** Gets gravity vector
- * @param[out] data gravity vector in body frame scaled such that 1.0 = 2^30.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_get_gravity(long *data)
-{
-    data[0] =
-        inv_q29_mult(rh.nav_quat[1], rh.nav_quat[3]) - inv_q29_mult(rh.nav_quat[2], rh.nav_quat[0]);
-    data[1] =
-        inv_q29_mult(rh.nav_quat[2], rh.nav_quat[3]) + inv_q29_mult(rh.nav_quat[1], rh.nav_quat[0]);
-    data[2] =
-        (inv_q29_mult(rh.nav_quat[3], rh.nav_quat[3]) + inv_q29_mult(rh.nav_quat[0], rh.nav_quat[0])) -
-        1073741824L;
-
-    return INV_SUCCESS;
-}
-
-/** Returns a quaternion based only on gyro and accel.
- * @param[out] data 6-axis  gyro and accel quaternion scaled such that 1.0 = 2^30.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_get_6axis_quaternion(long *data)
-{
-    memcpy(data, rh.gam_quat, sizeof(rh.gam_quat));
-    return INV_SUCCESS;
-}
-
-/** Returns a quaternion.
- * @param[out] data 9-axis quaternion scaled such that 1.0 = 2^30.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_get_quaternion(long *data)
-{
-    if (rh.status & (INV_COMPASS_CORRECTION_SET | INV_6_AXIS_QUAT_SET)) {
-        inv_q_mult(rh.compass_correction, rh.gam_quat, rh.nav_quat);
-        rh.status &= ~(INV_COMPASS_CORRECTION_SET | INV_6_AXIS_QUAT_SET);
-    }
-    memcpy(data, rh.nav_quat, sizeof(rh.nav_quat));
-    return INV_SUCCESS;
-}
-
-/** Returns a quaternion.
- * @param[out] data 9-axis quaternion.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_get_quaternion_float(float *data)
-{
-    long ldata[4];
-    inv_error_t result = inv_get_quaternion(ldata);
-    data[0] = inv_q30_to_float(ldata[0]);
-    data[1] = inv_q30_to_float(ldata[1]);
-    data[2] = inv_q30_to_float(ldata[2]);
-    data[3] = inv_q30_to_float(ldata[3]);
-    return result;
-}
-
-/** Returns a quaternion with accuracy and timestamp.
- * @param[out] data 9-axis quaternion scaled such that 1.0 = 2^30.
- * @param[out] accuracy Accuracy of quaternion, 0-3, where 3 is most accurate.
- * @param[out] timestamp Timestamp of this quaternion in nanoseconds
- */
-void inv_get_quaternion_set(long *data, int *accuracy, inv_time_t *timestamp)
-{
-    inv_get_quaternion(data);
-    *timestamp = inv_get_last_timestamp();
-    if (inv_get_compass_on()) {
-        *accuracy = inv_get_mag_accuracy();
-    } else if (inv_get_gyro_on()) {
-        *accuracy = inv_get_gyro_accuracy();
-    }else if (inv_get_accel_on()) {
-        *accuracy = inv_get_accel_accuracy();
-    } else {
-        *accuracy = 0;
-    }
-}
-
-/** Callback that gets called everytime there is new data. It is 
- * registered by inv_start_results_holder().
- * @param[in] sensor_cal New sensor data to process.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_generate_results(struct inv_sensor_cal_t *sensor_cal)
-{
-    rh.sensor = sensor_cal;
-    return INV_SUCCESS;
-}
-
-/** Function to turn on this module. This is automatically called by
- *  inv_enable_results_holder(). Typically not called by users.
- * @return Returns INV_SUCCESS if successful or an error code if not.
- */
-inv_error_t inv_start_results_holder(void)
-{
-    inv_register_data_cb(inv_generate_results, INV_PRIORITY_RESULTS_HOLDER,
-        INV_GYRO_NEW | INV_ACCEL_NEW | INV_MAG_NEW);
-    return INV_SUCCESS;
-}
-
-/** Initializes results holder. This is called automatically by the
-* enable function inv_enable_results_holder(). It may be called any time the feature is enabled, but
-* is typically not needed to be called by outside callers.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_init_results_holder(void)
-{
-    memset(&rh, 0, sizeof(rh));
-    rh.mag_scale[0] = 1L<<30;
-    rh.mag_scale[1] = 1L<<30;
-    rh.mag_scale[2] = 1L<<30;
-    rh.compass_correction[0] = 1L<<30;
-    rh.gam_quat[0] = 1L<<30;
-    rh.nav_quat[0] = 1L<<30;
-    rh.quat_confidence_interval = (float)M_PI;
-    return INV_SUCCESS;
-}
-
-/** Turns on storage of results.
-*/
-inv_error_t inv_enable_results_holder()
-{
-    inv_error_t result;
-    result = inv_init_results_holder();
-    if ( result ) {
-        return result;
-    }
-
-    result = inv_register_mpl_start_notification(inv_start_results_holder);
-    return result;
-}
-
-/** Sets state of if we know the accel bias.
- * @return return 1 if we know the accel bias, 0 if not.
- *            it is set with inv_set_accel_bias_found()
- */
-int inv_got_accel_bias()
-{
-    return rh.got_accel_bias;
-}
-
-/** Sets whether we know the accel bias
- * @param[in] state Set to 1 if we know the accel bias. 
- *            Can be retrieved with inv_got_accel_bias()
- */
-void inv_set_accel_bias_found(int state)
-{
-    rh.got_accel_bias = state;
-}
-
-/** Sets state of if we know the compass bias.
- * @return return 1 if we know the compass bias, 0 if not.
- *            it is set with inv_set_compass_bias_found()
- */
-int inv_got_compass_bias()
-{
-    return rh.got_compass_bias;
-}
-
-/** Sets whether we know the compass bias
- * @param[in] state Set to 1 if we know the compass bias. 
- *            Can be retrieved with inv_got_compass_bias()
- */
-void inv_set_compass_bias_found(int state)
-{
-    rh.got_compass_bias = state;
-}
-
-/** Sets the compass state.
- * @param[in] state Compass state. It can be retrieved with inv_get_compass_state().
- */
-void inv_set_compass_state(int state)
-{
-    rh.compass_state = state;
-}
-
-/** Get's the compass state
- * @return the compass state that was set with inv_set_compass_state()
- */
-int inv_get_compass_state()
-{
-    return rh.compass_state;
-}
-
-/** Set compass bias error. See inv_get_compass_bias_error()
- * @param[in] bias_error Set's how accurate we know the compass bias. It is the 
- * error squared.
- */
-void inv_set_compass_bias_error(const long *bias_error)
-{
-    memcpy(rh.compass_bias_error, bias_error, sizeof(rh.compass_bias_error));
-}
-
-/** Get's compass bias error. See inv_set_compass_bias_error() for setting.
- * @param[out] bias_error Accuracy as to how well the compass bias is known. It is the error squared.
- */
-void inv_get_compass_bias_error(long *bias_error)
-{
-    memcpy(bias_error, rh.compass_bias_error, sizeof(rh.compass_bias_error));
-}
-
-/**
- *  @brief      Returns 3-element vector of accelerometer data in body frame
- *                with gravity removed
- *  @param[out] data    3-element vector of accelerometer data in body frame
- *                with gravity removed
- *  @return     INV_SUCCESS if successful
- *              INV_ERROR_INVALID_PARAMETER if invalid input pointer
- */
-inv_error_t inv_get_linear_accel(long *data)
-{
-    long gravity[3];
-
-    if (data != NULL)
-    {
-        inv_get_accel_set(data, NULL, NULL);
-        inv_get_gravity(gravity);
-        data[0] -= gravity[0] >> 14;
-        data[1] -= gravity[1] >> 14;
-        data[2] -= gravity[2] >> 14;
-        return INV_SUCCESS;
-    }
-    else {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-}
-
-/**
- *  @brief      Returns 3-element vector of accelerometer data in body frame
- *  @param[out] data    3-element vector of accelerometer data in body frame
- *  @return     INV_SUCCESS if successful
- *              INV_ERROR_INVALID_PARAMETER if invalid input pointer
- */
-inv_error_t inv_get_accel(long *data)
-{
-    if (data != NULL) {
-        inv_get_accel_set(data, NULL, NULL);
-        return INV_SUCCESS;
-    }
-    else {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-}
-
-/**
- *  @brief      Returns 3-element vector of accelerometer float data
- *  @param[out] data    3-element vector of accelerometer float data
- *  @return     INV_SUCCESS if successful
- *              INV_ERROR_INVALID_PARAMETER if invalid input pointer
- */
-inv_error_t inv_get_accel_float(float *data)
-{
-    long tdata[3];
-    unsigned char i;
-
-    if (data != NULL && !inv_get_accel(tdata)) {
-        for (i = 0; i < 3; ++i) {
-            data[i] = ((float)tdata[i] / (1L << 16));
-        }
-        return INV_SUCCESS;
-    }
-    else {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-}
-
-/**
- *  @brief      Returns 3-element vector of gyro float data
- *  @param[out] data    3-element vector of gyro float data
- *  @return     INV_SUCCESS if successful
- *              INV_ERROR_INVALID_PARAMETER if invalid input pointer
- */
-inv_error_t inv_get_gyro_float(float *data)
-{
-    long tdata[3];
-    unsigned char i;
-
-    if (data != NULL) {
-        inv_get_gyro_set(tdata, NULL, NULL);
-        for (i = 0; i < 3; ++i) {
-            data[i] = ((float)tdata[i] / (1L << 16));
-        }
-        return INV_SUCCESS;
-    }
-    else {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-}
-
-/** Set 9 axis 95% heading confidence interval for quaternion
-* @param[in] ci Confidence interval in radians.
-*/
-void inv_set_heading_confidence_interval(float ci)
-{
-    rh.quat_confidence_interval = ci;
-}
-
-/** Get 9 axis 95% heading confidence interval for quaternion
-* @return Confidence interval in radians.
-*/
-float inv_get_heading_confidence_interval(void)
-{
-    return rh.quat_confidence_interval;
-}
-
-/**
- *  @brief      Returns 3-element vector of linear accel float data
- *  @param[out] data    3-element vector of linear aceel float data
- *  @return     INV_SUCCESS if successful
- *              INV_ERROR_INVALID_PARAMETER if invalid input pointer
- */
-inv_error_t inv_get_linear_accel_float(float *data)
-{
-    long tdata[3];
-    unsigned char i;
-
-    if (data != NULL && !inv_get_linear_accel(tdata)) {
-        for (i = 0; i < 3; ++i) {
-            data[i] = ((float)tdata[i] / (1L << 16));
-        }
-        return INV_SUCCESS;
-    }
-    else {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/results_holder.h b/60xx/libsensors_iio/software/core/mllite/results_holder.h
deleted file mode 100644
index 09da24e..0000000
--- a/60xx/libsensors_iio/software/core/mllite/results_holder.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#include "mltypes.h"
-
-#ifndef INV_RESULTS_HOLDER_H__
-#define INV_RESULTS_HOLDER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define INV_MOTION                       0x0001
-#define INV_NO_MOTION                    0x0002
-
-    /**************************************************************************/
-    /*  The value of inv_get_gyro_sum_of_sqr is scaled such the (1 dps)^2 =   */
-    /*  2^GYRO_MAG_SQR_SHIFT. This number must be >=0 and even.               */
-    /*  The value of inv_accel_sum_of_sqr is scaled such that (1g)^2 =        */
-    /*  2^ACC_MAG_SQR_SHIFT                                                   */
-    /**************************************************************************/
-#define ACC_MAG_SQR_SHIFT 16
-
-void inv_store_gaming_quaternion(const long *quat, inv_time_t timestamp);
-
-// States
-#define SF_NORMAL 0
-#define SF_UNCALIBRATED 1
-#define SF_STARTUP_SETTLE 2
-#define SF_FAST_SETTLE 3
-#define SF_DISTURBANCE 4
-#define SF_SLOW_SETTLE 5
-
-int inv_get_acc_state();
-void inv_set_acc_state(int state);
-int inv_get_motion_state(unsigned int *cntr);
-void inv_set_motion_state(unsigned char state);
-inv_error_t inv_get_gravity(long *data);
-inv_error_t inv_get_6axis_quaternion(long *data);
-inv_error_t inv_get_quaternion(long *data);
-inv_error_t inv_get_quaternion_float(float *data);
-void inv_get_quaternion_set(long *data, int *accuracy, inv_time_t *timestamp);
-
-inv_error_t inv_enable_results_holder();
-inv_error_t inv_init_results_holder(void);
-
-/* Magnetic Field Parameters*/
-void inv_set_local_field(const long *data);
-void inv_get_local_field(long *data);
-void inv_set_mag_scale(const long *data);
-void inv_get_mag_scale(long *data);
-void inv_set_compass_correction(const long *data, inv_time_t timestamp);
-void inv_get_compass_correction(long *data, inv_time_t *timestamp);
-int inv_got_compass_bias();
-void inv_set_compass_bias_found(int state);
-int inv_get_large_mag_field();
-void inv_set_large_mag_field(int state);
-void inv_set_compass_state(int state);
-int inv_get_compass_state();
-void inv_set_compass_bias_error(const long *bias_error);
-void inv_get_compass_bias_error(long *bias_error);
-inv_error_t inv_get_linear_accel(long *data);
-inv_error_t inv_get_accel(long *data);
-inv_error_t inv_get_accel_float(float *data);
-inv_error_t inv_get_gyro_float(float *data);
-inv_error_t inv_get_linear_accel_float(float *data);
-void inv_set_heading_confidence_interval(float ci);
-float inv_get_heading_confidence_interval(void);
-
-int inv_got_accel_bias();
-void inv_set_accel_bias_found(int state);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_RESULTS_HOLDER_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/start_manager.c b/60xx/libsensors_iio/software/core/mllite/start_manager.c
deleted file mode 100644
index fb758e7..0000000
--- a/60xx/libsensors_iio/software/core/mllite/start_manager.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-/**
- *   @defgroup  Start_Manager start_manager
- *   @brief     Motion Library - Start Manager
- *              Start Manager
- *
- *   @{
- *       @file start_manager.c
- *       @brief This handles all the callbacks when inv_start_mpl() is called.
- */
-
-
-#include <string.h>
-#include "log.h"
-#include "start_manager.h"
-
-typedef inv_error_t (*inv_start_cb_func)();
-struct inv_start_cb_t {
-    int num_cb;
-    inv_start_cb_func start_cb[INV_MAX_START_CB];
-};
-
-static struct inv_start_cb_t inv_start_cb;
-
-/** Initilize the start manager. Typically called by inv_start_mpl();
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_init_start_manager(void)
-{
-    memset(&inv_start_cb, 0, sizeof(inv_start_cb));
-    return INV_SUCCESS;
-}
-
-/** Removes a callback from start notification
-* @param[in] start_cb function to remove from start notification
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_unregister_mpl_start_notification(inv_error_t (*start_cb)(void))
-{
-    int kk;
-
-    for (kk=0; kk<inv_start_cb.num_cb; ++kk) {
-        if (inv_start_cb.start_cb[kk] == start_cb) {
-            // Found the match
-            if (kk != (inv_start_cb.num_cb-1)) {
-                memmove(&inv_start_cb.start_cb[kk],
-                    &inv_start_cb.start_cb[kk+1],
-                    (inv_start_cb.num_cb-kk-1)*sizeof(inv_start_cb_func));
-            }
-            inv_start_cb.num_cb--;
-            return INV_SUCCESS;
-        }
-    }
-    return INV_ERROR_INVALID_PARAMETER;
-}
-
-/** Register a callback to receive when inv_start_mpl() is called.
-* @param[in] start_cb Function callback that will be called when inv_start_mpl() is
-*            called.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_register_mpl_start_notification(inv_error_t (*start_cb)(void))
-{
-    if (inv_start_cb.num_cb >= INV_MAX_START_CB)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    inv_start_cb.start_cb[inv_start_cb.num_cb] = start_cb;
-    inv_start_cb.num_cb++;
-    return INV_SUCCESS;
-}
-
-/** Callback all the functions that want to be notified when inv_start_mpl() was
-* called.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_execute_mpl_start_notification(void)
-{
-    inv_error_t result,first_error;
-    int kk;
-
-    first_error = INV_SUCCESS;
-
-    for (kk = 0; kk < inv_start_cb.num_cb; ++kk) {
-        result = inv_start_cb.start_cb[kk]();
-        if (result && (first_error == INV_SUCCESS)) {
-            first_error = result;
-        }
-    }
-    return first_error;
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/start_manager.h b/60xx/libsensors_iio/software/core/mllite/start_manager.h
deleted file mode 100644
index 899e3f5..0000000
--- a/60xx/libsensors_iio/software/core/mllite/start_manager.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INV_START_MANAGER_H__
-#define INV_START_MANAGER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-
-/** Max number of start callbacks we can handle. */
-#define INV_MAX_START_CB 20
-
-inv_error_t inv_init_start_manager(void);
-inv_error_t inv_register_mpl_start_notification(inv_error_t (*start_cb)(void));
-inv_error_t inv_execute_mpl_start_notification(void);
-inv_error_t inv_unregister_mpl_start_notification(inv_error_t (*start_cb)(void));
-
-#ifdef __cplusplus
-}
-#endif
-#endif  // INV_START_MANAGER_H__
diff --git a/60xx/libsensors_iio/software/core/mllite/storage_manager.c b/60xx/libsensors_iio/software/core/mllite/storage_manager.c
deleted file mode 100644
index 3e4e619..0000000
--- a/60xx/libsensors_iio/software/core/mllite/storage_manager.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/**
- *   @defgroup  Storage_Manager storage_manager
- *   @brief     Motion Library - Stores Data for functions.
- *
- *
- *   @{
- *       @file storage_manager.c
- *       @brief Load and Store Manager.
- */
-
-#include <string.h>
-
-#include "storage_manager.h"
-#include "log.h"
-#include "ml_math_func.h"
-#include "mlmath.h"
-
-/* Must be changed if the format of storage changes */
-#define DEFAULT_KEY 29681
-
-typedef inv_error_t (*load_func_t)(const unsigned char *data);
-typedef inv_error_t (*save_func_t)(unsigned char *data);
-/** Max number of entites that can be stored */
-#define NUM_STORAGE_BOXES 20
-
-struct data_header_t {
-    long size;
-    uint32_t checksum;
-    unsigned int key;
-};
-
-struct data_storage_t {
-    int num; /**< Number of differnt save entities */
-    size_t total_size; /**< Size in bytes to store non volatile data */
-    load_func_t load[NUM_STORAGE_BOXES]; /**< Callback to load data */
-    save_func_t save[NUM_STORAGE_BOXES]; /**< Callback to save data */
-    struct data_header_t hd[NUM_STORAGE_BOXES]; /**< Header info for each entity */
-};
-static struct data_storage_t ds;
-
-/** Should be called once before using any of the storage methods. Typically
-* called first by inv_init_mpl().*/
-void inv_init_storage_manager()
-{
-    memset(&ds, 0, sizeof(ds));
-    ds.total_size = sizeof(struct data_header_t);
-}
-
-/** Used to register your mechanism to load and store non-volative data. This should typical be
-* called during the enable function for your feature.
-* @param[in] load_func function pointer you will use to receive data that was stored for you.
-* @param[in] save_func function pointer you will use to save any data you want saved to
-*            non-volatile memory between runs.
-* @param[in] size The size in bytes of the amount of data you want loaded and saved.
-* @param[in] key The key associated with your data type should be unique across MPL.
-*                    The key should change when your type of data for storage changes.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_register_load_store(inv_error_t (*load_func)(const unsigned char *data),
-                                    inv_error_t (*save_func)(unsigned char *data), size_t size, unsigned int key)
-{
-    int kk;
-    // Check if this has been registered already
-    for (kk=0; kk<ds.num; ++kk) {
-        if (key == ds.hd[kk].key) {
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-    }
-    // Make sure there is room
-    if (ds.num >= NUM_STORAGE_BOXES) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    // Add to list
-    ds.hd[ds.num].key = key;
-    ds.hd[ds.num].size = size;
-    ds.load[ds.num] = load_func;
-    ds.save[ds.num] = save_func;
-    ds.total_size += size + sizeof(struct data_header_t);
-    ds.num++;
-
-    return INV_SUCCESS;
-}
-
-/** Returns the memory size needed to perform a store
-* @param[out] size Size in bytes of memory needed to store.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_get_mpl_state_size(size_t *size)
-{
-    *size = ds.total_size;
-    return INV_SUCCESS;
-}
-
-/** @internal
- * Finds key in ds.hd[] array and returns location
- * @return location where key exists in array, -1 if not found.
- */
-static int inv_find_entry(unsigned int key)
-{
-    int kk;
-    for (kk=0; kk<ds.num; ++kk) {
-        if (key == ds.hd[kk].key) {
-            return kk;
-        }
-    }
-    return -1;
-}
-
-/** This function takes a block of data that has been saved in non-volatile memory and pushes
-* to the proper locations. Multiple error checks are performed on the data.
-* @param[in] data Data that was saved to be loaded up by MPL
-* @param[in] length Length of data vector in bytes
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_load_mpl_states(const unsigned char *data, size_t length)
-{
-    struct data_header_t *hd;
-    int entry;
-    uint32_t checksum;
-    long len;
-
-    len = length; // Important so we get negative numbers
-    if (len < sizeof(struct data_header_t))
-        return INV_ERROR_CALIBRATION_LOAD;	// No data
-    hd = (struct data_header_t *)data;
-    if (hd->key != DEFAULT_KEY)
-        return INV_ERROR_CALIBRATION_LOAD;	// Key changed or data corruption
-    len = MIN(hd->size, len);
-    len = hd->size;
-    len -= sizeof(struct data_header_t);
-    data += sizeof(struct data_header_t);
-    checksum = inv_checksum(data, len);
-    if (checksum != hd->checksum)
-        return INV_ERROR_CALIBRATION_LOAD;	// Data corruption
-
-    while (len > (long)sizeof(struct data_header_t)) {
-        hd = (struct data_header_t *)data;
-        entry = inv_find_entry(hd->key);
-        data += sizeof(struct data_header_t);
-        len -= sizeof(struct data_header_t);
-        if (entry >= 0 && len >= hd->size) {
-            if (hd->size == ds.hd[entry].size) {
-                checksum = inv_checksum(data, hd->size);
-                if (checksum == hd->checksum) {
-                    ds.load[entry](data);
-                } else {
-                    return INV_ERROR_CALIBRATION_LOAD;
-                }
-            }
-        }
-        len -= hd->size;
-        if (len >= 0)
-            data = data + hd->size;
-    }
-
-    return INV_SUCCESS;
-}
-
-/** This function fills up a block of memory to be stored in non-volatile memory.
-* @param[out] data Place to store data, size of sz, must be at least size
-*                  returned by inv_get_mpl_state_size()
-* @param[in] sz Size of data.
-* @return Returns INV_SUCCESS if successful or an error code if not.
-*/
-inv_error_t inv_save_mpl_states(unsigned char *data, size_t sz)
-{
-    unsigned char *cur;
-    int kk;
-    struct data_header_t *hd;
-
-    if (sz >= ds.total_size) {
-        cur = data + sizeof(struct data_header_t);
-        for (kk = 0; kk < ds.num; ++kk) {
-            hd = (struct data_header_t *)cur;
-            cur += sizeof(struct data_header_t);
-            ds.save[kk](cur);
-            hd->checksum = inv_checksum(cur, ds.hd[kk].size);
-            hd->size = ds.hd[kk].size;
-            hd->key = ds.hd[kk].key;
-            cur += ds.hd[kk].size;
-        }
-    } else {
-        return INV_ERROR_CALIBRATION_LOAD;
-    }
-
-    hd = (struct data_header_t *)data;
-    hd->checksum = inv_checksum(data + sizeof(struct data_header_t),
-                                ds.total_size - sizeof(struct data_header_t));
-    hd->key = DEFAULT_KEY;
-    hd->size = ds.total_size;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @}
- */
diff --git a/60xx/libsensors_iio/software/core/mllite/storage_manager.h b/60xx/libsensors_iio/software/core/mllite/storage_manager.h
deleted file mode 100644
index 7255591..0000000
--- a/60xx/libsensors_iio/software/core/mllite/storage_manager.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#include "mltypes.h"
-
-#ifndef INV_STORAGE_MANAGER_H__
-#define INV_STORAGE_MANAGER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_register_load_store(
-                           inv_error_t (*load_func)(const unsigned char *data),
-                           inv_error_t (*save_func)(unsigned char *data), 
-                           size_t size, unsigned int key);
-void inv_init_storage_manager(void);
-
-inv_error_t inv_get_mpl_state_size(size_t *size);
-inv_error_t inv_load_mpl_states(const unsigned char *data, size_t len);
-inv_error_t inv_save_mpl_states(unsigned char *data, size_t len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* INV_STORAGE_MANAGER_H__ */
diff --git a/60xx/libsensors_iio/software/core/mpl/accel_auto_cal.h b/60xx/libsensors_iio/software/core/mpl/accel_auto_cal.h
deleted file mode 100644
index 5a53213..0000000
--- a/60xx/libsensors_iio/software/core/mpl/accel_auto_cal.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id$
- *
- ******************************************************************************/
-
-#ifndef MLDMP_ACCEL_AUTO_CALIBRATION_H__
-#define MLDMP_ACCEL_AUTO_CALIBRATION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_in_use_auto_calibration(void);
-inv_error_t inv_disable_in_use_auto_calibration(void);
-inv_error_t inv_stop_in_use_auto_calibration(void);
-inv_error_t inv_start_in_use_auto_calibration(void);
-inv_error_t inv_in_use_auto_calibration_is_enabled(unsigned char *is_enabled);
-inv_error_t inv_init_in_use_auto_calibration(void);
-void inv_init_accel_maxmin(void);
-void inv_record_good_accel_maxmin(void);
-int inv_get_accel_bias_stage();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // MLDMP_ACCEL_AUTO_CALIBRATION_H__
-
diff --git a/60xx/libsensors_iio/software/core/mpl/authenticate.h b/60xx/libsensors_iio/software/core/mpl/authenticate.h
deleted file mode 100644
index d7c803b..0000000
--- a/60xx/libsensors_iio/software/core/mpl/authenticate.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id$
- *
- ******************************************************************************/
-
-#ifndef MLDMP_AUTHENTICATE_H__
-#define MLDMP_AUTHENTICATE_H__
-
-#include "invensense.h"
-
-inv_error_t inv_check_key(void);
-
-#endif  /* MLDMP_AUTHENTICATE_H__ */
diff --git a/60xx/libsensors_iio/software/core/mpl/build/android/libmplmpu.so b/60xx/libsensors_iio/software/core/mpl/build/android/libmplmpu.so
deleted file mode 100644
index fbd346f..0000000
--- a/60xx/libsensors_iio/software/core/mpl/build/android/libmplmpu.so
+++ /dev/null
Binary files differ
diff --git a/60xx/libsensors_iio/software/core/mpl/build/android/shared.mk b/60xx/libsensors_iio/software/core/mpl/build/android/shared.mk
deleted file mode 100644
index 2e15205..0000000
--- a/60xx/libsensors_iio/software/core/mpl/build/android/shared.mk
+++ /dev/null
@@ -1,88 +0,0 @@
-MPL_LIB_NAME ?= mplmpu
-LIBRARY = $(LIB_PREFIX)$(MPL_LIB_NAME).$(SHARED_LIB_EXT)
-
-MK_NAME = $(notdir $(CURDIR)/$(firstword $(MAKEFILE_LIST)))
-
-CROSS ?= $(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
-COMP  ?= $(CROSS)gcc
-LINK  ?= $(CROSS)gcc
-
-OBJFOLDER = $(CURDIR)/obj
-
-INV_ROOT = ../../../../..
-MLLITE_DIR  = $(INV_ROOT)/software/core/mllite
-MPL_DIR  = $(INV_ROOT)/software/core/mpl
-
-include $(INV_ROOT)/software/build/android/common.mk
-
-CFLAGS += $(CMDLINE_CFLAGS)
-CFLAGS += $(ANDROID_COMPILE)
-CFLAGS += -Wall
-CFLAGS += -fpic
-CFLAGS += -nostdlib
-CFLAGS += -DNDEBUG
-CFLAGS += -D_REENTRANT
-CFLAGS += -DLINUX
-CFLAGS += -DANDROID
-CFLAGS += -mthumb-interwork
-CFLAGS += -fno-exceptions
-CFLAGS += -ffunction-sections
-CFLAGS += -funwind-tables
-CFLAGS += -fstack-protector
-CFLAGS += -fno-short-enums
-CFLAGS += -fmessage-length=0
-CFLAGS += $(INV_INCLUDES)
-CFLAGS += $(INV_DEFINES)
-
-LLINK  = -lc 
-LLINK += -lm 
-LLINK += -lutils 
-LLINK += -lcutils 
-LLINK += -lgcc 
-LLINK += -ldl
-
-LFLAGS += $(CMDLINE_LFLAGS)
-LFLAGS += -shared 
-LFLAGS += -Wl,-soname,$(LIBRARY)
-LFLAGS += -Wl,-shared,-Bsymbolic 
-LFLAGS += $(ANDROID_LINK)
-LFLAGS += -Wl,-rpath,$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/obj/lib:$(ANDROID_ROOT)/out/target/product/$(PRODUCT)/system/lib
-
-####################################################################################################
-## sources
-
-INV_LIBS = $(MLLITE_DIR)/build/$(TARGET)/$(LIB_PREFIX)$(MLLITE_LIB_NAME).$(SHARED_LIB_EXT)
-
-#INV_SOURCES, VPATH provided by Makefile.filelist
-include ../filelist.mk
-
-INV_OBJS := $(addsuffix .o,$(INV_SOURCES))
-INV_OBJS_DST = $(addprefix $(OBJFOLDER)/,$(addsuffix .o, $(notdir $(INV_SOURCES))))
-
-####################################################################################################
-## rules
-
-.PHONY: all mpl clean cleanall
-
-all: mpl
-
-mpl: $(LIBRARY) $(MK_NAME)
-
-$(LIBRARY) : $(OBJFOLDER) $(INV_OBJS_DST) $(MK_NAME)
-	@$(call echo_in_colors, "\n<linking $(LIBRARY) with objects $(INV_OBJS_DST)\n")
-	$(LINK) $(LFLAGS) -o $(LIBRARY) $(INV_OBJS_DST) $(LLINK) $(INV_LIBS) $(LLINK)
-
-$(OBJFOLDER) :
-	@$(call echo_in_colors, "\n<creating object's folder 'obj/'>\n")
-	mkdir obj
-
-$(INV_OBJS_DST) : $(OBJFOLDER)/%.c.o : %.c  $(MK_NAME)
-	@$(call echo_in_colors, "\n<compile $< to $(OBJFOLDER)/$(notdir $@)>\n")
-	$(COMP) $(ANDROID_INCLUDES) $(KERNEL_INCLUDES) $(CFLAGS) -o $@ -c $<
-
-clean : 
-	rm -fR $(OBJFOLDER)
-
-cleanall : 
-	rm -fR $(LIBRARY) $(OBJFOLDER)
-
diff --git a/60xx/libsensors_iio/software/core/mpl/build/filelist.mk b/60xx/libsensors_iio/software/core/mpl/build/filelist.mk
deleted file mode 100644
index e18003a..0000000
--- a/60xx/libsensors_iio/software/core/mpl/build/filelist.mk
+++ /dev/null
@@ -1,46 +0,0 @@
-#### filelist.mk for mpl ####
-
-# headers only
-HEADERS := $(MPL_DIR)/mpu.h
-
-# headers for sources
-HEADERS := $(MPL_DIR)/fast_no_motion.h
-HEADERS += $(MPL_DIR)/fusion_9axis.h
-HEADERS += $(MPL_DIR)/motion_no_motion.h
-HEADERS += $(MPL_DIR)/no_gyro_fusion.h
-HEADERS += $(MPL_DIR)/quaternion_supervisor.h
-HEADERS += $(MPL_DIR)/gyro_tc.h
-HEADERS += $(MPL_DIR)/authenticate.h
-HEADERS += $(MPL_DIR)/accel_auto_cal.h
-HEADERS += $(MPL_DIR)/accel_auto_cal_protected.h
-HEADERS += $(MPL_DIR)/compass_vec_cal.h
-HEADERS += $(MPL_DIR)/compass_vec_cal_protected.h
-HEADERS += $(MPL_DIR)/mag_disturb.h
-HEADERS += $(MPL_DIR)/mag_disturb_protected.h
-HEADERS += $(MPL_DIR)/compass_bias_w_gyro.h
-HEADERS += $(MPL_DIR)/heading_from_gyro.h
-HEADERS += $(MPL_DIR)/compass_fit.h
-HEADERS += $(MPL_DIR)/quat_accuracy_monitor.h
-#HEADERS += $(MPL_DIR)/auto_calibration.h
-
-# sources
-SOURCES := $(MPL_DIR)/fast_no_motion.c
-SOURCES += $(MPL_DIR)/fusion_9axis.c
-SOURCES += $(MPL_DIR)/motion_no_motion.c
-SOURCES += $(MPL_DIR)/no_gyro_fusion.c
-SOURCES += $(MPL_DIR)/quaternion_supervisor.c
-SOURCES += $(MPL_DIR)/gyro_tc.c
-SOURCES += $(MPL_DIR)/authenticate.c
-SOURCES += $(MPL_DIR)/accel_auto_cal.c
-SOURCES += $(MPL_DIR)/compass_vec_cal.c
-SOURCES += $(MPL_DIR)/mag_disturb.c
-SOURCES += $(MPL_DIR)/compass_bias_w_gyro.c
-SOURCES += $(MPL_DIR)/heading_from_gyro.c
-SOURCES += $(MPL_DIR)/compass_fit.c
-SOURCES += $(MPL_DIR)/quat_accuracy_monitor.c
-#SOURCES += $(MPL_DIR)/auto_calibration.c
-
-INV_SOURCES += $(SOURCES)
-
-VPATH = $(MPL_DIR)
-
diff --git a/60xx/libsensors_iio/software/core/mpl/compass_bias_w_gyro.h b/60xx/libsensors_iio/software/core/mpl/compass_bias_w_gyro.h
deleted file mode 100644
index 4f01fc2..0000000
--- a/60xx/libsensors_iio/software/core/mpl/compass_bias_w_gyro.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef MLDMP_COMPASSBIASWGYRO_H__
-#define MLDMP_COMPASSBIASWGYRO_H__
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_enable_compass_bias_w_gyro();
-    inv_error_t inv_disable_compass_bias_w_gyro();
-    void inv_init_compass_bias_w_gyro();
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // MLDMP_COMPASSBIASWGYRO_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/compass_fit.h b/60xx/libsensors_iio/software/core/mpl/compass_fit.h
deleted file mode 100644
index be3cce8..0000000
--- a/60xx/libsensors_iio/software/core/mpl/compass_fit.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-#ifndef INV_MLDMP_COMPASSFIT_H__
-#define INV_MLDMP_COMPASSFIT_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-void inv_init_compass_fit(void);
-inv_error_t inv_enable_compass_fit(void);
-inv_error_t inv_disable_compass_fit(void);
-inv_error_t inv_start_compass_fit(void);
-inv_error_t inv_stop_compass_fit(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // INV_MLDMP_COMPASSFIT_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/compass_vec_cal.h b/60xx/libsensors_iio/software/core/mpl/compass_vec_cal.h
deleted file mode 100644
index a3e044c..0000000
--- a/60xx/libsensors_iio/software/core/mpl/compass_vec_cal.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-#ifndef COMPASS_ONLY_CAL_H__
-#define COMPASS_ONLY_CAL_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_vector_compass_cal();
-inv_error_t inv_disable_vector_compass_cal();
-inv_error_t inv_start_vector_compass_cal(void);
-inv_error_t inv_stop_vector_compass_cal(void);
-void inv_vector_compass_cal_sensitivity(float sens);
-inv_error_t inv_init_vector_compass_cal();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // COMPASS_ONLY_CAL_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/fast_no_motion.h b/60xx/libsensors_iio/software/core/mpl/fast_no_motion.h
deleted file mode 100644
index c553926..0000000
--- a/60xx/libsensors_iio/software/core/mpl/fast_no_motion.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef MLDMP_FAST_NO_MOTION_H__
-#define MLDMP_FAST_NO_MOTION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_enable_fast_nomot(void);
-    inv_error_t inv_disable_fast_nomot(void);
-    inv_error_t inv_start_fast_nomot(void);
-    inv_error_t inv_stop_fast_nomot(void);
-    inv_error_t inv_init_fast_nomot(void);
-    void inv_set_default_number_of_samples(int N);
-    inv_error_t inv_fast_nomot_is_enabled(unsigned char *is_enabled);
-    inv_error_t inv_update_fast_nomot(long *gyro);
-
-    void inv_get_fast_nomot_accel_param(long *cntr, long long *param);
-    void inv_get_fast_nomot_compass_param(long *cntr, long long *param);
-    void inv_set_fast_nomot_accel_threshold(long long thresh);
-    void inv_set_fast_nomot_compass_threshold(long long thresh);
-    void int_set_fast_nomot_gyro_threshold(long long thresh);
-
-    void inv_fnm_debug_print(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // MLDMP_FAST_NO_MOTION_H__
-
diff --git a/60xx/libsensors_iio/software/core/mpl/fusion_9axis.h b/60xx/libsensors_iio/software/core/mpl/fusion_9axis.h
deleted file mode 100644
index 1ba1ebb..0000000
--- a/60xx/libsensors_iio/software/core/mpl/fusion_9axis.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef MLDMP_FUSION9AXIS_H__
-#define MLDMP_FUSION9AXIS_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    void inv_init_9x_fusion(void);
-    inv_error_t inv_9x_fusion_state_change(unsigned char newState);
-    inv_error_t inv_enable_9x_sensor_fusion(void);
-    inv_error_t inv_disable_9x_sensor_fusion(void);
-    inv_error_t inv_start_9x_sensor_fusion(void);
-    inv_error_t inv_stop_9x_sensor_fusion(void);
-    inv_error_t inv_9x_fusion_set_mag_fb(double fb);
-    inv_error_t inv_9x_fusion_enable_jitter_reduction(int en);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // MLDMP_FUSION9AXIS_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/gyro_tc.h b/60xx/libsensors_iio/software/core/mpl/gyro_tc.h
deleted file mode 100644
index 69918d5..0000000
--- a/60xx/libsensors_iio/software/core/mpl/gyro_tc.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef _GYRO_TC_H_
-#define _GYRO_TC_H_
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_gyro_tc(void);
-inv_error_t inv_disable_gyro_tc(void);
-inv_error_t inv_start_gyro_tc(void);
-inv_error_t inv_stop_gyro_tc(void);
-
-inv_error_t inv_get_gyro_ts(long *data);
-inv_error_t inv_set_gyro_ts(long *data);
-
-inv_error_t inv_init_gyro_ts(void);
-
-inv_error_t inv_set_gtc_max_temp(long data);
-inv_error_t inv_set_gtc_min_temp(long data);
-
-inv_error_t inv_print_gtc_data(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  /* _GYRO_TC_H */
-
diff --git a/60xx/libsensors_iio/software/core/mpl/heading_from_gyro.h b/60xx/libsensors_iio/software/core/mpl/heading_from_gyro.h
deleted file mode 100644
index 09ecc42..0000000
--- a/60xx/libsensors_iio/software/core/mpl/heading_from_gyro.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef _HEADING_FROM_GYRO_H_
-#define _HEADING_FROM_GYRO_H_
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_enable_heading_from_gyro(void);
-    inv_error_t inv_disable_heading_from_gyro(void);
-    void inv_init_heading_from_gyro(void);
-    inv_error_t inv_start_heading_from_gyro(void);
-    inv_error_t inv_stop_heading_from_gyro(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif  /* _HEADING_FROM_GYRO_H_ */
diff --git a/60xx/libsensors_iio/software/core/mpl/inv_math.h b/60xx/libsensors_iio/software/core/mpl/inv_math.h
deleted file mode 100644
index 6620bbf..0000000
--- a/60xx/libsensors_iio/software/core/mpl/inv_math.h
+++ /dev/null
@@ -1,8 +0,0 @@
-/* math.h has many functions and defines that are not consistent across 
-* platforms. This address that */
-
-#ifdef _WINDOWS
-#define _USE_MATH_DEFINES
-#endif
-
-#include <math.h>
diff --git a/60xx/libsensors_iio/software/core/mpl/invensense_adv.h b/60xx/libsensors_iio/software/core/mpl/invensense_adv.h
deleted file mode 100644
index 12932c9..0000000
--- a/60xx/libsensors_iio/software/core/mpl/invensense_adv.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- $License:
-    Copyright (C) 2012 InvenSense Corporation, All Rights Reserved.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-/*
-    Main header file for Invensense's Advanced library.
-*/
-
-#include "accel_auto_cal.h"
-#include "compass_bias_w_gyro.h"
-#include "compass_fit.h"
-#include "compass_vec_cal.h"
-#include "fast_no_motion.h"
-#include "fusion_9axis.h"
-#include "gyro_tc.h"
-#include "heading_from_gyro.h"
-#include "mag_disturb.h"
-#include "motion_no_motion.h"
-#include "no_gyro_fusion.h"
-#include "quaternion_supervisor.h"
-#include "mag_disturb.h"
-#include "quat_accuracy_monitor.h"
-#include "shake.h"
diff --git a/60xx/libsensors_iio/software/core/mpl/mag_disturb.h b/60xx/libsensors_iio/software/core/mpl/mag_disturb.h
deleted file mode 100644
index 38df919..0000000
--- a/60xx/libsensors_iio/software/core/mpl/mag_disturb.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-#ifndef MLDMP_MAGDISTURB_H__
-#define MLDMP_MAGDISTURB_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    int inv_check_magnetic_disturbance(unsigned long delta_time, const long *quat,
-        const long *compass, const long *gravity);
-
-    void inv_track_dip_angle(int mode, float currdip);
-
-    inv_error_t inv_enable_magnetic_disturbance(void);
-    inv_error_t inv_disable_magnetic_disturbance(void);
-    int inv_get_magnetic_disturbance_state();
-    inv_error_t inv_set_magnetic_disturbance(int time_ms);
-    inv_error_t inv_disable_dip_tracking(void);
-    inv_error_t inv_enable_dip_tracking(void);
-    inv_error_t inv_init_magnetic_disturbance(void);
-
-    float Mag3ofNormalizedLong(const long *x);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // MLDMP_MAGDISTURB_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/motion_no_motion.h b/60xx/libsensors_iio/software/core/mpl/motion_no_motion.h
deleted file mode 100644
index 01cf1c0..0000000
--- a/60xx/libsensors_iio/software/core/mpl/motion_no_motion.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INV_MOTION_NO_MOTION_H__
-#define INV_MOTION_NO_MOTION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_motion_no_motion(void);
-inv_error_t inv_disable_motion_no_motion(void);
-inv_error_t inv_init_motion_no_motion(void);
-inv_error_t inv_start_motion_no_motion(void);
-inv_error_t inv_stop_motion_no_motion(void);
-
-inv_error_t inv_set_no_motion_time(long time_ms);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_MOTION_NO_MOTION_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/no_gyro_fusion.h b/60xx/libsensors_iio/software/core/mpl/no_gyro_fusion.h
deleted file mode 100644
index 38d5690..0000000
--- a/60xx/libsensors_iio/software/core/mpl/no_gyro_fusion.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef MLDMP_NOGYROFUSION_H__
-#define MLDMP_NOGYROFUSION_H__
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_enable_no_gyro_fusion(void);
-    inv_error_t inv_disable_no_gyro_fusion(void);
-    inv_error_t inv_start_no_gyro_fusion(void);
-    inv_error_t inv_start_no_gyro_fusion(void);
-    inv_error_t inv_init_no_gyro_fusion(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // MLDMP_NOGYROFUSION_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h b/60xx/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h
deleted file mode 100644
index 3c6a2c1..0000000
--- a/60xx/libsensors_iio/software/core/mpl/quat_accuracy_monitor.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
-	quat_accuracy_monitor.h
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-#ifndef QUAT_ACCURARCY_MONITOR_H__
-#define QUAT_ACCURARCY_MONITOR_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-enum accuracy_signal_type_e {
-    TYPE_NAV_QUAT,
-    TYPE_GAM_QUAT,
-    TYPE_NAV_QUAT_ADVANCED,
-    TYPE_GAM_QUAT_ADVANCED,
-    TYPE_NAV_QUAT_BASIC,
-    TYPE_GAM_QUAT_BASIC,
-    TYPE_MAG,
-    TYPE_GYRO,
-    TYPE_ACCEL,
-};
-
-inv_error_t inv_init_quat_accuracy_monitor(void);
-
-void set_accuracy_threshold(enum accuracy_signal_type_e type, double threshold);
-double get_accuracy_threshold(enum accuracy_signal_type_e type);
-void set_accuracy_weight(enum accuracy_signal_type_e type, int weight);
-int get_accuracy_weight(enum accuracy_signal_type_e type);
-
-int8_t get_accuracy_accuracy(enum accuracy_signal_type_e type);
-
-void inv_reset_quat_accuracy(void);
-double get_6axis_correction_term(void);
-double get_9axis_correction_term(void);
-int get_9axis_accuracy_state();
-
-void set_6axis_error_average(double value);
-double get_6axis_error_bound(void);
-double get_compass_correction(void);
-double get_9axis_error_bound(void);
-
-float get_confidence_interval(void);
-void set_compass_uncertainty(float value);
-
-inv_error_t inv_enable_quat_accuracy_monitor(void);
-inv_error_t inv_disable_quat_accuracy_monitor(void);
-inv_error_t inv_start_quat_accuracy_monitor(void);
-inv_error_t inv_stop_quat_accuracy_monitor(void);
-
-double get_compassNgravity(void);
-double get_init_compassNgravity(void);
-
-float inv_heading_accuracy_check(float orient[3], float *heading, int8_t *accuracy);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // QUAT_ACCURARCY_MONITOR_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/quaternion_supervisor.h b/60xx/libsensors_iio/software/core/mpl/quaternion_supervisor.h
deleted file mode 100644
index 4fa36b0..0000000
--- a/60xx/libsensors_iio/software/core/mpl/quaternion_supervisor.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INV_QUATERNION_SUPERVISOR_H__
-#define INV_QUATERNION_SUPERVISOR_H__
-
-#include "mltypes.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-inv_error_t inv_enable_quaternion(void);
-inv_error_t inv_disable_quaternion(void);
-inv_error_t inv_init_quaternion(void);
-inv_error_t inv_start_quaternion(void);
-void inv_set_quaternion(long *quat);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_QUATERNION_SUPERVISOR_H__
diff --git a/60xx/libsensors_iio/software/core/mpl/shake.h b/60xx/libsensors_iio/software/core/mpl/shake.h
deleted file mode 100644
index 67acb7b..0000000
--- a/60xx/libsensors_iio/software/core/mpl/shake.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- $License:
-    Copyright (C) 2011-2012 InvenSense Corporation, All Rights Reserved.
-    See included License.txt for License information.
- $
- */
-#ifndef INV_SHAKE_H__
-#define INV_SHAKE_H__
-
-#include "mltypes.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-	/* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-    #define STATE_ZERO                             0
-    #define STATE_INIT_1                           1
-    #define STATE_INIT_2                           2
-    #define STATE_DETECT                           3
-
-	struct t_shake_config_params {
-		long shake_time_min_ms;
-		long shake_time_max_ms;
-		long shake_time_min;
-        long shake_time_max;
-		unsigned char shake_time_set;
-		long shake_time_saved;
-        float shake_deriv_thr;
-        int zero_cross_thr;
-        float accel_delta_min;
-        float accel_delta_max;
-		unsigned char interp_enable;
-	};
-
-	struct t_shake_state_params {
-		unsigned char state;
-        float accel_peak_high;
-        float accel_peak_low;
-        float accel_range;
-        int num_zero_cross;
-        short curr_shake_time;
-		int deriv_major_change;
-		int deriv_major_sign;
-        float accel_buffer[200];
-        float delta_buffer[200];
-	};
-
-	struct t_shake_data_params {
-		float accel_prev;
-		float accel_curr;
-		float delta_prev;
-		float delta_curr;
-		float delta_prev_buffer;
-	};
-
-	struct t_shake_results {
-		//unsigned char shake_int;
-		int shake_number;
-	};
-
-	struct t_shake_cb {
-       void (*shake_callback)(struct t_shake_results *shake_results);            
-    };
-
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-	inv_error_t inv_enable_shake(void);
-    inv_error_t inv_disable_shake(void);
-    inv_error_t inv_init_shake(void);
-    inv_error_t inv_start_shake(void);
-	int inv_set_shake_cb(void (*callback)(struct t_shake_results *shake_results));
-	void inv_config_shake_time_params(long sample_time_ms);
-	void inv_set_shake_accel_delta_min(float accel_g);
-	void inv_set_shake_accel_delta_max(float accel_g);
-	void inv_set_shake_zero_cross_thresh(int num_zero_cross);
-	void inv_set_shake_deriv_thresh(float shake_deriv_thresh);
-	void inv_set_shake_time_min_ms(long time_ms);
-	void inv_set_shake_time_max_ms(long time_ms);
-	void inv_enable_shake_data_interpolation(unsigned char en);
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // INV_SHAKE__
\ No newline at end of file
diff --git a/60xx/mlsdk/Android.mk b/60xx/mlsdk/Android.mk
deleted file mode 100644
index 929a776..0000000
--- a/60xx/mlsdk/Android.mk
+++ /dev/null
@@ -1,101 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-ifneq ($(BOARD_USES_GENERIC_INVENSENSE),false)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_MODULE := libmlplatform
-#modify these to point to the mpl source installation
-MLSDK_ROOT = .
-MLPLATFORM_DIR = $(MLSDK_ROOT)/platform/linux
-
-LOCAL_CFLAGS += -D_REENTRANT -DLINUX -DANDROID
-LOCAL_CFLAGS += -DCONFIG_MPU_SENSORS_MPU3050
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/platform/include
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/platform/include/linux
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLPLATFORM_DIR)
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLPLATFORM_DIR)/kernel
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/mllite
-
-ML_SOURCES := \
-    $(MLPLATFORM_DIR)/mlos_linux.c \
-    $(MLPLATFORM_DIR)/mlsl_linux_mpu.c
-
-LOCAL_SRC_FILES := $(ML_SOURCES)
-
-LOCAL_SHARED_LIBRARIES := liblog libm libutils libcutils
-include $(BUILD_SHARED_LIBRARY)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := libmllite
-LOCAL_MODULE_TAGS := optional
-#modify these to point to the mpl source installation
-MLSDK_ROOT = .
-MLPLATFORM_DIR = $(MLSDK_ROOT)/platform
-MLLITE_DIR = $(MLSDK_ROOT)/mllite
-MPL_DIR = $(MLSDK_ROOT)/mldmp
-
-LOCAL_CFLAGS += -DNDEBUG
-LOCAL_CFLAGS += -D_REENTRANT -DLINUX -DANDROID
-LOCAL_CFLAGS += -DCONFIG_MPU_SENSORS_MPU3050
-LOCAL_CFLAGS += -DUNICODE -D_UNICODE -DSK_RELEASE
-LOCAL_CFLAGS += -DI2CDEV=\"/dev/mpu\"
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MPL_DIR) -I$(LOCAL_PATH)/$(MLLITE_DIR) -I$(LOCAL_PATH)/$(MLPLATFORM_DIR)/include
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/mlutils -I$(LOCAL_PATH)/$(MLSDK_ROOT)/mlapps/common
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/platform/include/linux
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLSDK_ROOT)/mllite/akmd
-LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(MLPLATFORM_DIR)/linux
-
-# optionally apply the compass filter. this is set in
-# BoardConfig.mk
-ifeq ($(BOARD_INVENSENSE_APPLY_COMPASS_NOISE_FILTER),true)
-LOCAL_CFLAGS += -DAPPLY_COMPASS_FILTER
-endif
-
-ML_SOURCES = \
-        $(MLLITE_DIR)/accel.c \
-        $(MLLITE_DIR)/compass.c \
-        $(MLLITE_DIR)/pressure.c \
-        $(MLLITE_DIR)/mldl_cfg_mpu.c \
-        $(MLLITE_DIR)/dmpDefault.c \
-        $(MLLITE_DIR)/ml.c \
-	$(MLLITE_DIR)/mlarray.c \
-	$(MLLITE_DIR)/mlarray_legacy.c \
-        $(MLLITE_DIR)/mlFIFO.c \
-        $(MLLITE_DIR)/mlFIFOHW.c \
-        $(MLLITE_DIR)/mlMathFunc.c \
-        $(MLLITE_DIR)/ml_stored_data.c \
-        $(MLLITE_DIR)/mlcontrol.c \
-        $(MLLITE_DIR)/mldl.c \
-        $(MLLITE_DIR)/mldmp.c \
-        $(MLLITE_DIR)/mlstates.c \
-        $(MLLITE_DIR)/mlsupervisor.c \
-        $(MLLITE_DIR)/mlBiasNoMotion.c \
-        $(MLLITE_DIR)/mlSetGyroBias.c \
-        \
-        $(MLLITE_DIR)/ml_mputest.c \
-        $(MLSDK_ROOT)/mlutils/mputest.c \
-        $(MLSDK_ROOT)/mlutils/checksum.c
-
-
-ifeq ($(HARDWARE),M_HW)
-    ML_SOURCES += $(MLLITE_DIR)/accel/mantis.c
-endif
-
-LOCAL_SRC_FILES := $(ML_SOURCES)
-LOCAL_SHARED_LIBRARIES := libm libutils libcutils liblog libmlplatform
-include $(BUILD_SHARED_LIBRARY)
-
-#This makes an .so from our .a
-#include $(CLEAR_VARS)
-#LOCAL_MODULE := libmpl
-#LOCAL_MODULE_TAGS := optional
-#LOCAL_SRC_FILES := mlsdk/mldmp/mpl/android/libmpl.a
-#LOCAL_SHARED_LIBRARIES := libm libutils libcutils liblog libmlplatform libmllite
-#LOCAL_WHOLE_STATIC_LIBRARIES := libmpl
-#LOCAL_PREBUILT_LIBS := mlsdk/mldmp/mpl/android/libmpl.a
-#include $(BUILD_SHARED_LIBRARY)
-#include $(BUILD_MULTI_PREBUILT)
-
-endif
diff --git a/60xx/mlsdk/mllite/accel.c b/60xx/mlsdk/mllite/accel.c
deleted file mode 100644
index 60b8d6c..0000000
--- a/60xx/mlsdk/mllite/accel.c
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: accel.c 4595 2011-01-25 01:43:03Z mcaramello $
- *
- *******************************************************************************/
-
-/** 
- *  @defgroup ACCELDL 
- *  @brief  Motion Library - Accel Driver Layer.
- *          Provides the interface to setup and handle an accel
- *          connected to either the primary or the seconday I2C interface 
- *          of the gyroscope.
- *
- *  @{
- *      @file   accel.c
- *      @brief  Accel setup and handling methods.
-**/
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <string.h>
-
-#include "ml.h"
-#include "mlinclude.h"
-#include "dmpKey.h"
-#include "mlFIFO.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mlMathFunc.h"
-#include "mlsl.h"
-#include "mlos.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-accel"
-
-#define ACCEL_DEBUG 0
-
-/* --------------------- */
-/* - Global Variables. - */
-/* --------------------- */
-
-/* --------------------- */
-/* - Static Variables. - */
-/* --------------------- */
-
-/* --------------- */
-/* - Prototypes. - */
-/* --------------- */
-
-/* -------------- */
-/* - Externs.   - */
-/* -------------- */
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-/** 
- *  @brief  Used to determine if an accel is configured and
- *          used by the MPL.
- *  @return INV_SUCCESS if the accel is present.
- */
-unsigned char inv_accel_present(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->accel &&
-        NULL != mldl_cfg->accel->resume &&
-        mldl_cfg->requested_sensors & INV_THREE_AXIS_ACCEL)
-        return TRUE;
-    else
-        return FALSE;
-}
-
-/**
- *  @brief   Query the accel slave address.
- *  @return  The 7-bit accel slave address.
- */
-unsigned char inv_get_slave_addr(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->pdata)
-        return mldl_cfg->pdata->accel.address;
-    else
-        return 0;
-}
-
-/**
- *  @brief   Get the ID of the accel in use.
- *  @return  ID of the accel in use.
- */
-unsigned short inv_get_accel_id(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->accel) {
-        return mldl_cfg->accel->id;
-    }
-    return ID_INVALID;
-}
-
-/**
- *  @brief  Get a sample of accel data from the device.
- *  @param  data
- *              the buffer to store the accel raw data for
- *              X, Y, and Z axes.
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_get_accel_data(long *data)
-{
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    inv_error_t result;
-    unsigned char raw_data[2 * ACCEL_NUM_AXES];
-    long tmp[ACCEL_NUM_AXES];
-    int ii;
-    signed char *mtx = mldl_cfg->pdata->accel.orientation;
-    char accelId = mldl_cfg->accel->id;
-
-    if (NULL == data)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (mldl_cfg->accel->read_len > sizeof(raw_data))
-        return INV_ERROR_ASSERTION_FAILURE;
-
-    result = (inv_error_t) inv_mpu_read_accel(mldl_cfg,
-                                              inv_get_serial_handle(),
-                                              inv_get_serial_handle(),
-                                              raw_data);
-    if (result == INV_ERROR_ACCEL_DATA_NOT_READY) {
-        return result;
-    }
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    for (ii = 0; ii < ARRAY_SIZE(tmp); ii++) {
-        if (EXT_SLAVE_LITTLE_ENDIAN == mldl_cfg->accel->endian) {
-            tmp[ii] = (long)((signed char)raw_data[2 * ii + 1]) * 256;
-            tmp[ii] += (long)((unsigned char)raw_data[2 * ii]);
-        } else if ((EXT_SLAVE_BIG_ENDIAN == mldl_cfg->accel->endian) ||
-                   (EXT_SLAVE_FS16_BIG_ENDIAN == mldl_cfg->accel->endian)) {
-            tmp[ii] = (long)((signed char)raw_data[2 * ii]) * 256;
-            tmp[ii] += (long)((unsigned char)raw_data[2 * ii + 1]);
-            if (accelId == ACCEL_ID_KXSD9) {
-                tmp[ii] = (long)((short)(((unsigned short)tmp[ii])
-                                         + ((unsigned short)0x8000)));
-            }
-        } else if (EXT_SLAVE_FS8_BIG_ENDIAN == mldl_cfg->accel->endian) {
-            tmp[ii] = (long)((signed char)raw_data[ii]) * 256;
-        } else {
-            result = INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-        }
-    }
-
-    for (ii = 0; ii < ARRAY_SIZE(tmp); ii++) {
-        data[ii] = ((long)tmp[0] * mtx[3 * ii] +
-                    (long)tmp[1] * mtx[3 * ii + 1] +
-                    (long)tmp[2] * mtx[3 * ii + 2]);
-    }
-
-    //MPL_LOGI("ACCEL: %8ld, %8ld, %8ld\n", data[0], data[1], data[2]);
-    return result;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/mllite/accel.h b/60xx/mlsdk/mllite/accel.h
deleted file mode 100644
index d3fbc6a..0000000
--- a/60xx/mlsdk/mllite/accel.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: accel.h 4580 2011-01-22 03:19:23Z prao $
- *
- *******************************************************************************/
-
-#ifndef ACCEL_H
-#define ACCEL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#include "mpu.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "accel_legacy.h"
-#endif
-
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-
-    unsigned char inv_accel_present(void);
-    unsigned char inv_get_slave_addr(void);
-    inv_error_t inv_get_accel_data(long *data);
-    unsigned short inv_get_accel_id(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // ACCEL_H
diff --git a/60xx/mlsdk/mllite/compass.c b/60xx/mlsdk/mllite/compass.c
deleted file mode 100644
index 798cb9f..0000000
--- a/60xx/mlsdk/mllite/compass.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: compass.c 5641 2011-06-14 02:10:02Z mcaramello $
- *
- *******************************************************************************/
-
-/** 
- *  @defgroup COMPASSDL 
- *  @brief  Motion Library - Compass Driver Layer.
- *          Provides the interface to setup and handle an compass
- *          connected to either the primary or the seconday I2C interface 
- *          of the gyroscope.
- *
- *  @{
- *      @file   compass.c
- *      @brief  Compass setup and handling methods.
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <string.h>
-#include <stdlib.h>
-#include "compass.h"
-
-#include "ml.h"
-#include "mlinclude.h"
-#include "dmpKey.h"
-#include "mlFIFO.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mlMathFunc.h"
-#include "mlsl.h"
-#include "mlos.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-compass"
-
-#define COMPASS_DEBUG 0
-
-/* --------------------- */
-/* - Global Variables. - */
-/* --------------------- */
-
-/* --------------------- */
-/* - Static Variables. - */
-/* --------------------- */
-
-/* --------------- */
-/* - Prototypes. - */
-/* --------------- */
-
-/* -------------- */
-/* - Externs.   - */
-/* -------------- */
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-static float square(float data)
-{
-    return data * data;
-}
-
-static void adaptive_filter_init(struct yas_adaptive_filter *adap_filter, int len, float noise)
-{
-    int i;
-
-    adap_filter->num = 0;
-    adap_filter->index = 0;
-    adap_filter->noise = noise;
-    adap_filter->len = len;
-
-    for (i = 0; i < adap_filter->len; ++i) {
-        adap_filter->sequence[i] = 0;
-    }
-}
-
-static int cmpfloat(const void *p1, const void *p2)
-{
-    return *(float*)p1 - *(float*)p2;
-}
-
-
-static float adaptive_filter_filter(struct yas_adaptive_filter *adap_filter, float in)
-{
-    float avg, sum, median, sorted[YAS_DEFAULT_FILTER_LEN];
-    int i;
-
-    if (adap_filter->len <= 1) {
-        return in;
-    }
-    if (adap_filter->num < adap_filter->len) {
-        adap_filter->sequence[adap_filter->index++] = in;
-        adap_filter->num++;
-        return in;
-    }
-    if (adap_filter->len <= adap_filter->index) {
-        adap_filter->index = 0;
-    }
-    adap_filter->sequence[adap_filter->index++] = in;
-
-    avg = 0;
-    for (i = 0; i < adap_filter->len; i++) {
-        avg += adap_filter->sequence[i];
-    }
-    avg /= adap_filter->len;
-
-    memcpy(sorted, adap_filter->sequence, adap_filter->len * sizeof(float));
-    qsort(&sorted, adap_filter->len, sizeof(float), cmpfloat);
-    median = sorted[adap_filter->len/2];
-
-    sum = 0;
-    for (i = 0; i < adap_filter->len; i++) {
-        sum += square(avg - adap_filter->sequence[i]);
-    }
-    sum /= adap_filter->len;
-
-    if (sum <= adap_filter->noise) {
-        return median;
-    }
-
-    return ((in - avg) * (sum - adap_filter->noise) / sum + avg);
-}
-
-static void thresh_filter_init(struct yas_thresh_filter *thresh_filter, float threshold)
-{
-    thresh_filter->threshold = threshold;
-    thresh_filter->last = 0;
-}
-
-static float thresh_filter_filter(struct yas_thresh_filter *thresh_filter, float in)
-{
-    if (in < thresh_filter->last - thresh_filter->threshold
-            || thresh_filter->last + thresh_filter->threshold < in) {
-        thresh_filter->last = in;
-        return in;
-    }
-    else {
-        return thresh_filter->last;
-    }
-}
-
-static int init(yas_filter_handle_t *t)
-{
-    float noise[] = {
-        YAS_DEFAULT_FILTER_NOISE,
-        YAS_DEFAULT_FILTER_NOISE,
-        YAS_DEFAULT_FILTER_NOISE,
-    };
-    int i;
-
-    if (t == NULL) {
-        return -1;
-    }
-
-    for (i = 0; i < 3; i++) {
-        adaptive_filter_init(&t->adap_filter[i], YAS_DEFAULT_FILTER_LEN, noise[i]);
-        thresh_filter_init(&t->thresh_filter[i], YAS_DEFAULT_FILTER_THRESH);
-    }
-
-    return 0;
-}
-
-static int update(yas_filter_handle_t *t, float *input, float *output)
-{
-    int i;
-
-    if (t == NULL || input == NULL || output == NULL) {
-        return -1;
-    }
-
-    for (i = 0; i < 3; i++) {
-        output[i] = adaptive_filter_filter(&t->adap_filter[i], input[i]);
-        output[i] = thresh_filter_filter(&t->thresh_filter[i], output[i]);
-    }
-
-    return 0;
-}
-
-int yas_filter_init(yas_filter_if_s *f)
-{
-    if (f == NULL) {
-        return -1;
-    }
-    f->init = init;
-    f->update = update;
-
-    return 0;
-}
-
-/**
- *  @brief  Used to determine if a compass is
- *          configured and used by the MPL.
- *  @return INV_SUCCESS if the compass is present.
- */
-unsigned char inv_compass_present(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->compass &&
-        NULL != mldl_cfg->compass->resume &&
-        mldl_cfg->requested_sensors & INV_THREE_AXIS_COMPASS)
-        return TRUE;
-    else
-        return FALSE;
-}
-
-/**
- *  @brief   Query the compass slave address.
- *  @return  The 7-bit compass slave address.
- */
-unsigned char inv_get_compass_slave_addr(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->pdata)
-        return mldl_cfg->pdata->compass.address;
-    else
-        return 0;
-}
-
-/**
- *  @brief   Get the ID of the compass in use.
- *  @return  ID of the compass in use.
- */
-unsigned short inv_get_compass_id(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->compass) {
-        return mldl_cfg->compass->id;
-    }
-    return ID_INVALID;
-}
-
-/**
- *  @brief  Get a sample of compass data from the device.
- *  @param  data
- *              the buffer to store the compass raw data for
- *              X, Y, and Z axes.
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_get_compass_data(long *data)
-{
-    inv_error_t result;
-    int ii;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    unsigned char *tmp = inv_obj.compass_raw_data;
-
-    if (mldl_cfg->compass->read_len > sizeof(inv_obj.compass_raw_data)) {
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_CONFIGURATION);
-        return INV_ERROR_INVALID_CONFIGURATION;
-    }
-
-    if (mldl_cfg->pdata->compass.bus == EXT_SLAVE_BUS_PRIMARY ||
-        !(mldl_cfg->requested_sensors & INV_DMP_PROCESSOR)) {
-        /*--- read the compass sensor data.
-          The compass read function may return an INV_ERROR_COMPASS_* errors
-          when the data is not ready (read/refresh frequency mismatch) or 
-          the internal data sampling timing of the device was not respected. 
-          Returning the error code will make the sensor fusion supervisor 
-          ignore this compass data sample. ---*/
-        result = (inv_error_t) inv_mpu_read_compass(mldl_cfg,
-                                                    inv_get_serial_handle(),
-                                                    inv_get_serial_handle(),
-                                                    tmp);
-        if (result) {
-            if (COMPASS_DEBUG) {
-                MPL_LOGV("inv_mpu_read_compass returned %d\n", result);
-            }
-            return result;
-        }
-        for (ii = 0; ii < 3; ii++) {
-            if (EXT_SLAVE_BIG_ENDIAN == mldl_cfg->compass->endian)
-                data[ii] =
-                    ((long)((signed char)tmp[2 * ii]) << 8) + tmp[2 * ii + 1];
-            else
-                data[ii] =
-                    ((long)((signed char)tmp[2 * ii + 1]) << 8) + tmp[2 * ii];
-        }
-
-        inv_obj.compass_overunder = (int)tmp[6];
-
-    } else {
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 ||             \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-        result = inv_get_external_sensor_data(data, 3);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-        {
-            static unsigned char first = TRUE;
-            // one-off write to AKM
-            if (first) {
-                unsigned char regs[] = {
-                    // beginning Mantis register for one-off slave R/W
-                    MPUREG_I2C_SLV4_ADDR,
-                    // the slave to write to
-                    mldl_cfg->pdata->compass.address,
-                    // the register to write to
-                    /*mldl_cfg->compass->trigger->reg */ 0x0A,
-                    // the value to write
-                    /*mldl_cfg->compass->trigger->value */ 0x01,
-                    // enable the write
-                    0xC0
-                };
-                result =
-                    inv_serial_write(inv_get_serial_handle(), mldl_cfg->addr,
-                                     ARRAY_SIZE(regs), regs);
-                first = FALSE;
-            } else {
-                unsigned char regs[] = {
-                    MPUREG_I2C_SLV4_CTRL,
-                    0xC0
-                };
-                result =
-                    inv_serial_write(inv_get_serial_handle(), mldl_cfg->addr,
-                                     ARRAY_SIZE(regs), regs);
-            }
-        }
-#endif
-#else
-        return INV_ERROR_INVALID_CONFIGURATION;
-#endif                          // CONFIG_MPU_SENSORS_xxxx
-    }
-    data[0] = inv_q30_mult(data[0], inv_obj.compass_asa[0]);
-    data[1] = inv_q30_mult(data[1], inv_obj.compass_asa[1]);
-    data[2] = inv_q30_mult(data[2], inv_obj.compass_asa[2]);
-
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief  Sets the compass bias.
- *  @param  bias 
- *              Compass bias, length 3. Scale is micro Tesla's * 2^16. 
- *              Frame is mount frame which may be different from body frame.
- *  @return INV_SUCCESS = 0 if successful. A non-zero error code otherwise.
- */
-inv_error_t inv_set_compass_bias(long *bias)
-{
-    inv_error_t result = INV_SUCCESS;
-    long biasC[3];
-    struct mldl_cfg *mldlCfg = inv_get_dl_config();
-
-    inv_obj.compass_bias[0] = bias[0];
-    inv_obj.compass_bias[1] = bias[1];
-    inv_obj.compass_bias[2] = bias[2];
-
-    // Find Bias in units of the raw data scaled by 2^16 in chip mounting frame
-    biasC[0] =
-        (long)(bias[0] * (1LL << 30) / inv_obj.compass_sens) +
-        inv_obj.init_compass_bias[0] * (1L << 16);
-    biasC[1] =
-        (long)(bias[1] * (1LL << 30) / inv_obj.compass_sens) +
-        inv_obj.init_compass_bias[1] * (1L << 16);
-    biasC[2] =
-        (long)(bias[2] * (1LL << 30) / inv_obj.compass_sens) +
-        inv_obj.init_compass_bias[2] * (1L << 16);
-
-    if (inv_dmpkey_supported(KEY_CPASS_BIAS_X)) {
-        unsigned char reg[4];
-        long biasB[3];
-        signed char *orC = mldlCfg->pdata->compass.orientation;
-
-        // Now transform to body frame
-        biasB[0] = biasC[0] * orC[0] + biasC[1] * orC[1] + biasC[2] * orC[2];
-        biasB[1] = biasC[0] * orC[3] + biasC[1] * orC[4] + biasC[2] * orC[5];
-        biasB[2] = biasC[0] * orC[6] + biasC[1] * orC[7] + biasC[2] * orC[8];
-
-        result =
-            inv_set_mpu_memory(KEY_CPASS_BIAS_X, 4,
-                               inv_int32_to_big8(biasB[0], reg));
-        result =
-            inv_set_mpu_memory(KEY_CPASS_BIAS_Y, 4,
-                               inv_int32_to_big8(biasB[1], reg));
-        result =
-            inv_set_mpu_memory(KEY_CPASS_BIAS_Z, 4,
-                               inv_int32_to_big8(biasB[2], reg));
-    }
-    return result;
-}
-
-/**
- *  @brief  Write a single register on the compass slave device, regardless
- *          of the bus it is connected to and the MPU's configuration.
- *  @param  reg
- *              the register to write to on the slave compass device.
- *  @param  val
- *              the value to write.
- *  @return INV_SUCCESS = 0 if successful. A non-zero error code otherwise.
- */
-inv_error_t inv_compass_write_reg(unsigned char reg, unsigned char val)
-{
-    struct ext_slave_config config;
-    unsigned char data[2];
-    inv_error_t result;
-
-    data[0] = reg;
-    data[1] = val;
-
-    config.key = MPU_SLAVE_WRITE_REGISTERS;
-    config.len = 2;
-    config.apply = TRUE;
-    config.data = data;
-
-    result = inv_mpu_config_compass(inv_get_dl_config(),
-                                    inv_get_serial_handle(),
-                                    inv_get_serial_handle(), &config);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- *  @brief  Read values from the compass slave device registers, regardless
- *          of the bus it is connected to and the MPU's configuration.
- *  @param  reg
- *              the register to read from on the slave compass device.
- *  @param  val
- *              a buffer of 3 elements to store the values read from the 
- *              compass device.
- *  @return INV_SUCCESS = 0 if successful. A non-zero error code otherwise.
- */
-inv_error_t inv_compass_read_reg(unsigned char reg, unsigned char *val)
-{
-    struct ext_slave_config config;
-    unsigned char data[2];
-    inv_error_t result;
-
-    data[0] = reg;
-
-    config.key = MPU_SLAVE_READ_REGISTERS;
-    config.len = 2;
-    config.apply = TRUE;
-    config.data = data;
-
-    result = inv_mpu_get_compass_config(inv_get_dl_config(),
-                                        inv_get_serial_handle(),
-                                        inv_get_serial_handle(), &config);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    *val = data[1];
-    return result;
-}
-
-/**
- *  @brief  Read values from the compass slave device scale registers, regardless
- *          of the bus it is connected to and the MPU's configuration.
- *  @param  reg
- *              the register to read from on the slave compass device.
- *  @param  val
- *              a buffer of 3 elements to store the values read from the 
- *              compass device.
- *  @return INV_SUCCESS = 0 if successful. A non-zero error code otherwise.
- */
-inv_error_t inv_compass_read_scale(long *val)
-{
-    struct ext_slave_config config;
-    unsigned char data[3];
-    inv_error_t result;
-
-    config.key = MPU_SLAVE_READ_SCALE;
-    config.len = 3;
-    config.apply = TRUE;
-    config.data = data;
-
-    result = inv_mpu_get_compass_config(inv_get_dl_config(),
-                                        inv_get_serial_handle(),
-                                        inv_get_serial_handle(), &config);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    val[0] = ((data[0] - 128) << 22) + (1L << 30);
-    val[1] = ((data[1] - 128) << 22) + (1L << 30);
-    val[2] = ((data[2] - 128) << 22) + (1L << 30);
-    return result;
-}
-
-inv_error_t inv_set_compass_offset(void)
-{
-    struct ext_slave_config config;
-    unsigned char data[3];
-    inv_error_t result;
-
-    config.key = MPU_SLAVE_OFFSET_VALS;
-    config.len = 3;
-    config.apply = TRUE;
-    config.data = data;
-
-    if(inv_obj.flags[INV_COMPASS_OFFSET_VALID]) {
-        /* push stored values */
-        data[0] = (char)inv_obj.compass_offsets[0];
-        data[1] = (char)inv_obj.compass_offsets[1];
-        data[2] = (char)inv_obj.compass_offsets[2];
-        MPL_LOGI("push compass offsets %hhd, %hhd, %hhd", data[0], data[1], data[2]);
-        result = inv_mpu_config_compass(inv_get_dl_config(),
-                                        inv_get_serial_handle(),
-                                        inv_get_serial_handle(), &config);
-    } else {
-        /* compute new values and store them */
-        result = inv_mpu_get_compass_config(inv_get_dl_config(),
-                                            inv_get_serial_handle(),
-                                            inv_get_serial_handle(), &config);
-        MPL_LOGI("pulled compass offsets %hhd %hhd %hhd", data[0], data[1], data[2]);
-        if(result == INV_SUCCESS) {
-            inv_obj.flags[INV_COMPASS_OFFSET_VALID] = 1;
-            inv_obj.compass_offsets[0] = data[0];
-            inv_obj.compass_offsets[1] = data[1];
-            inv_obj.compass_offsets[2] = data[2];
-        }
-    }
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-inv_error_t inv_compass_check_range(void)
-{
-    struct ext_slave_config config;
-    unsigned char data[3];
-    inv_error_t result;
-
-    config.key = MPU_SLAVE_RANGE_CHECK;
-    config.len = 3;
-    config.apply = TRUE;
-    config.data = data;
-
-    result = inv_mpu_get_compass_config(inv_get_dl_config(),
-                                        inv_get_serial_handle(),
-                                        inv_get_serial_handle(), &config);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if(data[0] || data[1] || data[2]) {
-        /* some value clipped */
-        return INV_ERROR_COMPASS_DATA_ERROR;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- * @}
- */
diff --git a/60xx/mlsdk/mllite/compass.h b/60xx/mlsdk/mllite/compass.h
deleted file mode 100644
index f0bdb58..0000000
--- a/60xx/mlsdk/mllite/compass.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: compass.h 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *******************************************************************************/
-
-#ifndef COMPASS_H
-#define COMPASS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#include "mpu.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "compass_legacy.h"
-#endif
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-#define YAS_MAX_FILTER_LEN (20)
-#define YAS_DEFAULT_FILTER_LEN (20)
-#define YAS_DEFAULT_FILTER_THRESH (300) /* 300 nT */
-#define YAS_DEFAULT_FILTER_NOISE (2000 * 2000) /* standard deviation 2000 nT */
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-struct yas_adaptive_filter {
-    int num;
-    int index;
-    int len;
-    float noise;
-    float sequence[YAS_MAX_FILTER_LEN];
-};
-
-struct yas_thresh_filter {
-    float threshold;
-    float last;
-};
-
-typedef struct {
-    struct yas_adaptive_filter adap_filter[3];
-    struct yas_thresh_filter thresh_filter[3];
-} yas_filter_handle_t;
-
-typedef struct {
-    int (*init)(yas_filter_handle_t *t);
-    int (*update)(yas_filter_handle_t *t, float *input, float *output);
-} yas_filter_if_s;
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-
-    unsigned char inv_compass_present(void);
-    unsigned char inv_get_compass_slave_addr(void);
-    inv_error_t inv_get_compass_data(long *data);
-    inv_error_t inv_set_compass_bias(long *bias);
-    unsigned short inv_get_compass_id(void);
-    inv_error_t inv_set_compass_offset(void);
-    inv_error_t inv_compass_check_range(void);
-    inv_error_t inv_compass_write_reg(unsigned char reg, unsigned char val);
-    inv_error_t inv_compass_read_reg(unsigned char reg, unsigned char *val);
-    inv_error_t inv_compass_read_scale(long *val);
-
-    int yas_filter_init(yas_filter_if_s *f);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // COMPASS_H
diff --git a/60xx/mlsdk/mllite/dmpDefault.c b/60xx/mlsdk/mllite/dmpDefault.c
deleted file mode 100644
index 6620d14..0000000
--- a/60xx/mlsdk/mllite/dmpDefault.c
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/***************************************************************************** *
- * $Id: dmpDefault.c 5627 2011-06-10 22:34:18Z nroyer $ 
- ******************************************************************************/
-
-/* WARNING: autogenerated code, do not modify */
-/**
- *  @defgroup DMPDEFAULT 
- *  @brief    Data and configuration for MLDmpDefaultOpen.
- *
- *  @{
- *      @file   inv_setup_dmp.c
- *      @brief  Data and configuration for MLDmpDefaultOpen.
- */
-
-#include "mltypes.h"
-#include "dmpDefault.h"
-#include "dmpKey.h"
-#include "dmpmap.h"
-#include "ml.h"
-#include "mpu.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-
-#define CFG_25  703
-#define CFG_24  699
-#define CFG_26  707
-#define CFG_21  802
-#define CFG_20  645
-#define CFG_23  814
-#define CFG_TAP4  808
-#define CFG_TAP5  809
-#define CFG_TAP6  810
-#define CFG_1  783
-#define CFG_TAP0  802
-#define CFG_TAP1  804
-#define CFG_TAP2  805
-#define CFG_TAP3  806
-#define FCFG_AZ  878
-#define CFG_ORIENT_IRQ_1  715
-#define CFG_ORIENT_IRQ_2  738
-#define CFG_ORIENT_IRQ_3  743
-#define CFG_TAP_QUANTIZE  647
-#define FCFG_3  936
-#define CFG_TAP_CLEAR_STICKY  817
-#define FCFG_1  868
-#define CFG_ACCEL_FILTER  968
-#define FCFG_2  872
-#define CFG_3D  521
-#define CFG_3B  517
-#define CFG_3C  519
-#define FCFG_5  942
-#define FCFG_4  857
-#define FCFG_FSCALE  877
-#define CFG_TAP_JERK  639
-#define FCFG_6  996
-#define CFG_12  797
-#define FCFG_7  930
-#define CFG_14  790
-#define CFG_15  790
-#define CFG_16  815
-#define CFG_18  551
-#define CFG_6  823
-#define CFG_7  564
-#define CFG_4  526
-#define CFG_5  749
-#define CFG_3  515
-#define CFG_GYRO_SOURCE  777
-#define CFG_8  772
-#define CFG_9  778
-#define CFG_ORIENT_2  733
-#define CFG_ORIENT_1  713
-#define FCFG_ACCEL_INPUT  904
-#define CFG_TAP7  811
-#define CFG_TAP_SAVE_ACCB  687
-#define FCFG_ACCEL_INIT  831
-
-
-#define D_0_22  (22)
-#define D_0_24  (24)
-#define D_0_36  (36)
-#define D_0_52  (52)
-#define D_0_96  (96)
-#define D_0_104 (104)
-#define D_0_108 (108)
-#define D_0_163 (163)
-#define D_0_188 (188)
-#define D_0_192 (192)
-#define D_0_224 (224)
-#define D_0_228 (228)
-#define D_0_232 (232)
-#define D_0_236 (236)
-
-#define D_1_2 (256 + 2)
-#define D_1_4 (256 + 4)
-#define D_1_8 (256 + 8)
-#define D_1_10 (256 + 10)
-#define D_1_24 (256 + 24)
-#define D_1_28 (256 + 28)
-#define D_1_92 (256 + 92)
-#define D_1_96 (256 + 96)
-#define D_1_98 (256 + 98)
-#define D_1_106 (256 + 106)
-#define D_1_108 (256 + 108)
-#define D_1_112 (256 + 112)
-#define D_1_128 (256 + 144)
-#define D_1_152 (256 + 12)
-#define D_1_168 (256 + 168)
-#define D_1_175 (256 + 175)
-#define D_1_178 (256 + 178)
-#define D_1_236 (256 + 236)
-#define D_1_244 (256 + 244)
-
-
-static const tKeyLabel dmpTConfig[] = {
-    {KEY_CFG_25, CFG_25},
-    {KEY_CFG_24, CFG_24},
-    {KEY_CFG_26, CFG_26},
-    {KEY_CFG_21, CFG_21},
-    {KEY_CFG_20, CFG_20},
-    {KEY_CFG_23, CFG_23},
-    {KEY_CFG_TAP4, CFG_TAP4},
-    {KEY_CFG_TAP5, CFG_TAP5},
-    {KEY_CFG_TAP6, CFG_TAP6},
-    {KEY_CFG_1, CFG_1},
-    {KEY_CFG_TAP0, CFG_TAP0},
-    {KEY_CFG_TAP1, CFG_TAP1},
-    {KEY_CFG_TAP2, CFG_TAP2},
-    {KEY_CFG_TAP3, CFG_TAP3},
-    {KEY_FCFG_AZ, FCFG_AZ},
-    {KEY_CFG_ORIENT_IRQ_1, CFG_ORIENT_IRQ_1},
-    {KEY_CFG_ORIENT_IRQ_2, CFG_ORIENT_IRQ_2},
-    {KEY_CFG_ORIENT_IRQ_3, CFG_ORIENT_IRQ_3},
-    {KEY_CFG_TAP_QUANTIZE, CFG_TAP_QUANTIZE},
-    {KEY_FCFG_3, FCFG_3},
-    {KEY_CFG_TAP_CLEAR_STICKY, CFG_TAP_CLEAR_STICKY},
-    {KEY_FCFG_1, FCFG_1},
-    //{KEY_CFG_ACCEL_FILTER, CFG_ACCEL_FILTER},
-    {KEY_FCFG_2, FCFG_2},
-    {KEY_CFG_3D, CFG_3D},
-    {KEY_CFG_3B, CFG_3B},
-    {KEY_CFG_3C, CFG_3C},
-    {KEY_FCFG_5, FCFG_5},
-    {KEY_FCFG_4, FCFG_4},
-    {KEY_FCFG_FSCALE, FCFG_FSCALE},
-    {KEY_CFG_TAP_JERK, CFG_TAP_JERK},
-    {KEY_FCFG_6, FCFG_6},
-    {KEY_CFG_12, CFG_12},
-    {KEY_FCFG_7, FCFG_7},
-    {KEY_CFG_14, CFG_14},
-    {KEY_CFG_15, CFG_15},
-    {KEY_CFG_16, CFG_16},
-    {KEY_CFG_18, CFG_18},
-    {KEY_CFG_6, CFG_6},
-    {KEY_CFG_7, CFG_7},
-    {KEY_CFG_4, CFG_4},
-    {KEY_CFG_5, CFG_5},
-    {KEY_CFG_3, CFG_3},
-    {KEY_CFG_GYRO_SOURCE, CFG_GYRO_SOURCE},
-    {KEY_CFG_8, CFG_8},
-    {KEY_CFG_9, CFG_9},
-    {KEY_CFG_ORIENT_2, CFG_ORIENT_2},
-    {KEY_CFG_ORIENT_1, CFG_ORIENT_1},
-    {KEY_FCFG_ACCEL_INPUT, FCFG_ACCEL_INPUT},
-    {KEY_CFG_TAP7, CFG_TAP7},
-    {KEY_CFG_TAP_SAVE_ACCB, CFG_TAP_SAVE_ACCB},
-    {KEY_FCFG_ACCEL_INIT, FCFG_ACCEL_INIT},
-
-    {KEY_D_0_22, D_0_22},
-    {KEY_D_0_24, D_0_24},
-    {KEY_D_0_36, D_0_36},
-    {KEY_D_0_52, D_0_52},
-    {KEY_D_0_96, D_0_96},
-    {KEY_D_0_104, D_0_104},
-    {KEY_D_0_108, D_0_108},
-    {KEY_D_0_163, D_0_163},
-    {KEY_D_0_188, D_0_188},
-    {KEY_D_0_192, D_0_192},
-    {KEY_D_0_224, D_0_224},
-    {KEY_D_0_228, D_0_228},
-    {KEY_D_0_232, D_0_232},
-    {KEY_D_0_236, D_0_236},
-
-    {KEY_DMP_PREVPTAT, DMP_PREVPTAT},
-    {KEY_D_1_2, D_1_2},
-    {KEY_D_1_4, D_1_4},
-    {KEY_D_1_8, D_1_8},
-    {KEY_D_1_10, D_1_10},
-    {KEY_D_1_24, D_1_24},
-    {KEY_D_1_28, D_1_28},
-    {KEY_D_1_92, D_1_92},
-    {KEY_D_1_96, D_1_96},
-    {KEY_D_1_98, D_1_98},
-    {KEY_D_1_106, D_1_106},
-    {KEY_D_1_108, D_1_108},
-    {KEY_D_1_112, D_1_112},
-    {KEY_D_1_128, D_1_128},
-    {KEY_D_1_152, D_1_152},
-    {KEY_D_1_168, D_1_168},
-    {KEY_D_1_175, D_1_175},
-    {KEY_D_1_178, D_1_178},
-    {KEY_D_1_236, D_1_236},
-    {KEY_D_1_244, D_1_244},
-
-    {KEY_DMP_TAPW_MIN, DMP_TAPW_MIN},
-    {KEY_DMP_TAP_THR_X, DMP_TAP_THX},
-    {KEY_DMP_TAP_THR_Y, DMP_TAP_THY},
-    {KEY_DMP_TAP_THR_Z, DMP_TAP_THZ},
-    {KEY_DMP_SH_TH_Y, DMP_SH_TH_Y},
-    {KEY_DMP_SH_TH_X, DMP_SH_TH_X},
-    {KEY_DMP_SH_TH_Z, DMP_SH_TH_Z},
-    {KEY_DMP_ORIENT, DMP_ORIENT}
-};
-
-#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0]))
-static const unsigned short sConfig = 0x013f;
-#define SCD (1024)
-static const unsigned char dmpMemory[SCD] = {
-    0xfb, 0x00, 0x00, 0x3e, 0x00, 0x0b, 0x00, 0x36, 0x5a, 0xd6, 0x96, 0x06, 0x3f, 0xa3, 0x00, 0x00,
-    0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x77, 0x8e, 0x00, 0x01, 0x00, 0x01,
-    0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7f, 0xff, 0xff, 0xfe, 0x80, 0x01,
-    0x02, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x03, 0x06, 0x00, 0x00, 0x05, 0x01, 0xe9, 0xa2, 0x0f,
-    0x00, 0x3e, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xca, 0xe3, 0x09, 0x3e, 0x80, 0x00, 0x00,
-    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x3e, 0x00, 0x02, 0xb4, 0x8b, 0x00, 0x00, 0x7a, 0xdf, 0x00, 0x02, 0x5b, 0x2f,
-    0xfc, 0xba, 0xfa, 0x00, 0x01, 0x00, 0x80, 0x00, 0x02, 0x01, 0x80, 0x00, 0x03, 0x02, 0x80, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xb4, 0x8b, 0x00, 0x00, 0x7a, 0xdf, 0x00, 0x02, 0x5b, 0x2f,
-    0x00, 0x7d, 0x32, 0xba, 0x00, 0x0a, 0x1e, 0xd1, 0x00, 0x3a, 0xe8, 0x25, 0x00, 0x00, 0x00, 0x00,
-    0x3f, 0xd7, 0x96, 0x08, 0xff, 0xb3, 0x39, 0xf5, 0xfe, 0x11, 0x1b, 0x62, 0xfb, 0xf4, 0xb4, 0x52,
-    0xfb, 0x8c, 0x6f, 0x5d, 0xfd, 0x5d, 0x08, 0xd9, 0x00, 0x7c, 0x73, 0x3b, 0x00, 0x6c, 0x12, 0xcc,
-    0x32, 0x00, 0x13, 0x9d, 0x32, 0x00, 0xd0, 0xd6, 0x32, 0x00, 0x08, 0x00, 0x40, 0x00, 0x01, 0xf4,
-    0x0d, 0x68, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xd6, 0x00, 0x00, 0x27, 0x10,
-
-    0xfb, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0xfa, 0x36, 0xff, 0xbc, 0x30, 0x8e, 0x00, 0x05, 0xfb, 0xf0, 0xff, 0xd9, 0x5b, 0xc8,
-    0x3e, 0x80, 0x00, 0x00, 0x3e, 0x80, 0x00, 0x00, 0x3e, 0x80, 0x00, 0x00, 0x12, 0x82, 0x2d, 0x90,
-    0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0xff, 0xff, 0x00, 0x05, 0x02, 0x00, 0x00, 0x0c,
-    0x00, 0x03, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0x03, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xff, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x6a, 0x00, 0x00, 0x00, 0x00,
-    0xff, 0xec, 0x3f, 0xc8, 0xff, 0xee, 0x00, 0x00, 0xff, 0xfe, 0x40, 0x00, 0xff, 0xff, 0xff, 0xc8,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x03, 0x65, 0x00, 0x00, 0x00, 0x99, 0x00, 0x00, 0x02, 0xf5,
-
-    0x9e, 0xc5, 0xa3, 0x8a, 0x22, 0x8a, 0x6e, 0x8a, 0x56, 0x8a, 0x5e, 0x9f, 0xc1, 0x83, 0x06, 0x26,
-    0x46, 0x66, 0x0e, 0x2e, 0x4e, 0x6e, 0x9d, 0xc4, 0xad, 0x00, 0x2c, 0x54, 0x7c, 0xf9, 0xc5, 0xa3,
-    0xc1, 0xc3, 0x8f, 0x96, 0x19, 0xa6, 0x81, 0xda, 0x0c, 0xd9, 0x2e, 0xd8, 0xa3, 0x86, 0x31, 0x81,
-    0xa6, 0xd9, 0x30, 0x26, 0xd8, 0xd8, 0xfa, 0xc1, 0x8c, 0xc2, 0x99, 0xc5, 0xa3, 0x2d, 0x55, 0x7d,
-    0x81, 0x91, 0xac, 0x38, 0xad, 0x3a, 0xc3, 0x83, 0x91, 0xac, 0x2d, 0xd9, 0x28, 0xd8, 0x4d, 0xd9,
-    0x48, 0xd8, 0x6d, 0xd9, 0x68, 0xd8, 0x8c, 0x9d, 0xae, 0x29, 0xd9, 0x04, 0xae, 0xd8, 0x51, 0xd9,
-    0x04, 0xae, 0xd8, 0x79, 0xd9, 0x04, 0xd8, 0x81, 0xfb, 0x9d, 0xad, 0x00, 0x8d, 0xae, 0x19, 0x81,
-    0xad, 0xd9, 0x01, 0xd8, 0xfa, 0xae, 0xda, 0x26, 0xd8, 0x8e, 0x91, 0x29, 0x83, 0xa7, 0xd9, 0xad,
-    0xad, 0xad, 0xad, 0xfb, 0x2a, 0xd8, 0xd8, 0xf9, 0xc0, 0xac, 0x89, 0x91, 0x3e, 0x5e, 0x76, 0xfb,
-    0xac, 0x2e, 0x2e, 0xf9, 0xc1, 0x8c, 0x5a, 0x9c, 0xac, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0xac, 0x30,
-    0x18, 0xa8, 0x98, 0x81, 0x28, 0x34, 0x3c, 0x97, 0x24, 0xa7, 0x28, 0x34, 0x3c, 0x9c, 0x24, 0xfa,
-    0xc0, 0x89, 0xac, 0x91, 0x2c, 0x4c, 0x6c, 0x8a, 0x9b, 0x2d, 0xd9, 0xd8, 0xd8, 0x51, 0xd9, 0xd8,
-    0xd8, 0x79, 0xd9, 0xd8, 0xd8, 0xf9, 0x9e, 0x88, 0xa3, 0x31, 0xda, 0xd8, 0xd8, 0x91, 0x2d, 0xd9,
-    0x28, 0xd8, 0x4d, 0xd9, 0x48, 0xd8, 0x6d, 0xd9, 0x68, 0xd8, 0xc1, 0x83, 0x93, 0x35, 0x3d, 0x80,
-    0x25, 0xda, 0xd8, 0xd8, 0x85, 0x69, 0xda, 0xd8, 0xd8, 0xf9, 0xc2, 0x93, 0x81, 0xa3, 0x28, 0x34,
-    0x3c, 0xfb, 0x91, 0xab, 0x8b, 0x18, 0xa3, 0x09, 0xd9, 0xab, 0x97, 0x0a, 0x91, 0x3c, 0xc0, 0x87,
-
-    0x9c, 0xc5, 0xa3, 0xdd, 0xf9, 0xa3, 0xa3, 0xa3, 0xa3, 0x95, 0xf9, 0xa3, 0xa3, 0xa3, 0x9d, 0xf9,
-    0xa3, 0xa3, 0xa3, 0xa3, 0xf9, 0x90, 0xa3, 0xa3, 0xa3, 0xa3, 0x91, 0xc3, 0x99, 0xf9, 0xa3, 0xa3,
-    0xa3, 0x98, 0xf9, 0xa3, 0xa3, 0xa3, 0xa3, 0x97, 0xa3, 0xa3, 0xa3, 0xa3, 0xfb, 0x9b, 0xa3, 0xa3,
-    0xdc, 0xc5, 0xa7, 0xf9, 0x26, 0x26, 0x26, 0xd8, 0xd8, 0xff, 0xd8, 0xd8, 0xd8, 0xd8, 0xd8, 0xc1,
-    0xc2, 0xc4, 0x81, 0xa0, 0x90, 0xfa, 0x2c, 0x80, 0x74, 0xfb, 0x70, 0xfa, 0x7c, 0xc0, 0x86, 0x98,
-    0xa8, 0xf9, 0xc9, 0x88, 0xa1, 0xfa, 0x0e, 0x97, 0x80, 0xf9, 0xa9, 0x2e, 0x2e, 0x2e, 0xaa, 0x2e,
-    0x2e, 0x2e, 0xfa, 0xaa, 0xc9, 0x2c, 0xcb, 0xa9, 0x4c, 0xcd, 0x6c, 0xf9, 0x89, 0xa5, 0xca, 0xcd,
-    0xcf, 0xc3, 0x9e, 0xa9, 0x3e, 0x5e, 0x7e, 0x85, 0xa5, 0x1a, 0x3e, 0x5e, 0xc2, 0xa5, 0x99, 0xfb,
-    0x08, 0x34, 0x5c, 0xf9, 0xa9, 0xc9, 0xcb, 0xcd, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97,
-    0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0x97, 0xa9,
-    0xf9, 0x89, 0x26, 0x46, 0x66, 0x8a, 0xa8, 0x96, 0x36, 0x56, 0x76, 0xaa, 0x98, 0x82, 0x87, 0x2d,
-    0x35, 0x3d, 0xc5, 0xa3, 0xc2, 0xc1, 0x97, 0x80, 0x4a, 0x4e, 0x4e, 0xa3, 0xfa, 0x48, 0xcd, 0xc9,
-    0xf9, 0xc4, 0xa9, 0x99, 0x83, 0x0d, 0x35, 0x5d, 0x89, 0xc5, 0xa3, 0x2d, 0x55, 0x7d, 0xc3, 0x93,
-    0xa3, 0x0e, 0x16, 0x1e, 0xa9, 0x2c, 0x54, 0x7c, 0xc0, 0xc2, 0x83, 0x97, 0xaf, 0x08, 0xc4, 0xa8,
-    0x11, 0xc1, 0x8f, 0xc5, 0xaf, 0x98, 0xf8, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xf9, 0xa3, 0x29,
-    0x55, 0x7d, 0xaf, 0x83, 0xc3, 0x93, 0xaf, 0xf8, 0x00, 0x28, 0x50, 0xc4, 0xc2, 0xc0, 0xf9, 0x97,
-};
-static tKeyLabel keys[NUM_KEYS];
-
-static unsigned short inv_setup_dmpGetAddress(unsigned short key)
-{
-    static int isSorted = 0;
-    if ( !isSorted ) {
-        int kk;
-        for (kk=0; kk<NUM_KEYS; ++kk) {
-            keys[ kk ].addr = 0xffff;
-            keys[ kk ].key = kk;
-        }
-        for (kk=0; kk<NUM_LOCAL_KEYS; ++kk) {
-            keys[ dmpTConfig[kk].key ].addr = dmpTConfig[kk].addr;
-        }
-        isSorted = 1;
-    }
-    if ( key >= NUM_KEYS )
-        return 0xffff;
-    return keys[ key ].addr;
-}
-
-
-/**
- *  @brief
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_setup_dmp(void)
-{
-    inv_error_t result;
-    inv_set_get_address( inv_setup_dmpGetAddress );
-
-    result = inv_clock_source(MPU_CLK_SEL_PLLGYROZ);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_dl_cfg_sampling(MPU_FILTER_42HZ, 4);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_full_scale(2000.f);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_load_dmp(dmpMemory, SCD, sConfig);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_ignore_system_suspend(FALSE);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if (inv_accel_present())
-    {
-        struct ext_slave_config config;
-        long odr;
-        config.key = MPU_SLAVE_CONFIG_ODR_SUSPEND;
-        config.len = sizeof(long);
-        config.apply = FALSE;
-        config.data = &odr;
-
-        odr = 0;
-        result = inv_mpu_config_accel(inv_get_dl_config(),
-                                  inv_get_serial_handle(),
-                                  inv_get_serial_handle(),
-                                  &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        config.key = MPU_SLAVE_CONFIG_ODR_RESUME;
-        odr = 200000;
-        result = inv_mpu_config_accel(inv_get_dl_config(), 
-                                  inv_get_serial_handle(),
-                                  inv_get_serial_handle(),
-                                  &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        config.key = MPU_SLAVE_CONFIG_IRQ_SUSPEND;
-        odr = MPU_SLAVE_IRQ_TYPE_NONE;
-        result = inv_mpu_config_accel(inv_get_dl_config(),
-                                  inv_get_serial_handle(),
-                                  inv_get_serial_handle(),
-                                  &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        config.key = MPU_SLAVE_CONFIG_IRQ_RESUME;
-        odr = MPU_SLAVE_IRQ_TYPE_NONE;
-        result = inv_mpu_config_accel(inv_get_dl_config(), 
-                         inv_get_serial_handle(),
-                         inv_get_serial_handle(),
-                         &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-    }
-
-    return result;
-}
-/**
- * @}
- */
-
diff --git a/60xx/mlsdk/mllite/dmpDefault.h b/60xx/mlsdk/mllite/dmpDefault.h
deleted file mode 100644
index 0670977..0000000
--- a/60xx/mlsdk/mllite/dmpDefault.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 ML_DMPDEFAULT_H__
-#define ML_DMPDEFAULT_H__
-
-/**
- * @defgroup DEFAULT 
- * @brief Default DMP assembly listing header file
- *
- * @{
- *      @file     inv_setup_dmp.c
- *      @brief    Default DMP assembly listing header file
- */
-
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-    inv_error_t inv_setup_dmp(void);
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif // ML_DMPDEFAULT_H__
diff --git a/60xx/mlsdk/mllite/dmpDefaultMantis.c b/60xx/mlsdk/mllite/dmpDefaultMantis.c
deleted file mode 100644
index f35aaca..0000000
--- a/60xx/mlsdk/mllite/dmpDefaultMantis.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/* WARNING: autogenerated code, do not modify */
-/**
- * @defgroup DMPDEFAULT 
- * @brief  
- *
- * @{
- * @file     inv_setup_dmpMantis.c
- * @brief    
- *
- *
- */
-
-#include "mltypes.h"
-#include "dmpDefault.h"
-#include "dmpKey.h"
-#include "dmpmap.h"
-#include "mldl.h"
-
-#define CFG_25  1786
-#define CFG_24  1782
-#define CFG_26  1790
-#define CFG_21  1899
-#define CFG_20  1728
-#define CFG_23  1911
-#define CFG_TAP4  1905
-#define CFG_TAP5  1906
-#define CFG_TAP6  1907
-#define CFG_1  1865
-#define CFG_TAP0  1899
-#define CFG_TAP1  1901
-#define CFG_TAP2  1902
-#define CFG_TAP_SAVE_ACCB  1770
-#define CFG_ORIENT_IRQ_1  1798
-#define CFG_ORIENT_IRQ_2  1821
-#define CFG_ORIENT_IRQ_3  1826
-#define FCFG_MAG_VAL  774
-#define CFG_TAP_QUANTIZE  1730
-#define FCFG_3  936
-#define FCFG_1  891
-#define CFG_ACCEL_FILTER  1076
-#define FCFG_2  895
-#define CFG_3D  1629
-#define FCFG_7  902
-#define CFG_3C  1627
-#define FCFG_5  1030
-#define FCFG_4  880
-#define CFG_3B  1625
-#define CFG_TAP_JERK  1722
-#define FCFG_6  954
-#define CFG_12  1894
-#define CFG_TAP7  1908
-#define CFG_14  1871
-#define CFG_15  1876
-#define CFG_16  1912
-#define CFG_TAP_CLEAR_STICKY  1914
-#define CFG_6  1920
-#define CFG_7  1014
-#define CFG_4  1634
-#define CFG_5  1831
-#define CFG_3  1623
-#define CFG_GYRO_SOURCE  1859
-#define CFG_TAP3  1903
-#define CFG_EXTERNAL  1884
-#define CFG_8  1854
-#define CFG_9  1860
-#define CFG_ORIENT_2  1816
-#define CFG_ORIENT_1  1796
-#define CFG_MOTION_BIAS  1023
-#define FCFG_MAG_MOV  791
-#define TEMPLABEL  1491
-#define FCFG_ACCEL_INIT  847
-
-
-#define D_0_22  (22+512)
-#define D_0_24  (24+512)
-
-#define D_0_36  (36)
-#define D_0_52  (52)
-#define D_0_96  (96)
-#define D_0_104 (104)
-#define D_0_108 (108)
-#define D_0_163 (163)
-#define D_0_188 (188)
-#define D_0_192 (192)
-#define D_0_224 (224)
-#define D_0_228 (228)
-#define D_0_232 (232)
-#define D_0_236 (236)
-
-#define D_1_2 (256 + 2)
-#define D_1_4 (256 + 4)
-#define D_1_8 (256 + 8)
-#define D_1_10 (256 + 10)
-#define D_1_24 (256 + 24)
-#define D_1_28 (256 + 28)
-#define D_1_92 (256 + 92)
-#define D_1_96 (256 + 96)
-#define D_1_98 (256 + 98)
-#define D_1_106 (256 + 106)
-#define D_1_108 (256 + 108)
-#define D_1_112 (256 + 112)
-#define D_1_128 (256 + 144)
-#define D_1_152 (256 + 12)
-#define D_1_168 (256 + 168)
-#define D_1_175 (256 + 175)
-#define D_1_178 (256 + 178)
-#define D_1_236 (256 + 236)
-#define D_1_244 (256 + 244)
-#define D_2_12  (512+12)
-#define D_2_96  (512+96)
-#define D_2_108 (512+108)
-#define D_2_244 (512+244)
-#define D_2_248 (512+248)
-#define D_2_252 (512+252)
-
-#define CPASS_BIAS_X (35*16+4)
-#define CPASS_BIAS_Y (35*16+8)
-#define CPASS_BIAS_Z (35*16+12)
-#define CPASS_MTX_00 (36*16)
-#define CPASS_MTX_01 (36*16+4)
-#define CPASS_MTX_02 (36*16+8)
-#define CPASS_MTX_10 (36*16+12)
-#define CPASS_MTX_11 (37*16)
-#define CPASS_MTX_12 (37*16+4)
-#define CPASS_MTX_20 (37*16+8)
-#define CPASS_MTX_21 (37*16+12)
-#define CPASS_MTX_22 (43*16+12)
-#define D_ACT0    (40*16)
-#define D_ACSX   (40*16+4)
-#define D_ACSY   (40*16+8)
-#define D_ACSZ   (40*16+12)
-
-static const tKeyLabel dmpTConfig[] = {
-    {KEY_CFG_25, CFG_25},
-    {KEY_CFG_24, CFG_24},
-    {KEY_CFG_26, CFG_26},
-    {KEY_CFG_21, CFG_21},
-    {KEY_CFG_20, CFG_20},
-    {KEY_CFG_23, CFG_23},
-    {KEY_CFG_TAP4, CFG_TAP4},
-    {KEY_CFG_TAP5, CFG_TAP5},
-    {KEY_CFG_TAP6, CFG_TAP6},
-    {KEY_CFG_1, CFG_1},
-    {KEY_CFG_TAP0, CFG_TAP0},
-    {KEY_CFG_TAP1, CFG_TAP1},
-    {KEY_CFG_TAP2, CFG_TAP2},
-    {KEY_CFG_TAP_SAVE_ACCB, CFG_TAP_SAVE_ACCB},
-    {KEY_CFG_ORIENT_IRQ_1, CFG_ORIENT_IRQ_1},
-    {KEY_CFG_ORIENT_IRQ_2, CFG_ORIENT_IRQ_2},
-    {KEY_CFG_ORIENT_IRQ_3, CFG_ORIENT_IRQ_3},
-    {KEY_FCFG_MAG_VAL, FCFG_MAG_VAL},
-    {KEY_CFG_TAP_QUANTIZE, CFG_TAP_QUANTIZE},
-    {KEY_FCFG_3, FCFG_3},
-    {KEY_FCFG_1, FCFG_1},
-//    {KEY_CFG_ACCEL_FILTER, CFG_ACCEL_FILTER},
-    {KEY_FCFG_2, FCFG_2},
-    {KEY_CFG_3D, CFG_3D},
-    {KEY_FCFG_7, FCFG_7},
-    {KEY_CFG_3C, CFG_3C},
-    {KEY_FCFG_5, FCFG_5},
-    {KEY_FCFG_4, FCFG_4},
-    {KEY_CFG_3B, CFG_3B},
-    {KEY_CFG_TAP_JERK, CFG_TAP_JERK},
-    {KEY_FCFG_6, FCFG_6},
-    {KEY_CFG_12, CFG_12},
-    {KEY_CFG_TAP7, CFG_TAP7},
-    {KEY_CFG_14, CFG_14},
-    {KEY_CFG_15, CFG_15},
-    {KEY_CFG_16, CFG_16},
-    {KEY_CFG_TAP_CLEAR_STICKY, CFG_TAP_CLEAR_STICKY},
-    {KEY_CFG_6, CFG_6},
-    {KEY_CFG_7, CFG_7},
-    {KEY_CFG_4, CFG_4},
-    {KEY_CFG_5, CFG_5},
-    {KEY_CFG_3, CFG_3},
-    {KEY_CFG_GYRO_SOURCE, CFG_GYRO_SOURCE},
-    {KEY_CFG_TAP3, CFG_TAP3},
-    {KEY_CFG_EXTERNAL, CFG_EXTERNAL},
-    {KEY_CFG_8, CFG_8},
-    {KEY_CFG_9, CFG_9},
-    {KEY_CFG_ORIENT_2, CFG_ORIENT_2},
-    {KEY_CFG_ORIENT_1, CFG_ORIENT_1},
-    {KEY_CFG_MOTION_BIAS, CFG_MOTION_BIAS},
-    {KEY_FCFG_MAG_MOV, FCFG_MAG_MOV},
-//    {KEY_TEMPLABEL, TEMPLABEL},
-    {KEY_FCFG_ACCEL_INIT, FCFG_ACCEL_INIT},
-    {KEY_D_0_22, D_0_22},
-    {KEY_D_0_24, D_0_24},
-    {KEY_D_0_36, D_0_36},
-    {KEY_D_0_52, D_0_52},
-    {KEY_D_0_96, D_0_96},
-    {KEY_D_0_104, D_0_104},
-    {KEY_D_0_108, D_0_108},
-    {KEY_D_0_163, D_0_163},
-    {KEY_D_0_188, D_0_188},
-    {KEY_D_0_192, D_0_192},
-    {KEY_D_0_224, D_0_224},
-    {KEY_D_0_228, D_0_228},
-    {KEY_D_0_232, D_0_232},
-    {KEY_D_0_236, D_0_236},
-
-    {KEY_DMP_PREVPTAT, DMP_PREVPTAT},
-    {KEY_D_1_2, D_1_2},
-    {KEY_D_1_4, D_1_4},
-    {KEY_D_1_8, D_1_8},
-    {KEY_D_1_10, D_1_10},
-    {KEY_D_1_24, D_1_24},
-    {KEY_D_1_28, D_1_28},
-    {KEY_D_1_92, D_1_92},
-    {KEY_D_1_96, D_1_96},
-    {KEY_D_1_98, D_1_98},
-    {KEY_D_1_106, D_1_106},
-    {KEY_D_1_108, D_1_108},
-    {KEY_D_1_112, D_1_112},
-    {KEY_D_1_128, D_1_128},
-    {KEY_D_1_152, D_1_152},
-    {KEY_D_1_168, D_1_168},
-    {KEY_D_1_175, D_1_175},
-    {KEY_D_1_178, D_1_178},
-    {KEY_D_1_236, D_1_236},
-    {KEY_D_1_244, D_1_244},
-
-    {KEY_D_2_12,  D_2_12},
-    {KEY_D_2_96,  D_2_96},
-    {KEY_D_2_108, D_2_108},
-    {KEY_D_2_244, D_2_244},
-    {KEY_D_2_248, D_2_248},
-    {KEY_D_2_252, D_2_252},
-
-    {KEY_DMP_TAPW_MIN, DMP_TAPW_MIN},
-    {KEY_DMP_TAP_THR_X, DMP_TAP_THX},
-    {KEY_DMP_TAP_THR_Y, DMP_TAP_THY},
-    {KEY_DMP_TAP_THR_Z, DMP_TAP_THZ},
-    {KEY_DMP_SH_TH_Y, DMP_SH_TH_Y},
-    {KEY_DMP_SH_TH_X, DMP_SH_TH_X},
-    {KEY_DMP_SH_TH_Z, DMP_SH_TH_Z},
-    {KEY_DMP_ORIENT, DMP_ORIENT},
-
-    {KEY_CPASS_BIAS_X, CPASS_BIAS_X},
-    {KEY_CPASS_BIAS_Y, CPASS_BIAS_Y},
-    {KEY_CPASS_BIAS_Z, CPASS_BIAS_Z},
-    {KEY_CPASS_MTX_00, CPASS_MTX_00},
-    {KEY_CPASS_MTX_01, CPASS_MTX_01},
-    {KEY_CPASS_MTX_02, CPASS_MTX_02},
-    {KEY_CPASS_MTX_10, CPASS_MTX_10},
-    {KEY_CPASS_MTX_11, CPASS_MTX_11},
-    {KEY_CPASS_MTX_12, CPASS_MTX_12},
-    {KEY_CPASS_MTX_20, CPASS_MTX_20},
-    {KEY_CPASS_MTX_21, CPASS_MTX_21},
-    {KEY_CPASS_MTX_22, CPASS_MTX_22},
-    {KEY_D_ACT0, D_ACT0},
-    {KEY_D_ACSX, D_ACSX},
-    {KEY_D_ACSY, D_ACSY},
-    {KEY_D_ACSZ, D_ACSZ}
-};
-#define NUM_LOCAL_KEYS (sizeof(dmpTConfig)/sizeof(dmpTConfig[0]))
-
-#define DMP_CODE_SIZE 1923
-
-static const unsigned char dmpMemory[DMP_CODE_SIZE] = {
-    0xfb, 0x00, 0x00, 0x3e, 0x00, 0x0b, 0x00, 0x36, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 
-    0x00, 0x65, 0x00, 0x54, 0xff, 0xef, 0x00, 0x00, 0xfa, 0x80, 0x00, 0x0b, 0x12, 0x82, 0x00, 0x01, 
-    0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x28, 0x00, 0x00, 0xff, 0xff, 0x45, 0x81, 0xff, 0xff, 0xfa, 0x72, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7f, 0xff, 0xff, 0xfe, 0x80, 0x01, 
-    0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x3e, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xca, 0xe3, 0x09, 0x3e, 0x80, 0x00, 0x00, 
-    0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 
-    0x41, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x2a, 0x00, 0x00, 0x16, 0x55, 0x00, 0x00, 0x21, 0x82, 
-    0xfd, 0x87, 0x26, 0x50, 0xfd, 0x80, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6f, 0x00, 0x02, 0x65, 0x32, 0x00, 0x00, 0x5e, 0xc0, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0xfb, 0x8c, 0x6f, 0x5d, 0xfd, 0x5d, 0x08, 0xd9, 0x00, 0x7c, 0x73, 0x3b, 0x00, 0x6c, 0x12, 0xcc, 
-    0x32, 0x00, 0x13, 0x9d, 0x32, 0x00, 0xd0, 0xd6, 0x32, 0x00, 0x08, 0x00, 0x40, 0x00, 0x01, 0xf4, 
-    0xff, 0xe6, 0x80, 0x79, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xd6, 0x00, 0x00, 0x27, 0x10, 
-    0xfb, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0xfa, 0x36, 0xff, 0xbc, 0x30, 0x8e, 0x00, 0x05, 0xfb, 0xf0, 0xff, 0xd9, 0x5b, 0xc8, 
-    0xff, 0xd0, 0x9a, 0xbe, 0x00, 0x00, 0x10, 0xa9, 0xff, 0xf4, 0x1e, 0xb2, 0x00, 0xce, 0xbb, 0xf7, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0c, 
-    0xff, 0xc2, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xcf, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x03, 0x3f, 0x68, 0xb6, 0x79, 0x35, 0x28, 0xbc, 0xc6, 0x7e, 0xd1, 0x6c, 
-    0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x6a, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x30, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x25, 0x4d, 0x00, 0x2f, 0x70, 0x6d, 0x00, 0x00, 0x05, 0xae, 0x00, 0x0c, 0x02, 0xd0, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x54, 0xff, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0xff, 0xef, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 
-    0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
-
-    0xd8, 0xdc, 0xba, 0xa2, 0xf1, 0xde, 0xb2, 0xb8, 0xb4, 0xa8, 0x81, 0x91, 0xf7, 0x4a, 0x90, 0x7f, 
-    0x91, 0x6a, 0xf3, 0xf9, 0xdb, 0xa8, 0xf9, 0xb0, 0xba, 0xa0, 0x80, 0xf2, 0xce, 0x81, 0xf3, 0xc2, 
-    0xf1, 0xc1, 0xf2, 0xc3, 0xf3, 0xcc, 0xa2, 0xb2, 0x80, 0xf1, 0xc6, 0xd8, 0x80, 0xba, 0xa7, 0xdf, 
-    0xdf, 0xdf, 0xf2, 0xa7, 0xc3, 0xcb, 0xc5, 0xb6, 0xf0, 0x87, 0xa2, 0x94, 0x24, 0x48, 0x70, 0x3c, 
-    0x95, 0x40, 0x68, 0x34, 0x58, 0x9b, 0x78, 0xa2, 0xf1, 0x83, 0x92, 0x2d, 0x55, 0x7d, 0xd8, 0xb1, 
-    0xb4, 0xb8, 0xa1, 0xd0, 0x91, 0x80, 0xf2, 0x70, 0xf3, 0x70, 0xf2, 0x7c, 0x80, 0xa8, 0xf1, 0x01, 
-    0xb0, 0x98, 0x87, 0xd9, 0x43, 0xd8, 0x86, 0xc9, 0x88, 0xba, 0xa1, 0xf2, 0x0e, 0xb8, 0x97, 0x80, 
-    0xf1, 0xa9, 0xdf, 0xdf, 0xdf, 0xaa, 0xdf, 0xdf, 0xdf, 0xf2, 0xaa, 0xc5, 0xcd, 0xc7, 0xa9, 0xc1, 
-    0xc9, 0xc3, 0x97, 0xf1, 0xa9, 0x89, 0x26, 0x46, 0x66, 0xb0, 0xb4, 0xba, 0x80, 0xac, 0xde, 0xf2, 
-    0xca, 0xf1, 0xb2, 0x8c, 0x02, 0xa9, 0xb6, 0x98, 0x00, 0x89, 0x0e, 0x16, 0x1e, 0xb8, 0xa9, 0xb4, 
-    0x99, 0x2c, 0x54, 0x7c, 0xb0, 0x8a, 0xa8, 0x96, 0x36, 0x56, 0x76, 0xf1, 0xb9, 0xaf, 0xb4, 0xb0, 
-    0x83, 0xc0, 0xb8, 0xa8, 0x97, 0x11, 0xb1, 0x8f, 0x98, 0xb9, 0xaf, 0xf0, 0x24, 0x08, 0x44, 0x10, 
-    0x64, 0x18, 0xf1, 0xa3, 0x29, 0x55, 0x7d, 0xaf, 0x83, 0xb5, 0x93, 0xaf, 0xf0, 0x00, 0x28, 0x50, 
-    0xf1, 0xa3, 0x86, 0x9f, 0x61, 0xa6, 0xda, 0xde, 0xdf, 0xd9, 0xfa, 0xa3, 0x86, 0x96, 0xdb, 0x31, 
-    0xa6, 0xd9, 0xf8, 0xdf, 0xba, 0xa6, 0x8f, 0xc2, 0xc5, 0xc7, 0xb2, 0x8c, 0xc1, 0xb8, 0xa2, 0xdf, 
-    0xdf, 0xdf, 0xa3, 0xdf, 0xdf, 0xdf, 0xd8, 0xd8, 0xf1, 0xb8, 0xa8, 0xb2, 0x86, 0xb4, 0x98, 0x0d, 
-    0x35, 0x5d, 0xb8, 0xaa, 0x98, 0xb0, 0x87, 0x2d, 0x35, 0x3d, 0xb2, 0xb6, 0xba, 0xaf, 0x8c, 0x96, 
-    0x19, 0x8f, 0x9f, 0xa7, 0x0e, 0x16, 0x1e, 0xb4, 0x9a, 0xb8, 0xaa, 0x87, 0x2c, 0x54, 0x7c, 0xb9, 
-    0xa3, 0xde, 0xdf, 0xdf, 0xa3, 0xb1, 0x80, 0xf2, 0xc4, 0xcd, 0xc9, 0xf1, 0xb8, 0xa9, 0xb4, 0x99, 
-    0x83, 0x0d, 0x35, 0x5d, 0x89, 0xb9, 0xa3, 0x2d, 0x55, 0x7d, 0xb5, 0x93, 0xa3, 0x0e, 0x16, 0x1e, 
-    0xa9, 0x2c, 0x54, 0x7c, 0xb8, 0xb4, 0xb0, 0xf1, 0x97, 0x83, 0xa8, 0x11, 0x84, 0xa5, 0x09, 0x98, 
-    0xa3, 0x83, 0xf0, 0xda, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xd8, 0xf1, 0xa5, 0x29, 0x55, 0x7d, 
-    0xa5, 0x85, 0x95, 0x02, 0x1a, 0x2e, 0x3a, 0x56, 0x5a, 0x40, 0x48, 0xf9, 0xf3, 0xa3, 0xd9, 0xf8, 
-    0xf0, 0x98, 0x83, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0x97, 0x82, 0xa8, 0xf1, 0x11, 0xf0, 0x98, 
-    0xa2, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xda, 0xf3, 0xde, 0xd8, 0x83, 0xa5, 0x94, 0x01, 0xd9, 
-    0xa3, 0x02, 0xf1, 0xa2, 0xc3, 0xc5, 0xc7, 0xd8, 0xf1, 0x84, 0x92, 0xa2, 0x4d, 0xda, 0x2a, 0xd8, 
-    0x48, 0x69, 0xd9, 0x2a, 0xd8, 0x68, 0x55, 0xda, 0x32, 0xd8, 0x50, 0x71, 0xd9, 0x32, 0xd8, 0x70, 
-    0x5d, 0xda, 0x3a, 0xd8, 0x58, 0x79, 0xd9, 0x3a, 0xd8, 0x78, 0x93, 0xa3, 0x4d, 0xda, 0x2a, 0xd8, 
-    0x48, 0x69, 0xd9, 0x2a, 0xd8, 0x68, 0x55, 0xda, 0x32, 0xd8, 0x50, 0x71, 0xd9, 0x32, 0xd8, 0x70, 
-    0x5d, 0xda, 0x3a, 0xd8, 0x58, 0x79, 0xd9, 0x3a, 0xd8, 0x78, 0xa8, 0x8a, 0x9a, 0xf0, 0x28, 0x50, 
-    0x78, 0x9e, 0xf3, 0x88, 0x18, 0xf1, 0x9f, 0x1d, 0x98, 0xa8, 0xd9, 0x08, 0xd8, 0xc8, 0x9f, 0x12, 
-    0x9e, 0xf3, 0x15, 0xa8, 0xda, 0x12, 0x10, 0xd8, 0xf1, 0xaf, 0xc8, 0x97, 0x87, 0x34, 0xb5, 0xb9, 
-    0x94, 0xa4, 0x21, 0xf3, 0xd9, 0x22, 0xd8, 0xf2, 0x2d, 0xf3, 0xd9, 0x2a, 0xd8, 0xf2, 0x35, 0xf3, 
-    0xd9, 0x32, 0xd8, 0x81, 0xa4, 0x60, 0x60, 0x61, 0xd9, 0x61, 0xd8, 0x6c, 0x68, 0x69, 0xd9, 0x69, 
-    0xd8, 0x74, 0x70, 0x71, 0xd9, 0x71, 0xd8, 0xb1, 0xa3, 0x84, 0x19, 0x3d, 0x5d, 0xa3, 0x83, 0x1a, 
-    0x3e, 0x5e, 0x93, 0x10, 0x30, 0x81, 0x10, 0x11, 0xb8, 0xb0, 0xaf, 0x8f, 0x94, 0xf2, 0xda, 0x3e, 
-    0xd8, 0xb4, 0x9a, 0xa8, 0x87, 0x29, 0xda, 0xf8, 0xd8, 0x87, 0x9a, 0x35, 0xda, 0xf8, 0xd8, 0x87, 
-    0x9a, 0x3d, 0xda, 0xf8, 0xd8, 0xb1, 0xb9, 0xa4, 0x98, 0x85, 0x02, 0x2e, 0x56, 0xa5, 0x81, 0x00, 
-    0x0c, 0x14, 0xa3, 0x97, 0xb0, 0x8a, 0xf1, 0x2d, 0xd9, 0x28, 0xd8, 0x4d, 0xd9, 0x48, 0xd8, 0x6d, 
-    0xd9, 0x68, 0xd8, 0xb1, 0x84, 0x0d, 0xda, 0x0e, 0xd8, 0xa3, 0x29, 0x83, 0xda, 0x2c, 0x0e, 0xd8, 
-    0xa3, 0x84, 0x49, 0x83, 0xda, 0x2c, 0x4c, 0x0e, 0xd8, 0xb8, 0xb0, 0xa8, 0x8a, 0x9a, 0xf5, 0x20, 
-    0xaa, 0xda, 0xdf, 0xd8, 0xa8, 0x40, 0xaa, 0xd0, 0xda, 0xde, 0xd8, 0xa8, 0x60, 0xaa, 0xda, 0xd0, 
-    0xdf, 0xd8, 0xf1, 0x97, 0x86, 0xa8, 0x31, 0x9b, 0x06, 0x99, 0x07, 0xab, 0x97, 0x28, 0x88, 0x9b, 
-    0xf0, 0x0c, 0x20, 0x14, 0x40, 0xb8, 0xb0, 0xb4, 0xa8, 0x8c, 0x9c, 0xf0, 0x04, 0x28, 0x51, 0x79, 
-    0x1d, 0x30, 0x14, 0x38, 0xb2, 0x82, 0xab, 0xd0, 0x98, 0x2c, 0x50, 0x50, 0x78, 0x78, 0x9b, 0xf1, 
-    0x1a, 0xb0, 0xf0, 0x8a, 0x9c, 0xa8, 0x29, 0x51, 0x79, 0x8b, 0x29, 0x51, 0x79, 0x8a, 0x24, 0x70, 
-    0x59, 0x8b, 0x20, 0x58, 0x71, 0x8a, 0x44, 0x69, 0x38, 0x8b, 0x39, 0x40, 0x68, 0x8a, 0x64, 0x48, 
-    0x31, 0x8b, 0x30, 0x49, 0x60, 0xa5, 0x88, 0x20, 0x09, 0x71, 0x58, 0x44, 0x68, 0x11, 0x39, 0x64, 
-    0x49, 0x30, 0x19, 0xf1, 0xac, 0x00, 0x2c, 0x54, 0x7c, 0xf0, 0x8c, 0xa8, 0x04, 0x28, 0x50, 0x78, 
-    0xf1, 0x88, 0x97, 0x26, 0xa8, 0x59, 0x98, 0xac, 0x8c, 0x02, 0x26, 0x46, 0x66, 0xf0, 0x89, 0x9c, 
-    0xa8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31, 0xa9, 0x88, 0x09, 
-    0x20, 0x59, 0x70, 0xab, 0x11, 0x38, 0x40, 0x69, 0xa8, 0x19, 0x31, 0x48, 0x60, 0x8c, 0xa8, 0x3c, 
-    0x41, 0x5c, 0x20, 0x7c, 0x00, 0xf1, 0x87, 0x98, 0x19, 0x86, 0xa8, 0x6e, 0x76, 0x7e, 0xa9, 0x99, 
-    0x88, 0x2d, 0x55, 0x7d, 0x9e, 0xb9, 0xa3, 0x8a, 0x22, 0x8a, 0x6e, 0x8a, 0x56, 0x8a, 0x5e, 0x9f, 
-    0xb1, 0x83, 0x06, 0x26, 0x46, 0x66, 0x0e, 0x2e, 0x4e, 0x6e, 0x9d, 0xb8, 0xad, 0x00, 0x2c, 0x54, 
-    0x7c, 0xf2, 0xb1, 0x8c, 0xb4, 0x99, 0xb9, 0xa3, 0x2d, 0x55, 0x7d, 0x81, 0x91, 0xac, 0x38, 0xad, 
-    0x3a, 0xb5, 0x83, 0x91, 0xac, 0x2d, 0xd9, 0x28, 0xd8, 0x4d, 0xd9, 0x48, 0xd8, 0x6d, 0xd9, 0x68, 
-    0xd8, 0x8c, 0x9d, 0xae, 0x29, 0xd9, 0x04, 0xae, 0xd8, 0x51, 0xd9, 0x04, 0xae, 0xd8, 0x79, 0xd9, 
-    0x04, 0xd8, 0x81, 0xf3, 0x9d, 0xad, 0x00, 0x8d, 0xae, 0x19, 0x81, 0xad, 0xd9, 0x01, 0xd8, 0xf2, 
-    0xae, 0xda, 0x26, 0xd8, 0x8e, 0x91, 0x29, 0x83, 0xa7, 0xd9, 0xad, 0xad, 0xad, 0xad, 0xf3, 0x2a, 
-    0xd8, 0xd8, 0xf1, 0xb0, 0xac, 0x89, 0x91, 0x3e, 0x5e, 0x76, 0xf3, 0xac, 0x2e, 0x2e, 0xf1, 0xb1, 
-    0x8c, 0x5a, 0x9c, 0xac, 0x2c, 0x28, 0x28, 0x28, 0x9c, 0xac, 0x30, 0x18, 0xa8, 0x98, 0x81, 0x28, 
-    0x34, 0x3c, 0x97, 0x24, 0xa7, 0x28, 0x34, 0x3c, 0x9c, 0x24, 0xf2, 0xb0, 0x89, 0xac, 0x91, 0x2c, 
-    0x4c, 0x6c, 0x8a, 0x9b, 0x2d, 0xd9, 0xd8, 0xd8, 0x51, 0xd9, 0xd8, 0xd8, 0x79, 0xd9, 0xd8, 0xd8, 
-    0xf1, 0x9e, 0x88, 0xa3, 0x31, 0xda, 0xd8, 0xd8, 0x91, 0x2d, 0xd9, 0x28, 0xd8, 0x4d, 0xd9, 0x48, 
-    0xd8, 0x6d, 0xd9, 0x68, 0xd8, 0xb1, 0x83, 0x93, 0x35, 0x3d, 0x80, 0x25, 0xda, 0xd8, 0xd8, 0x85, 
-    0x69, 0xda, 0xd8, 0xd8, 0xb4, 0x93, 0x81, 0xa3, 0x28, 0x34, 0x3c, 0xf3, 0xab, 0x8b, 0xf8, 0xa3, 
-    0x91, 0xb6, 0x09, 0xb4, 0xd9, 0xab, 0xde, 0xfa, 0xb0, 0x87, 0x9c, 0xb9, 0xa3, 0xdd, 0xf1, 0xa3, 
-    0xa3, 0xa3, 0xa3, 0x95, 0xf1, 0xa3, 0xa3, 0xa3, 0x9d, 0xf1, 0xa3, 0xa3, 0xa3, 0xa3, 0xf2, 0xa3, 
-    0xb4, 0x90, 0x80, 0xf2, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xa3, 0xb2, 0xa3, 0xa3, 0xa3, 0xa3, 
-    0xa3, 0xa3, 0xb0, 0x87, 0xb5, 0x99, 0xf1, 0xa3, 0xa3, 0xa3, 0x98, 0xf1, 0xa3, 0xa3, 0xa3, 0xa3, 
-    0x97, 0xa3, 0xa3, 0xa3, 0xa3, 0xf3, 0x9b, 0xa3, 0xa3, 0xdc, 0xb9, 0xa7, 0xf1, 0x26, 0x26, 0x26, 
-    0xd8, 0xd8, 0xff
-};
-
-static unsigned short sStartAddress = 0x0300;
-
-
-static tKeyLabel keys[NUM_KEYS];
-
-static unsigned short inv_setup_dmpGetAddress( unsigned short key )
-{
-    static int isSorted = 0;
-    if ( !isSorted ) {
-        int kk;
-        for (kk=0; kk<NUM_KEYS; ++kk) {
-            keys[ kk ].addr = 0xffff;
-            keys[ kk ].key = kk;
-        }
-        for (kk=0; kk<NUM_LOCAL_KEYS; ++kk) {
-            keys[ dmpTConfig[kk].key ].addr = dmpTConfig[kk].addr;
-        }
-        isSorted = 1;
-    }
-    if ( key >= NUM_KEYS )
-        return 0xffff;
-    return keys[ key ].addr;
-}
-
-/**
- *  @brief
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_setup_dmp(void)
-
-{
-    inv_error_t result;
-
-    inv_set_get_address(inv_setup_dmpGetAddress);
-    result = inv_clock_source(MPU_CLK_SEL_PLLGYROZ);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_dl_cfg_sampling(MPU_FILTER_42HZ, 4);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_full_scale(2000.f);  
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_load_dmp(dmpMemory, DMP_CODE_SIZE, sStartAddress);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_external_sync(MPU_EXT_SYNC_TEMP);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-/**
- *@}
- */
diff --git a/60xx/mlsdk/mllite/dmpKey.h b/60xx/mlsdk/mllite/dmpKey.h
deleted file mode 100644
index f152644..0000000
--- a/60xx/mlsdk/mllite/dmpKey.h
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 DMPKEY_H__
-#define DMPKEY_H__
-
-#define KEY_CFG_25  0
-#define KEY_CFG_24                 (KEY_CFG_25+1)
-#define KEY_CFG_26                 (KEY_CFG_24+1)
-#define KEY_CFG_21                 (KEY_CFG_26+1)
-#define KEY_CFG_20                 (KEY_CFG_21+1)
-#define KEY_CFG_TAP4               (KEY_CFG_20+1)
-#define KEY_CFG_TAP5               (KEY_CFG_TAP4+1)
-#define KEY_CFG_TAP6               (KEY_CFG_TAP5+1)
-#define KEY_CFG_TAP7               (KEY_CFG_TAP6+1)
-#define KEY_CFG_TAP0               (KEY_CFG_TAP7+1)
-#define KEY_CFG_TAP1               (KEY_CFG_TAP0+1)
-#define KEY_CFG_TAP2               (KEY_CFG_TAP1+1)
-#define KEY_CFG_TAP3               (KEY_CFG_TAP2+1)
-#define KEY_CFG_TAP_QUANTIZE       (KEY_CFG_TAP3+1)
-#define KEY_CFG_TAP_JERK           (KEY_CFG_TAP_QUANTIZE+1)
-#define KEY_CFG_TAP_SAVE_ACCB      (KEY_CFG_TAP_JERK+1)
-#define KEY_CFG_TAP_CLEAR_STICKY   (KEY_CFG_TAP_SAVE_ACCB+1)
-#define KEY_FCFG_ACCEL_INPUT       (KEY_CFG_TAP_CLEAR_STICKY +1)
-#define KEY_FCFG_ACCEL_INIT        (KEY_FCFG_ACCEL_INPUT+1)
-#define KEY_CFG_23                 (KEY_FCFG_ACCEL_INIT+1)
-#define KEY_FCFG_1                 (KEY_CFG_23+1)
-#define KEY_FCFG_3                 (KEY_FCFG_1+1)
-#define KEY_FCFG_2                 (KEY_FCFG_3+1)
-#define KEY_CFG_3D                 (KEY_FCFG_2+1)
-#define KEY_CFG_3B                 (KEY_CFG_3D+1)
-#define KEY_CFG_3C                 (KEY_CFG_3B+1)
-#define KEY_FCFG_5                 (KEY_CFG_3C+1)
-#define KEY_FCFG_4                 (KEY_FCFG_5+1)
-#define KEY_FCFG_7                 (KEY_FCFG_4+1)
-#define KEY_FCFG_FSCALE            (KEY_FCFG_7+1)
-#define KEY_FCFG_AZ                (KEY_FCFG_FSCALE+1)
-#define KEY_FCFG_6                 (KEY_FCFG_AZ+1)
-#define KEY_FCFG_LSB4              (KEY_FCFG_6+1)
-#define KEY_CFG_12                 (KEY_FCFG_LSB4+1)
-#define KEY_CFG_14                 (KEY_CFG_12+1)
-#define KEY_CFG_15                 (KEY_CFG_14+1)
-#define KEY_CFG_16                 (KEY_CFG_15+1)
-#define KEY_CFG_18                 (KEY_CFG_16+1)
-#define KEY_CFG_6                  (KEY_CFG_18 + 1)
-#define KEY_CFG_7                  (KEY_CFG_6+1)
-#define KEY_CFG_4                  (KEY_CFG_7+1)
-#define KEY_CFG_5                  (KEY_CFG_4+1)
-#define KEY_CFG_2                  (KEY_CFG_5+1)
-#define KEY_CFG_3                  (KEY_CFG_2+1)
-#define KEY_CFG_1                  (KEY_CFG_3+1)
-#define KEY_CFG_EXTERNAL           (KEY_CFG_1+1)
-#define KEY_CFG_8                  (KEY_CFG_EXTERNAL+1)
-#define KEY_CFG_9                  (KEY_CFG_8+1)
-#define KEY_CFG_ORIENT_3           (KEY_CFG_9 + 1)
-#define KEY_CFG_ORIENT_2           (KEY_CFG_ORIENT_3 + 1)
-#define KEY_CFG_ORIENT_1           (KEY_CFG_ORIENT_2 + 1)
-#define KEY_CFG_GYRO_SOURCE        (KEY_CFG_ORIENT_1 + 1)
-#define KEY_CFG_ORIENT_IRQ_1       (KEY_CFG_GYRO_SOURCE + 1)
-#define KEY_CFG_ORIENT_IRQ_2       (KEY_CFG_ORIENT_IRQ_1 + 1)
-#define KEY_CFG_ORIENT_IRQ_3       (KEY_CFG_ORIENT_IRQ_2 + 1)
-#define KEY_FCFG_MAG_VAL           (KEY_CFG_ORIENT_IRQ_3 + 1)
-#define KEY_FCFG_MAG_MOV           (KEY_FCFG_MAG_VAL + 1)
-
-#define KEY_D_0_22                 (KEY_FCFG_MAG_MOV + 1)
-#define KEY_D_0_24                 (KEY_D_0_22+1)
-#define KEY_D_0_36                 (KEY_D_0_24+1)
-#define KEY_D_0_52                 (KEY_D_0_36+1)
-#define KEY_D_0_96                 (KEY_D_0_52+1)
-#define KEY_D_0_104                (KEY_D_0_96+1)
-#define KEY_D_0_108                (KEY_D_0_104+1)
-#define KEY_D_0_163                (KEY_D_0_108+1)
-#define KEY_D_0_188                (KEY_D_0_163+1)
-#define KEY_D_0_192                (KEY_D_0_188+1)
-#define KEY_D_0_224                (KEY_D_0_192+1)
-#define KEY_D_0_228                (KEY_D_0_224+1)
-#define KEY_D_0_232                (KEY_D_0_228+1)
-#define KEY_D_0_236                (KEY_D_0_232+1)
-
-#define KEY_DMP_PREVPTAT           (KEY_D_0_236+1)
-#define KEY_D_1_2                  (KEY_DMP_PREVPTAT+1)
-#define KEY_D_1_4                  (KEY_D_1_2 + 1)
-#define KEY_D_1_8                  (KEY_D_1_4 + 1)
-#define KEY_D_1_10                 (KEY_D_1_8+1)
-#define KEY_D_1_24                 (KEY_D_1_10+1)
-#define KEY_D_1_28                 (KEY_D_1_24+1)
-#define KEY_D_1_92                 (KEY_D_1_28+1)
-#define KEY_D_1_96                 (KEY_D_1_92+1)
-#define KEY_D_1_98                 (KEY_D_1_96+1)
-#define KEY_D_1_106                (KEY_D_1_98+1)
-#define KEY_D_1_108                (KEY_D_1_106+1)
-#define KEY_D_1_112                (KEY_D_1_108+1)
-#define KEY_D_1_128                (KEY_D_1_112+1)
-#define KEY_D_1_152                (KEY_D_1_128+1)
-#define KEY_D_1_168                (KEY_D_1_152+1)
-#define KEY_D_1_175                (KEY_D_1_168+1)
-#define KEY_D_1_178                (KEY_D_1_175+1)
-#define KEY_D_1_179                (KEY_D_1_178+1)
-#define KEY_D_1_236                (KEY_D_1_179+1)
-#define KEY_D_1_244                (KEY_D_1_236+1)
-#define KEY_D_2_12                 (KEY_D_1_244+1)
-#define KEY_D_2_96                 (KEY_D_2_12+1)
-#define KEY_D_2_108                (KEY_D_2_96+1)
-#define KEY_D_2_244                (KEY_D_2_108+1)
-#define KEY_D_2_248                (KEY_D_2_244+1)
-#define KEY_D_2_252                (KEY_D_2_248+1)
-
-// Compass Keys
-#define KEY_CPASS_BIAS_X            (KEY_D_2_252+1)
-#define KEY_CPASS_BIAS_Y            (KEY_CPASS_BIAS_X+1)
-#define KEY_CPASS_BIAS_Z            (KEY_CPASS_BIAS_Y+1)
-#define KEY_CPASS_MTX_00            (KEY_CPASS_BIAS_Z+1)
-#define KEY_CPASS_MTX_01            (KEY_CPASS_MTX_00+1)
-#define KEY_CPASS_MTX_02            (KEY_CPASS_MTX_01+1)
-#define KEY_CPASS_MTX_10            (KEY_CPASS_MTX_02+1)
-#define KEY_CPASS_MTX_11            (KEY_CPASS_MTX_10+1)
-#define KEY_CPASS_MTX_12            (KEY_CPASS_MTX_11+1)
-#define KEY_CPASS_MTX_20            (KEY_CPASS_MTX_12+1)
-#define KEY_CPASS_MTX_21            (KEY_CPASS_MTX_20+1)
-#define KEY_CPASS_MTX_22            (KEY_CPASS_MTX_21+1)
-
-// Mantis Keys
-#define KEY_CFG_MOTION_BIAS         (KEY_CPASS_MTX_22+1)
-
-#define KEY_DMP_TAPW_MIN           (KEY_CFG_MOTION_BIAS+1)
-#define KEY_DMP_TAP_THR_X          (KEY_DMP_TAPW_MIN+1)
-#define KEY_DMP_TAP_THR_Y          (KEY_DMP_TAP_THR_X+1)
-#define KEY_DMP_TAP_THR_Z          (KEY_DMP_TAP_THR_Y+1)
-#define KEY_DMP_SH_TH_Y            (KEY_DMP_TAP_THR_Z+1)
-#define KEY_DMP_SH_TH_X            (KEY_DMP_SH_TH_Y+1)
-#define KEY_DMP_SH_TH_Z            (KEY_DMP_SH_TH_X+1)
-#define KEY_DMP_ORIENT             (KEY_DMP_SH_TH_Z+1)
-#define KEY_D_ACT0                 (KEY_DMP_ORIENT+1)
-#define KEY_D_ACSX                 (KEY_D_ACT0+1)
-#define KEY_D_ACSY                 (KEY_D_ACSX+1)
-#define KEY_D_ACSZ                 (KEY_D_ACSY+1)
-
-// Pedometer Standalone only keys
-#define KEY_D_PEDSTD_BP_B          (KEY_D_ACSZ+1)
-#define KEY_D_PEDSTD_HP_A          (KEY_D_PEDSTD_BP_B+1)
-#define KEY_D_PEDSTD_HP_B          (KEY_D_PEDSTD_HP_A+1)
-#define KEY_D_PEDSTD_BP_A4         (KEY_D_PEDSTD_HP_B+1)
-#define KEY_D_PEDSTD_BP_A3         (KEY_D_PEDSTD_BP_A4+1)
-#define KEY_D_PEDSTD_BP_A2         (KEY_D_PEDSTD_BP_A3+1)
-#define KEY_D_PEDSTD_BP_A1         (KEY_D_PEDSTD_BP_A2+1)
-#define KEY_D_PEDSTD_INT_THRSH     (KEY_D_PEDSTD_BP_A1+1)
-#define KEY_D_PEDSTD_CLIP          (KEY_D_PEDSTD_INT_THRSH+1)
-#define KEY_D_PEDSTD_SB            (KEY_D_PEDSTD_CLIP+1)
-#define KEY_D_PEDSTD_SB_TIME       (KEY_D_PEDSTD_SB+1)
-#define KEY_D_PEDSTD_PEAKTHRSH     (KEY_D_PEDSTD_SB_TIME+1)
-#define KEY_D_PEDSTD_TIML          (KEY_D_PEDSTD_PEAKTHRSH+1)
-#define KEY_D_PEDSTD_TIMH          (KEY_D_PEDSTD_TIML+1)
-#define KEY_D_PEDSTD_PEAK          (KEY_D_PEDSTD_TIMH+1)
-#define KEY_D_PEDSTD_TIMECTR       (KEY_D_PEDSTD_PEAK+1)
-#define KEY_D_PEDSTD_STEPCTR       (KEY_D_PEDSTD_TIMECTR+1)
-#define KEY_D_PEDSTD_WALKTIME      (KEY_D_PEDSTD_STEPCTR+1)
-
-// EIS Keys
-#define KEY_P_EIS_FIFO_FOOTER      (KEY_D_PEDSTD_WALKTIME+1)
-#define KEY_P_EIS_FIFO_YSHIFT      (KEY_P_EIS_FIFO_FOOTER+1)
-#define KEY_P_EIS_DATA_RATE        (KEY_P_EIS_FIFO_YSHIFT+1)
-#define KEY_P_EIS_FIFO_XSHIFT      (KEY_P_EIS_DATA_RATE+1)
-#define KEY_P_EIS_FIFO_SYNC        (KEY_P_EIS_FIFO_XSHIFT+1)
-#define KEY_P_EIS_FIFO_ZSHIFT      (KEY_P_EIS_FIFO_SYNC+1)
-#define KEY_P_EIS_FIFO_READY       (KEY_P_EIS_FIFO_ZSHIFT+1)
-#define KEY_DMP_FOOTER             (KEY_P_EIS_FIFO_READY+1)
-#define KEY_DMP_INTX_HC            (KEY_DMP_FOOTER+1)
-#define KEY_DMP_INTX_PH            (KEY_DMP_INTX_HC+1)
-#define KEY_DMP_INTX_SH            (KEY_DMP_INTX_PH+1)
-#define KEY_DMP_AINV_SH            (KEY_DMP_INTX_SH +1)
-#define KEY_DMP_A_INV_XH           (KEY_DMP_AINV_SH+1)
-#define KEY_DMP_AINV_PH            (KEY_DMP_A_INV_XH+1)
-#define KEY_DMP_CTHX_H             (KEY_DMP_AINV_PH+1)
-#define KEY_DMP_CTHY_H             (KEY_DMP_CTHX_H+1)
-#define KEY_DMP_CTHZ_H             (KEY_DMP_CTHY_H+1)
-#define KEY_DMP_NCTHX_H            (KEY_DMP_CTHZ_H+1)
-#define KEY_DMP_NCTHY_H            (KEY_DMP_NCTHX_H+1)
-#define KEY_DMP_NCTHZ_H            (KEY_DMP_NCTHY_H+1)
-#define KEY_DMP_CTSQ_XH            (KEY_DMP_NCTHZ_H+1)
-#define KEY_DMP_CTSQ_YH            (KEY_DMP_CTSQ_XH+1)
-#define KEY_DMP_CTSQ_ZH            (KEY_DMP_CTSQ_YH+1)
-#define KEY_DMP_INTX_H             (KEY_DMP_CTSQ_ZH+1)
-#define KEY_DMP_INTY_H             (KEY_DMP_INTX_H+1)
-#define KEY_DMP_INTZ_H             (KEY_DMP_INTY_H+1)
-#define KEY_DMP_HPX_H              (KEY_DMP_INTZ_H+1)
-#define KEY_DMP_HPY_H              (KEY_DMP_HPX_H+1)
-#define KEY_DMP_HPZ_H              (KEY_DMP_HPY_H+1)
-
-// Stream Keys
-#define KEY_STREAM_P_GYRO_Z        (KEY_DMP_HPZ_H + 1)
-#define KEY_STREAM_P_GYRO_Y        (KEY_STREAM_P_GYRO_Z+1)
-#define KEY_STREAM_P_GYRO_X        (KEY_STREAM_P_GYRO_Y+1)
-#define KEY_STREAM_P_TEMP          (KEY_STREAM_P_GYRO_X+1)
-#define KEY_STREAM_P_AUX_Y         (KEY_STREAM_P_TEMP+1)
-#define KEY_STREAM_P_AUX_X         (KEY_STREAM_P_AUX_Y+1)
-#define KEY_STREAM_P_AUX_Z         (KEY_STREAM_P_AUX_X+1)
-#define KEY_STREAM_P_ACCEL_Y       (KEY_STREAM_P_AUX_Z+1)
-#define KEY_STREAM_P_ACCEL_X       (KEY_STREAM_P_ACCEL_Y+1)
-#define KEY_STREAM_P_FOOTER        (KEY_STREAM_P_ACCEL_X+1)
-#define KEY_STREAM_P_ACCEL_Z       (KEY_STREAM_P_FOOTER+1)
-
-#define NUM_KEYS (KEY_STREAM_P_ACCEL_Z+1)
-
-    typedef struct {
-        unsigned short key;
-        unsigned short addr;
-    } tKeyLabel;
-    
-#define DINA0A 0x0a
-#define DINA22 0x22
-#define DINA42 0x42
-#define DINA5A 0x5a
-
-#define DINA06 0x06
-#define DINA0E 0x0e
-#define DINA16 0x16
-#define DINA1E 0x1e
-#define DINA26 0x26
-#define DINA2E 0x2e
-#define DINA36 0x36
-#define DINA3E 0x3e
-#define DINA46 0x46
-#define DINA4E 0x4e
-#define DINA56 0x56
-#define DINA5E 0x5e
-#define DINA66 0x66
-#define DINA6E 0x6e
-#define DINA76 0x76
-#define DINA7E 0x7e
-
-#define DINA00 0x00
-#define DINA08 0x08
-#define DINA10 0x10
-#define DINA18 0x18
-#define DINA20 0x20
-#define DINA28 0x28
-#define DINA30 0x30
-#define DINA38 0x38
-#define DINA40 0x40
-#define DINA48 0x48
-#define DINA50 0x50
-#define DINA58 0x58
-#define DINA60 0x60
-#define DINA68 0x68
-#define DINA70 0x70
-#define DINA78 0x78
-
-#define DINA04 0x04
-#define DINA0C 0x0c
-#define DINA14 0x14
-#define DINA1C 0x1C
-#define DINA24 0x24
-#define DINA2C 0x2c
-#define DINA34 0x34
-#define DINA3C 0x3c
-#define DINA44 0x44
-#define DINA4C 0x4c
-#define DINA54 0x54
-#define DINA5C 0x5c
-#define DINA64 0x64
-#define DINA6C 0x6c
-#define DINA74 0x74
-#define DINA7C 0x7c
-
-#define DINA01 0x01
-#define DINA09 0x09
-#define DINA11 0x11
-#define DINA19 0x19
-#define DINA21 0x21
-#define DINA29 0x29
-#define DINA31 0x31
-#define DINA39 0x39
-#define DINA41 0x41
-#define DINA49 0x49
-#define DINA51 0x51
-#define DINA59 0x59
-#define DINA61 0x61
-#define DINA69 0x69
-#define DINA71 0x71
-#define DINA79 0x79
-
-#define DINA25 0x25
-#define DINA2D 0x2d
-#define DINA35 0x35
-#define DINA3D 0x3d
-#define DINA4D 0x4d
-#define DINA55 0x55
-#define DINA5D 0x5D
-#define DINA6D 0x6d
-#define DINA75 0x75
-#define DINA7D 0x7d
-
-#define DINC00 0x00
-#define DINC01 0x01
-#define DINC02 0x02
-#define DINC03 0x03
-#define DINC08 0x08
-#define DINC09 0x09
-#define DINC0A 0x0a
-#define DINC0B 0x0b
-#define DINC10 0x10
-#define DINC11 0x11
-#define DINC12 0x12
-#define DINC13 0x13
-#define DINC18 0x18
-#define DINC19 0x19
-#define DINC1A 0x1a
-#define DINC1B 0x1b
-
-#define DINC20 0x20
-#define DINC21 0x21
-#define DINC22 0x22
-#define DINC23 0x23
-#define DINC28 0x28
-#define DINC29 0x29
-#define DINC2A 0x2a
-#define DINC2B 0x2b
-#define DINC30 0x30
-#define DINC31 0x31
-#define DINC32 0x32
-#define DINC33 0x33
-#define DINC38 0x38
-#define DINC39 0x39
-#define DINC3A 0x3a
-#define DINC3B 0x3b
-
-#define DINC40 0x40
-#define DINC41 0x41
-#define DINC42 0x42
-#define DINC43 0x43
-#define DINC48 0x48
-#define DINC49 0x49
-#define DINC4A 0x4a
-#define DINC4B 0x4b
-#define DINC50 0x50
-#define DINC51 0x51
-#define DINC52 0x52
-#define DINC53 0x53
-#define DINC58 0x58
-#define DINC59 0x59
-#define DINC5A 0x5a
-#define DINC5B 0x5b
-
-#define DINC60 0x60
-#define DINC61 0x61
-#define DINC62 0x62
-#define DINC63 0x63
-#define DINC68 0x68
-#define DINC69 0x69
-#define DINC6A 0x6a
-#define DINC6B 0x6b
-#define DINC70 0x70
-#define DINC71 0x71
-#define DINC72 0x72
-#define DINC73 0x73
-#define DINC78 0x78
-#define DINC79 0x79
-#define DINC7A 0x7a
-#define DINC7B 0x7b
-
-#if defined CONFIG_MPU_SENSORS_MPU3050
-#define DINA80 0x80
-#define DINA90 0x90
-#define DINAA0 0xa0
-#define DINAC9 0xc9
-#define DINACB 0xcb
-#define DINACD 0xcd
-#define DINACF 0xcf
-#define DINAC8 0xc8
-#define DINACA 0xca
-#define DINACC 0xcc
-#define DINACE 0xce
-#define DINAD8 0xd8
-#define DINADD 0xdd
-#define DINAF8 0xf8
-#define DINAFE 0xfe
-#define DINAC0 0xc0
-#define DINAC1 0xc1
-#define DINAC2 0xc2
-#define DINAC3 0xc3
-#define DINAC4 0xc4
-#define DINAC5 0xc5
-#elif defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-
-#define DINA80 0x80
-#define DINA90 0x90
-#define DINAA0 0xa0
-#define DINAC9 0xc9
-#define DINACB 0xcb
-#define DINACD 0xcd
-#define DINACF 0xcf
-#define DINAC8 0xc8
-#define DINACA 0xca
-#define DINACC 0xcc
-#define DINACE 0xce
-#define DINAD8 0xd8
-#define DINADD 0xdd
-#define DINAF8 0xf0
-#define DINAFE 0xfe
-
-#define DINBF8 0xf8
-#define DINAC0 0xb0
-#define DINAC1 0xb1
-#define DINAC2 0xb4
-#define DINAC3 0xb5
-#define DINAC4 0xb8
-#define DINAC5 0xb9
-#define DINBC0 0xc0
-#define DINBC2 0xc2
-#define DINBC4 0xc4
-#define DINBC6 0xc6
-#else
-#error No CONFIG_MPU_SENSORS_xxxx has been defined.
-#endif
-
-
-#endif // DMPKEY_H__
diff --git a/60xx/mlsdk/mllite/dmpconfig.txt b/60xx/mlsdk/mllite/dmpconfig.txt
deleted file mode 100644
index 4643ed5..0000000
--- a/60xx/mlsdk/mllite/dmpconfig.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-major version    =  1
-minor version    =  0
-startAddr        =  0
diff --git a/60xx/mlsdk/mllite/dmpmap.h b/60xx/mlsdk/mllite/dmpmap.h
deleted file mode 100644
index cb53c7c..0000000
--- a/60xx/mlsdk/mllite/dmpmap.h
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 DMPMAP_H
-#define DMPMAP_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-#define DMP_PTAT    0
-#define DMP_XGYR    2
-#define DMP_YGYR    4
-#define DMP_ZGYR    6
-#define DMP_XACC    8
-#define DMP_YACC    10
-#define DMP_ZACC    12
-#define DMP_ADC1    14
-#define DMP_ADC2    16
-#define DMP_ADC3    18
-#define DMP_BIASUNC    20
-#define DMP_FIFORT    22
-#define DMP_INVGSFH    24
-#define DMP_INVGSFL    26
-#define DMP_1H    28
-#define DMP_1L    30
-#define DMP_BLPFSTCH    32
-#define DMP_BLPFSTCL    34
-#define DMP_BLPFSXH    36
-#define DMP_BLPFSXL    38
-#define DMP_BLPFSYH    40
-#define DMP_BLPFSYL    42
-#define DMP_BLPFSZH    44
-#define DMP_BLPFSZL    46
-#define DMP_BLPFMTC    48
-#define DMP_SMC    50
-#define DMP_BLPFMXH    52
-#define DMP_BLPFMXL    54
-#define DMP_BLPFMYH    56
-#define DMP_BLPFMYL    58
-#define DMP_BLPFMZH    60
-#define DMP_BLPFMZL    62
-#define DMP_BLPFC    64
-#define DMP_SMCTH    66
-#define DMP_0H2    68
-#define DMP_0L2    70
-#define DMP_BERR2H    72
-#define DMP_BERR2L    74
-#define DMP_BERR2NH    76
-#define DMP_SMCINC    78
-#define DMP_ANGVBXH    80
-#define DMP_ANGVBXL    82
-#define DMP_ANGVBYH    84
-#define DMP_ANGVBYL    86
-#define DMP_ANGVBZH    88
-#define DMP_ANGVBZL    90
-#define DMP_BERR1H    92
-#define DMP_BERR1L    94
-#define DMP_ATCH    96
-#define DMP_BIASUNCSF    98
-#define DMP_ACT2H    100
-#define DMP_ACT2L    102
-#define DMP_GSFH    104
-#define DMP_GSFL    106
-#define DMP_GH    108
-#define DMP_GL    110
-#define DMP_0_5H    112
-#define DMP_0_5L    114
-#define DMP_0_0H    116
-#define DMP_0_0L    118
-#define DMP_1_0H    120
-#define DMP_1_0L    122
-#define DMP_1_5H    124
-#define DMP_1_5L    126
-#define DMP_TMP1AH    128
-#define DMP_TMP1AL    130
-#define DMP_TMP2AH    132
-#define DMP_TMP2AL    134
-#define DMP_TMP3AH    136
-#define DMP_TMP3AL    138
-#define DMP_TMP4AH    140
-#define DMP_TMP4AL    142
-#define DMP_XACCW    144
-#define DMP_TMP5    146
-#define DMP_XACCB    148
-#define DMP_TMP8    150
-#define DMP_YACCB    152
-#define DMP_TMP9    154
-#define DMP_ZACCB    156
-#define DMP_TMP10    158
-#define DMP_DZH    160
-#define DMP_DZL    162
-#define DMP_XGCH    164
-#define DMP_XGCL    166
-#define DMP_YGCH    168
-#define DMP_YGCL    170
-#define DMP_ZGCH    172
-#define DMP_ZGCL    174
-#define DMP_YACCW    176
-#define DMP_TMP7    178
-#define DMP_AFB1H    180
-#define DMP_AFB1L    182
-#define DMP_AFB2H    184
-#define DMP_AFB2L    186
-#define DMP_MAGFBH    188
-#define DMP_MAGFBL    190
-#define DMP_QT1H    192
-#define DMP_QT1L    194
-#define DMP_QT2H    196
-#define DMP_QT2L    198
-#define DMP_QT3H    200
-#define DMP_QT3L    202
-#define DMP_QT4H    204
-#define DMP_QT4L    206
-#define DMP_CTRL1H    208
-#define DMP_CTRL1L    210
-#define DMP_CTRL2H    212
-#define DMP_CTRL2L    214
-#define DMP_CTRL3H    216
-#define DMP_CTRL3L    218
-#define DMP_CTRL4H    220
-#define DMP_CTRL4L    222
-#define DMP_CTRLS1    224
-#define DMP_CTRLSF1    226
-#define DMP_CTRLS2    228
-#define DMP_CTRLSF2    230
-#define DMP_CTRLS3    232
-#define DMP_CTRLSFNLL    234
-#define DMP_CTRLS4    236
-#define DMP_CTRLSFNL2    238
-#define DMP_CTRLSFNL    240
-#define DMP_TMP30    242
-#define DMP_CTRLSFJT    244
-#define DMP_TMP31    246
-#define DMP_TMP11    248
-#define DMP_CTRLSF2_2    250
-#define DMP_TMP12    252
-#define DMP_CTRLSF1_2    254
-#define DMP_PREVPTAT    256
-#define DMP_ACCZB    258
-#define DMP_ACCXB    264
-#define DMP_ACCYB    266
-#define DMP_1HB    272
-#define DMP_1LB    274
-#define DMP_0H    276
-#define DMP_0L    278
-#define DMP_ASR22H    280
-#define DMP_ASR22L    282
-#define DMP_ASR6H    284
-#define DMP_ASR6L    286
-#define DMP_TMP13    288
-#define DMP_TMP14    290
-#define DMP_FINTXH    292
-#define DMP_FINTXL    294
-#define DMP_FINTYH    296
-#define DMP_FINTYL    298
-#define DMP_FINTZH    300
-#define DMP_FINTZL    302
-#define DMP_TMP1BH    304
-#define DMP_TMP1BL    306
-#define DMP_TMP2BH    308
-#define DMP_TMP2BL    310
-#define DMP_TMP3BH    312
-#define DMP_TMP3BL    314
-#define DMP_TMP4BH    316
-#define DMP_TMP4BL    318
-#define DMP_STXG    320
-#define DMP_ZCTXG    322
-#define DMP_STYG    324
-#define DMP_ZCTYG    326
-#define DMP_STZG    328
-#define DMP_ZCTZG    330
-#define DMP_CTRLSFJT2    332
-#define DMP_CTRLSFJTCNT    334
-#define DMP_PVXG    336
-#define DMP_TMP15    338
-#define DMP_PVYG    340
-#define DMP_TMP16    342
-#define DMP_PVZG    344
-#define DMP_TMP17    346
-#define DMP_MNMFLAGH    352
-#define DMP_MNMFLAGL    354
-#define DMP_MNMTMH    356
-#define DMP_MNMTML    358
-#define DMP_MNMTMTHRH    360
-#define DMP_MNMTMTHRL    362
-#define DMP_MNMTHRH    364
-#define DMP_MNMTHRL    366
-#define DMP_ACCQD4H    368
-#define DMP_ACCQD4L    370
-#define DMP_ACCQD5H    372
-#define DMP_ACCQD5L    374
-#define DMP_ACCQD6H    376
-#define DMP_ACCQD6L    378
-#define DMP_ACCQD7H    380
-#define DMP_ACCQD7L    382
-#define DMP_ACCQD0H    384
-#define DMP_ACCQD0L    386
-#define DMP_ACCQD1H    388
-#define DMP_ACCQD1L    390
-#define DMP_ACCQD2H    392
-#define DMP_ACCQD2L    394
-#define DMP_ACCQD3H    396
-#define DMP_ACCQD3L    398
-#define DMP_XN2H    400
-#define DMP_XN2L    402
-#define DMP_XN1H    404
-#define DMP_XN1L    406
-#define DMP_YN2H    408
-#define DMP_YN2L    410
-#define DMP_YN1H    412
-#define DMP_YN1L    414
-#define DMP_YH    416
-#define DMP_YL    418
-#define DMP_B0H    420
-#define DMP_B0L    422
-#define DMP_A1H    424
-#define DMP_A1L    426
-#define DMP_A2H    428
-#define DMP_A2L    430
-#define DMP_SEM1    432
-#define DMP_FIFOCNT    434
-#define DMP_SH_TH_X    436
-#define DMP_PACKET    438
-#define DMP_SH_TH_Y    440
-#define DMP_FOOTER    442
-#define DMP_SH_TH_Z    444
-#define DMP_TEMP29    448
-#define DMP_TEMP30    450
-#define DMP_XACCB_PRE    452
-#define DMP_XACCB_PREL    454
-#define DMP_YACCB_PRE    456
-#define DMP_YACCB_PREL    458
-#define DMP_ZACCB_PRE    460
-#define DMP_ZACCB_PREL    462
-#define DMP_TMP22    464
-#define DMP_TAP_TIMER    466
-#define DMP_TAP_THX    468
-#define DMP_TAP_THY    472
-#define DMP_TAP_THZ    476
-#define DMP_TAPW_MIN    478
-#define DMP_TMP25    480
-#define DMP_TMP26    482
-#define DMP_TMP27    484
-#define DMP_TMP28    486
-#define DMP_ORIENT    488
-#define DMP_THRSH    490
-#define DMP_ENDIANH    492
-#define DMP_ENDIANL    494
-#define DMP_BLPFNMTCH    496
-#define DMP_BLPFNMTCL    498
-#define DMP_BLPFNMXH    500
-#define DMP_BLPFNMXL    502
-#define DMP_BLPFNMYH    504
-#define DMP_BLPFNMYL    506
-#define DMP_BLPFNMZH    508
-#define DMP_BLPFNMZL    510
-#ifdef __cplusplus
-}
-#endif
-#endif // DMPMAP_H
diff --git a/60xx/mlsdk/mllite/invensense.h b/60xx/mlsdk/mllite/invensense.h
deleted file mode 100644
index 586dd25..0000000
--- a/60xx/mlsdk/mllite/invensense.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/** Main header file for Invensense's basic library.
- */
-#include "accel.h"
-#include "compass.h"
-#include "dmpDefault.h"
-#include "dmpKey.h"
-#include "dmpmap.h"
-#include "ml.h"
-#include "mlBiasNoMotion.h"
-#include "mlFIFO.h"
-#include "mlFIFOHW.h"
-#include "mlMathFunc.h"
-#include "mlSetGyroBias.h"
-#include "ml_legacy.h"
-#include "ml_mputest.h"
-#include "ml_stored_data.h"
-#include "mlcontrol.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mldmp.h"
-#include "mlinclude.h"
-#include "mlstates.h"
-#include "mlsupervisor.h"
-#include "pressure.h"
diff --git a/60xx/mlsdk/mllite/ml.c b/60xx/mlsdk/mllite/ml.c
deleted file mode 100644
index 3328edd..0000000
--- a/60xx/mlsdk/mllite/ml.c
+++ /dev/null
@@ -1,1885 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- *
- * $Id: ml.c 5642 2011-06-14 02:26:20Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup ML
- *  @brief  Motion Library APIs.
- *          The Motion Library processes gyroscopes, accelerometers, and
- *          compasses to provide a physical model of the movement for the
- *          sensors.
- *          The results of this processing may be used to control objects
- *          within a user interface environment, detect gestures, track 3D
- *          movement for gaming applications, and analyze the blur created
- *          due to hand movement while taking a picture.
- *
- *  @{
- *      @file   ml.c
- *      @brief  The Motion Library APIs.
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <string.h>
-
-#include "ml.h"
-#include "mldl.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "compass.h"
-#include "dmpKey.h"
-#include "dmpDefault.h"
-#include "mlstates.h"
-#include "mlFIFO.h"
-#include "mlFIFOHW.h"
-#include "mlMathFunc.h"
-#include "mlsupervisor.h"
-#include "mlmath.h"
-#include "mlcontrol.h"
-#include "mldl_cfg.h"
-#include "mpu.h"
-#include "accel.h"
-#include "mlos.h"
-#include "mlsl.h"
-#include "mlos.h"
-#include "mlBiasNoMotion.h"
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-ml"
-
-#define ML_MOT_TYPE_NONE 0
-#define ML_MOT_TYPE_NO_MOTION 1
-#define ML_MOT_TYPE_MOTION_DETECTED 2
-
-#define ML_MOT_STATE_MOVING 0
-#define ML_MOT_STATE_NO_MOTION 1
-#define ML_MOT_STATE_BIAS_IN_PROG 2
-
-#define _mlDebug(x)             //{x}
-
-/* Global Variables */
-const unsigned char mlVer[] = { INV_VERSION };
-
-struct inv_params_obj inv_params_obj = {
-    INV_BIAS_UPDATE_FUNC_DEFAULT,   // bias_mode
-    INV_ORIENTATION_MASK_DEFAULT,   // orientation_mask
-    INV_PROCESSED_DATA_CALLBACK_DEFAULT,    // fifo_processed_func
-    INV_ORIENTATION_CALLBACK_DEFAULT,   // orientation_cb_func
-    INV_MOTION_CALLBACK_DEFAULT,    // motion_cb_func
-    INV_STATE_SERIAL_CLOSED     // starting state
-};
-
-struct inv_obj_t inv_obj;
-void *g_mlsl_handle;
-
-typedef struct {
-    // These describe callbacks happening everythime a DMP interrupt is processed
-    int_fast8_t numInterruptProcesses;
-    // Array of function pointers, function being void function taking void
-    inv_obj_func processInterruptCb[MAX_INTERRUPT_PROCESSES];
-
-} tMLXCallbackInterrupt;        // MLX_callback_t
-
-tMLXCallbackInterrupt mlxCallbackInterrupt;
-
-/* --------------- */
-/* -  Functions. - */
-/* --------------- */
-
-inv_error_t inv_freescale_sensor_fusion_16bit(unsigned short orient);
-inv_error_t inv_freescale_sensor_fusion_8bit(unsigned short orient);
-unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx);
-
-/**
- *  @brief  Open serial connection with the MPU device.
- *          This is the entry point of the MPL and must be
- *          called prior to any other function call.
- *
- *  @param  port     System handle for 'port' MPU device is found on.
- *                   The significance of this parameter varies by
- *                   platform. It is passed as 'port' to MLSLSerialOpen.
- *
- *  @return INV_SUCCESS or error code.
- */
-inv_error_t inv_serial_start(char const *port)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    if (inv_get_state() >= INV_STATE_SERIAL_OPENED)
-        return INV_SUCCESS;
-
-    result = inv_state_transition(INV_STATE_SERIAL_OPENED);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    result = inv_serial_open(port, &g_mlsl_handle);
-    if (INV_SUCCESS != result) {
-        (void)inv_state_transition(INV_STATE_SERIAL_CLOSED);
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Close the serial communication.
- *          This function needs to be called explicitly to shut down
- *          the communication with the device.  Calling inv_dmp_close()
- *          won't affect the established serial communication.
- *  @return INV_SUCCESS; non-zero error code otherwise.
- */
-inv_error_t inv_serial_stop(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() == INV_STATE_SERIAL_CLOSED)
-        return INV_SUCCESS;
-
-    result = inv_state_transition(INV_STATE_SERIAL_CLOSED);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("State Transition Failure in %s: %d\n", __func__, result);
-    }
-    result = inv_serial_close(g_mlsl_handle);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("Unable to close Serial Handle %s: %d\n", __func__, result);
-    }
-    return result;
-}
-
-/**
- *  @brief  Get the serial file handle to the device.
- *  @return The serial file handle.
- */
-void *inv_get_serial_handle(void)
-{
-    INVENSENSE_FUNC_START;
-    return g_mlsl_handle;
-}
-
-/**
- *  @brief  apply the choosen orientation and full scale range
- *          for gyroscopes, accelerometer, and compass.
- *  @return INV_SUCCESS if successful, a non-zero code otherwise.
- */
-inv_error_t inv_apply_calibration(void)
-{
-    INVENSENSE_FUNC_START;
-    signed char gyroCal[9] = { 0 };
-    signed char accelCal[9] = { 0 };
-    signed char magCal[9] = { 0 };
-    float gyroScale = 2000.f;
-    float accelScale = 0.f;
-    float magScale = 0.f;
-
-    inv_error_t result;
-    int ii;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    for (ii = 0; ii < 9; ii++) {
-        gyroCal[ii] = mldl_cfg->pdata->orientation[ii];
-        if (NULL != mldl_cfg->accel){
-            accelCal[ii] = mldl_cfg->pdata->accel.orientation[ii];
-        }
-        if (NULL != mldl_cfg->compass){
-            magCal[ii] = mldl_cfg->pdata->compass.orientation[ii];
-        }
-    }
-
-    switch (mldl_cfg->full_scale) {
-    case MPU_FS_250DPS:
-        gyroScale = 250.f;
-        break;
-    case MPU_FS_500DPS:
-        gyroScale = 500.f;
-        break;
-    case MPU_FS_1000DPS:
-        gyroScale = 1000.f;
-        break;
-    case MPU_FS_2000DPS:
-        gyroScale = 2000.f;
-        break;
-    default:
-        MPL_LOGE("Unrecognized full scale setting for gyros : %02X\n",
-                 mldl_cfg->full_scale);
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    if (NULL != mldl_cfg->accel){
-        RANGE_FIXEDPOINT_TO_FLOAT(mldl_cfg->accel->range, accelScale);
-        inv_obj.accel_sens = (long)(accelScale * 65536L);
-    /* sensitivity adjustment, typically = 2 (for +/- 2 gee) */
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-    inv_obj.accel_sens /= 32768 / mldl_cfg->accel_sens_trim;
-#else
-    inv_obj.accel_sens /= 2;
-#endif
-    }
-    if (NULL != mldl_cfg->compass){
-        RANGE_FIXEDPOINT_TO_FLOAT(mldl_cfg->compass->range, magScale);
-        inv_obj.compass_sens = (long)(magScale * 32768);
-    }
-
-    if (inv_get_state() == INV_STATE_DMP_OPENED) {
-        result = inv_set_gyro_calibration(gyroScale, gyroCal);
-        if (INV_SUCCESS != result) {
-            MPL_LOGE("Unable to set Gyro Calibration\n");
-            return result;
-        }
-        if (NULL != mldl_cfg->accel){
-            result = inv_set_accel_calibration(accelScale, accelCal);
-            if (INV_SUCCESS != result) {
-                MPL_LOGE("Unable to set Accel Calibration\n");
-                return result;
-            }
-        }
-        if (NULL != mldl_cfg->compass){
-            result = inv_set_compass_calibration(magScale, magCal);
-            if (INV_SUCCESS != result) {
-                MPL_LOGE("Unable to set Mag Calibration\n");
-                return result;
-            }
-        }
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Setup the DMP to handle the accelerometer endianess.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_apply_endian_accel(void)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[4] = { 0 };
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    int endian = mldl_cfg->accel->endian;
-
-    if (mldl_cfg->pdata->accel.bus != EXT_SLAVE_BUS_SECONDARY) {
-        endian = EXT_SLAVE_BIG_ENDIAN;
-    }
-    switch (endian) {
-    case EXT_SLAVE_FS8_BIG_ENDIAN:
-    case EXT_SLAVE_FS16_BIG_ENDIAN:
-    case EXT_SLAVE_LITTLE_ENDIAN:
-        regs[0] = 0;
-        regs[1] = 64;
-        regs[2] = 0;
-        regs[3] = 0;
-        break;
-    case EXT_SLAVE_BIG_ENDIAN:
-    default:
-        regs[0] = 0;
-        regs[1] = 0;
-        regs[2] = 64;
-        regs[3] = 0;
-    }
-
-    return inv_set_mpu_memory(KEY_D_1_236, 4, regs);
-}
-
-/**
- * @internal
- * @brief   Initialize MLX data.  This should be called to setup the mlx
- *          output buffers before any motion processing is done.
- */
-void inv_init_ml(void)
-{
-    INVENSENSE_FUNC_START;
-    int ii;
-    long tmp[COMPASS_NUM_AXES];
-    // Set all values to zero by default
-    memset(&inv_obj, 0, sizeof(struct inv_obj_t));
-    memset(&mlxCallbackInterrupt, 0, sizeof(tMLXCallbackInterrupt));
-
-    inv_obj.compass_correction[0] = 1073741824L;
-    inv_obj.compass_correction_relative[0] = 1073741824L;
-    inv_obj.compass_disturb_correction[0] = 1073741824L;
-    inv_obj.compass_correction_offset[0] = 1073741824L;
-    inv_obj.relative_quat[0] = 1073741824L;
-
-    //Not used with the ST accelerometer
-    inv_obj.no_motion_threshold = 20;   // noMotionThreshold
-    //Not used with the ST accelerometer
-    inv_obj.motion_duration = 1536; // motionDuration
-
-    inv_obj.motion_state = INV_MOTION;  // Motion state
-
-    inv_obj.bias_update_time = 8000;
-    inv_obj.bias_calc_time = 2000;
-
-    inv_obj.internal_motion_state = ML_MOT_STATE_MOVING;
-
-    inv_obj.start_time = inv_get_tick_count();
-
-    inv_obj.compass_cal[0] = 322122560L;
-    inv_obj.compass_cal[4] = 322122560L;
-    inv_obj.compass_cal[8] = 322122560L;
-    inv_obj.compass_sens = 322122560L;  // Should only change when the sensor full-scale range (FSR) is changed.
-
-    for (ii = 0; ii < COMPASS_NUM_AXES; ii++) {
-        inv_obj.compass_scale[ii] = 65536L;
-        inv_obj.compass_test_scale[ii] = 65536L;
-        inv_obj.compass_bias_error[ii] = P_INIT;
-        inv_obj.init_compass_bias[ii] = 0;
-        inv_obj.compass_asa[ii] = (1L << 30);
-    }
-    if (inv_compass_read_scale(tmp) == INV_SUCCESS) {
-        for (ii = 0; ii < COMPASS_NUM_AXES; ii++)
-            inv_obj.compass_asa[ii] = tmp[ii];
-    }
-    inv_obj.got_no_motion_bias = 0;
-    inv_obj.got_compass_bias = 0;
-    inv_obj.compass_state = SF_UNCALIBRATED;
-    inv_obj.acc_state = SF_STARTUP_SETTLE;
-
-    inv_obj.got_init_compass_bias = 0;
-    inv_obj.resetting_compass = 0;
-
-    inv_obj.external_slave_callback = NULL;
-    inv_obj.compass_accuracy = 0;
-
-    inv_obj.factory_temp_comp = 0;
-    inv_obj.got_coarse_heading = 0;
-
-    inv_obj.compass_bias_ptr[0] = P_INIT;
-    inv_obj.compass_bias_ptr[4] = P_INIT;
-    inv_obj.compass_bias_ptr[8] = P_INIT;
-
-    inv_obj.gyro_bias_err = 1310720;
-
-    inv_obj.accel_lpf_gain = 1073744L;
-    inv_obj.no_motion_accel_threshold = 7000000L;
-}
-
-/**
- * @internal
- * @brief   This registers a function to be called for each time the DMP
- *          generates an an interrupt.
- *          It will be called after inv_register_fifo_rate_process() which gets called
- *          every time the FIFO data is processed.
- *          The FIFO does not have to be on for this callback.
- * @param func Function to be called when a DMP interrupt occurs.
- * @return INV_SUCCESS or non-zero error code.
- */
-inv_error_t inv_register_dmp_interupt_cb(inv_obj_func func)
-{
-    INVENSENSE_FUNC_START;
-    // Make sure we have not filled up our number of allowable callbacks
-    if (mlxCallbackInterrupt.numInterruptProcesses <=
-        MAX_INTERRUPT_PROCESSES - 1) {
-        int kk;
-        // Make sure we haven't registered this function already
-        for (kk = 0; kk < mlxCallbackInterrupt.numInterruptProcesses; ++kk) {
-            if (mlxCallbackInterrupt.processInterruptCb[kk] == func) {
-                return INV_ERROR_INVALID_PARAMETER;
-            }
-        }
-        // Add new callback
-        mlxCallbackInterrupt.processInterruptCb[mlxCallbackInterrupt.
-                                                numInterruptProcesses] = func;
-        mlxCallbackInterrupt.numInterruptProcesses++;
-        return INV_SUCCESS;
-    }
-    return INV_ERROR_MEMORY_EXAUSTED;
-}
-
-/**
- * @internal
- * @brief This unregisters a function to be called for each DMP interrupt.
- * @return INV_SUCCESS or non-zero error code.
- */
-inv_error_t inv_unregister_dmp_interupt_cb(inv_obj_func func)
-{
-    INVENSENSE_FUNC_START;
-    int kk, jj;
-    // Make sure we haven't registered this function already
-    for (kk = 0; kk < mlxCallbackInterrupt.numInterruptProcesses; ++kk) {
-        if (mlxCallbackInterrupt.processInterruptCb[kk] == func) {
-            // FIXME, we may need a thread block here
-            for (jj = kk + 1; jj < mlxCallbackInterrupt.numInterruptProcesses;
-                 ++jj) {
-                mlxCallbackInterrupt.processInterruptCb[jj - 1] =
-                    mlxCallbackInterrupt.processInterruptCb[jj];
-            }
-            mlxCallbackInterrupt.numInterruptProcesses--;
-            return INV_SUCCESS;
-        }
-    }
-    return INV_ERROR_INVALID_PARAMETER;
-}
-
-/**
- *  @internal
- *  @brief  Run the recorded interrupt process callbacks in the event
- *          of an interrupt.
- */
-void inv_run_dmp_interupt_cb(void)
-{
-    int kk;
-    for (kk = 0; kk < mlxCallbackInterrupt.numInterruptProcesses; ++kk) {
-        if (mlxCallbackInterrupt.processInterruptCb[kk])
-            mlxCallbackInterrupt.processInterruptCb[kk] (&inv_obj);
-    }
-}
-
-/** @internal
-* Resets the Motion/No Motion state which should be called at startup and resume.
-*/
-inv_error_t inv_reset_motion(void)
-{
-    unsigned char regs[8];
-    inv_error_t result;
-
-    inv_obj.motion_state = INV_MOTION;
-    inv_obj.flags[INV_MOTION_STATE_CHANGE] = INV_MOTION;
-    inv_obj.no_motion_accel_time = inv_get_tick_count();
-#if defined CONFIG_MPU_SENSORS_MPU3050
-    regs[0] = DINAD8 + 2;
-    regs[1] = DINA0C;
-    regs[2] = DINAD8 + 1;
-    result = inv_set_mpu_memory(KEY_CFG_18, 3, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-#else
-#endif
-    regs[0] = (unsigned char)((inv_obj.motion_duration >> 8) & 0xff);
-    regs[1] = (unsigned char)(inv_obj.motion_duration & 0xff);
-    result = inv_set_mpu_memory(KEY_D_1_106, 2, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    memset(regs, 0, 8);
-    result = inv_set_mpu_memory(KEY_D_1_96, 8, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    result =
-        inv_set_mpu_memory(KEY_D_0_96, 4, inv_int32_to_big8(0x40000000, regs));
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    inv_set_motion_state(INV_MOTION);
-    return result;
-}
-
-/**
- * @internal
- * @brief   inv_start_bias_calc starts the bias calculation on the MPU.
- */
-void inv_start_bias_calc(void)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_obj.suspend = 1;
-}
-
-/**
- * @internal
- * @brief   inv_stop_bias_calc stops the bias calculation on the MPU.
- */
-void inv_stop_bias_calc(void)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_obj.suspend = 0;
-}
-
-/**
- *  @brief  inv_update_data fetches data from the fifo and updates the
- *          motion algorithms.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start() must have been called.
- *
- *  @note   Motion algorithm data is constant between calls to inv_update_data
- *
- * @return
- * - INV_SUCCESS
- * - Non-zero error code
- */
-inv_error_t inv_update_data(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-    int_fast8_t got, ftry;
-    uint_fast8_t mpu_interrupt;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (inv_get_state() != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    // Set the maximum number of FIFO packets we want to process
-    if (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR) {
-        ftry = 100;             // Large enough to process all packets
-    } else {
-        ftry = 1;
-    }
-
-    // Go and process at most ftry number of packets, probably less than ftry
-    result = inv_read_and_process_fifo(ftry, &got);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    // Process all interrupts
-    mpu_interrupt = inv_get_interrupt_trigger(INTSRC_AUX1);
-    if (mpu_interrupt) {
-        inv_clear_interrupt_trigger(INTSRC_AUX1);
-    }
-    // Check if interrupt was from MPU
-    mpu_interrupt = inv_get_interrupt_trigger(INTSRC_MPU);
-    if (mpu_interrupt) {
-        inv_clear_interrupt_trigger(INTSRC_MPU);
-    }
-    // Take care of the callbacks that want to be notified when there was an MPU interrupt
-    if (mpu_interrupt) {
-        inv_run_dmp_interupt_cb();
-    }
-
-    result = inv_get_fifo_status();
-    return result;
-}
-
-/**
- *  @brief  inv_check_flag returns the value of a flag.
- *          inv_check_flag can be used to check a number of flags,
- *          allowing users to poll flags rather than register callback
- *          functions. If a flag is set to True when inv_check_flag is called,
- *          the flag is automatically reset.
- *          The flags are:
- *          - INV_RAW_DATA_READY
- *          Indicates that new raw data is available.
- *          - INV_PROCESSED_DATA_READY
- *          Indicates that new processed data is available.
- *          - INV_GOT_GESTURE
- *          Indicates that a gesture has been detected by the gesture engine.
- *          - INV_MOTION_STATE_CHANGE
- *          Indicates that a change has been made from motion to no motion,
- *          or vice versa.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start() must have been called.
- *
- *  @param flag The flag to check.
- *
- * @return TRUE or FALSE state of the flag
- */
-int inv_check_flag(int flag)
-{
-    INVENSENSE_FUNC_START;
-    int flagReturn = inv_obj.flags[flag];
-
-    inv_obj.flags[flag] = 0;
-    return flagReturn;
-}
-
-/**
- *  @brief  Enable generation of the DMP interrupt when Motion or no-motion
- *          is detected
- *  @param on
- *          Boolean to turn the interrupt on or off.
- *  @return INV_SUCCESS or non-zero error code.
- */
-inv_error_t inv_set_motion_interrupt(unsigned char on)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char regs[2] = { 0 };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (on) {
-        result = inv_get_dl_cfg_int(BIT_DMP_INT_EN);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        inv_obj.interrupt_sources |= INV_INT_MOTION;
-    } else {
-        inv_obj.interrupt_sources &= ~INV_INT_MOTION;
-        if (!inv_obj.interrupt_sources) {
-            result = inv_get_dl_cfg_int(0);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-    }
-
-    if (on) {
-        regs[0] = DINAFE;
-    } else {
-        regs[0] = DINAD8;
-    }
-    result = inv_set_mpu_memory(KEY_CFG_7, 1, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- * Enable generation of the DMP interrupt when a FIFO packet is ready
- *
- * @param on Boolean to turn the interrupt on or off
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_set_fifo_interrupt(unsigned char on)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char regs[2] = { 0 };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (on) {
-        result = inv_get_dl_cfg_int(BIT_DMP_INT_EN);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        inv_obj.interrupt_sources |= INV_INT_FIFO;
-    } else {
-        inv_obj.interrupt_sources &= ~INV_INT_FIFO;
-        if (!inv_obj.interrupt_sources) {
-            result = inv_get_dl_cfg_int(0);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-    }
-
-    if (on) {
-        regs[0] = DINAFE;
-    } else {
-        regs[0] = DINAD8;
-    }
-    result = inv_set_mpu_memory(KEY_CFG_6, 1, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- * @brief   Get the current set of DMP interrupt sources.
- *          These interrupts are generated by the DMP and can be
- *          routed to the MPU interrupt line via internal
- *          settings.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- * @return  Currently enabled interrupt sources.  The possible interrupts are:
- *          - INV_INT_FIFO,
- *          - INV_INT_MOTION,
- *          - INV_INT_TAP
- */
-int inv_get_interrupts(void)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return 0;               // error
-
-    return inv_obj.interrupt_sources;
-}
-
-/**
- *  @brief  Sets up the Accelerometer calibration and scale factor.
- *
- *          Please refer to the provided "9-Axis Sensor Fusion Application
- *          Note" document provided.  Section 5, "Sensor Mounting Orientation"
- *          offers a good coverage on the mounting matrices and explains how
- *          to use them.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *  @pre    inv_dmp_start() must <b>NOT</b> have been called.
- *
- *  @see    inv_set_gyro_calibration().
- *  @see    inv_set_compass_calibration().
- *
- *  @param[in]  range
- *                  The range of the accelerometers in g's. An accelerometer
- *                  that has a range of +2g's to -2g's should pass in 2.
- *  @param[in]  orientation
- *                  A 9 element matrix that represents how the accelerometers
- *                  are oriented with respect to the device they are mounted
- *                  in and the reference axis system.
- *                  A typical set of values are {1, 0, 0, 0, 1, 0, 0, 0, 1}.
- *                  This example corresponds to a 3 x 3 identity matrix.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_accel_calibration(float range, signed char *orientation)
-{
-    INVENSENSE_FUNC_START;
-    float cal[9];
-    float scale = range / 32768.f;
-    int kk;
-    unsigned long sf;
-    inv_error_t result;
-    unsigned char regs[4] = { 0, 0, 0, 0 };
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    /* Apply zero g-offset values */
-    if (ACCEL_ID_KXSD9 == mldl_cfg->accel->id) {
-        regs[0] = 0x80;
-        regs[1] = 0x0;
-        regs[2] = 0x80;
-        regs[3] = 0x0;
-    }
-
-    if (inv_dmpkey_supported(KEY_D_1_152)) {
-        result = inv_set_mpu_memory(KEY_D_1_152, 4, &regs[0]);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    if (scale == 0) {
-        inv_obj.accel_sens = 0;
-    }
-
-    if (mldl_cfg->accel->id) {
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-        unsigned char tmp[3] = { DINA0C, DINAC9, DINA2C };
-#else
-        unsigned char tmp[3] = { DINA4C, DINACD, DINA6C };
-#endif
-        struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-        unsigned char regs[3];
-        unsigned short orient;
-
-        for (kk = 0; kk < 9; ++kk) {
-            cal[kk] = scale * orientation[kk];
-            inv_obj.accel_cal[kk] = (long)(cal[kk] * (float)(1L << 30));
-        }
-
-        orient = inv_orientation_matrix_to_scalar(orientation);
-        regs[0] = tmp[orient & 3];
-        regs[1] = tmp[(orient >> 3) & 3];
-        regs[2] = tmp[(orient >> 6) & 3];
-        result = inv_set_mpu_memory(KEY_FCFG_2, 3, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        regs[0] = DINA26;
-        regs[1] = DINA46;
-#if defined CONFIG_MPU_SENSORS_MPU3050 || defined CONFIG_MPU_SENSORS_MPU6050A2
-        regs[2] = DINA66;
-#else
-        if (MPL_PROD_KEY(mldl_cfg->product_id, mldl_cfg->product_revision)
-                == MPU_PRODUCT_KEY_B1_E1_5)
-            regs[2] = DINA76;
-        else
-            regs[2] = DINA66;
-#endif
-        if (orient & 4)
-            regs[0] |= 1;
-        if (orient & 0x20)
-            regs[1] |= 1;
-        if (orient & 0x100)
-            regs[2] |= 1;
-
-        result = inv_set_mpu_memory(KEY_FCFG_7, 3, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        if (mldl_cfg->accel->id == ACCEL_ID_MMA845X) {
-            result = inv_freescale_sensor_fusion_16bit(orient);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        } else if (mldl_cfg->accel->id == ACCEL_ID_MMA8450) {
-            result = inv_freescale_sensor_fusion_8bit(orient);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-    }
-
-    if (inv_obj.accel_sens != 0) {
-        sf = (1073741824L / inv_obj.accel_sens);
-    } else {
-        sf = 0;
-    }
-    regs[0] = (unsigned char)((sf >> 8) & 0xff);
-    regs[1] = (unsigned char)(sf & 0xff);
-    result = inv_set_mpu_memory(KEY_D_0_108, 2, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Sets up the Gyro calibration and scale factor.
- *
- *          Please refer to the provided "9-Axis Sensor Fusion Application
- *          Note" document provided.  Section 5, "Sensor Mounting Orientation"
- *          offers a good coverage on the mounting matrices and explains
- *          how to use them.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *  @pre    inv_dmp_start() must have <b>NOT</b> been called.
- *
- *  @see    inv_set_accel_calibration().
- *  @see    inv_set_compass_calibration().
- *
- *  @param[in]  range
- *                  The range of the gyros in degrees per second. A gyro
- *                  that has a range of +2000 dps to -2000 dps should pass in
- *                  2000.
- *  @param[in] orientation
- *                  A 9 element matrix that represents how the gyro are oriented
- *                  with respect to the device they are mounted in. A typical
- *                  set of values are {1, 0, 0, 0, 1, 0, 0, 0, 1}. This
- *                  example corresponds to a 3 x 3 identity matrix.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_gyro_calibration(float range, signed char *orientation)
-{
-    INVENSENSE_FUNC_START;
-
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    int kk;
-    float scale;
-    inv_error_t result;
-
-    unsigned char regs[12] = { 0 };
-    unsigned char maxVal = 0;
-    unsigned char tmpPtr = 0;
-    unsigned char tmpSign = 0;
-    unsigned char i = 0;
-    int sf = 0;
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (mldl_cfg->gyro_sens_trim != 0) {
-        /* adjust the declared range to consider the gyro_sens_trim
-           of this part when different from the default (first dividend) */
-        range *= (32768.f / 250) / mldl_cfg->gyro_sens_trim;
-    }
-
-    scale = range / 32768.f;    // inverse of sensitivity for the given full scale range
-    inv_obj.gyro_sens = (long)(range * 32768L);
-
-    for (kk = 0; kk < 9; ++kk) {
-        inv_obj.gyro_cal[kk] = (long)(scale * orientation[kk] * (1L << 30));
-        inv_obj.gyro_orient[kk] = (long)((double)orientation[kk] * (1L << 30));
-    }
-
-    {
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-        unsigned char tmpD = DINA4C;
-        unsigned char tmpE = DINACD;
-        unsigned char tmpF = DINA6C;
-#else
-        unsigned char tmpD = DINAC9;
-        unsigned char tmpE = DINA2C;
-        unsigned char tmpF = DINACB;
-#endif
-        regs[3] = DINA36;
-        regs[4] = DINA56;
-        regs[5] = DINA76;
-
-        for (i = 0; i < 3; i++) {
-            maxVal = 0;
-            tmpSign = 0;
-            if (inv_obj.gyro_orient[0 + 3 * i] < 0)
-                tmpSign = 1;
-            if (ABS(inv_obj.gyro_orient[1 + 3 * i]) >
-                ABS(inv_obj.gyro_orient[0 + 3 * i])) {
-                maxVal = 1;
-                if (inv_obj.gyro_orient[1 + 3 * i] < 0)
-                    tmpSign = 1;
-            }
-            if (ABS(inv_obj.gyro_orient[2 + 3 * i]) >
-                ABS(inv_obj.gyro_orient[1 + 3 * i])) {
-                tmpSign = 0;
-                maxVal = 2;
-                if (inv_obj.gyro_orient[2 + 3 * i] < 0)
-                    tmpSign = 1;
-            }
-            if (maxVal == 0) {
-                regs[tmpPtr++] = tmpD;
-                if (tmpSign)
-                    regs[tmpPtr + 2] |= 0x01;
-            } else if (maxVal == 1) {
-                regs[tmpPtr++] = tmpE;
-                if (tmpSign)
-                    regs[tmpPtr + 2] |= 0x01;
-            } else {
-                regs[tmpPtr++] = tmpF;
-                if (tmpSign)
-                    regs[tmpPtr + 2] |= 0x01;
-            }
-        }
-        result = inv_set_mpu_memory(KEY_FCFG_1, 3, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_set_mpu_memory(KEY_FCFG_3, 3, &regs[3]);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        //sf = (gyroSens) * (0.5 * (pi/180) / 200.0) * 16384
-        inv_obj.gyro_sf =
-            (long)(((long long)inv_obj.gyro_sens * 767603923LL) / 1073741824LL);
-        result =
-            inv_set_mpu_memory(KEY_D_0_104, 4,
-                               inv_int32_to_big8(inv_obj.gyro_sf, regs));
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        if (inv_obj.gyro_sens != 0) {
-            sf = (long)((long long)23832619764371LL / inv_obj.gyro_sens);
-        } else {
-            sf = 0;
-        }
-
-        result = inv_set_mpu_memory(KEY_D_0_24, 4, inv_int32_to_big8(sf, regs));
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Sets up the Compass calibration and scale factor.
- *
- *          Please refer to the provided "9-Axis Sensor Fusion Application
- *          Note" document provided.  Section 5, "Sensor Mounting Orientation"
- *          offers a good coverage on the mounting matrices and explains
- *          how to use them.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *  @pre    inv_dmp_start() must have <b>NOT</b> been called.
- *
- *  @see    inv_set_gyro_calibration().
- *  @see    inv_set_accel_calibration().
- *
- *  @param[in] range
- *                  The range of the compass.
- *  @param[in] orientation
- *                  A 9 element matrix that represents how the compass is
- *                  oriented with respect to the device they are mounted in.
- *                  A typical set of values are {1, 0, 0, 0, 1, 0, 0, 0, 1}.
- *                  This example corresponds to a 3 x 3 identity matrix.
- *                  The matrix describes how to go from the chip mounting to
- *                  the body of the device.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_compass_calibration(float range, signed char *orientation)
-{
-    INVENSENSE_FUNC_START;
-    float cal[9];
-    float scale = range / 32768.f;
-    int kk;
-    unsigned short compassId = 0;
-
-    compassId = inv_get_compass_id();
-
-    if ((compassId == COMPASS_ID_YAS529) || (compassId == COMPASS_ID_HMC5883)
-        || (compassId == COMPASS_ID_LSM303M)) {
-        scale /= 32.0f;
-    }
-
-    for (kk = 0; kk < 9; ++kk) {
-        cal[kk] = scale * orientation[kk];
-        inv_obj.compass_cal[kk] = (long)(cal[kk] * (float)(1L << 30));
-    }
-
-    inv_obj.compass_sens = (long)(scale * 1073741824L);
-
-    if (inv_dmpkey_supported(KEY_CPASS_MTX_00)) {
-        unsigned char reg0[4] = { 0, 0, 0, 0 };
-        unsigned char regp[4] = { 64, 0, 0, 0 };
-        unsigned char regn[4] = { 64 + 128, 0, 0, 0 };
-        unsigned char *reg;
-        int_fast8_t kk;
-        unsigned short keyList[9] =
-            { KEY_CPASS_MTX_00, KEY_CPASS_MTX_01, KEY_CPASS_MTX_02,
-            KEY_CPASS_MTX_10, KEY_CPASS_MTX_11, KEY_CPASS_MTX_12,
-            KEY_CPASS_MTX_20, KEY_CPASS_MTX_21, KEY_CPASS_MTX_22
-        };
-
-        for (kk = 0; kk < 9; ++kk) {
-
-            if (orientation[kk] == 1)
-                reg = regp;
-            else if (orientation[kk] == -1)
-                reg = regn;
-            else
-                reg = reg0;
-            inv_set_mpu_memory(keyList[kk], 4, reg);
-        }
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
-* @internal
-* @brief Sets the Gyro Dead Zone based upon LPF filter settings and Control setup.
-*/
-inv_error_t inv_set_dead_zone(void)
-{
-    unsigned char reg;
-    inv_error_t result;
-    extern struct control_params cntrl_params;
-
-    if (cntrl_params.functions & INV_DEAD_ZONE) {
-        reg = 0x08;
-    } else {
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-        reg = 0;
-#else
-        if (inv_params_obj.bias_mode & INV_BIAS_FROM_LPF) {
-            reg = 0x2;
-        } else {
-            reg = 0;
-        }
-#endif
-    }
-
-    result = inv_set_mpu_memory(KEY_D_0_163, 1, &reg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- *  @brief  inv_set_bias_update is used to register which algorithms will be
- *          used to automatically reset the gyroscope bias.
- *          The engine INV_BIAS_UPDATE must be enabled for these algorithms to
- *          run.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start()
- *          must <b>NOT</b> have been called.
- *
- *  @param  function    A function or bitwise OR of functions that determine
- *                      how the gyroscope bias will be automatically updated.
- *                      Functions include:
- *                      - INV_NONE or 0,
- *                      - INV_BIAS_FROM_NO_MOTION,
- *                      - INV_BIAS_FROM_GRAVITY,
- *                      - INV_BIAS_FROM_TEMPERATURE,
-                    \ifnot UMPL
- *                      - INV_BIAS_FROM_LPF,
- *                      - INV_MAG_BIAS_FROM_MOTION,
- *                      - INV_MAG_BIAS_FROM_GYRO,
- *                      - INV_ALL.
- *                   \endif
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_bias_update(unsigned short function)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[4];
-    long tmp[3] = { 0, 0, 0 };
-    inv_error_t result = INV_SUCCESS;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    /* do not allow progressive no motion bias tracker to run -
-       it's not fully debugged */
-    function &= ~INV_PROGRESSIVE_NO_MOTION; // FIXME, workaround
-    MPL_LOGV("forcing disable of PROGRESSIVE_NO_MOTION bias tracker\n");
-
-    // You must use EnableFastNoMotion() to get this feature
-    function &= ~INV_BIAS_FROM_FAST_NO_MOTION;
-
-    // You must use DisableFastNoMotion() to turn this feature off
-    if (inv_params_obj.bias_mode & INV_BIAS_FROM_FAST_NO_MOTION)
-        function |= INV_BIAS_FROM_FAST_NO_MOTION;
-
-    /*--- remove magnetic components from bias tracking
-          if there is no compass ---*/
-    if (!inv_compass_present()) {
-        function &= ~(INV_MAG_BIAS_FROM_GYRO | INV_MAG_BIAS_FROM_MOTION);
-    } else {
-        function &= ~(INV_BIAS_FROM_LPF);
-    }
-
-    // Enable function sets bias from no motion
-    inv_params_obj.bias_mode = function & (~INV_BIAS_FROM_NO_MOTION);
-
-    if (function & INV_BIAS_FROM_NO_MOTION) {
-        inv_enable_bias_no_motion();
-    } else {
-        inv_disable_bias_no_motion();
-    }
-
-    if (inv_params_obj.bias_mode & INV_BIAS_FROM_LPF) {
-        regs[0] = DINA80 + 2;
-        regs[1] = DINA2D;
-        regs[2] = DINA55;
-        regs[3] = DINA7D;
-    } else {
-        regs[0] = DINA80 + 7;
-        regs[1] = DINA2D;
-        regs[2] = DINA35;
-        regs[3] = DINA3D;
-    }
-    result = inv_set_mpu_memory(KEY_FCFG_5, 4, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_dead_zone();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if ((inv_params_obj.bias_mode & INV_BIAS_FROM_GRAVITY) &&
-        !inv_compass_present()) {
-        result = inv_set_gyro_data_source(INV_GYRO_FROM_QUATERNION);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    } else {
-        result = inv_set_gyro_data_source(INV_GYRO_FROM_RAW);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    inv_obj.factory_temp_comp = 0;  // FIXME, workaround
-    if ((mldl_cfg->offset_tc[0] != 0) ||
-        (mldl_cfg->offset_tc[1] != 0) || (mldl_cfg->offset_tc[2] != 0)) {
-        inv_obj.factory_temp_comp = 1;
-    }
-
-    if (inv_obj.factory_temp_comp == 0) {
-        if (inv_params_obj.bias_mode & INV_BIAS_FROM_TEMPERATURE) {
-            result = inv_set_gyro_temp_slope(inv_obj.temp_slope);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        } else {
-            result = inv_set_gyro_temp_slope(tmp);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-    } else {
-        inv_params_obj.bias_mode &= ~INV_LEARN_BIAS_FROM_TEMPERATURE;
-        MPL_LOGV("factory temperature compensation coefficients available - "
-                 "disabling INV_LEARN_BIAS_FROM_TEMPERATURE\n");
-    }
-
-    /*---- hard requirement for using bias tracking BIAS_FROM_GRAVITY, relying on
-           compass and accel data, is to have accelerometer data delivered in the
-           FIFO ----*/
-    if (((inv_params_obj.bias_mode & INV_BIAS_FROM_GRAVITY)
-         && inv_compass_present())
-        || (inv_params_obj.bias_mode & INV_MAG_BIAS_FROM_GYRO)
-        || (inv_params_obj.bias_mode & INV_MAG_BIAS_FROM_MOTION)) {
-        inv_send_accel(INV_ALL, INV_32_BIT);
-        inv_send_gyro(INV_ALL, INV_32_BIT);
-    }
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_motion_state is used to determine if the device is in
- *          a 'motion' or 'no motion' state.
- *          inv_get_motion_state returns INV_MOTION of the device is moving,
- *          or INV_NO_MOTION if the device is not moving.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start()
- *          must have been called.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-int inv_get_motion_state(void)
-{
-    INVENSENSE_FUNC_START;
-    return inv_obj.motion_state;
-}
-
-/**
- *  @brief  inv_set_no_motion_thresh is used to set the threshold for
- *          detecting INV_NO_MOTION
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  thresh  A threshold scaled in degrees per second.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_no_motion_thresh(float thresh)
-{
-    inv_error_t result = INV_SUCCESS;
-    unsigned char regs[4] = { 0 };
-    long tmp;
-    INVENSENSE_FUNC_START;
-
-    tmp = (long)(thresh * thresh * 2.045f);
-    if (tmp < 0) {
-        return INV_ERROR;
-    } else if (tmp > 8180000L) {
-        return INV_ERROR;
-    }
-    inv_obj.no_motion_threshold = tmp;
-
-    regs[0] = (unsigned char)(tmp >> 24);
-    regs[1] = (unsigned char)((tmp >> 16) & 0xff);
-    regs[2] = (unsigned char)((tmp >> 8) & 0xff);
-    regs[3] = (unsigned char)(tmp & 0xff);
-
-    result = inv_set_mpu_memory(KEY_D_1_108, 4, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_reset_motion();
-    return result;
-}
-
-/**
- *  @brief  inv_set_no_motion_threshAccel is used to set the threshold for
- *          detecting INV_NO_MOTION with accelerometers when Gyros have
- *          been turned off
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  thresh  A threshold in g's scaled by 2^32
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_no_motion_threshAccel(long thresh)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_obj.no_motion_accel_threshold = thresh;
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_no_motion_time is used to set the time required for
- *          detecting INV_NO_MOTION
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  time    A time in seconds.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_no_motion_time(float time)
-{
-    inv_error_t result = INV_SUCCESS;
-    unsigned char regs[2] = { 0 };
-    long tmp;
-
-    INVENSENSE_FUNC_START;
-
-    tmp = (long)(time * 200);
-    if (tmp < 0) {
-        return INV_ERROR;
-    } else if (tmp > 65535L) {
-        return INV_ERROR;
-    }
-    inv_obj.motion_duration = (unsigned short)tmp;
-
-    regs[0] = (unsigned char)((inv_obj.motion_duration >> 8) & 0xff);
-    regs[1] = (unsigned char)(inv_obj.motion_duration & 0xff);
-    result = inv_set_mpu_memory(KEY_D_1_106, 2, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_reset_motion();
-    return result;
-}
-
-/**
- *  @brief  inv_get_version is used to get the ML version.
- *
- *  @pre    inv_get_version can be called at any time.
- *
- *  @param  version     inv_get_version writes the ML version
- *                      string pointer to version.
- *
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_get_version(unsigned char **version)
-{
-    INVENSENSE_FUNC_START;
-
-    *version = (unsigned char *)mlVer;  //fixme we are wiping const
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief Check for the presence of the gyro sensor.
- *
- * This is not a physical check but a logical check and the value can change
- * dynamically based on calls to inv_set_mpu_sensors().
- *
- * @return  TRUE if the gyro is enabled FALSE otherwise.
- */
-int inv_get_gyro_present(void)
-{
-    return inv_get_dl_config()->requested_sensors & (INV_X_GYRO | INV_Y_GYRO |
-                                                     INV_Z_GYRO);
-}
-
-static unsigned short inv_row_2_scale(const signed char *row)
-{
-    unsigned short b;
-
-    if (row[0] > 0)
-        b = 0;
-    else if (row[0] < 0)
-        b = 4;
-    else if (row[1] > 0)
-        b = 1;
-    else if (row[1] < 0)
-        b = 5;
-    else if (row[2] > 0)
-        b = 2;
-    else if (row[2] < 0)
-        b = 6;
-    else
-        b = 7;                  // error
-    return b;
-}
-
-unsigned short inv_orientation_matrix_to_scalar(const signed char *mtx)
-{
-    unsigned short scalar;
-    /*
-       XYZ  010_001_000 Identity Matrix
-       XZY  001_010_000
-       YXZ  010_000_001
-       YZX  000_010_001
-       ZXY  001_000_010
-       ZYX  000_001_010
-     */
-
-    scalar = inv_row_2_scale(mtx);
-    scalar |= inv_row_2_scale(mtx + 3) << 3;
-    scalar |= inv_row_2_scale(mtx + 6) << 6;
-
-    return scalar;
-}
-
-/* Setups up the Freescale 16-bit accel for Sensor Fusion
-* @param[in] orient A scalar representation of the orientation
-*  that describes how to go from the Chip Orientation
-*  to the Board Orientation often times called the Body Orientation in Invensense Documentation.
-*  inv_orientation_matrix_to_scalar() will turn the transformation matrix into this scalar.
-*/
-inv_error_t inv_freescale_sensor_fusion_16bit(unsigned short orient)
-{
-    unsigned char rr[3];
-    inv_error_t result;
-
-    orient = orient & 0xdb;
-    switch (orient) {
-    default:
-        // Typically 0x88
-        rr[0] = DINACC;
-        rr[1] = DINACF;
-        rr[2] = DINA0E;
-        break;
-    case 0x50:
-        rr[0] = DINACE;
-        rr[1] = DINA0E;
-        rr[2] = DINACD;
-        break;
-    case 0x81:
-        rr[0] = DINACE;
-        rr[1] = DINACB;
-        rr[2] = DINA0E;
-        break;
-    case 0x11:
-        rr[0] = DINACC;
-        rr[1] = DINA0E;
-        rr[2] = DINACB;
-        break;
-    case 0x42:
-        rr[0] = DINA0A;
-        rr[1] = DINACF;
-        rr[2] = DINACB;
-        break;
-    case 0x0a:
-        rr[0] = DINA0A;
-        rr[1] = DINACB;
-        rr[2] = DINACD;
-        break;
-    }
-    result = inv_set_mpu_memory(KEY_FCFG_AZ, 3, rr);
-    return result;
-}
-
-/* Setups up the Freescale 8-bit accel for Sensor Fusion
-* @param[in] orient A scalar representation of the orientation
-*  that describes how to go from the Chip Orientation
-*  to the Board Orientation often times called the Body Orientation in Invensense Documentation.
-*  inv_orientation_matrix_to_scalar() will turn the transformation matrix into this scalar.
-*/
-inv_error_t inv_freescale_sensor_fusion_8bit(unsigned short orient)
-{
-    unsigned char regs[27];
-    inv_error_t result;
-    uint_fast8_t kk;
-
-    orient = orient & 0xdb;
-    kk = 0;
-
-    regs[kk++] = DINAC3;
-    regs[kk++] = DINA90 + 14;
-    regs[kk++] = DINAA0 + 9;
-    regs[kk++] = DINA3E;
-    regs[kk++] = DINA5E;
-    regs[kk++] = DINA7E;
-
-    regs[kk++] = DINAC2;
-    regs[kk++] = DINAA0 + 9;
-    regs[kk++] = DINA90 + 9;
-    regs[kk++] = DINAF8 + 2;
-
-    switch (orient) {
-    default:
-        // Typically 0x88
-        regs[kk++] = DINACB;
-
-        regs[kk++] = DINA54;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-
-        regs[kk++] = DINACD;
-        break;
-    case 0x50:
-        regs[kk++] = DINACB;
-
-        regs[kk++] = DINACF;
-
-        regs[kk++] = DINA7C;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        break;
-    case 0x81:
-        regs[kk++] = DINA2C;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-
-        regs[kk++] = DINACD;
-
-        regs[kk++] = DINACB;
-        break;
-    case 0x11:
-        regs[kk++] = DINA2C;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINA28;
-        regs[kk++] = DINACB;
-        regs[kk++] = DINACF;
-        break;
-    case 0x42:
-        regs[kk++] = DINACF;
-        regs[kk++] = DINACD;
-
-        regs[kk++] = DINA7C;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        regs[kk++] = DINA78;
-        break;
-    case 0x0a:
-        regs[kk++] = DINACD;
-
-        regs[kk++] = DINA54;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-        regs[kk++] = DINA50;
-
-        regs[kk++] = DINACF;
-        break;
-    }
-
-    regs[kk++] = DINA90 + 7;
-    regs[kk++] = DINAF8 + 3;
-    regs[kk++] = DINAA0 + 9;
-    regs[kk++] = DINA0E;
-    regs[kk++] = DINA0E;
-    regs[kk++] = DINA0E;
-
-    regs[kk++] = DINAF8 + 1;    // filler
-
-    result = inv_set_mpu_memory(KEY_FCFG_FSCALE, kk, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/**
- * Controlls each sensor and each axis when the motion processing unit is
- * running.  When it is not running, simply records the state for later.
- *
- * NOTE: In this version only full sensors controll is allowed.  Independent
- * axis control will return an error.
- *
- * @param sensors Bit field of each axis desired to be turned on or off
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_set_mpu_sensors(unsigned long sensors)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char state = inv_get_state();
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    inv_error_t result = INV_SUCCESS;
-    unsigned short fifoRate;
-
-    if (state < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (((sensors & INV_THREE_AXIS_ACCEL) != INV_THREE_AXIS_ACCEL) &&
-        ((sensors & INV_THREE_AXIS_ACCEL) != 0)) {
-        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    }
-    if (((sensors & INV_THREE_AXIS_ACCEL) != 0) &&
-        (mldl_cfg->pdata->accel.get_slave_descr == 0)) {
-        return INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED;
-    }
-
-    if (((sensors & INV_THREE_AXIS_COMPASS) != INV_THREE_AXIS_COMPASS) &&
-        ((sensors & INV_THREE_AXIS_COMPASS) != 0)) {
-        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    }
-    if (((sensors & INV_THREE_AXIS_COMPASS) != 0) &&
-        (mldl_cfg->pdata->compass.get_slave_descr == 0)) {
-        return INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED;
-    }
-
-    if (((sensors & INV_THREE_AXIS_PRESSURE) != INV_THREE_AXIS_PRESSURE) &&
-        ((sensors & INV_THREE_AXIS_PRESSURE) != 0)) {
-        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    }
-    if (((sensors & INV_THREE_AXIS_PRESSURE) != 0) &&
-        (mldl_cfg->pdata->pressure.get_slave_descr == 0)) {
-        return INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED;
-    }
-
-    /* DMP was off, and is turning on */
-    if (sensors & INV_DMP_PROCESSOR &&
-        !(mldl_cfg->requested_sensors & INV_DMP_PROCESSOR)) {
-        struct ext_slave_config config;
-        long odr;
-        config.key = MPU_SLAVE_CONFIG_ODR_RESUME;
-        config.len = sizeof(long);
-        config.apply = (state == INV_STATE_DMP_STARTED);
-        config.data = &odr;
-
-        odr = (inv_mpu_get_sampling_rate_hz(mldl_cfg) * 1000);
-        result = inv_mpu_config_accel(mldl_cfg,
-                                      inv_get_serial_handle(),
-                                      inv_get_serial_handle(), &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        config.key = MPU_SLAVE_CONFIG_IRQ_RESUME;
-        odr = MPU_SLAVE_IRQ_TYPE_NONE;
-        result = inv_mpu_config_accel(mldl_cfg,
-                                      inv_get_serial_handle(),
-                                      inv_get_serial_handle(), &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        inv_init_fifo_hardare();
-    }
-
-    if (inv_obj.mode_change_func) {
-        result = inv_obj.mode_change_func(mldl_cfg->requested_sensors, sensors);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    /* Get the fifo rate before changing sensors so if we need to match it */
-    fifoRate = inv_get_fifo_rate();
-    mldl_cfg->requested_sensors = sensors;
-
-    /* inv_dmp_start will turn the sensors on */
-    if (state == INV_STATE_DMP_STARTED) {
-        result = inv_dl_start(sensors);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_reset_motion();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_dl_stop(~sensors);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    inv_set_fifo_rate(fifoRate);
-
-    if (!(sensors & INV_DMP_PROCESSOR) && (sensors & INV_THREE_AXIS_ACCEL)) {
-        struct ext_slave_config config;
-        long data;
-
-        config.len = sizeof(long);
-        config.key = MPU_SLAVE_CONFIG_IRQ_RESUME;
-        config.apply = (state == INV_STATE_DMP_STARTED);
-        config.data = &data;
-        data = MPU_SLAVE_IRQ_TYPE_DATA_READY;
-        result = inv_mpu_config_accel(mldl_cfg,
-                                      inv_get_serial_handle(),
-                                      inv_get_serial_handle(), &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    return result;
-}
-
-void inv_set_mode_change(inv_error_t(*mode_change_func)
-                         (unsigned long, unsigned long))
-{
-    inv_obj.mode_change_func = mode_change_func;
-}
-
-/**
-* Mantis setup
-*/
-#ifdef CONFIG_MPU_SENSORS_MPU6050B1
-inv_error_t inv_set_mpu_6050_config()
-{
-    long temp;
-    inv_error_t result;
-    unsigned char big8[4];
-    unsigned char atc[4];
-    long s[3], s2[3];
-    int kk;
-    struct mldl_cfg *mldlCfg = inv_get_dl_config();
-
-    result = inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                             0x0d, 4, atc);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    temp = atc[3] & 0x3f;
-    if (temp >= 32)
-        temp = temp - 64;
-    temp = (temp << 21) | 0x100000;
-    temp += (1L << 29);
-    temp = -temp;
-    result = inv_set_mpu_memory(KEY_D_ACT0, 4, inv_int32_to_big8(temp, big8));
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    for (kk = 0; kk < 3; ++kk) {
-        s[kk] = atc[kk] & 0x3f;
-        if (s[kk] > 32)
-            s[kk] = s[kk] - 64;
-        s[kk] *= 2516582L;
-    }
-
-    for (kk = 0; kk < 3; ++kk) {
-        s2[kk] = mldlCfg->pdata->orientation[kk * 3] * s[0] +
-            mldlCfg->pdata->orientation[kk * 3 + 1] * s[1] +
-            mldlCfg->pdata->orientation[kk * 3 + 2] * s[2];
-    }
-    result = inv_set_mpu_memory(KEY_D_ACSX, 4, inv_int32_to_big8(s2[0], big8));
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_mpu_memory(KEY_D_ACSY, 4, inv_int32_to_big8(s2[1], big8));
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_mpu_memory(KEY_D_ACSZ, 4, inv_int32_to_big8(s2[2], big8));
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-#endif
-
-/**
- * @}
- */
diff --git a/60xx/mlsdk/mllite/ml.h b/60xx/mlsdk/mllite/ml.h
deleted file mode 100644
index 838cd49..0000000
--- a/60xx/mlsdk/mllite/ml.h
+++ /dev/null
@@ -1,596 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- *
- * $Id: ml.h 5653 2011-06-16 21:06:55Z nroyer $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup ML
- *  @brief  The Motion Library processes gyroscopes and accelerometers to
- *          provide a physical model of the movement of the sensors.
- *          The results of this processing may be used to control objects
- *          within a user interface environment, detect gestures, track 3D
- *          movement for gaming applications, and analyze the blur created
- *          due to hand movement while taking a picture.
- *
- *  @{
- *      @file ml.h
- *      @brief Header file for the Motion Library.
-**/
-
-#ifndef INV_H
-#define INV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#include "mldmp.h"
-#include "mlsl.h"
-#include "mpu.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "ml_legacy.h"
-#endif
-
-/* ------------ */
-/* - Defines. - */
-/* ------------ */
-
-/* - Module defines. - */
-
-/*************************************************************************/
-/*  Motion Library Vesion                                                */
-/*************************************************************************/
-
-#define INV_VERSION_MAJOR                 4
-#define INV_VERSION_MINOR                 0
-#define INV_VERSION_SUB_MINOR             0
-
-#define INV_VERSION_MAJOR_STR            "4"
-#define INV_VERSION_MINOR_STR            "0"
-#define INV_VERSION_SUB_MINOR_STR        "0"
-
-#define INV_VERSION_NONE                 ""
-#define INV_VERSION_PROTOTYPE            "ProtoA "
-#define INV_VERSION_ENGINEERING          "EngA "
-#define INV_VERSION_PRE_ALPHA            "Pre-Alpha "
-#define INV_VERSION_ALPHA                "Alpha "
-#define INV_VERSION_BETA                 "Beta "
-#define INV_VERSION_PRODUCTION           "Production "
-
-#ifndef INV_VERSION_TYPE
-#define INV_VERSION_TYPE INV_VERSION_NONE
-#endif
-
-#define INV_VERSION  "InvenSense MPL" " " \
-    "v" INV_VERSION_MAJOR_STR "." INV_VERSION_MINOR_STR "." INV_VERSION_SUB_MINOR_STR " " \
-    INV_VERSION_TYPE \
-    __DATE__ " " __TIME__
-
-/*************************************************************************/
-/*  Motion processing engines                                            */
-/*************************************************************************/
-#define INV_MOTION_DETECT                (0x0004)
-#define INV_BIAS_UPDATE                  (0x0008)
-#define INV_GESTURE                      (0x0020)
-#define INV_CONTROL                      (0x0040)
-#define INV_ORIENTATION                  (0x0100)
-#define INV_PEDOMETER                    (0x0200)
-#define INV_BASIC                        (INV_MOTION_DETECT | INV_BIAS_UPDATE)
-
-/*************************************************************************/
-/*  Data Source - Obsolete                                               */
-/*************************************************************************/
-#define INV_DATA_FIFO                    (0x1)
-#define INV_DATA_POLL                    (0x2)
-
-/*************************************************************************/
-/*  Interrupt Source                                                     */
-/*************************************************************************/
-#define INV_INT_MOTION                   (0x01)
-#define INV_INT_FIFO                     (0x02)
-#define INV_INT_TAP                      (0x04)
-#define INV_INT_ORIENTATION              (0x08)
-#define INV_INT_SHAKE_PITCH              (0x10)
-#define INV_INT_SHAKE_ROLL               (0x20)
-#define INV_INT_SHAKE_YAW                (0x40)
-
-/*************************************************************************/
-/*  Bias update functions                                                */
-/*************************************************************************/
-#define INV_BIAS_FROM_NO_MOTION          0x0001
-#define INV_BIAS_FROM_GRAVITY            0x0002
-#define INV_BIAS_FROM_TEMPERATURE        0x0004
-#define INV_BIAS_FROM_LPF                0x0008
-#define INV_MAG_BIAS_FROM_MOTION         0x0010
-#define INV_MAG_BIAS_FROM_GYRO           0x0020
-#define INV_LEARN_BIAS_FROM_TEMPERATURE  0x0040
-#define INV_AUTO_RESET_MAG_BIAS          0x0080
-#define INV_REJECT_MAG_DISTURBANCE       0x0100
-#define INV_PROGRESSIVE_NO_MOTION        0x0200
-#define INV_BIAS_FROM_FAST_NO_MOTION     0x0400
-
-/*************************************************************************/
-/*  Euler angles and axis names                                          */
-/*************************************************************************/
-#define INV_X_AXIS                       (0x01)
-#define INV_Y_AXIS                       (0x02)
-#define INV_Z_AXIS                       (0x04)
-
-#define INV_PITCH                        (INV_X_AXIS)
-#define INV_ROLL                         (INV_Y_AXIS)
-#define INV_YAW                          (INV_Z_AXIS)
-
-/*************************************************************************/
-/*  Sensor types                                                         */
-/*************************************************************************/
-#define INV_GYROS                        0x0001
-#define INV_ACCELS                       0x0002
-
-/*************************************************************************/
-/*  Motion arrays                                                        */
-/*************************************************************************/
-#define INV_ROTATION_MATRIX              0x0003
-#define INV_QUATERNION                   0x0004
-#define INV_EULER_ANGLES                 0x0005
-#define INV_LINEAR_ACCELERATION          0x0006
-#define INV_LINEAR_ACCELERATION_WORLD    0x0007
-#define INV_GRAVITY                      0x0008
-#define INV_ANGULAR_VELOCITY             0x0009
-
-#define INV_GYRO_CALIBRATION_MATRIX      0x000B
-#define INV_ACCEL_CALIBRATION_MATRIX     0x000C
-#define INV_GYRO_BIAS                    0x000D
-#define INV_ACCEL_BIAS                   0x000E
-#define INV_GYRO_TEMP_SLOPE              0x000F
-
-#define INV_RAW_DATA                     0x0011
-#define INV_DMP_TAP                      0x0012
-#define INV_DMP_TAP2                     0x0021
-
-#define INV_EULER_ANGLES_X               0x0013
-#define INV_EULER_ANGLES_Y               0x0014
-#define INV_EULER_ANGLES_Z               0x0015
-
-#define INV_BIAS_UNCERTAINTY             0x0016
-#define INV_DMP_PACKET_NUMBER            0x0017
-#define INV_FOOTER                       0x0018
-
-#define INV_CONTROL_DATA                 0x0019
-
-#define INV_MAGNETOMETER                 0x001A
-#define INV_PEDLBS                       0x001B
-#define INV_MAG_RAW_DATA                 0x001C
-#define INV_MAG_CALIBRATION_MATRIX       0x001D
-#define INV_MAG_BIAS                     0x001E
-#define INV_HEADING                      0x001F
-
-#define INV_MAG_BIAS_ERROR               0x0020
-
-#define INV_PRESSURE                     0x0021
-#define INV_LOCAL_FIELD                  0x0022
-#define INV_MAG_SCALE                    0x0023
-
-#define INV_RELATIVE_QUATERNION          0x0024
-
-#define SET_QUATERNION                                  0x0001
-#define SET_GYROS                                       0x0002
-#define SET_LINEAR_ACCELERATION                         0x0004
-#define SET_GRAVITY                                     0x0008
-#define SET_ACCELS                                      0x0010
-#define SET_TAP                                         0x0020
-#define SET_PEDLBS                                      0x0040
-#define SET_LINEAR_ACCELERATION_WORLD                   0x0080
-#define SET_CONTROL                                     0x0100
-#define SET_PACKET_NUMBER                               0x4000
-#define SET_FOOTER                                      0x8000
-
-/*************************************************************************/
-/*  Integral reset options                                               */
-/*************************************************************************/
-#define INV_NO_RESET                     0x0000
-#define INV_RESET                        0x0001
-
-/*************************************************************************/
-/*  Motion states                                                        */
-/*************************************************************************/
-#define INV_MOTION                       0x0001
-#define INV_NO_MOTION                    0x0002
-
-/*************************************************************************/
-/* Orientation and Gesture states                                        */
-/*************************************************************************/
-#define INV_STATE_IDLE                   (0)
-#define INV_STATE_RUNNING                (1)
-
-/*************************************************************************/
-/* Gyroscope Temperature Compensation bins                               */
-/*************************************************************************/
-#define BINS                            (25)
-#define PTS_PER_BIN                     (5)
-#define MIN_TEMP                        (-40)
-#define MAX_TEMP                        (+85)
-#define TEMP_PER_BIN                    ((MAX_TEMP - MIN_TEMP) / BINS)
-
-/*************************************************************************/
-/*  Flags                                                                */
-/*************************************************************************/
-#define INV_RAW_DATA_READY               0x0001
-#define INV_PROCESSED_DATA_READY         0x0002
-
-#define INV_GOT_GESTURE                  0x0004
-
-#define INV_MOTION_STATE_CHANGE          0x0006
-#define INV_COMPASS_OFFSET_VALID         0x0007
-
-/*************************************************************************/
-/*  General                                                              */
-/*************************************************************************/
-#define INV_NONE                         (0x0000)
-#define INV_INVALID_FIFO_RATE            (0xFFFF)
-
-/*************************************************************************/
-/*  ML Params Structure Default Values                                   */
-/*************************************************************************/
-#define INV_BIAS_UPDATE_FUNC_DEFAULT               (INV_BIAS_FROM_NO_MOTION | INV_BIAS_FROM_GRAVITY)
-#define INV_ORIENTATION_MASK_DEFAULT               0x3f
-#define INV_PROCESSED_DATA_CALLBACK_DEFAULT           0
-#define INV_ORIENTATION_CALLBACK_DEFAULT              0
-#define INV_MOTION_CALLBACK_DEFAULT                   0
-
-/* ------------ */
-/* - Defines. - */
-/* ------------ */
-/* Priority for various features */
-#define INV_PRIORITY_BUS_ACCEL              100
-#define INV_PRIORITY_EXTERNAL_SLAVE_MAG     110
-#define INV_PRIORITY_FAST_NO_MOTION         120
-#define INV_PRIORITY_BIAS_NO_MOTION         125
-#define INV_PRIORITY_SET_GYRO_BIASES        150
-#define INV_PRIORITY_TEMP_COMP              175
-#define INV_PRIORITY_CONTROL                200
-#define INV_PRIORITY_EIS                    300
-#define INV_PRIORITY_ORIENTATION            400
-#define INV_PRIORITY_PEDOMETER_FULLPOWER    500
-#define INV_PRIORITY_NAVIGATION_PEDOMETER   600
-#define INV_PRIORITY_GESTURE                700
-#define INV_PRIORITY_GLYPH                  800
-
-#define MAX_INTERRUPT_PROCESSES 5
-/* Number of quantized accel samples */
-#define INV_MAX_NUM_ACCEL_SAMPLES (8)
-
-#define PRECISION 10000.f
-#define RANGE_FLOAT_TO_FIXEDPOINT(range, x) {               \
-    range.mantissa = (long)x;                               \
-    range.fraction = (long)((float)(x-(long)x)*PRECISION);  \
-}
-#define RANGE_FIXEDPOINT_TO_FLOAT(range, x) {   \
-    x = (float)(range.mantissa);                \
-    x += ((float)range.fraction/PRECISION);     \
-}
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-struct inv_obj_t {
-        //Calibration parameters
-        /* Raw sensor orientation */
-        long gyro_bias[3];
-        long accel_bias[3];
-        long compass_bias[3];
-
-        /* Cached values after orietnation is applied */
-        long scaled_gyro_bias[3];
-        long scaled_accel_bias[3];
-        long scaled_compass_bias[3];
-
-        long compass_scale[3];
-        long compass_test_bias[3];
-        long compass_test_scale[3];
-        long compass_asa[3];
-        long compass_offsets[3];
-
-        long compass_bias_error[3];
-
-        long got_no_motion_bias;
-        long got_compass_bias;
-        long compass_state;
-        long large_field;
-        long acc_state;
-
-        long factory_temp_comp;
-        long got_coarse_heading;
-        long gyro_temp_bias[3];
-        long prog_no_motion_bias[3];
-
-        long accel_cal[9];
-        // Deprecated, used gyro_orient
-        long gyro_cal[GYRO_NUM_AXES * GYRO_NUM_AXES];
-        long gyro_orient[GYRO_NUM_AXES * GYRO_NUM_AXES];
-        long accel_sens;
-        long compass_cal[9];
-        long gyro_sens;
-        long gyro_sf;
-        long temp_slope[GYRO_NUM_AXES];
-        long compass_sens;
-        long temp_offset[GYRO_NUM_AXES];
-
-        int cal_loaded_flag;
-
-        /* temperature compensation */
-        float x_gyro_coef[3];
-        float y_gyro_coef[3];
-        float z_gyro_coef[3];
-        float x_gyro_temp_data[BINS][PTS_PER_BIN];
-        float y_gyro_temp_data[BINS][PTS_PER_BIN];
-        float z_gyro_temp_data[BINS][PTS_PER_BIN];
-        float temp_data[BINS][PTS_PER_BIN];
-        int temp_ptrs[BINS];
-        long temp_valid_data[BINS];
-
-        long compass_correction[4];
-        long compass_correction_relative[4];
-        long compass_disturb_correction[4];
-        long compass_correction_offset[4];
-        long relative_quat[4];
-        long local_field[3];
-        long new_local_field;
-        long sync_grav_body[3];
-        int gyro_bias_err;
-
-        double compass_bias_ptr[9];
-        double compass_bias_v[3];
-        double compass_prev_m[36];
-        double compass_prev_xty[6];
-
-        int compass_peaks[18];
-        int all_sensors_no_motion;
-
-        long init_compass_bias[3];
-
-        int got_init_compass_bias;
-        int resetting_compass;
-
-        long ang_v_body[GYRO_NUM_AXES];
-        unsigned char compass_raw_data[24]; /* Sensor data plus status etc */
-        long compass_sensor_data[3]; /* Raw sensor data only */
-        long compass_calibrated_data[3];
-        long compass_test_calibrated_data[3];
-        long pressure;
-        inv_error_t (*external_slave_callback)(struct inv_obj_t *);
-        int  compass_accuracy;
-        int compass_overunder;
-
-        unsigned short flags[8];
-        unsigned short suspend;
-
-        long no_motion_threshold;
-        unsigned long motion_duration;
-
-        unsigned short motion_state;
-
-        unsigned short data_mode;
-        unsigned short interrupt_sources;
-
-        unsigned short bias_update_time;
-        short last_motion;
-        unsigned short bias_calc_time;
-
-        unsigned char internal_motion_state;
-        long start_time;
-
-        long accel_lpf_gain;
-        long accel_lpf[3];
-        unsigned long poll_no_motion;
-        long no_motion_accel_threshold;
-        unsigned long no_motion_accel_time;
-        inv_error_t(*mode_change_func) (unsigned long, unsigned long);
-    };
-
-    typedef inv_error_t(*inv_obj_func) (struct inv_obj_t *);
-
-    extern struct inv_obj_t inv_obj;
-
-    /* --------------------- */
-    /* - Params Structure. - */
-    /* --------------------- */
-
-    struct inv_params_obj {
-
-        unsigned short bias_mode;   // A function or bitwise OR of functions that determine how the gyroscope bias will be automatically updated.
-        // Functions include INV_BIAS_FROM_NO_MOTION, INV_BIAS_FROM_GRAVITY, and INV_BIAS_FROM_TEMPERATURE.
-        // The engine INV_BIAS_UPDATE must be enabled for these algorithms to run.
-
-        unsigned short orientation_mask;    // Allows a user to register which orientations will trigger the user defined callback function.
-        // The orientations are INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, and INV_Z_DOWN.
-        // INV_ORIENTATION_ALL is equivalent to INV_X_UP | INV_X_DOWN | INV_Y_UP | INV_Y_DOWN | INV_Z_UP | INV_Z_DOWN.
-
-        void (*fifo_processed_func) (void); // Callback function that triggers when all the processing has been finished by the motion processing engines.
-
-        void (*orientation_cb_func) (unsigned short orient);    // Callback function that will run when a change of orientation is detected.
-        // The new orientation. May be one of INV_X_UP, INV_X_DOWN, INV_Y_UP, INV_Y_DOWN, INV_Z_UP, or INV_Z_DOWN.
-
-        void (*motion_cb_func) (unsigned short motion_state);   // Callback function that will run when a change of motion state is detected.
-        // The new motion state. May be one of INV_MOTION, or INV_NO_MOTION.
-
-        unsigned char state;
-
-    };
-
-    extern struct inv_params_obj inv_params_obj;
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-
-    inv_error_t inv_serial_start(char const *port);
-    inv_error_t inv_serial_stop(void);
-    inv_error_t inv_set_mpu_sensors(unsigned long sensors);
-    void *inv_get_serial_handle(void);
-
-    /*API for handling the buffer */
-    inv_error_t inv_update_data(void);
-
-    /*API for handling polling */
-    int inv_check_flag(int flag);
-
-    /*API for setting bias update function */
-    inv_error_t inv_set_bias_update(unsigned short biasFunction);
-
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-    inv_error_t inv_turn_on_bias_from_no_motion(void);
-    inv_error_t inv_turn_off_bias_from_no_motion(void);
-    inv_error_t inv_set_mpu_6050_config(void);
-#endif
-
-    /* Legacy functions for handling augmented data*/
-    inv_error_t inv_get_array(int dataSet, long *data);
-    inv_error_t inv_get_float_array(int dataSet, float *data);
-    inv_error_t inv_set_array(int dataSet, long *data);
-    inv_error_t inv_set_float_array(int dataSet, float *data);
-    /* Individual functions for augmented data, per specific dataset */
-
-
-    inv_error_t inv_get_gyro(long *data);
-    inv_error_t inv_get_accel(long *data);
-    inv_error_t inv_get_temperature(long *data);
-    inv_error_t inv_get_temperature_raw(short *data);
-    inv_error_t inv_get_rot_mat(long *data);
-    inv_error_t inv_get_quaternion(long *data);
-    inv_error_t inv_get_linear_accel(long *data);
-    inv_error_t inv_get_linear_accel_in_world(long *data);
-    inv_error_t inv_get_gravity(long *data);
-    inv_error_t inv_get_angular_velocity(long *data);
-    inv_error_t inv_get_euler_angles(long *data);
-    inv_error_t inv_get_euler_angles_x(long *data);
-    inv_error_t inv_get_euler_angles_y(long *data);
-    inv_error_t inv_get_euler_angles_z(long *data);
-    inv_error_t inv_get_gyro_temp_slope(long *data);
-    inv_error_t inv_get_gyro_bias(long *data);
-    inv_error_t inv_get_accel_bias(long *data);
-    inv_error_t inv_get_mag_bias(long *data);
-    inv_error_t inv_get_gyro_and_accel_sensor(long *data);
-    inv_error_t inv_get_mag_raw_data(long *data);
-    inv_error_t inv_get_magnetometer(long *data);
-    inv_error_t inv_get_pressure(long *data);
-    inv_error_t inv_get_heading(long *data);
-    inv_error_t inv_get_gyro_cal_matrix(long *data);
-    inv_error_t inv_get_accel_cal_matrix(long *data);
-    inv_error_t inv_get_mag_cal_matrix(long *data);
-    inv_error_t inv_get_mag_bias_error(long *data);
-    inv_error_t inv_get_mag_scale(long *data);
-    inv_error_t inv_get_local_field(long *data);
-    inv_error_t inv_get_relative_quaternion(long *data);
-    inv_error_t inv_get_gyro_float(float *data);
-    inv_error_t inv_get_accel_float(float *data);
-    inv_error_t inv_get_temperature_float(float *data);
-    inv_error_t inv_get_rot_mat_float(float *data);
-    inv_error_t inv_get_quaternion_float(float *data);
-    inv_error_t inv_get_linear_accel_float(float *data);
-    inv_error_t inv_get_linear_accel_in_world_float(float *data);
-    inv_error_t inv_get_gravity_float(float *data);
-    inv_error_t inv_get_angular_velocity_float(float *data);
-    inv_error_t inv_get_euler_angles_float(float *data);
-    inv_error_t inv_get_euler_angles_x_float(float *data);
-    inv_error_t inv_get_euler_angles_y_float(float *data);
-    inv_error_t inv_get_euler_angles_z_float(float *data);
-    inv_error_t inv_get_gyro_temp_slope_float(float *data);
-    inv_error_t inv_get_gyro_bias_float(float *data);
-    inv_error_t inv_get_accel_bias_float(float *data);
-    inv_error_t inv_get_mag_bias_float(float *data);
-    inv_error_t inv_get_gyro_and_accel_sensor_float(float *data);
-    inv_error_t inv_get_mag_raw_data_float(float *data);
-    inv_error_t inv_get_magnetometer_float(float *data);
-    inv_error_t inv_get_pressure_float(float *data);
-    inv_error_t inv_get_heading_float(float *data);
-    inv_error_t inv_get_gyro_cal_matrix_float(float *data);
-    inv_error_t inv_get_accel_cal_matrix_float(float *data);
-    inv_error_t inv_get_mag_cal_matrix_float(float *data);
-    inv_error_t inv_get_mag_bias_error_float(float *data);
-    inv_error_t inv_get_mag_scale_float(float *data);
-    inv_error_t inv_get_local_field_float(float *data);
-    inv_error_t inv_get_relative_quaternion_float(float *data);
-    inv_error_t inv_get_compass_accuracy(int *accuracy);
-    inv_error_t inv_set_gyro_bias(long *data);
-    inv_error_t inv_set_accel_bias(long *data);
-    inv_error_t inv_set_mag_bias(long *data);
-    inv_error_t inv_set_gyro_temp_slope(long *data);
-    inv_error_t inv_set_local_field(long *data);
-    inv_error_t inv_set_mag_scale(long *data);
-    inv_error_t inv_set_gyro_temp_slope_float(float *data);
-    inv_error_t inv_set_gyro_bias_float(float *data);
-    inv_error_t inv_set_accel_bias_float(float *data);
-    inv_error_t inv_set_mag_bias_float(float *data);
-    inv_error_t inv_set_local_field_float(float *data);
-    inv_error_t inv_set_mag_scale_float(float *data);
-
-    inv_error_t inv_apply_endian_accel(void);
-    inv_error_t inv_apply_calibration(void);
-    inv_error_t inv_set_gyro_calibration(float range, signed char *orientation);
-    inv_error_t inv_set_accel_calibration(float range,
-                                          signed char *orientation);
-    inv_error_t inv_set_compass_calibration(float range,
-                                            signed char *orientation);
-
-    /*API for detecting change of state */
-     inv_error_t
-        inv_set_motion_callback(void (*func) (unsigned short motion_state));
-    int inv_get_motion_state(void);
-
-    /*API for getting ML version. */
-    inv_error_t inv_get_version(unsigned char **version);
-
-    inv_error_t inv_set_motion_interrupt(unsigned char on);
-    inv_error_t inv_set_fifo_interrupt(unsigned char on);
-
-    int inv_get_interrupts(void);
-
-    /* Simulated DMP */
-    int inv_get_gyro_present(void);
-
-    inv_error_t inv_set_no_motion_time(float time);
-    inv_error_t inv_set_no_motion_thresh(float thresh);
-    inv_error_t inv_set_no_motion_threshAccel(long thresh);
-    inv_error_t inv_reset_motion(void);
-
-    inv_error_t inv_update_bias(void);
-    inv_error_t inv_set_dead_zone(void);
-    void inv_start_bias_calc(void);
-    void inv_stop_bias_calc(void);
-
-    // Private functions shared accross modules
-    void inv_init_ml(void);
-
-    inv_error_t inv_register_dmp_interupt_cb(inv_obj_func func);
-    inv_error_t inv_unregister_dmp_interupt_cb(inv_obj_func func);
-    void inv_run_dmp_interupt_cb(void);
-    void inv_set_mode_change(inv_error_t(*mode_change_func)
-                              (unsigned long, unsigned long));
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INV_H
-/**
- * @}
- */
diff --git a/60xx/mlsdk/mllite/mlBiasNoMotion.c b/60xx/mlsdk/mllite/mlBiasNoMotion.c
deleted file mode 100644
index 73321ff..0000000
--- a/60xx/mlsdk/mllite/mlBiasNoMotion.c
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id:$
- *
- *****************************************************************************/
-
-#include "mlBiasNoMotion.h"
-#include "ml.h"
-#include "mlinclude.h"
-#include "mlos.h"
-#include "mlFIFO.h"
-#include "dmpKey.h"
-#include "accel.h"
-#include "mlMathFunc.h"
-#include "mldl.h"
-#include "mlstates.h"
-#include "mlSetGyroBias.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-BiasNoMot"
-
-
-#define _mlDebug(x)             //{x}
-
-/**
- *  @brief  inv_set_motion_callback is used to register a callback function that
- *          will trigger when a change of motion state is detected.
- *
- *  @pre    inv_dmp_open() 
- *          @ifnot MPL_MF 
- *              or inv_open_low_power_pedometer() 
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start()
- *          must <b>NOT</b> have been called.
- *
- *  @param  func    A user defined callback function accepting a
- *                  motion_state parameter, the new motion state.
- *                  May be one of INV_MOTION or INV_NO_MOTION.
- *  @return INV_SUCCESS if successful or Non-zero error code otherwise.
- */
-inv_error_t inv_set_motion_callback(void (*func) (unsigned short motion_state))
-{
-    INVENSENSE_FUNC_START;
-
-    if ((inv_get_state() != INV_STATE_DMP_OPENED) &&
-        (inv_get_state() != INV_STATE_DMP_STARTED))
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    inv_params_obj.motion_cb_func = func;
-
-    return INV_SUCCESS;
-}
-
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-/** Turns on the feature to compute gyro bias from No Motion */
-inv_error_t inv_turn_on_bias_from_no_motion()
-{
-    inv_error_t result;
-    unsigned char regs[3] = { 0x0d, DINA35, 0x5d };
-    inv_params_obj.bias_mode |= INV_BIAS_FROM_NO_MOTION;
-    result = inv_set_mpu_memory(KEY_CFG_MOTION_BIAS, 3, regs);
-    return result;
-}
-
-/** Turns off the feature to compute gyro bias from No Motion
-*/
-inv_error_t inv_turn_off_bias_from_no_motion()
-{
-    inv_error_t result;
-    unsigned char regs[3] = { DINA90 + 8, DINA90 + 8, DINA90 + 8 };
-    inv_params_obj.bias_mode &= ~INV_BIAS_FROM_NO_MOTION;
-    result = inv_set_mpu_memory(KEY_CFG_MOTION_BIAS, 3, regs);
-    return result;
-}
-#endif
-
-inv_error_t inv_update_bias(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char regs[12];
-    short bias[GYRO_NUM_AXES];
-
-    if ((inv_params_obj.bias_mode & INV_BIAS_FROM_NO_MOTION)
-        && inv_get_gyro_present()) {
-
-        regs[0] = DINAA0 + 3;
-        result = inv_set_mpu_memory(KEY_FCFG_6, 1, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        result = inv_get_mpu_memory(KEY_D_1_244, 12, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        inv_convert_bias(regs, bias);
-
-        regs[0] = DINAA0 + 15;
-        result = inv_set_mpu_memory(KEY_FCFG_6, 1, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        result = inv_set_gyro_bias_in_hw_unit(bias, INV_SGB_NO_MOTION);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        result =
-            inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                            MPUREG_TEMP_OUT_H, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_set_mpu_memory(KEY_DMP_PREVPTAT, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        inv_obj.got_no_motion_bias = TRUE;
-    }
-    return INV_SUCCESS;
-}
-
-inv_error_t MLAccelMotionDetection(struct inv_obj_t *inv_obj)
-{
-    long gain;
-    unsigned long timeChange;
-    long rate;
-    inv_error_t result;
-    long accel[3], temp;
-    long long accelMag;
-    unsigned long currentTime;
-    int kk;
-
-    if (!inv_accel_present()) {
-        return INV_SUCCESS;
-    }
-
-    currentTime = inv_get_tick_count();
-
-    // We always run the accel low pass filter at the highest sample rate possible
-    result = inv_get_accel(accel);
-    if (result != INV_ERROR_FEATURE_NOT_ENABLED) {
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        rate = inv_get_fifo_rate() * 5 + 5;
-        if (rate > 200)
-            rate = 200;
-
-        gain = inv_obj->accel_lpf_gain * rate;
-        timeChange = inv_get_fifo_rate();
-
-        accelMag = 0;
-        for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-            inv_obj->accel_lpf[kk] =
-                inv_q30_mult(((1L << 30) - gain), inv_obj->accel_lpf[kk]);
-            inv_obj->accel_lpf[kk] += inv_q30_mult(gain, accel[kk]);
-            temp = accel[0] - inv_obj->accel_lpf[0];
-            accelMag += (long long)temp *temp;
-        }
-
-        if (accelMag > inv_obj->no_motion_accel_threshold) {
-            inv_obj->no_motion_accel_time = currentTime;
-
-            // Check for change of state
-            if (!inv_get_gyro_present())
-                inv_set_motion_state(INV_MOTION);
-
-        } else if ((currentTime - inv_obj->no_motion_accel_time) >
-                   5 * inv_obj->motion_duration) {
-            // We have no motion according to accel
-            // Check fsor change of state
-            if (!inv_get_gyro_present())
-                inv_set_motion_state(INV_NO_MOTION);
-        }
-    }
-    return INV_SUCCESS;
-}
-
-/**
- * @internal
- * @brief   Manually update the motion/no motion status.  This is a 
- *          convienence function for implementations that do not wish to use 
- *          inv_update_data.  
- *          This function can be called periodically to check for the 
- *          'no motion' state and update the internal motion status and bias 
- *          calculations.
- */
-inv_error_t MLPollMotionStatus(struct inv_obj_t * inv_obj)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[3] = { 0 };
-    unsigned short motionFlag = 0;
-    unsigned long currentTime;
-    inv_error_t result;
-
-    result = MLAccelMotionDetection(inv_obj);
-
-    currentTime = inv_get_tick_count();
-
-    // If it is not time to poll for a no motion event, return
-    if (((inv_obj->interrupt_sources & INV_INT_MOTION) == 0) &&
-        ((currentTime - inv_obj->poll_no_motion) <= 1000))
-        return INV_SUCCESS;
-
-    inv_obj->poll_no_motion = currentTime;
-
-#if defined CONFIG_MPU_SENSORS_MPU3050
-    if (inv_get_gyro_present()
-        && ((inv_params_obj.bias_mode & INV_BIAS_FROM_FAST_NO_MOTION) == 0)) {
-        static long repeatBiasUpdateTime = 0;
-
-        result = inv_get_mpu_memory(KEY_D_1_98, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        motionFlag = (unsigned short)regs[0] * 256 + (unsigned short)regs[1];
-
-        _mlDebug(MPL_LOGV("motionFlag from RAM : 0x%04X\n", motionFlag);
-            )
-            if (motionFlag == inv_obj->motion_duration) {
-            if (inv_obj->motion_state == INV_MOTION) {
-                inv_update_bias();
-                repeatBiasUpdateTime = inv_get_tick_count();
-
-                regs[0] = DINAD8 + 1;
-                regs[1] = DINA0C;
-                regs[2] = DINAD8 + 2;
-                result = inv_set_mpu_memory(KEY_CFG_18, 3, regs);
-                if (result) {
-                    LOG_RESULT_LOCATION(result);
-                    return result;
-                }
-
-                regs[0] = 0;
-                regs[1] = 5;
-                result = inv_set_mpu_memory(KEY_D_1_106, 2, regs);
-                if (result) {
-                    LOG_RESULT_LOCATION(result);
-                    return result;
-                }
-
-                //Trigger no motion callback
-                inv_set_motion_state(INV_NO_MOTION);
-            }
-        }
-        if (motionFlag == 5) {
-            if (inv_obj->motion_state == INV_NO_MOTION) {
-                regs[0] = DINAD8 + 2;
-                regs[1] = DINA0C;
-                regs[2] = DINAD8 + 1;
-                result = inv_set_mpu_memory(KEY_CFG_18, 3, regs);
-                if (result) {
-                    LOG_RESULT_LOCATION(result);
-                    return result;
-                }
-
-                regs[0] =
-                    (unsigned char)((inv_obj->motion_duration >> 8) & 0xff);
-                regs[1] = (unsigned char)(inv_obj->motion_duration & 0xff);
-                result = inv_set_mpu_memory(KEY_D_1_106, 2, regs);
-                if (result) {
-                    LOG_RESULT_LOCATION(result);
-                    return result;
-                }
-
-                //Trigger no motion callback
-                inv_set_motion_state(INV_MOTION);
-            }
-        }
-        if (inv_obj->motion_state == INV_NO_MOTION) {
-            if ((inv_get_tick_count() - repeatBiasUpdateTime) > 4000) {
-                inv_update_bias();
-                repeatBiasUpdateTime = inv_get_tick_count();
-            }
-        }
-    }
-#else                           // CONFIG_MPU_SENSORS_MPU3050
-    if (inv_get_gyro_present()
-        && ((inv_params_obj.bias_mode & INV_BIAS_FROM_FAST_NO_MOTION) == 0)) {
-        result = inv_get_mpu_memory(KEY_D_1_98, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        motionFlag = (unsigned short)regs[0] * 256 + (unsigned short)regs[1];
-
-        _mlDebug(MPL_LOGV("motionFlag from RAM : 0x%04X\n", motionFlag);
-            )
-            if (motionFlag > 0) {
-            unsigned char biasReg[12];
-            long biasTmp2[3], biasTmp[3];
-            int i;
-
-            if (inv_obj->last_motion != motionFlag) {
-                result = inv_get_mpu_memory(KEY_D_2_96, 12, biasReg);
-
-                for (i = 0; i < 3; i++) {
-                    biasTmp2[i] = inv_big8_to_int32(&biasReg[i * 4]);
-                }
-                // Rotate bias vector by the transpose of the orientation matrix
-                for (i = 0; i < 3; ++i) {
-                    biasTmp[i] =
-                        inv_q30_mult(biasTmp2[0],
-                                     inv_obj->gyro_orient[i]) +
-                        inv_q30_mult(biasTmp2[1],
-                                     inv_obj->gyro_orient[i + 3]) +
-                        inv_q30_mult(biasTmp2[2], inv_obj->gyro_orient[i + 6]);
-                }
-                inv_obj->gyro_bias[0] = inv_q30_mult(biasTmp[0], 1501974482L);
-                inv_obj->gyro_bias[1] = inv_q30_mult(biasTmp[1], 1501974482L);
-                inv_obj->gyro_bias[2] = inv_q30_mult(biasTmp[2], 1501974482L);
-            }
-            inv_set_motion_state(INV_NO_MOTION);
-        } else {
-            // We are in a motion state
-            inv_set_motion_state(INV_MOTION);
-        }
-        inv_obj->last_motion = motionFlag;
-
-    }
-#endif                          // CONFIG_MPU_SENSORS_MPU3050
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_enable_bias_no_motion(void)
-{
-    inv_error_t result;
-    inv_params_obj.bias_mode |= INV_BIAS_FROM_NO_MOTION;
-    result =
-        inv_register_fifo_rate_process(MLPollMotionStatus,
-                                       INV_PRIORITY_BIAS_NO_MOTION);
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_turn_on_bias_from_no_motion();
-#endif
-    return result;
-}
-
-inv_error_t inv_disable_bias_no_motion(void)
-{
-    inv_error_t result;
-    inv_params_obj.bias_mode &= ~INV_BIAS_FROM_NO_MOTION;
-    result = inv_unregister_fifo_rate_process(MLPollMotionStatus);
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-    defined CONFIG_MPU_SENSORS_MPU6050B1
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_turn_off_bias_from_no_motion();
-#endif
-    return result;
-}
diff --git a/60xx/mlsdk/mllite/mlBiasNoMotion.h b/60xx/mlsdk/mllite/mlBiasNoMotion.h
deleted file mode 100644
index 030dbf9..0000000
--- a/60xx/mlsdk/mllite/mlBiasNoMotion.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef INV_BIAS_NO_MOTION_H__
-#define INV_BIAS_NO_MOTION_H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_enable_bias_no_motion(void);
-    inv_error_t inv_disable_bias_no_motion(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INV_BIAS_NO_MOTION_H__
diff --git a/60xx/mlsdk/mllite/mlFIFO.c b/60xx/mlsdk/mllite/mlFIFO.c
deleted file mode 100644
index 2c0d2f0..0000000
--- a/60xx/mlsdk/mllite/mlFIFO.c
+++ /dev/null
@@ -1,2265 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlFIFO.c 5653 2011-06-16 21:06:55Z nroyer $
- *
- *******************************************************************************/
-
-/**
- *   @defgroup MLFIFO
- *   @brief Motion Library - FIFO Driver.
- *          The FIFO API Interface.
- *
- *   @{
- *       @file mlFIFO.c
- *       @brief FIFO Interface.
-**/
-
-#include <string.h>
-#include "mpu.h"
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-#    include "mpu6050a2.h"
-#elif defined CONFIG_MPU_SENSORS_MPU6050B1
-#    include "mpu6050b1.h"
-#elif defined CONFIG_MPU_SENSORS_MPU3050
-#  include "mpu3050.h"
-#else
-#error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
-#endif
-#include "mlFIFO.h"
-#include "mlFIFOHW.h"
-#include "dmpKey.h"
-#include "mlMathFunc.h"
-#include "ml.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mlstates.h"
-#include "mlsupervisor.h"
-#include "mlos.h"
-#include "mlmath.h"
-#include "accel.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-fifo"
-
-#define FIFO_DEBUG 0
-
-#define REF_QUATERNION             (0)
-#define REF_GYROS                  (REF_QUATERNION + 4)
-#define REF_CONTROL                (REF_GYROS + 3)
-#define REF_RAW                    (REF_CONTROL + 4)
-#define REF_RAW_EXTERNAL           (REF_RAW + 8)
-#define REF_ACCEL                  (REF_RAW_EXTERNAL + 6)
-#define REF_QUANT_ACCEL            (REF_ACCEL + 3)
-#define REF_QUATERNION_6AXIS       (REF_QUANT_ACCEL + INV_MAX_NUM_ACCEL_SAMPLES)
-#define REF_EIS                    (REF_QUATERNION_6AXIS + 4)
-#define REF_DMP_PACKET             (REF_EIS + 3)
-#define REF_GARBAGE                (REF_DMP_PACKET + 1)
-#define REF_LAST                   (REF_GARBAGE + 1)
-
-long fifo_scale[REF_LAST] = {
-    (1L << 30), (1L << 30), (1L << 30), (1L << 30), // Quaternion
-    // 2^(16+30)/((2^30)*((3.14159265358/180)/200)/2)
-    1501974482L, 1501974482L, 1501974482L,  // Gyro
-    (1L << 30), (1L << 30), (1L << 30), (1L << 30), // Control
-    (1L << 14),                 // Temperature
-    (1L << 14), (1L << 14), (1L << 14), // Raw Gyro
-    (1L << 14), (1L << 14), (1L << 14), (0),    // Raw Accel, plus padding
-    (1L << 14), (1L << 14), (1L << 14), // Raw External
-    (1L << 14), (1L << 14), (1L << 14), // Raw External
-    (1L << 16), (1L << 16), (1L << 16), // Accel
-    (1L << 30), (1L << 30), (1L << 30), (1L << 30), // Quant Accel
-    (1L << 30), (1L << 30), (1L << 30), (1L << 30), //Quant Accel
-    (1L << 30), (1L << 30), (1L << 30), (1L << 30), // Quaternion 6 Axis
-    (1L << 30), (1L << 30), (1L << 30), // EIS
-    (1L << 30),                 // Packet
-    (1L << 30),                 // Garbage
-};
-
-// The scale factors for tap need to match the number in fifo_scale above.
-// fifo_base_offset below may also need to be changed if this is not 8
-#if INV_MAX_NUM_ACCEL_SAMPLES != 8
-#error  INV_MAX_NUM_ACCEL_SAMPLES must be defined to 8
-#endif
-
-#define CONFIG_QUAT                (0)
-#define CONFIG_GYROS               (CONFIG_QUAT + 1)
-#define CONFIG_CONTROL_DATA        (CONFIG_GYROS + 1)
-#define CONFIG_TEMPERATURE         (CONFIG_CONTROL_DATA + 1)
-#define CONFIG_RAW_DATA            (CONFIG_TEMPERATURE + 1)
-#define CONFIG_RAW_EXTERNAL        (CONFIG_RAW_DATA + 1)
-#define CONFIG_ACCEL               (CONFIG_RAW_EXTERNAL + 1)
-#define CONFIG_DMP_QUANT_ACCEL     (CONFIG_ACCEL + 1)
-#define CONFIG_EIS                 (CONFIG_DMP_QUANT_ACCEL + 1)
-#define CONFIG_DMP_PACKET_NUMBER   (CONFIG_EIS + 1)
-#define CONFIG_FOOTER              (CONFIG_DMP_PACKET_NUMBER + 1)
-#define NUMFIFOELEMENTS            (CONFIG_FOOTER + 1)
-
-const int fifo_base_offset[NUMFIFOELEMENTS] = {
-    REF_QUATERNION * 4,
-    REF_GYROS * 4,
-    REF_CONTROL * 4,
-    REF_RAW * 4,
-    REF_RAW * 4 + 4,
-    REF_RAW_EXTERNAL * 4,
-    REF_ACCEL * 4,
-    REF_QUANT_ACCEL * 4,
-    REF_EIS * 4,
-    REF_DMP_PACKET * 4,
-    REF_GARBAGE * 4
-};
-
-struct fifo_obj {
-    void (*fifo_process_cb) (void);
-    long decoded[REF_LAST];
-    long decoded_accel[INV_MAX_NUM_ACCEL_SAMPLES][ACCEL_NUM_AXES];
-    int offsets[REF_LAST * 4];
-    int cache;
-    uint_fast8_t gyro_source;
-    unsigned short fifo_rate;
-    unsigned short sample_step_size_ms;
-    uint_fast16_t fifo_packet_size;
-    uint_fast16_t data_config[NUMFIFOELEMENTS];
-    unsigned char reference_count[REF_LAST];
-    long acc_bias_filt[3];
-    float acc_filter_coef;
-    long gravity_cache[3];
-};
-
-static struct fifo_obj fifo_obj;
-
-#define FIFO_CACHE_TEMPERATURE 1
-#define FIFO_CACHE_GYRO 2
-#define FIFO_CACHE_GRAVITY_BODY 4
-#define FIFO_CACHE_ACC_BIAS 8
-
-struct fifo_rate_obj {
-    // These describe callbacks happening everytime a FIFO block is processed
-    int_fast8_t num_cb;
-    HANDLE mutex;
-    inv_obj_func fifo_process_cb[MAX_HIGH_RATE_PROCESSES];
-    int priority[MAX_HIGH_RATE_PROCESSES];
-};
-
-struct fifo_rate_obj fifo_rate_obj;
-
-/** Sets accuracy to be one of 0, INV_32_BIT, or INV_16_BIT. Looks up old 
- *  accuracy if needed.
- */
-static uint_fast16_t inv_set_fifo_accuracy(uint_fast16_t elements,
-                                           uint_fast16_t accuracy,
-                                           uint_fast8_t configOffset)
-{
-    if (elements) {
-        if (!accuracy)
-            accuracy = fifo_obj.data_config[configOffset];
-        else if (accuracy & INV_16_BIT)
-            if ((fifo_obj.data_config[configOffset] & INV_32_BIT))
-                accuracy = INV_32_BIT;  // 32-bits takes priority
-            else
-                accuracy = INV_16_BIT;
-        else
-            accuracy = INV_32_BIT;
-    } else {
-        accuracy = 0;
-    }
-
-    return accuracy;
-}
-
-/** Adjusts (len) Reference Counts, at offset (refOffset). If increment is 0, 
- * the reference counts are subtracted, otherwise they are incremented for each
- * bit set in element. The value returned are the elements that should be sent
- * out as data through the FIFO.
-*/
-static uint_fast16_t inv_set_fifo_reference(uint_fast16_t elements,
-                                            uint_fast16_t increment,
-                                            uint_fast8_t refOffset,
-                                            uint_fast8_t len)
-{
-    uint_fast8_t kk;
-
-    if (increment == 0) {
-        for (kk = 0; kk < len; ++kk) {
-            if ((elements & 1)
-                && (fifo_obj.reference_count[kk + refOffset] > 0)) {
-                fifo_obj.reference_count[kk + refOffset]--;
-            }
-            elements >>= 1;
-        }
-    } else {
-        for (kk = 0; kk < len; ++kk) {
-            if (elements & 1)
-                fifo_obj.reference_count[kk + refOffset]++;
-            elements >>= 1;
-        }
-    }
-    elements = 0;
-    for (kk = 0; kk < len; ++kk) {
-        if (fifo_obj.reference_count[kk + refOffset] > 0)
-            elements |= (1 << kk);
-    }
-    return elements;
-}
-
-/**
- * @param[in] accuracy INV_16_BIT or INV_32_BIT when constructing data to send
- *  out the FIFO, 0 when removing from the FIFO.
- */
-static inv_error_t inv_construct3_fifo(unsigned char *regs,
-                                       uint_fast16_t elements,
-                                       uint_fast16_t accuracy,
-                                       uint_fast8_t refOffset,
-                                       unsigned short key,
-                                       uint_fast8_t configOffset)
-{
-    int_fast8_t kk;
-    inv_error_t result;
-
-    elements = inv_set_fifo_reference(elements, accuracy, refOffset, 3);
-    accuracy = inv_set_fifo_accuracy(elements, accuracy, configOffset);
-
-    if (accuracy & INV_16_BIT) {
-        regs[0] = DINAF8 + 2;
-    }
-
-    fifo_obj.data_config[configOffset] = elements | accuracy;
-
-    for (kk = 0; kk < 3; ++kk) {
-        if ((elements & 1) == 0)
-            regs[kk + 1] = DINAA0 + 3;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(key, 4, regs);
-
-    return result;
-}
-
-/** 
- * @internal
- * Puts footer on FIFO data.
- */
-static inv_error_t inv_set_footer(void)
-{
-    unsigned char regs = DINA30;
-    uint_fast8_t tmp_count;
-    int_fast8_t i, j;
-    int offset;
-    int result;
-    int *fifo_offsets_ptr = fifo_obj.offsets;
-
-    fifo_obj.fifo_packet_size = 0;
-    for (i = 0; i < NUMFIFOELEMENTS; i++) {
-        tmp_count = 0;
-        offset = fifo_base_offset[i];
-        for (j = 0; j < 8; j++) {
-            if ((fifo_obj.data_config[i] >> j) & 0x0001) {
-#ifndef BIG_ENDIAN
-                // Special Case for Byte Ordering on Accel Data
-                if ((i == CONFIG_RAW_DATA) && (j > 2)) {
-                    tmp_count += 2;
-                    switch (inv_get_dl_config()->accel->endian) {
-                    case EXT_SLAVE_BIG_ENDIAN:
-                        *fifo_offsets_ptr++ = offset + 3;
-                        *fifo_offsets_ptr++ = offset + 2;
-                        break;
-                    case EXT_SLAVE_LITTLE_ENDIAN:
-                        *fifo_offsets_ptr++ = offset + 2;
-                        *fifo_offsets_ptr++ = offset + 3;
-                        break;
-                    case EXT_SLAVE_FS8_BIG_ENDIAN:
-                        if (j == 3) {
-                            // Throw this byte away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ = offset + 3;
-                        } else if (j == 4) {
-                            *fifo_offsets_ptr++ = offset + 3;
-                            *fifo_offsets_ptr++ = offset + 7;
-                        } else {
-                            // Throw these byte away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                        }
-                        break;
-                    case EXT_SLAVE_FS16_BIG_ENDIAN:
-                        if (j == 3) {
-                            // Throw this byte away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ = offset + 3;
-                        } else if (j == 4) {
-                            *fifo_offsets_ptr++ = offset - 2;
-                            *fifo_offsets_ptr++ = offset + 3;
-                        } else {
-                            *fifo_offsets_ptr++ = offset - 2;
-                            *fifo_offsets_ptr++ = offset + 3;
-                        }
-                        break;
-                    default:
-                        return INV_ERROR;    // Bad value on ordering
-                    }
-                } else {
-                    tmp_count += 2;
-                    *fifo_offsets_ptr++ = offset + 3;
-                    *fifo_offsets_ptr++ = offset + 2;
-                    if (fifo_obj.data_config[i] & INV_32_BIT) {
-                        *fifo_offsets_ptr++ = offset + 1;
-                        *fifo_offsets_ptr++ = offset;
-                        tmp_count += 2;
-                    }
-                }
-#else
-                // Big Endian Platform
-                // Special Case for Byte Ordering on Accel Data
-                if ((i == CONFIG_RAW_DATA) && (j > 2)) {
-                    tmp_count += 2;
-                    switch (inv_get_dl_config()->accel->endian) {
-                    case EXT_SLAVE_BIG_ENDIAN:
-                        *fifo_offsets_ptr++ = offset + 2;
-                        *fifo_offsets_ptr++ = offset + 3;
-                        break;
-                    case EXT_SLAVE_LITTLE_ENDIAN:
-                        *fifo_offsets_ptr++ = offset + 3;
-                        *fifo_offsets_ptr++ = offset + 2;
-                        break;
-                    case EXT_SLAVE_FS8_BIG_ENDIAN:
-                        if (j == 3) {
-                            // Throw this byte away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ = offset;
-                        } else if (j == 4) {
-                            *fifo_offsets_ptr++ = offset;
-                            *fifo_offsets_ptr++ = offset + 4;
-                        } else {
-                            // Throw these bytes away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                        }
-                        break;
-                    case EXT_SLAVE_FS16_BIG_ENDIAN:
-                        if (j == 3) {
-                            // Throw this byte away
-                            *fifo_offsets_ptr++ =
-                                fifo_base_offset[CONFIG_FOOTER];
-                            *fifo_offsets_ptr++ = offset;
-                        } else if (j == 4) {
-                            *fifo_offsets_ptr++ = offset - 3;
-                            *fifo_offsets_ptr++ = offset;
-                        } else {
-                            *fifo_offsets_ptr++ = offset - 3;
-                            *fifo_offsets_ptr++ = offset;
-                        }
-                        break;
-                    default:
-                        return INV_ERROR;    // Bad value on ordering
-                    }
-                } else {
-                    tmp_count += 2;
-                    *fifo_offsets_ptr++ = offset;
-                    *fifo_offsets_ptr++ = offset + 1;
-                    if (fifo_obj.data_config[i] & INV_32_BIT) {
-                        *fifo_offsets_ptr++ = offset + 2;
-                        *fifo_offsets_ptr++ = offset + 3;
-                        tmp_count += 2;
-                    }
-                }
-
-#endif
-            }
-            offset += 4;
-        }
-        fifo_obj.fifo_packet_size += tmp_count;
-    }
-    if (fifo_obj.data_config[CONFIG_FOOTER] == 0 &&
-        fifo_obj.fifo_packet_size > 0) {
-        // Add footer
-        result = inv_set_mpu_memory(KEY_CFG_16, 1, &regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        fifo_obj.data_config[CONFIG_FOOTER] = 0x0001 | INV_16_BIT;
-        fifo_obj.fifo_packet_size += 2;
-    } else if (fifo_obj.data_config[CONFIG_FOOTER] &&
-               (fifo_obj.fifo_packet_size == 2)) {
-        // Remove Footer
-        regs = DINAA0 + 3;
-        result = inv_set_mpu_memory(KEY_CFG_16, 1, &regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        fifo_obj.data_config[CONFIG_FOOTER] = 0;
-        fifo_obj.fifo_packet_size = 0;
-    }
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_decode_quantized_accel(void)
-{
-    int kk;
-    int fifoRate = inv_get_fifo_rate();
-
-    if (!fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = (INV_MAX_NUM_ACCEL_SAMPLES - (fifoRate + 1));
-         kk < INV_MAX_NUM_ACCEL_SAMPLES; kk++) {
-        union {
-            unsigned int u10:10;
-            signed int s10:10;
-        } temp;
-
-        union {
-            uint32_t u32;
-            int32_t s32;
-        } value;
-
-        value.u32 = fifo_obj.decoded[REF_QUANT_ACCEL + kk];
-        // unquantize this samples.  
-        // They are stored as x * 2^20 + y * 2^10 + z
-        // Z
-        temp.u10 = value.u32 & 0x3ff;
-        value.s32 -= temp.s10;
-        fifo_obj.decoded_accel[kk][2] = temp.s10 * 64;
-        // Y
-        value.s32 = value.s32 / 1024;
-        temp.u10 = value.u32 & 0x3ff;
-        value.s32 -= temp.s10;
-        fifo_obj.decoded_accel[kk][1] = temp.s10 * 64;
-        // X
-        value.s32 = value.s32 / 1024;
-        temp.u10 = value.u32 & 0x3ff;
-        fifo_obj.decoded_accel[kk][0] = temp.s10 * 64;
-    }
-    return INV_SUCCESS;
-}
-
-static inv_error_t inv_state_change_fifo(unsigned char newState)
-{
-    inv_error_t result = INV_SUCCESS;
-    unsigned char regs[4];
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    /* Don't reset the fifo on a fifo rate change */
-    if ((mldl_cfg->requested_sensors & INV_DMP_PROCESSOR) &&
-        (newState != inv_get_state()) && (inv_dmpkey_supported(KEY_D_1_178))) {
-        /* Delay output on restart by 50ms due to warm up time of gyros */
-
-        short delay = (short)-((50 / inv_get_sample_step_size_ms()) + 1);
-        inv_init_fifo_hardare();
-        inv_int16_to_big8(delay, regs);
-        result = inv_set_mpu_memory(KEY_D_1_178, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    if (INV_STATE_DMP_STARTED == newState) {
-        if (inv_dmpkey_supported(KEY_D_1_128)) {
-            double tmp;
-            tmp = (0x20000000L * M_PI) / (fifo_obj.fifo_rate + 1);
-            if (tmp > 0x40000000L)
-                tmp = 0x40000000L;
-            (void)inv_int32_to_big8((long)tmp, regs);
-            result = inv_set_mpu_memory(KEY_D_1_128, sizeof(long), regs);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            result = inv_reset_fifo();
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-    }
-    return result;
-}
-
-/**
- * @internal
- * @brief get the FIFO packet size
- * @return the FIFO packet size
- */
-uint_fast16_t inv_get_fifo_packet_size(void)
-{
-    return fifo_obj.fifo_packet_size;
-}
-
-/**
- *  @brief  Initializes all the internal static variables for 
- *          the FIFO module.
- *  @note   Should be called by the initialization routine such 
- *          as inv_dmp_open().
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise. 
- */
-inv_error_t inv_init_fifo_param(void)
-{
-    inv_error_t result;
-    memset(&fifo_obj, 0, sizeof(struct fifo_obj));
-    fifo_obj.decoded[REF_QUATERNION] = 1073741824L; // Set to Identity
-    inv_set_linear_accel_filter_coef(0.f);
-    fifo_obj.fifo_rate = 20;
-    fifo_obj.sample_step_size_ms = 100;
-    memset(&fifo_rate_obj, 0, sizeof(struct fifo_rate_obj));
-    result = inv_create_mutex(&fifo_rate_obj.mutex);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_register_state_callback(inv_state_change_fifo);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- *  @brief  Close the FIFO usage.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_close_fifo(void)
-{
-    inv_error_t result;
-    inv_error_t first = INV_SUCCESS;
-    result = inv_unregister_state_callback(inv_state_change_fifo);
-    ERROR_CHECK_FIRST(first, result);
-    result = inv_destroy_mutex(fifo_rate_obj.mutex);
-    ERROR_CHECK_FIRST(first, result);
-    memset(&fifo_rate_obj, 0, sizeof(struct fifo_rate_obj));
-    return first;
-}
-
-/** 
- * Set the gyro source to output to the fifo
- * 
- * @param source The source.  One of 
- * - INV_GYRO_FROM_RAW
- * - INV_GYRO_FROM_QUATERNION
- * 
- * @return INV_SUCCESS or non-zero error code;
- */
-inv_error_t inv_set_gyro_data_source(uint_fast8_t source)
-{
-    if (source != INV_GYRO_FROM_QUATERNION && source != INV_GYRO_FROM_RAW) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    fifo_obj.gyro_source = source;
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief  Reads and processes FIFO data. Also handles callbacks when data is
- *          ready.
- *  @param  numPackets 
- *              Number of FIFO packets to try to read. You should
- *              use a large number here, such as 100, if you want to read all
- *              the full packets in the FIFO, which is typical operation.
- *  @param  processed
- *              The number of FIFO packets processed. This may be incremented
- *              even if high rate processes later fail.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_read_and_process_fifo(int_fast8_t numPackets,
-                                      int_fast8_t * processed)
-{
-    int_fast8_t packet;
-    inv_error_t result = INV_SUCCESS;
-    uint_fast16_t read;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    int kk;
-
-    if (NULL == processed)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    *processed = 0;
-    if (fifo_obj.fifo_packet_size == 0)
-        return result;          // Nothing to read
-
-    for (packet = 0; packet < numPackets; ++packet) {
-        if (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR) {
-            unsigned char footer_n_data[MAX_FIFO_LENGTH + FIFO_FOOTER_SIZE];
-            unsigned char *buf = &footer_n_data[FIFO_FOOTER_SIZE];
-            read = inv_get_fifo((uint_fast16_t) fifo_obj.fifo_packet_size,
-                                footer_n_data);
-            if (0 == read ||
-                read != fifo_obj.fifo_packet_size - FIFO_FOOTER_SIZE) {
-                result = inv_get_fifo_status();
-                if (INV_SUCCESS != result) {
-                    memset(fifo_obj.decoded, 0, sizeof(fifo_obj.decoded));
-                }
-                return result;
-            }
-
-            result = inv_process_fifo_packet(buf);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        } else if (inv_accel_present()) {
-            long data[ACCEL_NUM_AXES];
-            result = inv_get_accel_data(data);
-            if (result == INV_ERROR_ACCEL_DATA_NOT_READY) {
-                return INV_SUCCESS;
-            }
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-
-            memset(fifo_obj.decoded, 0, sizeof(fifo_obj.decoded));
-            fifo_obj.cache = 0;
-            for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-                fifo_obj.decoded[REF_RAW + 4 + kk] =
-                    inv_q30_mult((data[kk] << 16),
-                                 fifo_scale[REF_RAW + 4 + kk]);
-                fifo_obj.decoded[REF_ACCEL + kk] =
-                    inv_q30_mult((data[kk] << 15), fifo_scale[REF_ACCEL + kk]);
-                fifo_obj.decoded[REF_ACCEL + kk] -=
-                    inv_obj.scaled_accel_bias[kk];
-            }
-        }
-        // The buffer was processed correctly, so increment even if
-        // other processes fail later, which will return an error
-        *processed = *processed + 1;
-
-        if ((fifo_obj.fifo_rate < INV_MAX_NUM_ACCEL_SAMPLES) &&
-            fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL]) {
-            result = inv_decode_quantized_accel();
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-
-        if (fifo_obj.data_config[CONFIG_QUAT]) {
-            result = inv_accel_compass_supervisor();
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-
-        result = inv_pressure_supervisor();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        // Callbacks now that we have a buffer of data ready
-        result = inv_run_fifo_rate_processes();
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-    }
-    return result;
-}
-
-/**
- *  @brief  inv_set_fifo_processed_callback is used to set a processed data callback
- *          function.  inv_set_fifo_processed_callback sets a user defined callback
- *          function that triggers when all the decoding has been finished by
- *          the motion processing engines. It is called before other bigger 
- *          processing engines to allow lower latency for the user.
- *
- *  @pre    inv_dmp_open() 
- *          @ifnot MPL_MF 
- *              or inv_open_low_power_pedometer() 
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start() 
- *          must <b>NOT</b> have been called.
- *
- *  @param  func    A user defined callback function.
- *
- *  @return INV_SUCCESS if successful, or non-zero error code otherwise.
- */
-inv_error_t inv_set_fifo_processed_callback(void (*func) (void))
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    fifo_obj.fifo_process_cb = func;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @internal
- * @brief   Process data from the dmp read via the fifo.  Takes a buffer 
- *          filled with bytes read from the DMP FIFO. 
- *          Currently expects only the 16 bytes of quaternion data. 
- *          Calculates the motion parameters from that data and stores the 
- *          results in an internal data structure.
- * @param[in,out]   dmpData     Pointer to the buffer containing the fifo data.
- * @return  INV_SUCCESS or error code.
-**/
-inv_error_t inv_process_fifo_packet(const unsigned char *dmpData)
-{
-    INVENSENSE_FUNC_START;
-    int N, kk;
-    unsigned char *p;
-
-    p = (unsigned char *)(&fifo_obj.decoded);
-    N = fifo_obj.fifo_packet_size;
-    if (N > sizeof(fifo_obj.decoded))
-        return INV_ERROR_ASSERTION_FAILURE;
-
-    memset(&fifo_obj.decoded, 0, sizeof(fifo_obj.decoded));
-
-    for (kk = 0; kk < N; ++kk) {
-        p[fifo_obj.offsets[kk]] = *dmpData++;
-    }
-
-    // If multiplies are much greater cost than if checks, you could check
-    // to see if fifo_scale is non-zero first, or equal to (1L<<30)
-    for (kk = 0; kk < REF_LAST; ++kk) {
-        fifo_obj.decoded[kk] =
-            inv_q30_mult(fifo_obj.decoded[kk], fifo_scale[kk]);
-    }
-
-    memcpy(&fifo_obj.decoded[REF_QUATERNION_6AXIS],
-           &fifo_obj.decoded[REF_QUATERNION], 4 * sizeof(long));
-
-    inv_obj.flags[INV_PROCESSED_DATA_READY] = 1;
-    fifo_obj.cache = 0;
-
-    return INV_SUCCESS;
-}
-
-/** Converts 16-bit temperature data as read from temperature register
-* into Celcius scaled by 2^16.
-*/
-long inv_decode_temperature(short tempReg)
-{
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-    // Celcius = 35 + (T + 3048.7)/325.9
-    return 2906830L + inv_q30_mult((long)tempReg << 16, 3294697L);
-#endif
-#if defined CONFIG_MPU_SENSORS_MPU6050B1
-    // Celcius = 35 + (T + 927.4)/360.6
-    return 2462307L + inv_q30_mult((long)tempReg << 16, 2977653L);
-#endif
-#if defined CONFIG_MPU_SENSORS_MPU3050
-    // Celcius = 35 + (T + 13200)/280
-    return 5383314L + inv_q30_mult((long)tempReg << 16, 3834792L);
-#endif
-}
-
-/**  @internal
-* Returns the temperature in hardware units. The scaling may change from part to part.
-*/
-inv_error_t inv_get_temperature_raw(short *data)
-{
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_TEMPERATURE]) {
-        inv_error_t result;
-        unsigned char regs[2];
-        if ((fifo_obj.cache & FIFO_CACHE_TEMPERATURE) == 0) {
-            if (FIFO_DEBUG)
-                MPL_LOGI("Fetching the temperature from the registers\n");
-            fifo_obj.cache |= FIFO_CACHE_TEMPERATURE;
-            result = inv_serial_read(inv_get_serial_handle(),
-                                inv_get_mpu_slave_addr(), MPUREG_TEMP_OUT_H, 2,
-                                regs);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            fifo_obj.decoded[REF_RAW] = ((short)regs[0] << 8) | (regs[1]);
-        }
-    }
-    *data = (short)fifo_obj.decoded[REF_RAW];
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 1-element vector of temperature. It is read from the hardware if it
- *              doesn't exist in the FIFO.
- *  @param[out] data    1-element vector of temperature
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_temperature(long *data)
-{
-    short tr;
-    inv_error_t result;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-    result = inv_get_temperature_raw(&tr);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    data[0] = inv_decode_temperature(tr);
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Get the Decoded Accel Data.
- *  @param  data
- *              a buffer to store the quantized data.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_get_unquantized_accel(long *data)
-{
-    int ii, kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (ii = 0; ii < INV_MAX_NUM_ACCEL_SAMPLES; ii++) {
-        for (kk = 0; kk < ACCEL_NUM_AXES; kk++) {
-            data[ii * ACCEL_NUM_AXES + kk] = fifo_obj.decoded_accel[ii][kk];
-        }
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Get the Quantized Accel data algorithm output from the FIFO.
- *  @param  data
- *              a buffer to store the quantized data.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_get_quantized_accel(long *data)
-{
-    int ii;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (ii = 0; ii < INV_MAX_NUM_ACCEL_SAMPLES; ii++) {
-        data[ii] = fifo_obj.decoded[REF_QUANT_ACCEL + ii];
-    }
-
-    return INV_SUCCESS;
-}
-
-/** This gets raw gyro data. The data is taken from the FIFO if it was put in the FIFO
-*  and it is read from the registers if it was not put into the FIFO. The data is
-*  cached till the next FIFO processing block time.
-* @param[out] data Length 3, Gyro data
-*/
-inv_error_t inv_get_gyro_sensor(long *data)
-{
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-    if ((fifo_obj.data_config[CONFIG_RAW_DATA] & 7) != 7) {
-        inv_error_t result;
-        unsigned char regs[6];
-        if ((fifo_obj.cache & FIFO_CACHE_GYRO) == 0) {
-            fifo_obj.cache |= FIFO_CACHE_GYRO;
-            result =
-                inv_serial_read(inv_get_serial_handle(),
-                                inv_get_mpu_slave_addr(), MPUREG_GYRO_XOUT_H, 6,
-                                regs);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            fifo_obj.decoded[REF_RAW + 1] =
-                (((long)regs[0]) << 24) | (((long)regs[1]) << 16);
-            fifo_obj.decoded[REF_RAW + 2] =
-                (((long)regs[2]) << 24) | (((long)regs[3]) << 16);
-            fifo_obj.decoded[REF_RAW + 3] =
-                (((long)regs[4]) << 24) | (((long)regs[5]) << 16);
-
-            // Temperature starts at location 0, Gyro at location 1.
-            fifo_obj.decoded[REF_RAW + 1] =
-                inv_q30_mult(fifo_obj.decoded[REF_RAW + 1],
-                             fifo_scale[REF_RAW + 1]);
-            fifo_obj.decoded[REF_RAW + 2] =
-                inv_q30_mult(fifo_obj.decoded[REF_RAW + 2],
-                             fifo_scale[REF_RAW + 2]);
-            fifo_obj.decoded[REF_RAW + 3] =
-                inv_q30_mult(fifo_obj.decoded[REF_RAW + 3],
-                             fifo_scale[REF_RAW + 3]);
-        }
-        data[0] = fifo_obj.decoded[REF_RAW + 1];
-        data[1] = fifo_obj.decoded[REF_RAW + 2];
-        data[2] = fifo_obj.decoded[REF_RAW + 3];
-    } else {
-        long data2[6];
-        inv_get_gyro_and_accel_sensor(data2);
-        data[0] = data2[0];
-        data[1] = data2[1];
-        data[2] = data2[2];
-    }
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 6-element vector of gyro and accel data
- *  @param[out] data    6-element vector of gyro and accel data
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_gyro_and_accel_sensor(long *data)
-{
-    int ii;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_RAW_DATA])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (ii = 0; ii < (GYRO_NUM_AXES + ACCEL_NUM_AXES); ii++) {
-        data[ii] = fifo_obj.decoded[REF_RAW + 1 + ii];
-    }
-
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 3-element vector of external sensor
- *  @param[out] data    3-element vector of external sensor
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_external_sensor_data(long *data, int size)
-{
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-    int ii;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_RAW_EXTERNAL])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (ii = 0; ii < size && ii < 6; ii++) {
-        data[ii] = fifo_obj.decoded[REF_RAW_EXTERNAL + ii];
-    }
-
-    return INV_SUCCESS;
-#else
-    memset(data, 0, COMPASS_NUM_AXES * sizeof(long));
-    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-#endif
-}
-
-/** 
- *  Sends accelerometer data to the FIFO.
- *
- *  @param[in] elements Which of the 3 elements to send. Use INV_ALL for 3 axis
- *            or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 or'd together
- *            for a subset.
- *
- * @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *            bit data. Set to zero to remove it from the FIFO.
- */
-inv_error_t inv_send_accel(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[4] = { DINAF8 + 1, DINA28, DINA30, DINA38 };
-    inv_error_t result;
-    int kk;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    result = inv_construct3_fifo(regs, elements, accuracy, REF_ACCEL,
-                                 KEY_CFG_12, CONFIG_ACCEL);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    for (kk = 0; kk < ACCEL_NUM_AXES; kk++) {
-        fifo_scale[REF_ACCEL + kk] = 2 * inv_obj.accel_sens;
-    }
-
-    return inv_set_footer();
-}
-
-/** 
- * Sends control data to the FIFO. Control data is a 4 length vector of 32-bits.
- *
- *  @param[in] elements Which of the 4 elements to send. Use INV_ALL for all
- *            or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3, INV_ELEMENT_4 or'd
- *             together for a subset.
- *
- *  @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *             bit data. Set to zero to remove it from the FIFO.
- */
-inv_error_t inv_send_cntrl_data(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    int_fast8_t kk;
-    inv_error_t result;
-    unsigned char regs[5] = { DINAF8 + 1, DINA20, DINA28, DINA30, DINA38 };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_CONTROL, 4);
-    accuracy = inv_set_fifo_accuracy(elements, accuracy, CONFIG_CONTROL_DATA);
-
-    if (accuracy & INV_16_BIT) {
-        regs[0] = DINAF8 + 2;
-    }
-
-    fifo_obj.data_config[CONFIG_CONTROL_DATA] = elements | accuracy;
-
-    for (kk = 0; kk < 4; ++kk) {
-        if ((elements & 1) == 0)
-            regs[kk + 1] = DINAA0 + 3;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_1, 5, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-/** 
- * Adds a rolling counter to the fifo packet.  When used with the footer
- * the data comes out the first time:
- * 
- * @code
- * <data0><data1>...<dataN><PacketNum0><PacketNum1>
- * @endcode
- * for every other packet it is
- *
- * @code
- * <FifoFooter0><FifoFooter1><data0><data1>...<dataN><PacketNum0><PacketNum1>
- * @endcode
- *
- * This allows for scanning of the fifo for packets
- * 
- * @return INV_SUCCESS or error code
- */
-inv_error_t inv_send_packet_number(uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char regs;
-    uint_fast16_t elements;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    elements = inv_set_fifo_reference(1, accuracy, REF_DMP_PACKET, 1);
-    if (elements & 1) {
-        regs = DINA28;
-        fifo_obj.data_config[CONFIG_DMP_PACKET_NUMBER] =
-            INV_ELEMENT_1 | INV_16_BIT;
-    } else {
-        regs = DINAF8 + 3;
-        fifo_obj.data_config[CONFIG_DMP_PACKET_NUMBER] = 0;
-    }
-    result = inv_set_mpu_memory(KEY_CFG_23, 1, &regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-/**
- *  @brief  Send the computed gravity vectors into the FIFO.
- *          The gravity vectors can be retrieved from the FIFO via 
- *          inv_get_gravity(), to have the gravitation vector expressed
- *          in coordinates relative to the body.
- *
- *  Gravity is a derived vector derived from the quaternion.
- *  @param  elements
- *              the gravitation vectors components bitmask.
- *              To send all compoents use INV_ALL.
- *  @param  accuracy
- *              The number of bits the gravitation vector is expressed 
- *              into.
- *              Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *              bit data. 
- *              Set to zero to remove it from the FIFO.
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_send_gravity(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    result = inv_send_quaternion(accuracy);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-/** Sends gyro data to the FIFO. Gyro data is a 3 length vector
- *  of 32-bits. Should be called once after inv_dmp_open() and before inv_dmp_start().
- *  @param[in] elements Which of the 3 elements to send. Use INV_ALL for all of them
- *            or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 or'd together
- *            for a subset.
- *  @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *             bit data. Set to zero to remove it from the FIFO.
- */
-inv_error_t inv_send_gyro(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[4] = { DINAF8 + 1, DINA20, DINA28, DINA30 };
-    inv_error_t result;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (fifo_obj.gyro_source == INV_GYRO_FROM_QUATERNION) {
-        regs[0] = DINA90 + 5;
-        result = inv_set_mpu_memory(KEY_CFG_GYRO_SOURCE, 1, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        regs[0] = DINAF8 + 1;
-        regs[1] = DINA20;
-        regs[2] = DINA28;
-        regs[3] = DINA30;
-    } else {
-        regs[0] = DINA90 + 10;
-        result = inv_set_mpu_memory(KEY_CFG_GYRO_SOURCE, 1, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        regs[0] = DINAF8 + 1;
-        regs[1] = DINA28;
-        regs[2] = DINA30;
-        regs[3] = DINA38;
-    }
-    result = inv_construct3_fifo(regs, elements, accuracy, REF_GYROS,
-                                 KEY_CFG_9, CONFIG_GYROS);
-
-    return inv_set_footer();
-}
-
-/** Sends linear accelerometer data to the FIFO. 
- *
- *  Linear accelerometer data is a 3 length vector of 32-bits. It is the 
- *  acceleration in the body frame with gravity removed.
- * 
- * 
- *  @param[in] elements Which of the 3 elements to send. Use INV_ALL for all of
- *            them or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 or'd together
- *            for a subset.
- *
- *  NOTE: Elements is ignored if the fifo rate is < INV_MAX_NUM_ACCEL_SAMPLES
- *  @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *             bit data. Set to zero to remove it from the FIFO.
- */
-inv_error_t inv_send_linear_accel(uint_fast16_t elements,
-                                  uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char state = inv_get_state();
-
-    if (state < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    result = inv_send_gravity(elements, accuracy);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_send_accel(elements, accuracy);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-/** Sends linear world accelerometer data to the FIFO. Linear world
- *  accelerometer data is a 3 length vector of 32-bits. It is the acceleration
- *  in the world frame with gravity removed. Should be called once after
- *  inv_dmp_open() and before inv_dmp_start().
- *
- *  @param[in] elements Which of the 3 elements to send. Use INV_ALL for all of 
- *             them or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 or'd together
- *             for a subset.
- *  @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *             bit data.
- */
-inv_error_t inv_send_linear_accel_in_world(uint_fast16_t elements,
-                                           uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    result = inv_send_linear_accel(INV_ALL, accuracy);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_send_quaternion(accuracy);
-
-    return inv_set_footer();
-}
-
-/** Sends quaternion data to the FIFO. Quaternion data is a 4 length vector
- *   of 32-bits. Should be called once after inv_dmp_open() and before inv_dmp_start().
- * @param[in] accuracy Set to INV_32_BIT for 32-bit data, or INV_16_BIT for 16
- *            bit data.
- */
-inv_error_t inv_send_quaternion(uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[5] = { DINAF8 + 1, DINA20, DINA28,
-        DINA30, DINA38
-    };
-    uint_fast16_t elements, kk;
-    inv_error_t result;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    elements = inv_set_fifo_reference(0xf, accuracy, REF_QUATERNION, 4);
-    accuracy = inv_set_fifo_accuracy(elements, accuracy, CONFIG_QUAT);
-
-    if (accuracy & INV_16_BIT) {
-        regs[0] = DINAF8 + 2;
-    }
-
-    fifo_obj.data_config[CONFIG_QUAT] = elements | accuracy;
-
-    for (kk = 0; kk < 4; ++kk) {
-        if ((elements & 1) == 0)
-            regs[kk + 1] = DINAA0 + 3;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_8, 5, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-/** Sends raw data to the FIFO. 
- *  Should be called once after inv_dmp_open() and before inv_dmp_start().
- *  @param[in] elements Which of the 7 elements to send. Use INV_ALL for all of them
- *            or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 ... INV_ELEMENT_7 or'd together
- *            for a subset. The first element is temperature, the next 3 are gyro data,
- *            and the last 3 accel data.
- *  @param  accuracy
- *              The element's accuracy, can be INV_16_BIT, INV_32_BIT, or 0 to turn off.
- *  @return 0 if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_send_sensor_data(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    int result;
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-    unsigned char regs[7] = { DINAA0 + 3, DINAA0 + 3, DINAA0 + 3,
-        DINAA0 + 3, DINAA0 + 3, DINAA0 + 3,
-        DINAA0 + 3
-    };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (accuracy)
-        accuracy = INV_16_BIT;
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_RAW, 7);
-
-    if (elements & 1)
-        fifo_obj.data_config[CONFIG_TEMPERATURE] = 1 | INV_16_BIT;
-    else
-        fifo_obj.data_config[CONFIG_TEMPERATURE] = 0;
-    if (elements & 0x7e)
-        fifo_obj.data_config[CONFIG_RAW_DATA] =
-            (0x3f & (elements >> 1)) | INV_16_BIT;
-    else
-        fifo_obj.data_config[CONFIG_RAW_DATA] = 0;
-
-    if (elements & INV_ELEMENT_1) {
-        regs[0] = DINACA;
-    }
-    if (elements & INV_ELEMENT_2) {
-        regs[1] = DINBC4;
-    }
-    if (elements & INV_ELEMENT_3) {
-        regs[2] = DINACC;
-    }
-    if (elements & INV_ELEMENT_4) {
-        regs[3] = DINBC6;
-    }
-    if (elements & INV_ELEMENT_5) {
-        regs[4] = DINBC0;
-    }
-    if (elements & INV_ELEMENT_6) {
-        regs[5] = DINAC8;
-    }
-    if (elements & INV_ELEMENT_7) {
-        regs[6] = DINBC2;
-    }
-    result = inv_set_mpu_memory(KEY_CFG_15, 7, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-
-#else
-    INVENSENSE_FUNC_START;
-    unsigned char regs[4] = { DINAA0 + 3,
-        DINAA0 + 3,
-        DINAA0 + 3,
-        DINAA0 + 3
-    };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (accuracy)
-        accuracy = INV_16_BIT;
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_RAW, 7);
-
-    if (elements & 0x03) {
-        elements |= 0x03;
-        regs[0] = DINA20;
-    }
-    if (elements & 0x0C) {
-        elements |= 0x0C;
-        regs[1] = DINA28;
-    }
-    if (elements & 0x30) {
-        elements |= 0x30;
-        regs[2] = DINA30;
-    }
-    if (elements & 0x40) {
-        elements |= 0xC0;
-        regs[3] = DINA38;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_15, 4, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if (elements & 0x01)
-        fifo_obj.data_config[CONFIG_TEMPERATURE] = 1 | INV_16_BIT;
-    else
-        fifo_obj.data_config[CONFIG_TEMPERATURE] = 0;
-    if (elements & 0xfe)
-        fifo_obj.data_config[CONFIG_RAW_DATA] =
-            (0x7f & (elements >> 1)) | INV_16_BIT;
-    else
-        fifo_obj.data_config[CONFIG_RAW_DATA] = 0;
-
-    return inv_set_footer();
-#endif
-}
-
-/** Sends raw external data to the FIFO. 
- *  Should be called once after inv_dmp_open() and before inv_dmp_start().
- *  @param[in] elements Which of the 3 elements to send. Use INV_ALL for all of them
- *            or INV_ELEMENT_1, INV_ELEMENT_2, INV_ELEMENT_3 or'd together
- *            for a subset. 
- *  @param[in] accuracy INV_16_BIT to send data, 0 to stop sending this data.
- *            Sending and Stop sending are reference counted, so data actually
- *            stops when the reference reaches zero.
- */
-inv_error_t inv_send_external_sensor_data(uint_fast16_t elements,
-                                          uint_fast16_t accuracy)
-{
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-    int result;
-    unsigned char regs[6] = { DINAA0 + 3, DINAA0 + 3,
-                              DINAA0 + 3, DINAA0 + 3,
-                              DINAA0 + 3, DINAA0 + 3 };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (accuracy)
-        accuracy = INV_16_BIT;
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_RAW_EXTERNAL, 6);
-
-    if (elements)
-        fifo_obj.data_config[CONFIG_RAW_EXTERNAL] = elements | INV_16_BIT;
-    else
-        fifo_obj.data_config[CONFIG_RAW_EXTERNAL] = 0;
-
-    if (elements & INV_ELEMENT_1) {
-        regs[0] = DINBC2;
-    }
-    if (elements & INV_ELEMENT_2) {
-        regs[1] = DINACA;
-    }
-    if (elements & INV_ELEMENT_3) {
-        regs[2] = DINBC4;
-    }
-    if (elements & INV_ELEMENT_4) {
-        regs[3] = DINBC0;
-    }
-    if (elements & INV_ELEMENT_5) {
-        regs[4] = DINAC8;
-    }
-    if (elements & INV_ELEMENT_6) {
-        regs[5] = DINACC;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_EXTERNAL, sizeof(regs), regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-
-#else
-    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;    // Feature not supported
-#endif
-}
-
-/**
- *  @brief  Send the Quantized Acceleromter data into the FIFO.  The data can be
- *          retrieved using inv_get_quantized_accel() or inv_get_unquantized_accel().
- *
- *  To be useful this should be set to fifo_rate + 1 if less than
- *  INV_MAX_NUM_ACCEL_SAMPLES, otherwise it doesn't work.
- *
- *  @param  elements
- *              the components bitmask.
- *              To send all compoents use INV_ALL.
- *
- *  @param  accuracy
- *              Use INV_32_BIT for 32-bit data or INV_16_BIT for 
- *              16-bit data.
- *              Set to zero to remove it from the FIFO.
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_send_quantized_accel(uint_fast16_t elements,
-                                     uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[5] = { DINAF8 + 1, DINA20, DINA28,
-        DINA30, DINA38
-    };
-    unsigned char regs2[4] = { DINA20, DINA28,
-        DINA30, DINA38
-    };
-    inv_error_t result;
-    int_fast8_t kk;
-    int_fast8_t ii;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_QUANT_ACCEL, 8);
-
-    if (elements) {
-        fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL] = (elements) | INV_32_BIT;
-    } else {
-        fifo_obj.data_config[CONFIG_DMP_QUANT_ACCEL] = 0;
-    }
-
-    for (kk = 0; kk < INV_MAX_NUM_ACCEL_SAMPLES; ++kk) {
-        fifo_obj.decoded[REF_QUANT_ACCEL + kk] = 0;
-        for (ii = 0; ii < ACCEL_NUM_AXES; ii++) {
-            fifo_obj.decoded_accel[kk][ii] = 0;
-        }
-    }
-
-    for (kk = 0; kk < 4; ++kk) {
-        if ((elements & 1) == 0)
-            regs[kk + 1] = DINAA0 + 3;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_TAP0, 5, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    for (kk = 0; kk < 4; ++kk) {
-        if ((elements & 1) == 0)
-            regs2[kk] = DINAA0 + 3;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(KEY_CFG_TAP4, 4, regs2);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return inv_set_footer();
-}
-
-inv_error_t inv_send_eis(uint_fast16_t elements, uint_fast16_t accuracy)
-{
-    INVENSENSE_FUNC_START;
-    int_fast8_t kk;
-    unsigned char regs[3] = { DINA28, DINA30, DINA38 };
-    inv_error_t result;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (accuracy) {
-        accuracy = INV_32_BIT;
-    }
-
-    elements = inv_set_fifo_reference(elements, accuracy, REF_EIS, 3);
-    accuracy = inv_set_fifo_accuracy(elements, accuracy, CONFIG_EIS);
-
-    fifo_obj.data_config[CONFIG_EIS] = elements | accuracy;
-
-    for (kk = 0; kk < 3; ++kk) {
-        if ((elements & 1) == 0)
-            regs[kk] = DINAA0 + 7;
-        elements >>= 1;
-    }
-
-    result = inv_set_mpu_memory(KEY_P_EIS_FIFO_XSHIFT, 3, regs);
-
-    return inv_set_footer();
-}
-
-/** 
- * @brief       Returns 3-element vector of accelerometer data in body frame.
- *
- * @param[out]  data    3-element vector of accelerometer data in body frame.
- *                      One gee = 2^16.
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_accel(long *data)
-{
-    int kk;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if ((!fifo_obj.data_config[CONFIG_ACCEL] &&
-         (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR))
-        ||
-        (!(mldl_cfg->requested_sensors & INV_DMP_PROCESSOR) &&
-         !inv_accel_present()))
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_ACCEL + kk];
-    }
-
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 4-element quaternion vector derived from 6-axis or 
- *  9-axis if 9-axis was implemented. 6-axis is gyros and accels. 9-axis is
- *  gyros, accel and compass.
- *
- *  @param[out] data    4-element quaternion vector. One is scaled to 2^30.
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_quaternion(long *data)
-{
-    int kk;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_QUAT])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < 4; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_QUATERNION + kk];
-    }
-
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 4-element quaternion vector derived from 6 
- *              axis sensors (gyros and accels).
- *  @param[out] data    
- *                  4-element quaternion vector. One is scaled to 2^30.
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_6axis_quaternion(long *data)
-{
-    int kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_QUAT])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < 4; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_QUATERNION_6AXIS + kk];
-    }
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_get_relative_quaternion(long *data)
-{
-    if (data == NULL)
-        return INV_ERROR;
-    data[0] = inv_obj.relative_quat[0];
-    data[1] = inv_obj.relative_quat[1];
-    data[2] = inv_obj.relative_quat[2];
-    data[3] = inv_obj.relative_quat[3];
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief  Returns 3-element vector of gyro data in body frame.
- *  @param[out] data    
- *              3-element vector of gyro data in body frame 
- *              with gravity removed. One degree per second = 2^16.
- *  @return 0 on success or an error code.
- */
-inv_error_t inv_get_gyro(long *data)
-{
-    int kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (fifo_obj.data_config[CONFIG_GYROS]) {
-        for (kk = 0; kk < 3; ++kk) {
-            data[kk] = fifo_obj.decoded[REF_GYROS + kk];
-        }
-        return INV_SUCCESS;
-    } else {
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-    }
-}
-
-/**
- *  @brief  Get the 3-element gravity vector from the FIFO expressed
- *          in coordinates relative to the body frame.
- *  @param  data    
- *              3-element vector of gravity in body frame.
- *  @return 0 on success or an error code.
- */
-inv_error_t inv_get_gravity(long *data)
-{
-    long quat[4];
-    int ii;
-    inv_error_t result;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_QUAT])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    if ((fifo_obj.cache & FIFO_CACHE_GRAVITY_BODY) == 0) {
-        fifo_obj.cache |= FIFO_CACHE_GRAVITY_BODY;
-
-        // Compute it from Quaternion
-        result = inv_get_quaternion(quat);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        data[0] =
-            inv_q29_mult(quat[1], quat[3]) - inv_q29_mult(quat[2], quat[0]);
-        data[1] =
-            inv_q29_mult(quat[2], quat[3]) + inv_q29_mult(quat[1], quat[0]);
-        data[2] =
-            (inv_q29_mult(quat[3], quat[3]) + inv_q29_mult(quat[0], quat[0])) -
-            1073741824L;
-
-        for (ii = 0; ii < ACCEL_NUM_AXES; ii++) {
-            data[ii] >>= 14;
-            fifo_obj.gravity_cache[ii] = data[ii];
-        }
-    } else {
-        data[0] = fifo_obj.gravity_cache[0];
-        data[1] = fifo_obj.gravity_cache[1];
-        data[2] = fifo_obj.gravity_cache[2];
-    }
-
-    return INV_SUCCESS;
-}
-
-/** 
-* @brief        Sets the filter coefficent used for computing the acceleration
-*               bias which is used to compute linear acceleration.
-* @param[in] coef   Fitler coefficient. 0. means no filter, a small number means
-*                   a small cutoff frequency with an increasing number meaning 
-*                   an increasing cutoff frequency.
-*/
-inv_error_t inv_set_linear_accel_filter_coef(float coef)
-{
-    fifo_obj.acc_filter_coef = coef;
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 3-element vector of accelerometer data in body frame
- *              with gravity removed.
- *  @param[out] data    3-element vector of accelerometer data in body frame
- *                      with gravity removed. One g = 2^16.
- *  @return     0 on success or an error code. data unchanged on error.
- */
-inv_error_t inv_get_linear_accel(long *data)
-{
-    int kk;
-    long grav[3];
-    long la[3];
-    inv_error_t result;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    result = inv_get_gravity(grav);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_get_accel(la);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if ((fifo_obj.cache & FIFO_CACHE_ACC_BIAS) == 0) {
-        fifo_obj.cache |= FIFO_CACHE_ACC_BIAS;
-
-        for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-            long x;
-            x = la[kk] - grav[kk];
-            fifo_obj.acc_bias_filt[kk] = (long)(x * fifo_obj.acc_filter_coef +
-                                                fifo_obj.acc_bias_filt[kk] *
-                                                (1.f -
-                                                 fifo_obj.acc_filter_coef));
-            data[kk] = x - fifo_obj.acc_bias_filt[kk];
-        }
-    } else {
-        for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-            data[kk] = la[kk] - grav[kk] - fifo_obj.acc_bias_filt[kk];
-        }
-    }
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 3-element vector of accelerometer data in world frame
- *              with gravity removed.
- *  @param[out] data    3-element vector of accelerometer data in world frame
- *                      with gravity removed. One g = 2^16.
- *  @return     0 on success or an error code.
- */
-inv_error_t inv_get_linear_accel_in_world(long *data)
-{
-    int kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-    if (fifo_obj.data_config[CONFIG_ACCEL] && fifo_obj.data_config[CONFIG_QUAT]) {
-        long wtemp[4], qi[4], wtemp2[4];
-        wtemp[0] = 0;
-        inv_get_linear_accel(&wtemp[1]);
-        inv_q_mult(&fifo_obj.decoded[REF_QUATERNION], wtemp, wtemp2);
-        inv_q_invert(&fifo_obj.decoded[REF_QUATERNION], qi);
-        inv_q_mult(wtemp2, qi, wtemp);
-        for (kk = 0; kk < 3; ++kk) {
-            data[kk] = wtemp[kk + 1];
-        }
-        return INV_SUCCESS;
-    } else {
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-    }
-}
-
-/**
- *  @brief      Returns 4-element vector of control data.
- *  @param[out] data    4-element vector of control data.
- *  @return     0 for succes or an error code.
- */
-inv_error_t inv_get_cntrl_data(long *data)
-{
-    int kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_CONTROL_DATA])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < 4; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_CONTROL + kk];
-    }
-
-    return INV_SUCCESS;
-
-}
-
-/**
- *  @brief      Returns 3-element vector of EIS shfit data
- *  @param[out] data    3-element vector of EIS shift data.
- *  @return     0 for succes or an error code.
- */
-inv_error_t inv_get_eis(long *data)
-{
-    int kk;
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_EIS])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < 3; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_EIS + kk];
-    }
-
-    return INV_SUCCESS;
-
-}
-
-/** 
- *  @brief      Returns 3-element vector of accelerometer data in body frame.
- *  @param[out] data    3-element vector of accelerometer data in body frame in g's.
- *  @return     0 for success or an error code.
- */
-inv_error_t inv_get_accel_float(float *data)
-{
-    long lData[3];
-    int kk;
-    int result;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    result = inv_get_accel(lData);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    for (kk = 0; kk < ACCEL_NUM_AXES; ++kk) {
-        data[kk] = lData[kk] / 65536.0f;
-    }
-
-    return INV_SUCCESS;
-}
-
-/** 
- *  @brief      Returns 4-element quaternion vector.
- *  @param[out] data    4-element quaternion vector.
- *  @return     0 on success, an error code otherwise.
- */
-inv_error_t inv_get_quaternion_float(float *data)
-{
-    int kk;
-
-    if (data == NULL)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    if (!fifo_obj.data_config[CONFIG_QUAT])
-        return INV_ERROR_FEATURE_NOT_ENABLED;
-
-    for (kk = 0; kk < 4; ++kk) {
-        data[kk] = fifo_obj.decoded[REF_QUATERNION + kk] / 1073741824.0f;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   Command the MPU to put data in the FIFO at a particular rate.
- *
- *          The DMP will add fifo entries every fifoRate + 1 MPU cycles.  For
- *          example if the MPU is running at 200Hz the following values apply:
- *
- *          <TABLE>
- *          <TR><TD>fifoRate</TD><TD>DMP Sample Rate</TD><TD>FIFO update frequency</TD></TR>
- *          <TR><TD>0</TD><TD>200Hz</TD><TD>200Hz</TD></TR>
- *          <TR><TD>1</TD><TD>200Hz</TD><TD>100Hz</TD></TR>
- *          <TR><TD>2</TD><TD>200Hz</TD><TD>50Hz</TD></TR>
- *          <TR><TD>4</TD><TD>200Hz</TD><TD>40Hz</TD></TR>
- *          <TR><TD>9</TD><TD>200Hz</TD><TD>20Hz</TD></TR>
- *          <TR><TD>19</TD><TD>200Hz</TD><TD>10Hz</TD></TR>
- *          </TABLE>
- *
- *          Note: if the DMP is running, (state == INV_STATE_DMP_STARTED)
- *          then inv_run_state_callbacks() will be called to allow features
- *          that depend upon fundamental constants to be updated.
- *
- *  @pre    inv_dmp_open() 
- *          @ifnot MPL_MF 
- *              or inv_open_low_power_pedometer() 
- *              or inv_eis_open_dmp()
- *          @endif
- *          and inv_dmp_start() 
- *          must <b>NOT</b> have been called.
- *
- * @param   fifoRate    Divider value - 1.  Output rate is 
- *          (DMP Sample Rate) / (fifoRate + 1).
- *
- * @return  INV_SUCCESS if successful, ML error code on any failure.
- */
-inv_error_t inv_set_fifo_rate(unsigned short fifoRate)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[2];
-    unsigned char state;
-    inv_error_t result = INV_SUCCESS;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    state = inv_get_state();
-    if (state != INV_STATE_DMP_OPENED && state != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    fifo_obj.fifo_rate = fifoRate;
-
-    if (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR) {
-
-        regs[0] = (unsigned char)((fifoRate >> 8) & 0xff);
-        regs[1] = (unsigned char)(fifoRate & 0xff);
-
-        result = inv_set_mpu_memory(KEY_D_0_22, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        fifo_obj.sample_step_size_ms = 
-            (unsigned short)(((long)fifoRate + 1) *
-                             (inv_mpu_get_sampling_period_us
-                              (mldl_cfg)) / 1000L);
-
-        if (state == INV_STATE_DMP_STARTED)
-            result = inv_run_state_callbacks(state);
-    } else if (mldl_cfg->requested_sensors & INV_THREE_AXIS_ACCEL) {
-        struct ext_slave_config config;
-        long data;
-        config.key = MPU_SLAVE_CONFIG_ODR_RESUME;
-        config.len = sizeof(long);
-        config.apply = (state == INV_STATE_DMP_STARTED);
-        config.data = &data;
-        data = (1000 * inv_mpu_get_sampling_rate_hz(mldl_cfg)) / (fifoRate + 1);
-
-        /* Ask for the same frequency */
-        result = inv_mpu_config_accel(mldl_cfg,
-                                      inv_get_serial_handle(),
-                                      inv_get_serial_handle(), &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_mpu_get_accel_config(mldl_cfg,
-                                          inv_get_serial_handle(),
-                                          inv_get_serial_handle(), &config);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        if(FIFO_DEBUG)
-            MPL_LOGI("Actual ODR: %ld Hz\n", data / 1000);
-        /* Record the actual frequency granted odr is in mHz */
-        fifo_obj.sample_step_size_ms = (unsigned short)((1000L * 1000L) / data);
-    }
-    return result;
-}
-
-/**
- * @brief   Retrieve the current FIFO update divider - 1.
- *          See inv_set_fifo_rate() for how this value is used.
- *
- *          The fifo rate when there is no fifo is the equivilent divider when
- *          derived from the value set by SetSampleSteSizeMs()
- *          
- * @return  The value of the fifo rate divider or INV_INVALID_FIFO_RATE on error.
- */
-unsigned short inv_get_fifo_rate(void)
-{
-    return fifo_obj.fifo_rate;
-}
-
-/**
- * @brief   Returns the step size for quaternion type data.
- *
- * Typically the data rate for each FIFO packet. When the gryos are sleeping
- * this value will return the last value set by SetSampleStepSizeMs()
- *
- * @return  step size for quaternion type data
- */
-int_fast16_t inv_get_sample_step_size_ms(void)
-{
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR)
-        return (fifo_obj.fifo_rate + 1) *
-            (inv_mpu_get_sampling_period_us(mldl_cfg) / 1000);
-    else
-        return fifo_obj.sample_step_size_ms;
-}
-
-/**
- * @brief   Returns the step size for quaternion type data.
- *
- * Typically the data rate for each FIFO packet. When the gryos are sleeping
- * this value will return the last value set by SetSampleStepSizeMs()
- *
- * @return  step size for quaternion type data
- */
-int_fast16_t inv_get_sample_frequency(void)
-{
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (mldl_cfg->requested_sensors & INV_DMP_PROCESSOR)
-        return (inv_mpu_get_sampling_rate_hz(mldl_cfg) /
-                (fifo_obj.fifo_rate + 1));
-    else
-        return (1000 / fifo_obj.sample_step_size_ms);
-}
-
-/** 
- *  @brief  The gyro data magnitude squared : 
- *          (1 degree per second)^2 = 2^6 = 2^GYRO_MAG_SQR_SHIFT.
- *  @return the computed magnitude squared output of the gyroscope.
- */
-unsigned long inv_get_gyro_sum_of_sqr(void)
-{
-    unsigned long gmag = 0;
-    long temp;
-    int kk;
-
-    for (kk = 0; kk < 3; ++kk) {
-        temp = fifo_obj.decoded[REF_GYROS + kk] >>
-            (16 - (GYRO_MAG_SQR_SHIFT / 2));
-        gmag += temp * temp;
-    }
-
-    return gmag;
-}
-
-/** 
- *  @brief  The gyro data magnitude squared:
- *          (1 g)^2 = 2^16 = 2^ACC_MAG_SQR_SHIFT.
- *  @return the computed magnitude squared output of the accelerometer.
- */
-unsigned long inv_accel_sum_of_sqr(void)
-{
-    unsigned long amag = 0;
-    long temp;
-    int kk;
-    long accel[3];
-    inv_error_t result;
-
-    result = inv_get_accel(accel);
-    if (INV_SUCCESS != result) {
-        return 0;
-    }
-
-    for (kk = 0; kk < 3; ++kk) {
-        temp = accel[kk] >> (16 - (ACC_MAG_SQR_SHIFT / 2));
-        amag += temp * temp;
-    }
-    return amag;
-}
-
-/**
- *  @internal
- */
-void inv_override_quaternion(float *q)
-{
-    int kk;
-    for (kk = 0; kk < 4; ++kk) {
-        fifo_obj.decoded[REF_QUATERNION + kk] = (long)(q[kk] * (1L << 30));
-    }
-}
-
-/**
- * @internal
- * @brief   This registers a function to be called for each set of 
- *          gyro/quaternion/rotation matrix/etc output.
- * @param[in] func The callback function to register
- * @param[in] priority The unique priority number of the callback. Lower numbers
- *            are called first.
- * @return  error code.
- */
-inv_error_t inv_register_fifo_rate_process(inv_obj_func func, int priority)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    int kk, nn;
-
-    result = inv_lock_mutex(fifo_rate_obj.mutex);
-    if (INV_SUCCESS != result) {
-        return result;
-    }
-    // Make sure we haven't registered this function already
-    // Or used the same priority
-    for (kk = 0; kk < fifo_rate_obj.num_cb; ++kk) {
-        if ((fifo_rate_obj.fifo_process_cb[kk] == func) ||
-            (fifo_rate_obj.priority[kk] == priority)) {
-            inv_unlock_mutex(fifo_rate_obj.mutex);
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-    }
-
-    // Make sure we have not filled up our number of allowable callbacks
-    if (fifo_rate_obj.num_cb <= MAX_HIGH_RATE_PROCESSES - 1) {
-        kk = 0;
-        if (fifo_rate_obj.num_cb != 0) {
-            // set kk to be where this new callback goes in the array
-            while ((kk < fifo_rate_obj.num_cb) &&
-                   (fifo_rate_obj.priority[kk] < priority)) {
-                kk++;
-            }
-            if (kk != fifo_rate_obj.num_cb) {
-                // We need to move the others
-                for (nn = fifo_rate_obj.num_cb; nn > kk; --nn) {
-                    fifo_rate_obj.fifo_process_cb[nn] =
-                        fifo_rate_obj.fifo_process_cb[nn - 1];
-                    fifo_rate_obj.priority[nn] = fifo_rate_obj.priority[nn - 1];
-                }
-            }
-        }
-        // Add new callback
-        fifo_rate_obj.fifo_process_cb[kk] = func;
-        fifo_rate_obj.priority[kk] = priority;
-        fifo_rate_obj.num_cb++;
-    } else {
-        result = INV_ERROR_MEMORY_EXAUSTED;
-    }
-
-    inv_unlock_mutex(fifo_rate_obj.mutex);
-    return result;
-}
-
-/**
- * @internal
- * @brief   This unregisters a function to be called for each set of 
- *          gyro/quaternion/rotation matrix/etc output.
- * @return  error code.
- */
-inv_error_t inv_unregister_fifo_rate_process(inv_obj_func func)
-{
-    INVENSENSE_FUNC_START;
-    int kk, jj;
-    inv_error_t result;
-
-    result = inv_lock_mutex(fifo_rate_obj.mutex);
-    if (INV_SUCCESS != result) {
-        return result;
-    }
-    // Make sure we haven't registered this function already
-    result = INV_ERROR_INVALID_PARAMETER;
-    for (kk = 0; kk < fifo_rate_obj.num_cb; ++kk) {
-        if (fifo_rate_obj.fifo_process_cb[kk] == func) {
-            for (jj = kk + 1; jj < fifo_rate_obj.num_cb; ++jj) {
-                fifo_rate_obj.fifo_process_cb[jj - 1] =
-                    fifo_rate_obj.fifo_process_cb[jj];
-                fifo_rate_obj.priority[jj - 1] =
-                    fifo_rate_obj.priority[jj];
-            }
-            fifo_rate_obj.fifo_process_cb[fifo_rate_obj.num_cb - 1] = NULL;
-            fifo_rate_obj.priority[fifo_rate_obj.num_cb - 1] = 0;
-            fifo_rate_obj.num_cb--;
-            result = INV_SUCCESS;
-            break;
-        }
-    }
-
-    inv_unlock_mutex(fifo_rate_obj.mutex);
-    return result;
-
-}
-#ifdef UMPL
-bool bFIFIDataAvailable = FALSE;
-bool isUmplDataInFIFO(void)
-{
-    return bFIFIDataAvailable;
-}
-void setUmplDataInFIFOFlag(bool flag)
-{
-    bFIFIDataAvailable = flag;
-}
-#endif
-inv_error_t inv_run_fifo_rate_processes(void)
-{
-    int kk;
-    inv_error_t result, result2;
-
-    result = inv_lock_mutex(fifo_rate_obj.mutex);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("MLOsLockMutex returned %d\n", result);
-        return result;
-    }
-    // User callbacks take priority over the fifo_process_cb callback
-    if (fifo_obj.fifo_process_cb)
-        fifo_obj.fifo_process_cb();
-
-    for (kk = 0; kk < fifo_rate_obj.num_cb; ++kk) {
-        if (fifo_rate_obj.fifo_process_cb[kk]) {
-            result2 = fifo_rate_obj.fifo_process_cb[kk] (&inv_obj);
-            if (result == INV_SUCCESS)
-#ifdef UMPL		 
-	 setUmplDataInFIFOFlag(TRUE);
-#endif
-                result = result2;
-        }
-    }
-
-    inv_unlock_mutex(fifo_rate_obj.mutex);
-    return result;
-}
-
-/*********************/
-         /** \}*//* defgroup */
-/*********************/
diff --git a/60xx/mlsdk/mllite/mlFIFO.h b/60xx/mlsdk/mllite/mlFIFO.h
deleted file mode 100644
index 2114eb3..0000000
--- a/60xx/mlsdk/mllite/mlFIFO.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 INVENSENSE_INV_FIFO_H__
-#define INVENSENSE_INV_FIFO_H__
-
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "ml.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlFIFO_legacy.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    /**************************************************************************/
-    /*  Elements                                                              */
-    /**************************************************************************/
-
-#define INV_ELEMENT_1                    (0x0001)
-#define INV_ELEMENT_2                    (0x0002)
-#define INV_ELEMENT_3                    (0x0004)
-#define INV_ELEMENT_4                    (0x0008)
-#define INV_ELEMENT_5                    (0x0010)
-#define INV_ELEMENT_6                    (0x0020)
-#define INV_ELEMENT_7                    (0x0040)
-#define INV_ELEMENT_8                    (0x0080)
-
-#define INV_ALL                          (0xFFFF)
-#define INV_ELEMENT_MASK                 (0x00FF)
-
-    /**************************************************************************/
-    /*  Accuracy                                                              */
-    /**************************************************************************/
-
-#define INV_16_BIT                       (0x0100)
-#define INV_32_BIT                       (0x0200)
-#define INV_ACCURACY_MASK                (0x0300)
-
-    /**************************************************************************/
-    /*  Accuracy                                                              */
-    /**************************************************************************/
-
-#define INV_GYRO_FROM_RAW                (0x00)
-#define INV_GYRO_FROM_QUATERNION         (0x01)
-
-    /**************************************************************************/
-    /*  High Rate Proceses                                                    */
-    /**************************************************************************/
-
-#define MAX_HIGH_RATE_PROCESSES 16
-
-    /**************************************************************************/
-    /*  Prototypes                                                            */
-    /**************************************************************************/
-
-    inv_error_t inv_set_fifo_rate(unsigned short fifoRate);
-    unsigned short inv_get_fifo_rate(void);
-    int_fast16_t inv_get_sample_step_size_ms(void);
-    int_fast16_t inv_get_sample_frequency(void);
-    long inv_decode_temperature(short tempReg);
-
-    // Register callbacks after a packet of FIFO data is processed
-    inv_error_t inv_register_fifo_rate_process(inv_obj_func func, int priority);
-    inv_error_t inv_unregister_fifo_rate_process(inv_obj_func func);
-    inv_error_t inv_run_fifo_rate_processes(void);
-
-    // Setup FIFO for various output
-    inv_error_t inv_send_quaternion(uint_fast16_t accuracy);
-    inv_error_t inv_send_gyro(uint_fast16_t elements, uint_fast16_t accuracy);
-    inv_error_t inv_send_accel(uint_fast16_t elements, uint_fast16_t accuracy);
-    inv_error_t inv_send_linear_accel(uint_fast16_t elements,
-                                      uint_fast16_t accuracy);
-    inv_error_t inv_send_linear_accel_in_world(uint_fast16_t elements,
-                                               uint_fast16_t accuracy);
-    inv_error_t inv_send_cntrl_data(uint_fast16_t elements,
-                                    uint_fast16_t accuracy);
-    inv_error_t inv_send_sensor_data(uint_fast16_t elements,
-                                     uint_fast16_t accuracy);
-    inv_error_t inv_send_external_sensor_data(uint_fast16_t elements,
-                                              uint_fast16_t accuracy);
-    inv_error_t inv_send_gravity(uint_fast16_t elements,
-                                 uint_fast16_t accuracy);
-    inv_error_t inv_send_packet_number(uint_fast16_t accuracy);
-    inv_error_t inv_send_quantized_accel(uint_fast16_t elements,
-                                         uint_fast16_t accuracy);
-    inv_error_t inv_send_eis(uint_fast16_t elements, uint_fast16_t accuracy);
-
-    // Get Fixed Point data from FIFO
-    inv_error_t inv_get_accel(long *data);
-    inv_error_t inv_get_quaternion(long *data);
-    inv_error_t inv_get_6axis_quaternion(long *data);
-    inv_error_t inv_get_relative_quaternion(long *data);
-    inv_error_t inv_get_gyro(long *data);
-    inv_error_t inv_set_linear_accel_filter_coef(float coef);
-    inv_error_t inv_get_linear_accel(long *data);
-    inv_error_t inv_get_linear_accel_in_world(long *data);
-    inv_error_t inv_get_gyro_and_accel_sensor(long *data);
-    inv_error_t inv_get_gyro_sensor(long *data);
-    inv_error_t inv_get_cntrl_data(long *data);
-    inv_error_t inv_get_temperature(long *data);
-    inv_error_t inv_get_gravity(long *data);
-    inv_error_t inv_get_unquantized_accel(long *data);
-    inv_error_t inv_get_quantized_accel(long *data);
-    inv_error_t inv_get_external_sensor_data(long *data, int size);
-    inv_error_t inv_get_eis(long *data);
-
-    // Get Floating Point data from FIFO
-    inv_error_t inv_get_accel_float(float *data);
-    inv_error_t inv_get_quaternion_float(float *data);
-
-    inv_error_t inv_process_fifo_packet(const unsigned char *dmpData);
-    inv_error_t inv_read_and_process_fifo(int_fast8_t numPackets,
-                                          int_fast8_t * processed);
-
-    inv_error_t inv_set_fifo_processed_callback(void (*func) (void));
-
-    inv_error_t inv_init_fifo_param(void);
-    inv_error_t inv_close_fifo(void);
-    inv_error_t inv_set_gyro_data_source(uint_fast8_t source);
-    inv_error_t inv_decode_quantized_accel(void);
-    unsigned long inv_get_gyro_sum_of_sqr(void);
-    unsigned long inv_accel_sum_of_sqr(void);
-    void inv_override_quaternion(float *q);
-#ifdef UMPL
-    bool isUmplDataInFIFO(void);
-    void setUmplDataInFIFOFlag(bool flag);
-#endif
-    uint_fast16_t inv_get_fifo_packet_size(void);
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INVENSENSE_INV_FIFO_H__
diff --git a/60xx/mlsdk/mllite/mlFIFOHW.c b/60xx/mlsdk/mllite/mlFIFOHW.c
deleted file mode 100644
index 7a77e66..0000000
--- a/60xx/mlsdk/mllite/mlFIFOHW.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlFIFOHW.c 5653 2011-06-16 21:06:55Z nroyer $
- *
- *******************************************************************************/
-
-/** 
- *  @defgroup MLFIFO_HW 
- *  @brief  Motion Library - FIFO HW Driver.
- *          Provides facilities to interact with the FIFO.
- *
- *  @{
- *      @file   mlFIFOHW.c
- *      @brief  The Motion Library Fifo Hardware Layer.
- *
- */
-
-#include <string.h>
-
-#include "mpu.h"
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-#    include "mpu6050a2.h"
-#elif defined CONFIG_MPU_SENSORS_MPU6050B1
-#    include "mpu6050b1.h"
-#elif defined CONFIG_MPU_SENSORS_MPU3050
-#  include "mpu3050.h"
-#else
-#error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
-#endif
-#include "mlFIFOHW.h"
-#include "ml.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-
-#include "mlsl.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-fifo"
-
-/*
-    Defines
-*/
-
-#define _fifoDebug(x)           //{x}
-
-/*
-    Typedefs
-*/
-
-struct fifo_hw_obj {
-    short fifoCount;
-    inv_error_t fifoError;
-    unsigned char fifoOverflow;
-    unsigned char fifoResetOnOverflow;
-};
-
-/*
-    Global variables
-*/
-const unsigned char gFifoFooter[FIFO_FOOTER_SIZE] = { 0xB2, 0x6A };
-
-/*
-    Static variables
-*/
-static struct fifo_hw_obj fifo_objHW;
-
-/*
-    Definitions
-*/
-
-/**
- *  @brief  Initializes the internal FIFO data structure.
- */
-void inv_init_fifo_hardare(void)
-{
-    memset(&fifo_objHW, 0, sizeof(fifo_objHW));
-    fifo_objHW.fifoResetOnOverflow = TRUE;
-}
-
-/**
- *  @internal
- *  @brief  used to get the FIFO data.
- *  @param  length  
- *              Number of bytes to read from the FIFO.
- *  @param  buffer  
- *              the bytes of FIFO data.
- *              Note that this buffer <b>must</b> be large enough
- *              to store and additional trailing FIFO footer when 
- *              expected.  The callers must make sure enough space
- *              is allocated.
- *  @return number of valid bytes of data.
-**/
-uint_fast16_t inv_get_fifo(uint_fast16_t length, unsigned char *buffer)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    uint_fast16_t inFifo;
-    uint_fast16_t toRead;
-    int_fast8_t kk;
-
-    toRead = length - FIFO_FOOTER_SIZE + fifo_objHW.fifoCount;
-    /*---- make sure length is correct ----*/
-    if (length > MAX_FIFO_LENGTH || toRead > length || NULL == buffer) {
-        fifo_objHW.fifoError = INV_ERROR_INVALID_PARAMETER;
-        return 0;
-    }
-
-    result = inv_get_fifo_length(&inFifo);
-    if (INV_SUCCESS != result) {
-        fifo_objHW.fifoError = result;
-        return 0;
-    }
-    // fifo_objHW.fifoCount is the footer size left in the buffer, or 
-    //      0 if this is the first time reading the fifo since it was reset
-    if (inFifo < length + fifo_objHW.fifoCount) {
-        fifo_objHW.fifoError = INV_SUCCESS;
-        return 0;
-    }
-    // if a trailing fifo count is expected - start storing data 2 bytes before
-    result =
-        inv_read_fifo(fifo_objHW.fifoCount >
-                      0 ? buffer : buffer + FIFO_FOOTER_SIZE, toRead);
-    if (INV_SUCCESS != result) {
-        fifo_objHW.fifoError = result;
-        return 0;
-    }
-    // Make sure the fifo didn't overflow before or during the read
-    result = inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                             MPUREG_INT_STATUS, 1, &fifo_objHW.fifoOverflow);
-    if (INV_SUCCESS != result) {
-        fifo_objHW.fifoError = result;
-        return 0;
-    }
-
-    if (fifo_objHW.fifoOverflow & BIT_INT_STATUS_FIFO_OVERLOW) {
-        MPL_LOGV("Resetting Fifo : Overflow\n");
-        inv_reset_fifo();
-        fifo_objHW.fifoError = INV_ERROR_FIFO_OVERFLOW;
-        return 0;
-    }
-
-    /* Check the Footer value to give us a chance at making sure data 
-     * didn't get corrupted */
-    for (kk = 0; kk < fifo_objHW.fifoCount; ++kk) {
-        if (buffer[kk] != gFifoFooter[kk]) {
-            MPL_LOGV("Resetting Fifo : Invalid footer : 0x%02x 0x%02x\n",
-                     buffer[0], buffer[1]);
-            _fifoDebug(char out[200];
-                       MPL_LOGW("fifoCount : %d\n", fifo_objHW.fifoCount);
-                       sprintf(out, "0x");
-                       for (kk = 0; kk < (int)toRead; kk++) {
-                       sprintf(out, "%s%02X", out, buffer[kk]);}
-                       MPL_LOGW("%s\n", out);)
-                inv_reset_fifo();
-            fifo_objHW.fifoError = INV_ERROR_FIFO_FOOTER;
-            return 0;
-        }
-    }
-
-    if (fifo_objHW.fifoCount == 0) {
-        fifo_objHW.fifoCount = FIFO_FOOTER_SIZE;
-    }
-
-    return length - FIFO_FOOTER_SIZE;
-}
-
-/**
- *  @brief  Used to query the status of the FIFO.
- *  @return INV_SUCCESS if the fifo is OK. An error code otherwise.
-**/
-inv_error_t inv_get_fifo_status(void)
-{
-    inv_error_t fifoError = fifo_objHW.fifoError;
-    fifo_objHW.fifoError = 0;
-    return fifoError;
-}
-
-/** 
- * @internal
- * @brief   Get the length from the fifo
- * 
- * @param[out] len amount of data currently stored in the fifo.
- * 
- * @return INV_SUCCESS or non-zero error code.
-**/
-inv_error_t inv_get_fifo_length(uint_fast16_t * len)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char fifoBuf[2];
-    inv_error_t result;
-
-    if (NULL == len)
-        return INV_ERROR_INVALID_PARAMETER;
-
-    /*---- read the 2 'count' registers and 
-      burst read the data from the FIFO ----*/
-    result = inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                             MPUREG_FIFO_COUNTH, 2, fifoBuf);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("ReadBurst failed %d\n", result);
-        inv_reset_fifo();
-        fifo_objHW.fifoError = INV_ERROR_FIFO_READ_COUNT;
-        *len = 0;
-        return result;
-    }
-
-    *len = (uint_fast16_t) (fifoBuf[0] << 8);
-    *len += (uint_fast16_t) (fifoBuf[1]);
-    return result;
-}
-
-/**
- *  @brief  inv_get_fifo_count is used to get the number of bytes left in the FIFO.
- *          This function returns the stored value and does not access the hardware.  
- *          See inv_get_fifo_length().
- *  @return the number of bytes left in the FIFO
-**/
-short inv_get_fifo_count(void)
-{
-    return fifo_objHW.fifoCount;
-}
-
-/** 
- *  @internal
- *  @brief  Read data from the fifo
- * 
- *  @param[out] data Location to store the date read from the fifo
- *  @param[in] len   Amount of data to read out of the fifo
- * 
- *  @return INV_SUCCESS or non-zero error code
-**/
-inv_error_t inv_read_fifo(unsigned char *data, uint_fast16_t len)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    result = inv_serial_read_fifo(inv_get_serial_handle(),
-                                  inv_get_mpu_slave_addr(),
-                                  (unsigned short)len, data);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("inv_serial_readBurst failed %d\n", result);
-        inv_reset_fifo();
-        fifo_objHW.fifoError = INV_ERROR_FIFO_READ_DATA;
-        return result;
-    }
-    return result;
-}
-
-/**
- *  @brief  Clears the FIFO status and its content. 
- *  @note   Halt the DMP writing into the FIFO for the time 
- *          needed to reset the FIFO.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_reset_fifo(void)
-{
-    INVENSENSE_FUNC_START;
-    int len = FIFO_HW_SIZE;
-    unsigned char fifoBuf[2];
-    unsigned char tries = 0;
-    unsigned char userCtrlReg;
-    inv_error_t result;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    fifo_objHW.fifoCount = 0;
-    if (mldl_cfg->gyro_is_suspended)
-        return INV_SUCCESS;
-
-    result = inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                             MPUREG_USER_CTRL, 1, &userCtrlReg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    while (len != 0 && tries < 6) {
-        result =
-            inv_serial_single_write(inv_get_serial_handle(),
-                                    inv_get_mpu_slave_addr(), MPUREG_USER_CTRL,
-                                    ((userCtrlReg & (~BIT_FIFO_EN)) |
-                                     BIT_FIFO_RST));
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result =
-            inv_serial_read(inv_get_serial_handle(), inv_get_mpu_slave_addr(),
-                            MPUREG_FIFO_COUNTH, 2, fifoBuf);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        len = (unsigned short)fifoBuf[0] * 256 + (unsigned short)fifoBuf[1];
-        tries++;
-    }
-
-    result =
-        inv_serial_single_write(inv_get_serial_handle(),
-                                inv_get_mpu_slave_addr(), MPUREG_USER_CTRL,
-                                userCtrlReg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- * @}
-**/
diff --git a/60xx/mlsdk/mllite/mlFIFOHW.h b/60xx/mlsdk/mllite/mlFIFOHW.h
deleted file mode 100644
index 6f70185..0000000
--- a/60xx/mlsdk/mllite/mlFIFOHW.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 INVENSENSE_INV_FIFO_HW_H__
-#define INVENSENSE_INV_FIFO_HW_H__
-
-#include "mpu.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlFIFOHW_legacy.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    // This is the maximum amount of FIFO data we would read in one packet
-#define MAX_FIFO_LENGTH             (256)
-    // This is the hardware size of the FIFO
-#define FIFO_FOOTER_SIZE            (2)
-
-    uint_fast16_t inv_get_fifo(uint_fast16_t length, unsigned char *buffer);
-    inv_error_t inv_get_fifo_status(void);
-    inv_error_t inv_get_fifo_length(uint_fast16_t * len);
-    short inv_get_fifo_count(void);
-    inv_error_t inv_reset_fifo(void);
-    void inv_init_fifo_hardare();
-    inv_error_t inv_read_fifo(unsigned char *data, uint_fast16_t len);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INVENSENSE_INV_FIFO_HW_H__
diff --git a/60xx/mlsdk/mllite/mlMathFunc.c b/60xx/mlsdk/mllite/mlMathFunc.c
deleted file mode 100644
index 0d8e7ec..0000000
--- a/60xx/mlsdk/mllite/mlMathFunc.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-#include "mlmath.h"
-#include "mlMathFunc.h"
-#include "mlinclude.h"
-
-/** 
- * Performs one iteration of the filter, generating a new y(0) 
- *         1     / N                /  N             \\
- * y(0) = ---- * |SUM b(k) * x(k) - | SUM a(k) * y(k)|| for N = length
- *        a(0)   \k=0               \ k=1            //
- * 
- * The filters A and B should be (sizeof(long) * state->length).
- * The state variables x and y should be (sizeof(long) * (state->length - 1))
- *
- * The state variables x and y should be initialized prior to the first call
- * 
- * @param state Contains the length of the filter, filter coefficients and
- *              filter state variables x and y.
- * @param x New input into the filter.
- */
-void inv_filter_long(struct filter_long *state, long x)
-{
-    const long *b = state->b;
-    const long *a = state->a;
-    long length = state->length;
-    long long tmp;
-    int ii;
-
-    /* filter */
-    tmp = (long long)x *(b[0]);
-    for (ii = 0; ii < length - 1; ii++) {
-        tmp += ((long long)state->x[ii] * (long long)(b[ii + 1]));
-    }
-    for (ii = 0; ii < length - 1; ii++) {
-        tmp -= ((long long)state->y[ii] * (long long)(a[ii + 1]));
-    }
-    tmp /= (long long)a[0];
-
-    /* Delay */
-    for (ii = length - 2; ii > 0; ii--) {
-        state->y[ii] = state->y[ii - 1];
-        state->x[ii] = state->x[ii - 1];
-    }
-    /* New values */
-    state->y[0] = (long)tmp;
-    state->x[0] = x;
-}
-
-/** Performs a multiply and shift by 29. These are good functions to write in assembly on
- * with devices with small memory where you want to get rid of the long long which some
- * assemblers don't handle well
- * @param[in] a 
- * @param[in] b
- * @return ((long long)a*b)>>29
-*/
-long inv_q29_mult(long a, long b)
-{
-    long long temp;
-    long result;
-    temp = (long long)a *b;
-    result = (long)(temp >> 29);
-    return result;
-}
-
-/** Performs a multiply and shift by 30. These are good functions to write in assembly on
- * with devices with small memory where you want to get rid of the long long which some
- * assemblers don't handle well
- * @param[in] a 
- * @param[in] b
- * @return ((long long)a*b)>>30
-*/
-long inv_q30_mult(long a, long b)
-{
-    long long temp;
-    long result;
-    temp = (long long)a *b;
-    result = (long)(temp >> 30);
-    return result;
-}
-
-void inv_q_mult(const long *q1, const long *q2, long *qProd)
-{
-    INVENSENSE_FUNC_START;
-    qProd[0] = (long)(((long long)q1[0] * q2[0] - (long long)q1[1] * q2[1] -
-                       (long long)q1[2] * q2[2] -
-                       (long long)q1[3] * q2[3]) >> 30);
-    qProd[1] =
-        (int)(((long long)q1[0] * q2[1] + (long long)q1[1] * q2[0] +
-               (long long)q1[2] * q2[3] - (long long)q1[3] * q2[2]) >> 30);
-    qProd[2] =
-        (long)(((long long)q1[0] * q2[2] - (long long)q1[1] * q2[3] +
-                (long long)q1[2] * q2[0] + (long long)q1[3] * q2[1]) >> 30);
-    qProd[3] =
-        (long)(((long long)q1[0] * q2[3] + (long long)q1[1] * q2[2] -
-                (long long)q1[2] * q2[1] + (long long)q1[3] * q2[0]) >> 30);
-}
-
-void inv_q_add(long *q1, long *q2, long *qSum)
-{
-    INVENSENSE_FUNC_START;
-    qSum[0] = q1[0] + q2[0];
-    qSum[1] = q1[1] + q2[1];
-    qSum[2] = q1[2] + q2[2];
-    qSum[3] = q1[3] + q2[3];
-}
-
-void inv_q_normalize(long *q)
-{
-    INVENSENSE_FUNC_START;
-    double normSF = 0;
-    int i;
-    for (i = 0; i < 4; i++) {
-        normSF += ((double)q[i]) / 1073741824L * ((double)q[i]) / 1073741824L;
-    }
-    if (normSF > 0) {
-        normSF = 1 / sqrt(normSF);
-        for (i = 0; i < 4; i++) {
-            q[i] = (int)((double)q[i] * normSF);
-        }
-    } else {
-        q[0] = 1073741824L;
-        q[1] = 0;
-        q[2] = 0;
-        q[3] = 0;
-    }
-}
-
-void inv_q_invert(const long *q, long *qInverted)
-{
-    INVENSENSE_FUNC_START;
-    qInverted[0] = q[0];
-    qInverted[1] = -q[1];
-    qInverted[2] = -q[2];
-    qInverted[3] = -q[3];
-}
-
-void inv_q_multf(const float *q1, const float *q2, float *qProd)
-{
-    INVENSENSE_FUNC_START;
-    qProd[0] = (q1[0] * q2[0] - q1[1] * q2[1] - q1[2] * q2[2] - q1[3] * q2[3]);
-    qProd[1] = (q1[0] * q2[1] + q1[1] * q2[0] + q1[2] * q2[3] - q1[3] * q2[2]);
-    qProd[2] = (q1[0] * q2[2] - q1[1] * q2[3] + q1[2] * q2[0] + q1[3] * q2[1]);
-    qProd[3] = (q1[0] * q2[3] + q1[1] * q2[2] - q1[2] * q2[1] + q1[3] * q2[0]);
-}
-
-void inv_q_addf(float *q1, float *q2, float *qSum)
-{
-    INVENSENSE_FUNC_START;
-    qSum[0] = q1[0] + q2[0];
-    qSum[1] = q1[1] + q2[1];
-    qSum[2] = q1[2] + q2[2];
-    qSum[3] = q1[3] + q2[3];
-}
-
-void inv_q_normalizef(float *q)
-{
-    INVENSENSE_FUNC_START;
-    float normSF = 0;
-    float xHalf = 0;
-    normSF = (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-    if (normSF < 2) {
-        xHalf = 0.5f * normSF;
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        normSF = normSF * (1.5f - xHalf * normSF * normSF);
-        q[0] *= normSF;
-        q[1] *= normSF;
-        q[2] *= normSF;
-        q[3] *= normSF;
-    } else {
-        q[0] = 1.0;
-        q[1] = 0.0;
-        q[2] = 0.0;
-        q[3] = 0.0;
-    }
-    normSF = (q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-}
-
-/** Performs a length 4 vector normalization with a square root.
-* @param[in,out] vector to normalize. Returns [1,0,0,0] is magnitude is zero.
-*/
-void inv_q_norm4(float *q)
-{
-    float mag;
-    mag = sqrtf(q[0] * q[0] + q[1] * q[1] + q[2] * q[2] + q[3] * q[3]);
-    if (mag) {
-        q[0] /= mag;
-        q[1] /= mag;
-        q[2] /= mag;
-        q[3] /= mag;
-    } else {
-        q[0] = 1.f;
-        q[1] = 0.f;
-        q[2] = 0.f;
-        q[3] = 0.f;
-    }
-}
-
-void inv_q_invertf(const float *q, float *qInverted)
-{
-    INVENSENSE_FUNC_START;
-    qInverted[0] = q[0];
-    qInverted[1] = -q[1];
-    qInverted[2] = -q[2];
-    qInverted[3] = -q[3];
-}
-
-/**
- * Converts a quaternion to a rotation matrix.
- * @param[in] quat 4-element quaternion in fixed point. One is 2^30.
- * @param[out] rot Rotation matrix in fixed point. One is 2^30. The
- *             First 3 elements of the rotation matrix, represent
- *             the first row of the matrix. Rotation matrix multiplied
- *             by a 3 element column vector transform a vector from Body
- *             to World.
- */
-void inv_quaternion_to_rotation(const long *quat, long *rot)
-{
-    rot[0] =
-        inv_q29_mult(quat[1], quat[1]) + inv_q29_mult(quat[0],
-                                                      quat[0]) - 1073741824L;
-    rot[1] = inv_q29_mult(quat[1], quat[2]) - inv_q29_mult(quat[3], quat[0]);
-    rot[2] = inv_q29_mult(quat[1], quat[3]) + inv_q29_mult(quat[2], quat[0]);
-    rot[3] = inv_q29_mult(quat[1], quat[2]) + inv_q29_mult(quat[3], quat[0]);
-    rot[4] =
-        inv_q29_mult(quat[2], quat[2]) + inv_q29_mult(quat[0],
-                                                      quat[0]) - 1073741824L;
-    rot[5] = inv_q29_mult(quat[2], quat[3]) - inv_q29_mult(quat[1], quat[0]);
-    rot[6] = inv_q29_mult(quat[1], quat[3]) - inv_q29_mult(quat[2], quat[0]);
-    rot[7] = inv_q29_mult(quat[2], quat[3]) + inv_q29_mult(quat[1], quat[0]);
-    rot[8] =
-        inv_q29_mult(quat[3], quat[3]) + inv_q29_mult(quat[0],
-                                                      quat[0]) - 1073741824L;
-}
-
-/** Converts a 32-bit long to a big endian byte stream */
-unsigned char *inv_int32_to_big8(long x, unsigned char *big8)
-{
-    big8[0] = (unsigned char)((x >> 24) & 0xff);
-    big8[1] = (unsigned char)((x >> 16) & 0xff);
-    big8[2] = (unsigned char)((x >> 8) & 0xff);
-    big8[3] = (unsigned char)(x & 0xff);
-    return big8;
-}
-
-/** Converts a big endian byte stream into a 32-bit long */
-long inv_big8_to_int32(const unsigned char *big8)
-{
-    long x;
-    x = ((long)big8[0] << 24) | ((long)big8[1] << 16) | ((long)big8[2] << 8) |
-        ((long)big8[3]);
-    return x;
-}
-
-/** Converts a 16-bit short to a big endian byte stream */
-unsigned char *inv_int16_to_big8(short x, unsigned char *big8)
-{
-    big8[0] = (unsigned char)((x >> 8) & 0xff);
-    big8[1] = (unsigned char)(x & 0xff);
-    return big8;
-}
-
-void inv_matrix_det_inc(float *a, float *b, int *n, int x, int y)
-{
-    int k, l, i, j;
-    for (i = 0, k = 0; i < *n; i++, k++) {
-        for (j = 0, l = 0; j < *n; j++, l++) {
-            if (i == x)
-                i++;
-            if (j == y)
-                j++;
-            *(b + 10 * k + l) = *(a + 10 * i + j);
-        }
-    }
-    *n = *n - 1;
-}
-
-void inv_matrix_det_incd(double *a, double *b, int *n, int x, int y)
-{
-    int k, l, i, j;
-    for (i = 0, k = 0; i < *n; i++, k++) {
-        for (j = 0, l = 0; j < *n; j++, l++) {
-            if (i == x)
-                i++;
-            if (j == y)
-                j++;
-            *(b + 10 * k + l) = *(a + 10 * i + j);
-        }
-    }
-    *n = *n - 1;
-}
-
-float inv_matrix_det(float *p, int *n)
-{
-    float d[10][10], sum = 0;
-    int i, j, m;
-    m = *n;
-    if (*n == 2)
-        return (*p ** (p + 11) - *(p + 1) ** (p + 10));
-    for (i = 0, j = 0; j < m; j++) {
-        *n = m;
-        inv_matrix_det_inc(p, &d[0][0], n, i, j);
-        sum =
-            sum + *(p + 10 * i + j) * SIGNM(i + j) * inv_matrix_det(&d[0][0],
-                                                                    n);
-    }
-
-    return (sum);
-}
-
-double inv_matrix_detd(double *p, int *n)
-{
-    double d[10][10], sum = 0;
-    int i, j, m;
-    m = *n;
-    if (*n == 2)
-        return (*p ** (p + 11) - *(p + 1) ** (p + 10));
-    for (i = 0, j = 0; j < m; j++) {
-        *n = m;
-        inv_matrix_det_incd(p, &d[0][0], n, i, j);
-        sum =
-            sum + *(p + 10 * i + j) * SIGNM(i + j) * inv_matrix_detd(&d[0][0],
-                                                                     n);
-    }
-
-    return (sum);
-}
-
-/** Wraps angle from (-M_PI,M_PI]
- * @param[in] ang Angle in radians to wrap
- * @return Wrapped angle from (-M_PI,M_PI]
- */
-float inv_wrap_angle(float ang)
-{
-    if (ang > M_PI)
-        return ang - 2 * (float)M_PI;
-    else if (ang <= -(float)M_PI)
-        return ang + 2 * (float)M_PI;
-    else
-        return ang;
-}
-
-/** Finds the minimum angle difference ang1-ang2 such that difference
- * is between [-M_PI,M_PI]
- * @param[in] ang1 
- * @param[in] ang2
- * @return angle difference ang1-ang2
- */
-float inv_angle_diff(float ang1, float ang2)
-{
-    float d;
-    ang1 = inv_wrap_angle(ang1);
-    ang2 = inv_wrap_angle(ang2);
-    d = ang1 - ang2;
-    if (d > M_PI)
-        d -= 2 * (float)M_PI;
-    else if (d < -(float)M_PI)
-        d += 2 * (float)M_PI;
-    return d;
-}
diff --git a/60xx/mlsdk/mllite/mlMathFunc.h b/60xx/mlsdk/mllite/mlMathFunc.h
deleted file mode 100644
index 70fa9f4..0000000
--- a/60xx/mlsdk/mllite/mlMathFunc.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 INVENSENSE_INV_MATH_FUNC_H__
-#define INVENSENSE_INV_MATH_FUNC_H__
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlMathFunc_legacy.h"
-#endif
-
-#define NUM_ROTATION_MATRIX_ELEMENTS (9)
-#define ROT_MATRIX_SCALE_LONG  (1073741824)
-#define ROT_MATRIX_SCALE_FLOAT (1073741824.0f)
-#define ROT_MATRIX_LONG_TO_FLOAT( longval ) \
-    ((float) ((longval) / ROT_MATRIX_SCALE_FLOAT ))
-#define SIGNM(k)((int)(k)&1?-1:1)
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-    struct filter_long {
-        int length;
-        const long *b;
-        const long *a;
-        long *x;
-        long *y;
-    };
-
-    void inv_filter_long(struct filter_long *state, long x);
-    long inv_q29_mult(long a, long b);
-    long inv_q30_mult(long a, long b);
-    void inv_q_mult(const long *q1, const long *q2, long *qProd);
-    void inv_q_add(long *q1, long *q2, long *qSum);
-    void inv_q_normalize(long *q);
-    void inv_q_invert(const long *q, long *qInverted);
-    void inv_q_multf(const float *q1, const float *q2, float *qProd);
-    void inv_q_addf(float *q1, float *q2, float *qSum);
-    void inv_q_normalizef(float *q);
-    void inv_q_norm4(float *q);
-    void inv_q_invertf(const float *q, float *qInverted);
-    void inv_quaternion_to_rotation(const long *quat, long *rot);
-    unsigned char *inv_int32_to_big8(long x, unsigned char *big8);
-    long inv_big8_to_int32(const unsigned char *big8);
-    unsigned char *inv_int16_to_big8(short x, unsigned char *big8);
-    float inv_matrix_det(float *p, int *n);
-    void inv_matrix_det_inc(float *a, float *b, int *n, int x, int y);
-    double inv_matrix_detd(double *p, int *n);
-    void inv_matrix_det_incd(double *a, double *b, int *n, int x, int y);
-    float inv_wrap_angle(float ang);
-    float inv_angle_diff(float ang1, float ang2);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INVENSENSE_INV_MATH_FUNC_H__
diff --git a/60xx/mlsdk/mllite/mlSetGyroBias.c b/60xx/mlsdk/mllite/mlSetGyroBias.c
deleted file mode 100644
index bd14d2e..0000000
--- a/60xx/mlsdk/mllite/mlSetGyroBias.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id:$
- *
- *****************************************************************************/
-
-#include "mlSetGyroBias.h"
-#include "mlFIFO.h"
-#include "ml.h"
-#include <string.h>
-#include "mldl.h"
-#include "mlMathFunc.h"
-
-typedef struct {
-    int needToSetBias;
-    short currentBias[3];
-    int mode;
-    int motion;
-} tSGB;
-
-tSGB sgb;
-
-/** Records a motion event that may cause a callback when the priority for this
- * feature is met.
- */
-void inv_set_motion_state(int motion)
-{
-    sgb.motion = motion;
-}
-
-/** Converts from internal DMP gyro bias registers to external hardware gyro bias by
-* applying scaling and transformation.
-*/
-void inv_convert_bias(const unsigned char *regs, short *bias)
-{
-    long biasTmp2[3], biasTmp[3], biasPrev[3];
-    int i;
-    int sf;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (mldl_cfg->gyro_sens_trim != 0) {
-        sf = 2000 * 131 / mldl_cfg->gyro_sens_trim;
-    } else {
-        sf = 2000;
-    }
-    for (i = 0; i < 3; i++) {
-        biasTmp2[i] = inv_big8_to_int32(&regs[i * 4]);
-    }
-    // Rotate bias vector by the transpose of the orientation matrix
-    for (i = 0; i < 3; ++i) {
-        biasTmp[i] = inv_q30_mult(biasTmp2[0], inv_obj.gyro_orient[i]) +
-            inv_q30_mult(biasTmp2[1], inv_obj.gyro_orient[i + 3]) +
-            inv_q30_mult(biasTmp2[2], inv_obj.gyro_orient[i + 6]);
-    }
-
-    for (i = 0; i < GYRO_NUM_AXES; i++) {
-        biasTmp[i] = (long)(biasTmp[i] * 1.39882274201861f / sf);
-        biasPrev[i] = (long)mldl_cfg->offset[i];
-        if (biasPrev[i] > 32767)
-            biasPrev[i] -= 65536L;
-    }
-
-    for (i = 0; i < GYRO_NUM_AXES; i++) {
-        bias[i] = (short)(biasPrev[i] - biasTmp[i]);
-    }
-}
-
-/** Records hardware biases in format as used by hardware gyro registers.
-* Note, the hardware will add this value to the measured gyro data.
-*/
-inv_error_t inv_set_gyro_bias_in_hw_unit(const short *bias, int mode)
-{
-    if (sgb.currentBias[0] != bias[0])
-        sgb.needToSetBias = 1;
-    if (sgb.currentBias[1] != bias[1])
-        sgb.needToSetBias = 1;
-    if (sgb.currentBias[2] != bias[2])
-        sgb.needToSetBias = 1;
-    if (sgb.needToSetBias) {
-        memcpy(sgb.currentBias, bias, sizeof(sgb.currentBias));
-        sgb.mode = mode;
-    }
-    return INV_SUCCESS;
-}
-
-/** Records gyro biases
-* @param[in] bias Bias where 1dps is 2^16. In chip frame.
-*/
-inv_error_t inv_set_gyro_bias_in_dps(const long *bias, int mode)
-{
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    int sf, i;
-    long biasTmp;
-    short offset[3];
-    inv_error_t result;
-
-    if (mldl_cfg->gyro_sens_trim != 0) {
-        sf = 2000 * 131 / mldl_cfg->gyro_sens_trim;
-    } else {
-        sf = 2000;
-    }
-
-    for (i = 0; i < GYRO_NUM_AXES; i++) {
-        biasTmp = -bias[i] / sf;
-        if (biasTmp < 0)
-            biasTmp += 65536L;
-        offset[i] = (short)biasTmp;
-    }
-    result = inv_set_gyro_bias_in_hw_unit(offset, mode);
-    return result;
-}
-
-inv_error_t inv_set_gyro_bias_in_dps_float(const float *bias, int mode)
-{
-    long biasL[3];
-    inv_error_t result;
-
-    biasL[0] = (long)(bias[0] * (1L << 16));
-    biasL[1] = (long)(bias[1] * (1L << 16));
-    biasL[2] = (long)(bias[2] * (1L << 16));
-    result = inv_set_gyro_bias_in_dps(biasL, mode);
-    return result;
-}
-
-inv_error_t MLSetGyroBiasCB(struct inv_obj_t * inv_obj)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (sgb.needToSetBias) {
-        result = inv_set_offset(sgb.currentBias);
-        sgb.needToSetBias = 0;
-    }
-
-    // Check if motion state has changed
-    if (sgb.motion == INV_MOTION) {
-        // We are moving
-        if (inv_obj->motion_state == INV_NO_MOTION) {
-            //Trigger motion callback
-            inv_obj->motion_state = INV_MOTION;
-            inv_obj->flags[INV_MOTION_STATE_CHANGE] = INV_MOTION;
-            if (inv_params_obj.motion_cb_func) {
-                inv_params_obj.motion_cb_func(INV_MOTION);
-            }
-        }
-    } else if (sgb.motion == INV_NO_MOTION){
-        // We are not moving
-        if (inv_obj->motion_state == INV_MOTION) {
-            //Trigger no motion callback
-            inv_obj->motion_state = INV_NO_MOTION;
-            inv_obj->got_no_motion_bias = TRUE;
-            inv_obj->flags[INV_MOTION_STATE_CHANGE] = INV_NO_MOTION;
-            if (inv_params_obj.motion_cb_func) {
-                inv_params_obj.motion_cb_func(INV_NO_MOTION);
-            }
-        }
-    }
-
-    return result;
-}
-
-inv_error_t inv_enable_set_bias(void)
-{
-    inv_error_t result;
-    memset(&sgb, 0, sizeof(sgb));
-
-    sgb.motion = inv_obj.motion_state;
-
-    result =
-        inv_register_fifo_rate_process(MLSetGyroBiasCB,
-                                       INV_PRIORITY_SET_GYRO_BIASES);
-    if (result == INV_ERROR_INVALID_PARAMETER)
-        result = INV_SUCCESS;    /* We already registered this */
-    return result;
-}
-
-inv_error_t inv_disable_set_bias(void)
-{
-    inv_error_t result;
-    result = inv_unregister_fifo_rate_process(MLSetGyroBiasCB);
-    return INV_SUCCESS;          // FIXME need to disable
-}
diff --git a/60xx/mlsdk/mllite/mlSetGyroBias.h b/60xx/mlsdk/mllite/mlSetGyroBias.h
deleted file mode 100644
index e56f18b..0000000
--- a/60xx/mlsdk/mllite/mlSetGyroBias.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id$
- *
- *****************************************************************************/
-
-#ifndef INV_SET_GYRO_BIAS__H__
-#define INV_SET_GYRO_BIAS__H__
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define INV_SGB_NO_MOTION 4
-#define INV_SGB_FAST_NO_MOTION 5
-#define INV_SGB_TEMP_COMP 6
-
-    inv_error_t inv_enable_set_bias(void);
-    inv_error_t inv_disable_set_bias(void);
-    inv_error_t inv_set_gyro_bias_in_hw_unit(const short *bias, int mode);
-    inv_error_t inv_set_gyro_bias_in_dps(const long *bias, int mode);
-    inv_error_t inv_set_gyro_bias_in_dps_float(const float *bias, int mode);
-    void inv_convert_bias(const unsigned char *regs, short *bias);
-    void inv_set_motion_state(int motion);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INV_SET_GYRO_BIAS__H__
diff --git a/60xx/mlsdk/mllite/ml_mputest.c b/60xx/mlsdk/mllite/ml_mputest.c
deleted file mode 100644
index d7fc608..0000000
--- a/60xx/mlsdk/mllite/ml_mputest.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: ml_mputest.c 5641 2011-06-14 02:10:02Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup MPU_SELF_TEST
- *  @brief  C wrapper to integrate the MPU Self Test wrapper in MPL.
- *          Provides ML name compliant naming and an additional API that
- *          automates the suspension of normal MPL operations, runs the test,
- *          and resume.
- *
- *  @{
- *      @file   ml_mputest.c
- *      @brief  C wrapper to integrate the MPU Self Test wrapper in MPL.
- *              The main logic of the test and APIs can be found in mputest.c
- */
-
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <math.h>
-#include <stdlib.h>
-
-#include "ml_mputest.h"
-
-#include "mlmath.h"
-#include "mlinclude.h"
-#include "ml.h"
-#include "mlstates.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    Globals
-*/
-extern struct mldl_cfg *mputestCfgPtr;
-extern signed char g_z_sign;
-
-/*
-    Prototypes
-*/
-extern inv_error_t inv_factory_calibrate(void *mlsl_handle,
-                                         uint_fast8_t provide_result);
-
-/**
- *  @brief  An MPL wrapper for the main MPU Self Test API inv_factory_calibrate().
- *          See inv_factory_calibrate() function for more details.
- *
- *  @pre    inv_dmp_open() <b>must</b> have been called to populate the mldl_cfg
- *          data structure.
- *          On Windows, SetupPlatform() is also a madatory pre condition to
- *          ensure the accelerometer is properly configured before running the
- *          test.
- *
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  provide_result
- *              If 1:
- *              perform and analyze the offset, drive frequency, and noise
- *              calculation and compare it against set thresholds. Report
- *              also the final result using a bit-mask like error code as
- *              described in the inv_test_gyro_xxxx() functions.
- *              When 0:
- *              skip the noise and drive frequency calculation  and pass/fail
- *              assessment. It simply calculates the gyro and accel biases.
- *              NOTE: for MPU6050 devices, this parameter is currently
- *              ignored.
- *
- *  @return INV_SUCCESS or first non-zero error code otherwise.
- */
-inv_error_t inv_self_test_factory_calibrate(void *mlsl_handle,
-                                            unsigned char provide_result)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t firstError = INV_SUCCESS;
-    inv_error_t result;
-    unsigned char initState = inv_get_state();
-
-    if (initState < INV_STATE_DMP_OPENED) {
-        MPL_LOGE("Self Test cannot run before inv_dmp_open()\n");
-        return INV_ERROR_SM_IMPROPER_STATE;
-    }
-
-    /* obtain a pointer to the 'struct mldl_cfg' data structure. */
-    mputestCfgPtr = inv_get_dl_config();
-
-    if(initState == INV_STATE_DMP_STARTED) {
-        result = inv_dmp_stop();
-        ERROR_CHECK_FIRST(firstError, result);
-    }
-
-    result = inv_factory_calibrate(mlsl_handle, provide_result);
-    ERROR_CHECK_FIRST(firstError, result);
-
-    if(initState == INV_STATE_DMP_STARTED) {
-        result = inv_dmp_start();
-        ERROR_CHECK_FIRST(firstError, result);
-    }
-
-    return firstError;
-}
-
-/**
- *  @brief  Runs the MPU test at MPL runtime.
- *          If the DMP is operating, stops the DMP temporarely,
- *          runs the MPU Self Test, and re-starts the DMP.
- *
- *  @return INV_SUCCESS or a non-zero error code otherwise.
- */
-inv_error_t inv_self_test_run(void)
-{
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-    return inv_self_test_factory_calibrate(inv_get_serial_handle(), TRUE);
-#else
-    return inv_self_test_factory_calibrate(inv_get_serial_handle(), FALSE);
-#endif
-}
-
-/**
- *  @brief  Runs the MPU test for bias correction only at MPL runtime.
- *          If the DMP is operating, stops the DMP temporarely,
- *          runs the bias calculation routines, and re-starts the DMP.
- *
- *  @return INV_SUCCESS or a non-zero error code otherwise.
- */
-inv_error_t inv_self_test_bias_only(void)
-{
-    return inv_self_test_factory_calibrate(inv_get_serial_handle(), FALSE);
-}
-
-/**
- *  @brief  Set the orientation of the acceleroemter Z axis as it will be
- *          expected when running the MPU Self Test.
- *          Specifies the orientation of the accelerometer Z axis : Z axis
- *          pointing upwards or downwards.
- *  @param  z_sign
- *              The sign of the accelerometer Z axis; valid values are +1 and
- *              -1 for +Z and -Z respectively.  Any other value will cause the
- *              setting to be ignored and an error code to be returned.
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_self_test_set_accel_z_orient(signed char z_sign)
-{
-    if (z_sign != +1 && z_sign != -1) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    g_z_sign = z_sign;
-    return INV_SUCCESS;
-}
-
-
-#ifdef __cplusplus
-}
-#endif
-
-/**
- *  @}
- */
-
diff --git a/60xx/mlsdk/mllite/ml_mputest.h b/60xx/mlsdk/mllite/ml_mputest.h
deleted file mode 100644
index 705d3cc..0000000
--- a/60xx/mlsdk/mllite/ml_mputest.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: ml_mputest.h 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *****************************************************************************/
-
-#ifndef _INV_MPUTEST_H_
-#define _INV_MPUTEST_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-
-/* user APIs */
-inv_error_t inv_self_test_factory_calibrate(
-                void *mlsl_handle, unsigned char provide_result);
-inv_error_t inv_self_test_set_accel_z_orient(signed char z_sign);
-inv_error_t inv_self_test_run(void);
-inv_error_t inv_self_test_bias_only(void);
-
-/* other functions */
-#define inv_set_self_test_parameters inv_set_test_parameters
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _INV_MPUTEST_H_ */
-
diff --git a/60xx/mlsdk/mllite/ml_stored_data.c b/60xx/mlsdk/mllite/ml_stored_data.c
deleted file mode 100644
index 9107fe2..0000000
--- a/60xx/mlsdk/mllite/ml_stored_data.c
+++ /dev/null
@@ -1,1586 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: ml_stored_data.c 5641 2011-06-14 02:10:02Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- * @defgroup ML_STORED_DATA
- *
- * @{
- *      @file     ml_stored_data.c
- *      @brief    functions for reading and writing stored data sets.
- *                Typically, these functions process stored calibration data.
- */
-
-#include "ml_stored_data.h"
-#include "ml.h"
-#include "mlFIFO.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "compass.h"
-#include "dmpKey.h"
-#include "dmpDefault.h"
-#include "mlstates.h"
-#include "checksum.h"
-#include "mlsupervisor.h"
-
-#include "mlsl.h"
-#include "mlos.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-storeload"
-
-/*
-    Typedefs
-*/
-typedef inv_error_t(*tMLLoadFunc) (unsigned char *, unsigned short);
-
-/*
-    Globals
-*/
-extern struct inv_obj_t inv_obj;
-
-/*
-    Debugging Definitions
-    set LOADCAL_DEBUG and/or STORECAL_DEBUG to 1 print the fields
-    being read or stored in human-readable format.
-    When set to 0, the compiler will optimize and remove the printouts
-    from the code.
-*/
-#define LOADCAL_DEBUG    0
-#define STORECAL_DEBUG   0
-
-#define LOADCAL_LOG(...)                        \
-    if(LOADCAL_DEBUG)                           \
-        MPL_LOGI("LOADCAL: " __VA_ARGS__)
-#define STORECAL_LOG(...)                       \
-    if(STORECAL_DEBUG)                          \
-        MPL_LOGI("STORECAL: " __VA_ARGS__)
-
-/**
- *  @brief  Duplicate of the inv_temp_comp_find_bin function in the libmpl
- *          advanced algorithms library. To remove cross-dependency, for now,
- *          we reimplement the same function here.
- *  @param  temp
- *              the temperature (1 count == 1 degree C).
- */
-int FindTempBin(float temp)
-{
-    int bin = (int)((temp - MIN_TEMP) / TEMP_PER_BIN);
-    if (bin < 0)
-        bin = 0;
-    if (bin > BINS - 1)
-        bin = BINS - 1;
-    return bin;
-}
-
-/**
- * @brief   Returns the length of the <b>MPL internal calibration data</b>.
- *          Should be called before allocating the memory required to store
- *          this data to a file.
- *          This function returns the total size required to store the cal
- *          data including the header (4 bytes) and the checksum (2 bytes).
- *
- *  @pre    Must be in INV_STATE_DMP_OPENED state.
- *          inv_dmp_open() or inv_dmp_stop() must have been called.
- *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
- *          been called.
- *
- * @return  the length of the internal calibrated data format.
- */
-unsigned int inv_get_cal_length(void)
-{
-    INVENSENSE_FUNC_START;
-    unsigned int length;
-    length = INV_CAL_HDR_LEN +  // header
-        BINS * PTS_PER_BIN * 4 * 4 + BINS * 4 * 2 + // gyro cal
-        INV_CAL_ACCEL_LEN +     // accel cal
-        INV_CAL_COMPASS_LEN +   // compass cal
-        INV_CAL_CHK_LEN;        // checksum
-    return length;
-}
-
-/**
- *  @brief  Loads a type 0 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature,
- *          - gyro biases for X, Y, Z axes.
- *          This calibration data would normally be produced by the MPU Self
- *          Test and its size is 18 bytes (header and checksum included).
- *          Calibration format type 0 is currently <b>NOT</b> used and
- *          is substituted by type 5 : inv_load_cal_V5().
- *
- *  @note   This calibration data format is obsoleted and no longer supported
- *          by the rest of the MPL
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V0(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    const short expLen = 18;
-    long newGyroData[3] = { 0, 0, 0 };
-    float newTemp;
-    int bin;
-
-    LOADCAL_LOG("Entering inv_load_cal_V0\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 1 must be %d bytes long\n", expLen);
-        return INV_ERROR_FILE_READ;
-    }
-
-    newTemp = (float)inv_decode_temperature(
-                (unsigned short)calData[6] * 256 + calData[7]) / 65536.f;
-    LOADCAL_LOG("newTemp = %f\n", newTemp);
-
-    newGyroData[0] = ((long)calData[8]) * 256 + ((long)calData[9]);
-    if (newGyroData[0] > 32767L)
-        newGyroData[0] -= 65536L;
-    LOADCAL_LOG("newGyroData[0] = %ld\n", newGyroData[0]);
-    newGyroData[1] = ((long)calData[10]) * 256 + ((long)calData[11]);
-    if (newGyroData[1] > 32767L)
-        newGyroData[1] -= 65536L;
-    LOADCAL_LOG("newGyroData[2] = %ld\n", newGyroData[2]);
-    newGyroData[2] = ((long)calData[12]) * 256 + ((long)calData[13]);
-    if (newGyroData[2] > 32767L)
-        newGyroData[2] -= 65536L;
-    LOADCAL_LOG("newGyroData[2] = %ld\n", newGyroData[2]);
-
-    bin = FindTempBin(newTemp);
-    LOADCAL_LOG("bin = %d", bin);
-
-    inv_obj.temp_data[bin][inv_obj.temp_ptrs[bin]] = newTemp;
-    LOADCAL_LOG("temp_data[%d][%d] = %f",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.x_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] =
-        ((float)newGyroData[0]) / 65536.f;
-    LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.x_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.y_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] =
-        ((float)newGyroData[0]) / 65536.f;
-    LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.y_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.z_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] =
-        ((float)newGyroData[0]) / 65536.f;
-    LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.z_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-
-    inv_obj.temp_ptrs[bin] = (inv_obj.temp_ptrs[bin] + 1) % PTS_PER_BIN;
-    LOADCAL_LOG("temp_ptrs[%d] = %d\n", bin, inv_obj.temp_ptrs[bin]);
-
-    if (inv_obj.temp_ptrs[bin] == 0)
-        inv_obj.temp_valid_data[bin] = TRUE;
-    LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                bin, inv_obj.temp_valid_data[bin]);
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V0\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Loads a type 1 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature,
- *          - gyro biases for X, Y, Z axes,
- *          - accel biases for X, Y, Z axes.
- *          This calibration data would normally be produced by the MPU Self
- *          Test and its size is 24 bytes (header and checksum included).
- *          Calibration format type 1 is currently <b>NOT</b> used and
- *          is substituted by type 5 : inv_load_cal_V5().
- *
- *  @note   In order to successfully work, the gyro bias must be stored
- *          expressed in 250 dps full scale (131.072 sensitivity). Other full
- *          scale range will produce unpredictable results in the gyro biases.
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V1(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    const short expLen = 24;
-    long newGyroData[3] = {0, 0, 0};
-    long accelBias[3] = {0, 0, 0};
-    float gyroBias[3] = {0, 0, 0};
-    float newTemp = 0;
-    int bin;
-
-    LOADCAL_LOG("Entering inv_load_cal_V1\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 1 must be %d bytes long\n", expLen);
-        return INV_ERROR_FILE_READ;
-    }
-
-    newTemp = (float)inv_decode_temperature(
-                (unsigned short)calData[6] * 256 + calData[7]) / 65536.f;
-    LOADCAL_LOG("newTemp = %f\n", newTemp);
-
-    newGyroData[0] = ((long)calData[8]) * 256 + ((long)calData[9]);
-    if (newGyroData[0] > 32767L)
-        newGyroData[0] -= 65536L;
-    LOADCAL_LOG("newGyroData[0] = %ld\n", newGyroData[0]);
-    newGyroData[1] = ((long)calData[10]) * 256 + ((long)calData[11]);
-    if (newGyroData[1] > 32767L)
-        newGyroData[1] -= 65536L;
-    LOADCAL_LOG("newGyroData[1] = %ld\n", newGyroData[1]);
-    newGyroData[2] = ((long)calData[12]) * 256 + ((long)calData[13]);
-    if (newGyroData[2] > 32767L)
-        newGyroData[2] -= 65536L;
-    LOADCAL_LOG("newGyroData[2] = %ld\n", newGyroData[2]);
-
-    bin = FindTempBin(newTemp);
-    LOADCAL_LOG("bin = %d\n", bin);
-
-    gyroBias[0] = ((float)newGyroData[0]) / 131.072f;
-    gyroBias[1] = ((float)newGyroData[1]) / 131.072f;
-    gyroBias[2] = ((float)newGyroData[2]) / 131.072f;
-    LOADCAL_LOG("gyroBias[0] = %f\n", gyroBias[0]);
-    LOADCAL_LOG("gyroBias[1] = %f\n", gyroBias[1]);
-    LOADCAL_LOG("gyroBias[2] = %f\n", gyroBias[2]);
-
-    inv_obj.temp_data[bin][inv_obj.temp_ptrs[bin]] = newTemp;
-    LOADCAL_LOG("temp_data[%d][%d] = %f",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.x_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[0];
-    LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.x_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.y_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[1];
-    LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.y_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-    inv_obj.z_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[2];
-    LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin],
-                inv_obj.z_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]]);
-
-    inv_obj.temp_ptrs[bin] = (inv_obj.temp_ptrs[bin] + 1) % PTS_PER_BIN;
-    LOADCAL_LOG("temp_ptrs[%d] = %d\n", bin, inv_obj.temp_ptrs[bin]);
-
-    if (inv_obj.temp_ptrs[bin] == 0)
-        inv_obj.temp_valid_data[bin] = TRUE;
-    LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                bin, inv_obj.temp_valid_data[bin]);
-
-    /* load accel biases and apply immediately */
-    accelBias[0] = ((long)calData[14]) * 256 + ((long)calData[15]);
-    if (accelBias[0] > 32767)
-        accelBias[0] -= 65536L;
-    accelBias[0] = (long)((long long)accelBias[0] * 65536L *
-                          inv_obj.accel_sens / 1073741824L);
-    LOADCAL_LOG("accelBias[0] = %ld\n", accelBias[0]);
-    accelBias[1] = ((long)calData[16]) * 256 + ((long)calData[17]);
-    if (accelBias[1] > 32767)
-        accelBias[1] -= 65536L;
-    accelBias[1] = (long)((long long)accelBias[1] * 65536L *
-                          inv_obj.accel_sens / 1073741824L);
-    LOADCAL_LOG("accelBias[1] = %ld\n", accelBias[1]);
-    accelBias[2] = ((long)calData[18]) * 256 + ((int)calData[19]);
-    if (accelBias[2] > 32767)
-        accelBias[2] -= 65536L;
-    accelBias[2] = (long)((long long)accelBias[2] * 65536L *
-                          inv_obj.accel_sens / 1073741824L);
-    LOADCAL_LOG("accelBias[2] = %ld\n", accelBias[2]);
-    if (inv_set_array(INV_ACCEL_BIAS, accelBias)) {
-        LOG_RESULT_LOCATION(inv_set_array(INV_ACCEL_BIAS, accelBias));
-        return inv_set_array(INV_ACCEL_BIAS, accelBias);
-    }
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V1\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Loads a type 2 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature compensation : temperature data points,
- *          - temperature compensation : gyro biases data points for X, Y,
- *              and Z axes.
- *          - accel biases for X, Y, Z axes.
- *          This calibration data is produced internally by the MPL and its
- *          size is 2222 bytes (header and checksum included).
- *          Calibration format type 2 is currently <b>NOT</b> used and
- *          is substituted by type 4 : inv_load_cal_V4().
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V2(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    const short expLen = 2222;
-    long accel_bias[3];
-    int ptr = INV_CAL_HDR_LEN;
-
-    int i, j;
-    long long tmp;
-
-    LOADCAL_LOG("Entering inv_load_cal_V2\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 2 must be %d bytes long (got %d)\n",
-                 expLen, len);
-        return INV_ERROR_FILE_READ;
-    }
-
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_ptrs[i] = 0;
-        inv_obj.temp_ptrs[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_ptrs[%d] = %d\n", i, inv_obj.temp_ptrs[i]);
-    }
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_valid_data[i] = 0;
-        inv_obj.temp_valid_data[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                    i, inv_obj.temp_valid_data[i]);
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.temp_data[i][j]);
-        }
-
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.x_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.x_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.y_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.y_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.z_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.z_gyro_temp_data[i][j]);
-        }
-    }
-
-    /* read the accel biases */
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        accel_bias[i] = (int32_t) t;
-        LOADCAL_LOG("accel_bias[%d] = %ld\n", i, accel_bias[i]);
-    }
-
-    if (inv_set_array(INV_ACCEL_BIAS, accel_bias)) {
-        LOG_RESULT_LOCATION(inv_set_array(INV_ACCEL_BIAS, accel_bias));
-        return inv_set_array(INV_ACCEL_BIAS, accel_bias);
-    }
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V2\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Loads a type 3 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature compensation : temperature data points,
- *          - temperature compensation : gyro biases data points for X, Y,
- *              and Z axes.
- *          - accel biases for X, Y, Z axes.
- *          - compass biases for X, Y, Z axes and bias tracking algorithm
- *              mock-up.
- *          This calibration data is produced internally by the MPL and its
- *          size is 2429 bytes (header and checksum included).
- *          Calibration format type 3 is currently <b>NOT</b> used and
- *          is substituted by type 4 : inv_load_cal_V4().
-
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V3(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    union doubleToLongLong {
-        double db;
-        unsigned long long ll;
-    } dToLL;
-
-    const short expLen = 2429;
-    long bias[3];
-    int i, j;
-    int ptr = INV_CAL_HDR_LEN;
-    long long tmp;
-
-    LOADCAL_LOG("Entering inv_load_cal_V3\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 3 must be %d bytes long (got %d)\n",
-                 expLen, len);
-        return INV_ERROR_FILE_READ;
-    }
-
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_ptrs[i] = 0;
-        inv_obj.temp_ptrs[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_ptrs[%d] = %d\n", i, inv_obj.temp_ptrs[i]);
-    }
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_valid_data[i] = 0;
-        inv_obj.temp_valid_data[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                    i, inv_obj.temp_valid_data[i]);
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.temp_data[i][j]);
-        }
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.x_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.x_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.y_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.y_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.z_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.z_gyro_temp_data[i][j]);
-        }
-    }
-
-    /* read the accel biases */
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        bias[i] = (int32_t) t;
-        LOADCAL_LOG("accel_bias[%d] = %ld\n", i, bias[i]);
-    }
-    if (inv_set_array(INV_ACCEL_BIAS, bias)) {
-        LOG_RESULT_LOCATION(inv_set_array(INV_ACCEL_BIAS, bias));
-        return inv_set_array(INV_ACCEL_BIAS, bias);
-    }
-
-    /* read the compass biases */
-    inv_obj.got_compass_bias = (int)calData[ptr++];
-    inv_obj.got_init_compass_bias = (int)calData[ptr++];
-    inv_obj.compass_state = (int)calData[ptr++];
-
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_bias_error[i] = (int32_t) t;
-        LOADCAL_LOG("compass_bias_error[%d] = %ld\n", i,
-                    inv_obj.compass_bias_error[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.init_compass_bias[i] = (int32_t) t;
-        LOADCAL_LOG("init_compass_bias[%d] = %ld\n", i,
-                    inv_obj.init_compass_bias[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_bias[i] = (int32_t) t;
-        LOADCAL_LOG("compass_bias[%d] = %ld\n", i, inv_obj.compass_bias[i]);
-    }
-    for (i = 0; i < 18; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_peaks[i] = (int32_t) t;
-        LOADCAL_LOG("compass_peaks[%d] = %d\n", i, inv_obj.compass_peaks[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        dToLL.ll = 0;
-        dToLL.ll += 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_bias_v[i] = dToLL.db;
-        LOADCAL_LOG("compass_bias_v[%d] = %lf\n", i, inv_obj.compass_bias_v[i]);
-    }
-    for (i = 0; i < 9; i++) {
-        dToLL.ll = 0;
-        dToLL.ll += 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_bias_ptr[i] = dToLL.db;
-        LOADCAL_LOG("compass_bias_ptr[%d] = %lf\n", i,
-                    inv_obj.compass_bias_ptr[i]);
-    }
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V3\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Loads a type 4 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature compensation : temperature data points,
- *          - temperature compensation : gyro biases data points for X, Y,
- *              and Z axes.
- *          - accel biases for X, Y, Z axes.
- *          - compass biases for X, Y, Z axes, compass scale, and bias
- *              tracking algorithm  mock-up.
- *          This calibration data is produced internally by the MPL and its
- *          size is 2777 bytes (header and checksum included).
- *          Calibration format type 4 is currently used and
- *          substitutes type 2 (inv_load_cal_V2()) and 3 (inv_load_cal_V3()).
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V4(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    union doubleToLongLong {
-        double db;
-        unsigned long long ll;
-    } dToLL;
-
-    const unsigned int expLen = 2782;
-    long bias[3];
-    int ptr = INV_CAL_HDR_LEN;
-    int i, j;
-    long long tmp;
-    inv_error_t result;
-
-    LOADCAL_LOG("Entering inv_load_cal_V4\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 4 must be %d bytes long (got %d)\n",
-                 expLen, len);
-        return INV_ERROR_FILE_READ;
-    }
-
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_ptrs[i] = 0;
-        inv_obj.temp_ptrs[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_ptrs[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_ptrs[%d] = %d\n", i, inv_obj.temp_ptrs[i]);
-    }
-    for (i = 0; i < BINS; i++) {
-        inv_obj.temp_valid_data[i] = 0;
-        inv_obj.temp_valid_data[i] += 16777216L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 65536L * ((long)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += 256 * ((int)calData[ptr++]);
-        inv_obj.temp_valid_data[i] += (int)calData[ptr++];
-        LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                    i, inv_obj.temp_valid_data[i]);
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.temp_data[i][j]);
-        }
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.x_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.x_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.y_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.y_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = 0;
-            tmp += 16777216LL * (long long)calData[ptr++];
-            tmp += 65536LL * (long long)calData[ptr++];
-            tmp += 256LL * (long long)calData[ptr++];
-            tmp += (long long)calData[ptr++];
-            if (tmp > 2147483648LL) {
-                tmp -= 4294967296LL;
-            }
-            inv_obj.z_gyro_temp_data[i][j] = ((float)tmp) / 65536.0f;
-            LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                        i, j, inv_obj.z_gyro_temp_data[i][j]);
-        }
-    }
-
-    /* read the accel biases */
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        bias[i] = (int32_t) t;
-        LOADCAL_LOG("accel_bias[%d] = %ld\n", i, bias[i]);
-    }
-    if (inv_set_array(INV_ACCEL_BIAS, bias)) {
-        LOG_RESULT_LOCATION(inv_set_array(INV_ACCEL_BIAS, bias));
-        return inv_set_array(INV_ACCEL_BIAS, bias);
-    }
-
-    /* read the compass biases */
-    inv_reset_compass_calibration();
-
-    inv_obj.got_compass_bias = (int)calData[ptr++];
-    LOADCAL_LOG("got_compass_bias = %ld\n", inv_obj.got_compass_bias);
-    inv_obj.got_init_compass_bias = (int)calData[ptr++];
-    LOADCAL_LOG("got_init_compass_bias = %d\n", inv_obj.got_init_compass_bias);
-    inv_obj.compass_state = (int)calData[ptr++];
-    LOADCAL_LOG("compass_state = %ld\n", inv_obj.compass_state);
-
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_bias_error[i] = (int32_t) t;
-        LOADCAL_LOG("compass_bias_error[%d] = %ld\n", i,
-                    inv_obj.compass_bias_error[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.init_compass_bias[i] = (int32_t) t;
-        LOADCAL_LOG("init_compass_bias[%d] = %ld\n", i,
-                    inv_obj.init_compass_bias[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_bias[i] = (int32_t) t;
-        LOADCAL_LOG("compass_bias[%d] = %ld\n", i, inv_obj.compass_bias[i]);
-    }
-    for (i = 0; i < 18; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_peaks[i] = (int32_t) t;
-        LOADCAL_LOG("compass_peaks[%d] = %d\n", i, inv_obj.compass_peaks[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        dToLL.ll = 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_bias_v[i] = dToLL.db;
-        LOADCAL_LOG("compass_bias_v[%d] = %lf\n", i, inv_obj.compass_bias_v[i]);
-    }
-    for (i = 0; i < 9; i++) {
-        dToLL.ll = 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_bias_ptr[i] = dToLL.db;
-        LOADCAL_LOG("compass_bias_ptr[%d] = %lf\n", i,
-                    inv_obj.compass_bias_ptr[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = 0;
-        t += 16777216UL * ((uint32_t) calData[ptr++]);
-        t += 65536UL * ((uint32_t) calData[ptr++]);
-        t += 256u * ((uint32_t) calData[ptr++]);
-        t += (uint32_t) calData[ptr++];
-        inv_obj.compass_scale[i] = (int32_t) t;
-        LOADCAL_LOG("compass_scale[%d] = %d\n", i, (int32_t) t);
-    }
-    for (i = 0; i < 6; i++) {
-        dToLL.ll = 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_prev_xty[i] = dToLL.db;
-        LOADCAL_LOG("compass_prev_xty[%d] = %f\n", i, dToLL.db);
-    }
-    for (i = 0; i < 36; i++) {
-        dToLL.ll = 72057594037927936ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 281474976710656ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 1099511627776ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 4294967296LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 16777216ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 65536ULL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += 256LL * ((unsigned long long)calData[ptr++]);
-        dToLL.ll += (unsigned long long)calData[ptr++];
-
-        inv_obj.compass_prev_m[i] = dToLL.db;
-        LOADCAL_LOG("compass_prev_m[%d] = %f\n", i, dToLL.db);
-    }
-
-    /* Load the compass offset flag and values */
-    inv_obj.flags[INV_COMPASS_OFFSET_VALID] = calData[ptr++];
-    inv_obj.compass_offsets[0] = calData[ptr++];
-    inv_obj.compass_offsets[1] = calData[ptr++];
-    inv_obj.compass_offsets[2] = calData[ptr++];
-
-    inv_obj.compass_accuracy = calData[ptr++];
-    /* push the compass offset values to the device */
-    result = inv_set_compass_offset();
-
-    if (result == INV_SUCCESS) {
-        if (inv_compass_check_range() != INV_SUCCESS) {
-            MPL_LOGI("range check fail");
-            inv_reset_compass_calibration();
-            inv_obj.flags[INV_COMPASS_OFFSET_VALID] = 0;
-            inv_set_compass_offset();
-        }
-    }
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V4\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Loads a type 5 set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *          This calibrations data format stores values for (in order of
- *          appearance) :
- *          - temperature,
- *          - gyro biases for X, Y, Z axes,
- *          - accel biases for X, Y, Z axes.
- *          This calibration data would normally be produced by the MPU Self
- *          Test and its size is 36 bytes (header and checksum included).
- *          Calibration format type 5 is produced by the MPU Self Test and
- *          substitutes the type 1 : inv_load_cal_V1().
- *
- *  @pre    inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- *  @param  calData
- *              A pointer to an array of bytes to be parsed.
- *  @param  len
- *              the length of the calibration
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal_V5(unsigned char *calData, unsigned short len)
-{
-    INVENSENSE_FUNC_START;
-    const short expLen = 36;
-    long accelBias[3] = { 0, 0, 0 };
-    float gyroBias[3] = { 0, 0, 0 };
-
-    int ptr = INV_CAL_HDR_LEN;
-    unsigned short temp;
-    float newTemp;
-    int bin;
-    int i;
-
-    LOADCAL_LOG("Entering inv_load_cal_V5\n");
-
-    if (len != expLen) {
-        MPL_LOGE("Calibration data type 5 must be %d bytes long (got %d)\n",
-                 expLen, len);
-        return INV_ERROR_FILE_READ;
-    }
-
-    /* load the temperature */
-    temp = (unsigned short)calData[ptr++] * (1L << 8);
-    temp += calData[ptr++];
-    newTemp = (float)inv_decode_temperature(temp) / 65536.f;
-    LOADCAL_LOG("newTemp = %f\n", newTemp);
-
-    /* load the gyro biases (represented in 2 ^ 16 == 1 dps) */
-    for (i = 0; i < 3; i++) {
-        int32_t tmp = 0;
-        tmp += (int32_t) calData[ptr++] * (1L << 24);
-        tmp += (int32_t) calData[ptr++] * (1L << 16);
-        tmp += (int32_t) calData[ptr++] * (1L << 8);
-        tmp += (int32_t) calData[ptr++];
-        gyroBias[i] = (float)tmp / 65536.0f;
-        LOADCAL_LOG("gyroBias[%d] = %f\n", i, gyroBias[i]);
-    }
-    /* find the temperature bin */
-    bin = FindTempBin(newTemp);
-
-    /* populate the temp comp data structure */
-    inv_obj.temp_data[bin][inv_obj.temp_ptrs[bin]] = newTemp;
-    LOADCAL_LOG("temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin], newTemp);
-
-    inv_obj.x_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[0];
-    LOADCAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin], gyroBias[0]);
-    inv_obj.y_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[1];
-    LOADCAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin], gyroBias[1]);
-    inv_obj.z_gyro_temp_data[bin][inv_obj.temp_ptrs[bin]] = gyroBias[2];
-    LOADCAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                bin, inv_obj.temp_ptrs[bin], gyroBias[2]);
-    inv_obj.temp_ptrs[bin] = (inv_obj.temp_ptrs[bin] + 1) % PTS_PER_BIN;
-    LOADCAL_LOG("temp_ptrs[%d] = %d\n", bin, inv_obj.temp_ptrs[bin]);
-
-    if (inv_obj.temp_ptrs[bin] == 0)
-        inv_obj.temp_valid_data[bin] = TRUE;
-    LOADCAL_LOG("temp_valid_data[%d] = %ld\n",
-                bin, inv_obj.temp_valid_data[bin]);
-
-    /* load accel biases (represented in 2 ^ 16 == 1 gee)
-       and apply immediately */
-    for (i = 0; i < 3; i++) {
-        int32_t tmp = 0;
-        tmp += (int32_t) calData[ptr++] * (1L << 24);
-        tmp += (int32_t) calData[ptr++] * (1L << 16);
-        tmp += (int32_t) calData[ptr++] * (1L << 8);
-        tmp += (int32_t) calData[ptr++];
-        accelBias[i] = (long)tmp;
-        LOADCAL_LOG("accelBias[%d] = %ld\n", i, accelBias[i]);
-    }
-    if (inv_set_array(INV_ACCEL_BIAS, accelBias)) {
-        LOG_RESULT_LOCATION(inv_set_array(INV_ACCEL_BIAS, accelBias));
-        return inv_set_array(INV_ACCEL_BIAS, accelBias);
-    }
-
-    inv_obj.got_no_motion_bias = TRUE;
-    LOADCAL_LOG("got_no_motion_bias = 1\n");
-    inv_obj.cal_loaded_flag = TRUE;
-    LOADCAL_LOG("cal_loaded_flag = 1\n");
-
-    LOADCAL_LOG("Exiting inv_load_cal_V5\n");
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   Loads a set of calibration data.
- *          It parses a binary data set containing calibration data.
- *          The binary data set is intended to be loaded from a file.
- *
- * @pre     inv_dmp_open()
- *          @ifnot MPL_MF
- *              or inv_open_low_power_pedometer()
- *              or inv_eis_open_dmp()
- *          @endif
- *          must have been called.
- *
- * @param   calData
- *              A pointer to an array of bytes to be parsed.
- *
- * @return  INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_cal(unsigned char *calData)
-{
-    INVENSENSE_FUNC_START;
-    int calType = 0;
-    int len = 0;
-    int ptr;
-    uint32_t chk = 0;
-    uint32_t cmp_chk = 0;
-
-    tMLLoadFunc loaders[] = {
-        inv_load_cal_V0,
-        inv_load_cal_V1,
-        inv_load_cal_V2,
-        inv_load_cal_V3,
-        inv_load_cal_V4,
-        inv_load_cal_V5
-    };
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    /* read the header (type and len)
-       len is the total record length including header and checksum */
-    len = 0;
-    len += 16777216L * ((int)calData[0]);
-    len += 65536L * ((int)calData[1]);
-    len += 256 * ((int)calData[2]);
-    len += (int)calData[3];
-
-    calType = ((int)calData[4]) * 256 + ((int)calData[5]);
-    if (calType > 5) {
-        MPL_LOGE("Unsupported calibration file format %d. "
-                 "Valid types 0..5\n", calType);
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    /* check the checksum */
-    chk = 0;
-    ptr = len - INV_CAL_CHK_LEN;
-
-    chk += 16777216L * ((uint32_t) calData[ptr++]);
-    chk += 65536L * ((uint32_t) calData[ptr++]);
-    chk += 256 * ((uint32_t) calData[ptr++]);
-    chk += (uint32_t) calData[ptr++];
-
-    cmp_chk = inv_checksum(calData + INV_CAL_HDR_LEN,
-                           len - (INV_CAL_HDR_LEN + INV_CAL_CHK_LEN));
-
-    if (chk != cmp_chk) {
-        return INV_ERROR_CALIBRATION_CHECKSUM;
-    }
-
-    /* call the proper method to read in the data */
-    return loaders[calType] (calData, len);
-}
-
-/**
- *  @brief  Stores a set of calibration data.
- *          It generates a binary data set containing calibration data.
- *          The binary data set is intended to be stored into a file.
- *
- *  @pre    inv_dmp_open()
- *
- *  @param  calData
- *              A pointer to an array of bytes to be stored.
- *  @param  length
- *              The amount of bytes available in the array.
- *
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_store_cal(unsigned char *calData, int length)
-{
-    INVENSENSE_FUNC_START;
-    int ptr = 0;
-    int i = 0;
-    int j = 0;
-    long long tmp;
-    uint32_t chk;
-    long bias[3];
-    //unsigned char state;
-    union doubleToLongLong {
-        double db;
-        unsigned long long ll;
-    } dToLL;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    STORECAL_LOG("Entering inv_store_cal\n");
-
-    // length
-    calData[0] = (unsigned char)((length >> 24) & 0xff);
-    calData[1] = (unsigned char)((length >> 16) & 0xff);
-    calData[2] = (unsigned char)((length >> 8) & 0xff);
-    calData[3] = (unsigned char)(length & 0xff);
-    STORECAL_LOG("calLen = %d\n", length);
-
-    // calibration data format type
-    calData[4] = 0;
-    calData[5] = 4;
-    STORECAL_LOG("calType = %d\n", (int)calData[4] * 256 + calData[5]);
-
-    // data
-    ptr = 6;
-    for (i = 0; i < BINS; i++) {
-        tmp = (int)inv_obj.temp_ptrs[i];
-        calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(tmp & 0xff);
-        STORECAL_LOG("temp_ptrs[%d] = %lld\n", i, tmp);
-    }
-
-    for (i = 0; i < BINS; i++) {
-        tmp = (int)inv_obj.temp_valid_data[i];
-        calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(tmp & 0xff);
-        STORECAL_LOG("temp_valid_data[%d] = %lld\n", i, tmp);
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = (long long)(inv_obj.temp_data[i][j] * 65536.0f);
-            if (tmp < 0) {
-                tmp += 4294967296LL;
-            }
-            calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-            calData[ptr++] = (unsigned char)(tmp & 0xff);
-            STORECAL_LOG("temp_data[%d][%d] = %f\n",
-                         i, j, inv_obj.temp_data[i][j]);
-        }
-    }
-
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = (long long)(inv_obj.x_gyro_temp_data[i][j] * 65536.0f);
-            if (tmp < 0) {
-                tmp += 4294967296LL;
-            }
-            calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-            calData[ptr++] = (unsigned char)(tmp & 0xff);
-            STORECAL_LOG("x_gyro_temp_data[%d][%d] = %f\n",
-                         i, j, inv_obj.x_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = (long long)(inv_obj.y_gyro_temp_data[i][j] * 65536.0f);
-            if (tmp < 0) {
-                tmp += 4294967296LL;
-            }
-            calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-            calData[ptr++] = (unsigned char)(tmp & 0xff);
-            STORECAL_LOG("y_gyro_temp_data[%d][%d] = %f\n",
-                         i, j, inv_obj.y_gyro_temp_data[i][j]);
-        }
-    }
-    for (i = 0; i < BINS; i++) {
-        for (j = 0; j < PTS_PER_BIN; j++) {
-            tmp = (long long)(inv_obj.z_gyro_temp_data[i][j] * 65536.0f);
-            if (tmp < 0) {
-                tmp += 4294967296LL;
-            }
-            calData[ptr++] = (unsigned char)((tmp >> 24) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 16) & 0xff);
-            calData[ptr++] = (unsigned char)((tmp >> 8) & 0xff);
-            calData[ptr++] = (unsigned char)(tmp & 0xff);
-            STORECAL_LOG("z_gyro_temp_data[%d][%d] = %f\n",
-                         i, j, inv_obj.z_gyro_temp_data[i][j]);
-        }
-    }
-
-    inv_get_array(INV_ACCEL_BIAS, bias);
-
-    /* write the accel biases */
-    for (i = 0; i < 3; i++) {
-        uint32_t t = (uint32_t) bias[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("accel_bias[%d] = %ld\n", i, bias[i]);
-    }
-
-    /* write the compass calibration state */
-    calData[ptr++] = (unsigned char)(inv_obj.got_compass_bias);
-    STORECAL_LOG("got_compass_bias = %ld\n", inv_obj.got_compass_bias);
-    calData[ptr++] = (unsigned char)(inv_obj.got_init_compass_bias);
-    STORECAL_LOG("got_init_compass_bias = %d\n", inv_obj.got_init_compass_bias);
-    if (inv_obj.compass_state == SF_UNCALIBRATED) {
-        calData[ptr++] = SF_UNCALIBRATED;
-    } else {
-        calData[ptr++] = SF_STARTUP_SETTLE;
-    }
-    STORECAL_LOG("compass_state = %ld\n", inv_obj.compass_state);
-
-    for (i = 0; i < 3; i++) {
-        uint32_t t = (uint32_t) inv_obj.compass_bias_error[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("compass_bias_error[%d] = %ld\n",
-                     i, inv_obj.compass_bias_error[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = (uint32_t) inv_obj.init_compass_bias[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("init_compass_bias[%d] = %ld\n", i,
-                     inv_obj.init_compass_bias[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = (uint32_t) inv_obj.compass_bias[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("compass_bias[%d] = %ld\n", i, inv_obj.compass_bias[i]);
-    }
-    for (i = 0; i < 18; i++) {
-        uint32_t t = (uint32_t) inv_obj.compass_peaks[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("compass_peaks[%d] = %d\n", i, inv_obj.compass_peaks[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        dToLL.db = inv_obj.compass_bias_v[i];
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 56) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 48) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 40) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 32) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(dToLL.ll & 0xff);
-        STORECAL_LOG("compass_bias_v[%d] = %lf\n", i,
-                     inv_obj.compass_bias_v[i]);
-    }
-    for (i = 0; i < 9; i++) {
-        dToLL.db = inv_obj.compass_bias_ptr[i];
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 56) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 48) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 40) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 32) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(dToLL.ll & 0xff);
-        STORECAL_LOG("compass_bias_ptr[%d] = %lf\n", i,
-                     inv_obj.compass_bias_ptr[i]);
-    }
-    for (i = 0; i < 3; i++) {
-        uint32_t t = (uint32_t) inv_obj.compass_scale[i];
-        calData[ptr++] = (unsigned char)((t >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((t >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(t & 0xff);
-        STORECAL_LOG("compass_scale[%d] = %ld\n", i, inv_obj.compass_scale[i]);
-    }
-    for (i = 0; i < 6; i++) {
-        dToLL.db = inv_obj.compass_prev_xty[i];
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 56) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 48) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 40) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 32) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(dToLL.ll & 0xff);
-        STORECAL_LOG("compass_prev_xty[%d] = %lf\n", i,
-                     inv_obj.compass_prev_xty[i]);
-    }
-    for (i = 0; i < 36; i++) {
-        dToLL.db = inv_obj.compass_prev_m[i];
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 56) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 48) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 40) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 32) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 24) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 16) & 0xff);
-        calData[ptr++] = (unsigned char)((dToLL.ll >> 8) & 0xff);
-        calData[ptr++] = (unsigned char)(dToLL.ll & 0xff);
-        STORECAL_LOG("compass_prev_m[%d] = %lf\n", i,
-                     inv_obj.compass_prev_m[i]);
-    }
-
-    /* store the compass offsets and validity flag */
-    calData[ptr++] = (unsigned char)inv_obj.flags[INV_COMPASS_OFFSET_VALID];
-    calData[ptr++] = (unsigned char)inv_obj.compass_offsets[0];
-    calData[ptr++] = (unsigned char)inv_obj.compass_offsets[1];
-    calData[ptr++] = (unsigned char)inv_obj.compass_offsets[2];
-
-    /* store the compass accuracy */
-    calData[ptr++] = (unsigned char)(inv_obj.compass_accuracy);
-
-    /* add a checksum */
-    chk = inv_checksum(calData + INV_CAL_HDR_LEN,
-                       length - (INV_CAL_HDR_LEN + INV_CAL_CHK_LEN));
-    calData[ptr++] = (unsigned char)((chk >> 24) & 0xff);
-    calData[ptr++] = (unsigned char)((chk >> 16) & 0xff);
-    calData[ptr++] = (unsigned char)((chk >> 8) & 0xff);
-    calData[ptr++] = (unsigned char)(chk & 0xff);
-
-    STORECAL_LOG("Exiting inv_store_cal\n");
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Load a calibration file.
- *
- *  @pre    Must be in INV_STATE_DMP_OPENED state.
- *          inv_dmp_open() or inv_dmp_stop() must have been called.
- *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
- *          been called.
- *
- *  @return 0 or error code.
- */
-inv_error_t inv_load_calibration(void)
-{
-    unsigned char *calData;
-    inv_error_t result;
-    unsigned int length;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    result = inv_serial_get_cal_length(&length);
-    if (result == INV_ERROR_FILE_OPEN) {
-        MPL_LOGI("Calibration data not loaded\n");
-        return INV_SUCCESS;
-    }
-    if (result || length <= 0) {
-        MPL_LOGE("Could not get file calibration length - "
-                 "error %d - aborting\n", result);
-        return result;
-    }
-    calData = (unsigned char *)inv_malloc(length);
-    if (!calData) {
-        MPL_LOGE("Could not allocate buffer of %d bytes - "
-                 "aborting\n", length);
-        return INV_ERROR_MEMORY_EXAUSTED;
-    }
-    result = inv_serial_read_cal(calData, length);
-    if (result) {
-        MPL_LOGE("Could not read the calibration data from file - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-
-    }
-    result = inv_load_cal(calData);
-    if (result) {
-        MPL_LOGE("Could not load the calibration data - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-
-    }
-
-
-
-free_mem_n_exit:    
-    inv_free(calData);
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Store runtime calibration data to a file
- *
- *  @pre    Must be in INV_STATE_DMP_OPENED state.
- *          inv_dmp_open() or inv_dmp_stop() must have been called.
- *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
- *          been called.
- *
- *  @return 0 or error code.
- */
-inv_error_t inv_store_calibration(void)
-{
-    unsigned char *calData;
-    inv_error_t result;
-    unsigned int length;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    length = inv_get_cal_length();
-    calData = (unsigned char *)inv_malloc(length);
-    if (!calData) {
-        MPL_LOGE("Could not allocate buffer of %d bytes - "
-                 "aborting\n", length);
-        return INV_ERROR_MEMORY_EXAUSTED;
-    }
-    result = inv_store_cal(calData, length);
-    if (result) {
-        MPL_LOGE("Could not store calibrated data on file - "
-                 "error %d - aborting\n", result);
-        goto free_mem_n_exit;
-
-    }
-    result = inv_serial_write_cal(calData, length);
-    if (result) {
-        MPL_LOGE("Could not write calibration data - " "error %d\n", result);
-        goto free_mem_n_exit;
-
-    }
-
-
-
-free_mem_n_exit:
-    inv_free(calData);
-    return INV_SUCCESS;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/mllite/ml_stored_data.h b/60xx/mlsdk/mllite/ml_stored_data.h
deleted file mode 100644
index 74c2b7c..0000000
--- a/60xx/mlsdk/mllite/ml_stored_data.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/*******************************************************************************
- *
- * $Id:$
- *
- ******************************************************************************/
-
-#ifndef INV_STORED_DATA_H
-#define INV_STORED_DATA_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    Includes.
-*/
-
-#include "mltypes.h"
-
-/*
-    Defines
-*/
-#define INV_CAL_ACCEL_LEN    (12)
-#define INV_CAL_COMPASS_LEN  (555 + 5)
-#define INV_CAL_HDR_LEN      (6)
-#define INV_CAL_CHK_LEN      (4)
-
-/*
-    APIs
-*/
-    inv_error_t inv_load_calibration(void);
-    inv_error_t inv_store_calibration(void);
-
-/*
-    Other prototypes
-*/
-    inv_error_t inv_load_cal(unsigned char *calData);
-    inv_error_t inv_store_cal(unsigned char *calData, int length);
-    unsigned int inv_get_cal_length(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          /* INV_STORED_DATA_H */
diff --git a/60xx/mlsdk/mllite/mlarray.c b/60xx/mlsdk/mllite/mlarray.c
deleted file mode 100644
index 6ae85e0..0000000
--- a/60xx/mlsdk/mllite/mlarray.c
+++ /dev/null
@@ -1,2524 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- *
- * $Id: mlarray.c 5085 2011-04-08 22:25:14Z phickey $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup ML
- *  @{
- *      @file   mlarray.c
- *      @brief  APIs to read different data sets from FIFO.
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-#include "ml.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "mlMathFunc.h"
-#include "mlmath.h"
-#include "mlstates.h"
-#include "mlFIFO.h"
-#include "mlsupervisor.h"
-#include "mldl.h"
-#include "dmpKey.h"
-#include "compass.h"
-
-/**
- *  @brief  inv_get_gyro is used to get the most recent gyroscope measurement.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled at 1 dps = 2^16 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-
- /* inv_get_gyro implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_accel is used to get the most recent
- *          accelerometer measurement.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled in units of g (gravity),
- *          where 1 g = 2^16 LSBs.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_accel implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_temperature is used to get the most recent
- *          temperature measurement.
- *          The argument array should only have one element.
- *          The value is in units of deg C (degrees Celsius), where
- *          2^16 LSBs = 1 deg C.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to the data to be passed back to the user.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_temperature implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_rot_mat is used to get the rotation matrix
- *          representation of the current sensor fusion solution.
- *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32,
- *          R33, representing the matrix:
- *          <center>R11 R12 R13</center>
- *          <center>R21 R22 R23</center>
- *          <center>R31 R32 R33</center>
- *          Values are scaled, where 1.0 = 2^30 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_rot_mat(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    long qdata[4];
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    inv_get_quaternion(qdata);
-    inv_quaternion_to_rotation(qdata, data);
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_quaternion is used to get the quaternion representation
- *          of the current sensor fusion solution.
- *          The values are scaled where 1.0 = 2^30 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 4 cells long </b>.
- *
- *  @return INV_SUCCESS if the command is successful; an ML error code otherwise.
- */
- /* inv_get_quaternion implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_linear_accel is used to get an estimate of linear
- *          acceleration, based on the most recent accelerometer measurement
- *          and sensor fusion solution.
- *          The values are scaled where 1 g (gravity) = 2^16 LSBs.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_linear_accel implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_linear_accel_in_world is used to get an estimate of
- *          linear acceleration, in the world frame,  based on the most
- *          recent accelerometer measurement and sensor fusion solution.
- *          The values are scaled where 1 g (gravity) = 2^16 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_linear_accel_in_world implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_gravity is used to get an estimate of the body frame
- *          gravity vector, based on the most recent sensor fusion solution.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_gravity implemented in mlFIFO.c */
-
-/**
- *  @internal
- *  @brief  inv_get_angular_velocity is used to get an estimate of the body
- *          frame angular velocity, which is computed from the current and
- *          previous sensor fusion solutions.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_angular_velocity(long *data)
-{
-
-    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    /* not implemented. old (invalid) implementation:
-       if ( inv_get_state() < INV_STATE_DMP_OPENED )
-       return INV_ERROR_SM_IMPROPER_STATE;
-
-       if (NULL == data) {
-       return INV_ERROR_INVALID_PARAMETER;
-       }
-       data[0] = inv_obj.ang_v_body[0];
-       data[1] = inv_obj.ang_v_body[1];
-       data[2] = inv_obj.ang_v_body[2];
-
-       return result;
-     */
-}
-
-/**
- *  @brief  inv_get_euler_angles is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          Euler angles may follow various conventions. This function is equivelant
- *          to inv_get_euler_angles_x, refer to inv_get_euler_angles_x for more
- *          information.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_euler_angles(long *data)
-{
-    return inv_get_euler_angles_x(data);
-}
-
-/**
- *  @brief  inv_get_euler_angles_x is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          Euler angles are returned according to the X convention.
- *          This is typically the convention used for mobile devices where the X
- *          axis is the width of the screen, Y axis is the height, and Z the
- *          depth. In this case roll is defined as the rotation around the X
- *          axis of the device.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>Y axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
- *          </TABLE>
- *
- *          Values are scaled where 1.0 = 2^16.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_euler_angles_x(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[6];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (long)((float)
-               (atan2f(rotMatrix[7], rotMatrix[8]) * 57.29577951308) *
-               65536L);
-    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
-    data[2] =
-        (long)((float)
-               (atan2f(rotMatrix[3], rotMatrix[0]) * 57.29577951308) *
-               65536L);
-    return result;
-}
-
-/**
- *  @brief  inv_get_euler_angles_y is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          Euler angles are returned according to the Y convention.
- *          This convention is typically used in augmented reality applications,
- *          where roll is defined as the rotation around the axis along the
- *          height of the screen of a mobile device, namely the Y axis.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Y axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
- *          </TABLE>
- *
- *          Values are scaled where 1.0 = 2^16.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_euler_angles_y(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[7];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (long)((float)
-               (atan2f(rotMatrix[8], rotMatrix[6]) * 57.29577951308f) *
-               65536L);
-    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
-    data[2] =
-        (long)((float)
-               (atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308f) *
-               65536L);
-    return result;
-}
-
-/**  @brief  inv_get_euler_angles_z is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          This convention is mostly used in application involving the use
- *          of a camera, typically placed on the back of a mobile device, that
- *          is along the Z axis.  In this convention roll is defined as the
- *          rotation around the Z axis.
- *          Euler angles are returned according to the Y convention.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Z axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Y axis                </TD></TR>
- *          </TABLE>
- *
- *          Values are scaled where 1.0 = 2^16.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-
-inv_error_t inv_get_euler_angles_z(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[8];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (long)((float)
-               (atan2f(rotMatrix[6], rotMatrix[7]) * 57.29577951308) *
-               65536L);
-    data[1] = (long)((float)((double)asin(tmp) * 57.29577951308) * 65536L);
-    data[2] =
-        (long)((float)
-               (atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308) *
-               65536L);
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_temp_slope is used to get is used to get the temperature
- *          compensation algorithm's estimate of the gyroscope bias temperature
- *          coefficient.
- *          The argument array elements are ordered X,Y,Z.
- *          Values are in units of dps per deg C (degrees per second per degree
- *          Celcius). Values are scaled so that 1 dps per deg C = 2^16 LSBs.
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_gyro_temp_slope(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    if (inv_params_obj.bias_mode & INV_LEARN_BIAS_FROM_TEMPERATURE) {
-        data[0] = (long)(inv_obj.x_gyro_coef[1] * 65536.0f);
-        data[1] = (long)(inv_obj.y_gyro_coef[1] * 65536.0f);
-        data[2] = (long)(inv_obj.z_gyro_coef[1] * 65536.0f);
-    } else {
-        data[0] = inv_obj.temp_slope[0];
-        data[1] = inv_obj.temp_slope[1];
-        data[2] = inv_obj.temp_slope[2];
-    }
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_bias is used to get the gyroscope biases.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled such that 1 dps = 2^16 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_gyro_bias(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    data[0] = inv_obj.gyro_bias[0];
-    data[1] = inv_obj.gyro_bias[1];
-    data[2] = inv_obj.gyro_bias[2];
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_accel_bias is used to get the accelerometer baises.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled such that 1 g (gravity) = 2^16 LSBs.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_accel_bias(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    data[0] = inv_obj.accel_bias[0];
-    data[1] = inv_obj.accel_bias[1];
-    data[2] = inv_obj.accel_bias[2];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_bias is used to get Magnetometer Bias
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_bias(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    data[0] =
-        inv_obj.compass_bias[0] +
-        (long)((long long)inv_obj.init_compass_bias[0] * inv_obj.compass_sens /
-               16384);
-    data[1] =
-        inv_obj.compass_bias[1] +
-        (long)((long long)inv_obj.init_compass_bias[1] * inv_obj.compass_sens /
-               16384);
-    data[2] =
-        inv_obj.compass_bias[2] +
-        (long)((long long)inv_obj.init_compass_bias[2] * inv_obj.compass_sens /
-               16384);
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_and_accel_sensor is used to get the most recent set of all sensor data.
- *          The argument array elements are ordered gyroscope X,Y, and Z,
- *          accelerometer X, Y, and Z, and magnetometer X,Y, and Z.
- *          \if UMPL The magnetometer elements are not populated in UMPL. \endif
- *          The gyroscope and accelerometer data is not scaled or offset, it is
- *          copied directly from the sensor registers.
- *          In the case of accelerometers with 8-bit output resolution, the data
- *          is scaled up to match the 2^14 = 1 g typical represntation of +/- 2 g
- *          full scale range
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
- /* inv_get_gyro_and_accel_sensor implemented in mlFIFO.c */
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_raw_data is used to get Raw magnetometer data.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_raw_data(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.compass_sensor_data[0];
-    data[1] = inv_obj.compass_sensor_data[1];
-    data[2] = inv_obj.compass_sensor_data[2];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_magnetometer is used to get magnetometer data.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_magnetometer(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.compass_sensor_data[0] + inv_obj.init_compass_bias[0];
-    data[1] = inv_obj.compass_sensor_data[1] + inv_obj.init_compass_bias[1];
-    data[2] = inv_obj.compass_sensor_data[2] + inv_obj.init_compass_bias[2];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_pressure is used to get Pressure data.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to data to be passed back to the user.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_pressure(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.pressure;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_heading is used to get heading from Rotation Matrix.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to data to be passed back to the user.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-
-inv_error_t inv_get_heading(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    result = inv_get_rot_mat_float(rotMatrix);
-    if ((rotMatrix[7] < 0.707) && (rotMatrix[7] > -0.707)) {
-        tmp =
-            (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308 -
-                    90.0f);
-    } else {
-        tmp =
-            (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308 +
-                    90.0f);
-    }
-    if (tmp < 0) {
-        tmp += 360.0f;
-    }
-    data[0] = (long)((360 - tmp) * 65536.0f);
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_cal_matrix is used to get the gyroscope
- *          calibration matrix. The gyroscope calibration matrix defines the relationship
- *          between the gyroscope sensor axes and the sensor fusion solution axes.
- *          Calibration matrix data members will have a value of 1, 0, or -1.
- *          The matrix has members
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_gyro_cal_matrix(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.gyro_cal[0];
-    data[1] = inv_obj.gyro_cal[1];
-    data[2] = inv_obj.gyro_cal[2];
-    data[3] = inv_obj.gyro_cal[3];
-    data[4] = inv_obj.gyro_cal[4];
-    data[5] = inv_obj.gyro_cal[5];
-    data[6] = inv_obj.gyro_cal[6];
-    data[7] = inv_obj.gyro_cal[7];
-    data[8] = inv_obj.gyro_cal[8];
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_accel_cal_matrix is used to get the accelerometer
- *          calibration matrix.
- *          Calibration matrix data members will have a value of 1, 0, or -1.
- *          The matrix has members
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_accel_cal_matrix(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.accel_cal[0];
-    data[1] = inv_obj.accel_cal[1];
-    data[2] = inv_obj.accel_cal[2];
-    data[3] = inv_obj.accel_cal[3];
-    data[4] = inv_obj.accel_cal[4];
-    data[5] = inv_obj.accel_cal[5];
-    data[6] = inv_obj.accel_cal[6];
-    data[7] = inv_obj.accel_cal[7];
-    data[8] = inv_obj.accel_cal[8];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_cal_matrix is used to get magnetometer calibration matrix.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_cal_matrix(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.compass_cal[0];
-    data[1] = inv_obj.compass_cal[1];
-    data[2] = inv_obj.compass_cal[2];
-    data[3] = inv_obj.compass_cal[3];
-    data[4] = inv_obj.compass_cal[4];
-    data[5] = inv_obj.compass_cal[5];
-    data[6] = inv_obj.compass_cal[6];
-    data[7] = inv_obj.compass_cal[7];
-    data[8] = inv_obj.compass_cal[8];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_bias_error is used to get magnetometer Bias error.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_bias_error(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    if (inv_obj.large_field == 0) {
-        data[0] = inv_obj.compass_bias_error[0];
-        data[1] = inv_obj.compass_bias_error[1];
-        data[2] = inv_obj.compass_bias_error[2];
-    } else {
-        data[0] = P_INIT;
-        data[1] = P_INIT;
-        data[2] = P_INIT;
-    }
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_scale is used to get magnetometer scale.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_scale(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.compass_scale[0];
-    data[1] = inv_obj.compass_scale[1];
-    data[2] = inv_obj.compass_scale[2];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_local_field is used to get local magnetic field data.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_local_field(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = inv_obj.local_field[0];
-    data[1] = inv_obj.local_field[1];
-    data[2] = inv_obj.local_field[2];
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_relative_quaternion is used to get relative quaternion.
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 4 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- *  @endcond
- */
-/* inv_get_relative_quaternion implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_gyro_float is used to get the most recent gyroscope measurement.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of dps (degrees per second).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gyro_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[3];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    result = inv_get_gyro(ldata);
-    data[0] = (float)ldata[0] / 65536.0f;
-    data[1] = (float)ldata[1] / 65536.0f;
-    data[2] = (float)ldata[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  inv_get_angular_velocity_float is used to get an array of three data points representing the angular
- *          velocity as derived from <b>both</b> gyroscopes and accelerometers.
- *          This requires that ML_SENSOR_FUSION be enabled, to fuse data from
- *          the gyroscope and accelerometer device, appropriately scaled and
- *          oriented according to the respective mounting matrices.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_angular_velocity_float(float *data)
-{
-    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    /* not implemented. old (invalid) implementation:
-       return inv_get_gyro_float(data);
-     */
-}
-
-/**
- *  @brief  inv_get_accel_float is used to get the most recent accelerometer measurement.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of g (gravity).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
- /* inv_get_accel_float implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_temperature_float is used to get the most recent
- *          temperature measurement.
- *          The argument array should only have one element.
- *          The value is in units of deg C (degrees Celsius).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to data to be passed back to the user.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_temperature_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[1];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_temperature(ldata);
-    data[0] = (float)ldata[0] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_rot_mat_float is used to get an array of nine data points representing the rotation
- *          matrix generated from all available sensors.
- *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32,
- *          R33, representing the matrix:
- *          <center>R11 R12 R13</center>
- *          <center>R21 R22 R23</center>
- *          <center>R31 R32 R33</center>
- *          <b>Please refer to the "9-Axis Sensor Fusion Application Note" document,
- *          section 7 "Sensor Fusion Output", for details regarding rotation
- *          matrix output</b>.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long at least</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_rot_mat_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    {
-        long qdata[4], rdata[9];
-        inv_get_quaternion(qdata);
-        inv_quaternion_to_rotation(qdata, rdata);
-        data[0] = (float)rdata[0] / 1073741824.0f;
-        data[1] = (float)rdata[1] / 1073741824.0f;
-        data[2] = (float)rdata[2] / 1073741824.0f;
-        data[3] = (float)rdata[3] / 1073741824.0f;
-        data[4] = (float)rdata[4] / 1073741824.0f;
-        data[5] = (float)rdata[5] / 1073741824.0f;
-        data[6] = (float)rdata[6] / 1073741824.0f;
-        data[7] = (float)rdata[7] / 1073741824.0f;
-        data[8] = (float)rdata[8] / 1073741824.0f;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_quaternion_float is used to get the quaternion representation
- *          of the current sensor fusion solution.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 4 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an ML error code otherwise.
- */
- /* inv_get_quaternion_float implemented in mlFIFO.c */
-
-/**
- *  @brief  inv_get_linear_accel_float is used to get an estimate of linear
- *          acceleration, based on the most recent accelerometer measurement
- *          and sensor fusion solution.
- *          The values are in units of g (gravity).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_linear_accel_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[3];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_linear_accel(ldata);
-    data[0] = (float)ldata[0] / 65536.0f;
-    data[1] = (float)ldata[1] / 65536.0f;
-    data[2] = (float)ldata[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_linear_accel_in_world_float is used to get an estimate of
- *          linear acceleration, in the world frame,  based on the most
- *          recent accelerometer measurement and sensor fusion solution.
- *          The values are in units of g (gravity).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_linear_accel_in_world_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[3];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_linear_accel_in_world(ldata);
-    data[0] = (float)ldata[0] / 65536.0f;
-    data[1] = (float)ldata[1] / 65536.0f;
-    data[2] = (float)ldata[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gravity_float is used to get an estimate of the body frame
- *          gravity vector, based on the most recent sensor fusion solution.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long at least</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gravity_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[3];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    result = inv_get_gravity(ldata);
-    data[0] = (float)ldata[0] / 65536.0f;
-    data[1] = (float)ldata[1] / 65536.0f;
-    data[2] = (float)ldata[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_cal_matrix_float is used to get the gyroscope
- *          calibration matrix. The gyroscope calibration matrix defines the relationship
- *          between the gyroscope sensor axes and the sensor fusion solution axes.
- *          Calibration matrix data members will have a value of 1.0, 0, or -1.0.
- *          The matrix has members
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gyro_cal_matrix_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.gyro_cal[0] / 1073741824.0f;
-    data[1] = (float)inv_obj.gyro_cal[1] / 1073741824.0f;
-    data[2] = (float)inv_obj.gyro_cal[2] / 1073741824.0f;
-    data[3] = (float)inv_obj.gyro_cal[3] / 1073741824.0f;
-    data[4] = (float)inv_obj.gyro_cal[4] / 1073741824.0f;
-    data[5] = (float)inv_obj.gyro_cal[5] / 1073741824.0f;
-    data[6] = (float)inv_obj.gyro_cal[6] / 1073741824.0f;
-    data[7] = (float)inv_obj.gyro_cal[7] / 1073741824.0f;
-    data[8] = (float)inv_obj.gyro_cal[8] / 1073741824.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_accel_cal_matrix_float is used to get the accelerometer
- *          calibration matrix.
- *          Calibration matrix data members will have a value of 1.0, 0, or -1.0.
- *          The matrix has members
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *          The argument array elements are ordered C11, C12, C13, C21, C22, C23, C31, C32, C33.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-
-inv_error_t inv_get_accel_cal_matrix_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.accel_cal[0] / 1073741824.0f;
-    data[1] = (float)inv_obj.accel_cal[1] / 1073741824.0f;
-    data[2] = (float)inv_obj.accel_cal[2] / 1073741824.0f;
-    data[3] = (float)inv_obj.accel_cal[3] / 1073741824.0f;
-    data[4] = (float)inv_obj.accel_cal[4] / 1073741824.0f;
-    data[5] = (float)inv_obj.accel_cal[5] / 1073741824.0f;
-    data[6] = (float)inv_obj.accel_cal[6] / 1073741824.0f;
-    data[7] = (float)inv_obj.accel_cal[7] / 1073741824.0f;
-    data[8] = (float)inv_obj.accel_cal[8] / 1073741824.0f;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_cal_matrix_float is used to get an array of nine data points
- *			representing the calibration matrix for the compass:
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long at least</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_cal_matrix_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.compass_cal[0] / 1073741824.0f;
-    data[1] = (float)inv_obj.compass_cal[1] / 1073741824.0f;
-    data[2] = (float)inv_obj.compass_cal[2] / 1073741824.0f;
-    data[3] = (float)inv_obj.compass_cal[3] / 1073741824.0f;
-    data[4] = (float)inv_obj.compass_cal[4] / 1073741824.0f;
-    data[5] = (float)inv_obj.compass_cal[5] / 1073741824.0f;
-    data[6] = (float)inv_obj.compass_cal[6] / 1073741824.0f;
-    data[7] = (float)inv_obj.compass_cal[7] / 1073741824.0f;
-    data[8] = (float)inv_obj.compass_cal[8] / 1073741824.0f;
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_temp_slope_float is used to get the temperature
- *          compensation algorithm's estimate of the gyroscope bias temperature
- *          coefficient.
- *          The argument array elements are ordered X,Y,Z.
- *          Values are in units of dps per deg C (degrees per second per degree
- *          Celcius)
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long </b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gyro_temp_slope_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    if (inv_params_obj.bias_mode & INV_LEARN_BIAS_FROM_TEMPERATURE) {
-        data[0] = inv_obj.x_gyro_coef[1];
-        data[1] = inv_obj.y_gyro_coef[1];
-        data[2] = inv_obj.z_gyro_coef[1];
-    } else {
-        data[0] = (float)inv_obj.temp_slope[0] / 65536.0f;
-        data[1] = (float)inv_obj.temp_slope[1] / 65536.0f;
-        data[2] = (float)inv_obj.temp_slope[2] / 65536.0f;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_bias_float is used to get the gyroscope biases.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of dps (degrees per second).
-
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gyro_bias_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.gyro_bias[0] / 65536.0f;
-    data[1] = (float)inv_obj.gyro_bias[1] / 65536.0f;
-    data[2] = (float)inv_obj.gyro_bias[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_accel_bias_float is used to get the accelerometer baises.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of g (gravity).
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_accel_bias_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.accel_bias[0] / 65536.0f;
-    data[1] = (float)inv_obj.accel_bias[1] / 65536.0f;
-    data[2] = (float)inv_obj.accel_bias[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_bias_float is used to get an array of three data points representing
- *			the compass biases.
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_bias_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] =
-        ((float)
-         (inv_obj.compass_bias[0] +
-          (long)((long long)inv_obj.init_compass_bias[0] *
-                 inv_obj.compass_sens / 16384))) / 65536.0f;
-    data[1] =
-        ((float)
-         (inv_obj.compass_bias[1] +
-          (long)((long long)inv_obj.init_compass_bias[1] *
-                 inv_obj.compass_sens / 16384))) / 65536.0f;
-    data[2] =
-        ((float)
-         (inv_obj.compass_bias[2] +
-          (long)((long long)inv_obj.init_compass_bias[2] *
-                 inv_obj.compass_sens / 16384))) / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_gyro_and_accel_sensor_float is used to get the most recent set of all sensor data.
- *          The argument array elements are ordered gyroscope X,Y, and Z,
- *          accelerometer X, Y, and Z, and magnetometer X,Y, and Z.
- *          \if UMPL The magnetometer elements are not populated in UMPL. \endif
- *          The gyroscope and accelerometer data is not scaled or offset, it is
- *          copied directly from the sensor registers, and cast as a float.
- *          In the case of accelerometers with 8-bit output resolution, the data
- *          is scaled up to match the 2^14 = 1 g typical represntation of +/- 2 g
- *          full scale range
-
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_gyro_and_accel_sensor_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    long ldata[6];
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_gyro_and_accel_sensor(ldata);
-    data[0] = (float)ldata[0];
-    data[1] = (float)ldata[1];
-    data[2] = (float)ldata[2];
-    data[3] = (float)ldata[3];
-    data[4] = (float)ldata[4];
-    data[5] = (float)ldata[5];
-    data[6] = (float)inv_obj.compass_sensor_data[0];
-    data[7] = (float)inv_obj.compass_sensor_data[1];
-    data[8] = (float)inv_obj.compass_sensor_data[2];
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_euler_angles_x is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          Euler angles are returned according to the X convention.
- *          This is typically the convention used for mobile devices where the X
- *          axis is the width of the screen, Y axis is the height, and Z the
- *          depth. In this case roll is defined as the rotation around the X
- *          axis of the device.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>Y axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
- *
-           </TABLE>
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_euler_angles_x_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[6];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (float)(atan2f(rotMatrix[7],
-                       rotMatrix[8]) * 57.29577951308);
-    data[1] = (float)((double)asin(tmp) * 57.29577951308);
-    data[2] =
-        (float)(atan2f(rotMatrix[3], rotMatrix[0]) * 57.29577951308);
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_euler_angles_float is used to get an array of three data points three data points
- *			representing roll, pitch, and yaw corresponding to the INV_EULER_ANGLES_X output and it is
- *          therefore the default convention for Euler angles.
- *          Please refer to the INV_EULER_ANGLES_X for a detailed description.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_euler_angles_float(float *data)
-{
-    return inv_get_euler_angles_x_float(data);
-}
-
-/**  @brief  inv_get_euler_angles_y_float is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          Euler angles are returned according to the Y convention.
- *          This convention is typically used in augmented reality applications,
- *          where roll is defined as the rotation around the axis along the
- *          height of the screen of a mobile device, namely the Y axis.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Y axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Z axis                </TD></TR>
- *          </TABLE>
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_euler_angles_y_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[7];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (float)(atan2f(rotMatrix[8], rotMatrix[6]) * 57.29577951308);
-    data[1] = (float)((double)asin(tmp) * 57.29577951308);
-    data[2] =
-        (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308);
-
-    return result;
-}
-
-/**  @brief  inv_get_euler_angles_z_float is used to get the Euler angle representation
- *          of the current sensor fusion solution.
- *          This convention is mostly used in application involving the use
- *          of a camera, typically placed on the back of a mobile device, that
- *          is along the Z axis.  In this convention roll is defined as the
- *          rotation around the Z axis.
- *          Euler angles are returned according to the Y convention.
- *          <TABLE>
- *          <TR><TD>Element </TD><TD><b>Euler angle</b></TD><TD><b>Rotation about </b></TD></TR>
- *          <TR><TD> 0      </TD><TD>Roll              </TD><TD>Z axis                </TD></TR>
- *          <TR><TD> 1      </TD><TD>Pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD> 2      </TD><TD>Yaw               </TD><TD>Y axis                </TD></TR>
- *          </TABLE>
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_euler_angles_z_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    result = inv_get_rot_mat_float(rotMatrix);
-    tmp = rotMatrix[8];
-    if (tmp > 1.0f) {
-        tmp = 1.0f;
-    }
-    if (tmp < -1.0f) {
-        tmp = -1.0f;
-    }
-    data[0] =
-        (float)(atan2f(rotMatrix[6], rotMatrix[7]) * 57.29577951308);
-    data[1] = (float)((double)asin(tmp) * 57.29577951308);
-    data[2] =
-        (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308);
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_raw_data_float is used to get Raw magnetometer data
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_raw_data_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] =
-        (float)(inv_obj.compass_sensor_data[0] + inv_obj.init_compass_bias[0]);
-    data[1] =
-        (float)(inv_obj.compass_sensor_data[1] + inv_obj.init_compass_bias[1]);
-    data[2] =
-        (float)(inv_obj.compass_sensor_data[2] + inv_obj.init_compass_bias[2]);
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_magnetometer_float is used to get magnetometer data
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_magnetometer_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.compass_calibrated_data[0] / 65536.0f;
-    data[1] = (float)inv_obj.compass_calibrated_data[1] / 65536.0f;
-    data[2] = (float)inv_obj.compass_calibrated_data[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_pressure_float is used to get a single value representing the pressure in Pascal
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to the data to be passed back to the user.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_pressure_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.pressure;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_heading_float is used to get single number representing the heading of the device
- *          relative to the Earth, in which 0 represents North, 90 degrees
- *          represents East, and so on.
- *          The heading is defined as the direction of the +Y axis if the Y
- *          axis is horizontal, and otherwise the direction of the -Z axis.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to the data to be passed back to the user.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_heading_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    float rotMatrix[9];
-    float tmp;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    inv_get_rot_mat_float(rotMatrix);
-    if ((rotMatrix[7] < 0.707) && (rotMatrix[7] > -0.707)) {
-        tmp =
-            (float)(atan2f(rotMatrix[4], rotMatrix[1]) * 57.29577951308 -
-                    90.0f);
-    } else {
-        tmp =
-            (float)(atan2f(rotMatrix[5], rotMatrix[2]) * 57.29577951308 +
-                    90.0f);
-    }
-    if (tmp < 0) {
-        tmp += 360.0f;
-    }
-    data[0] = 360 - tmp;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_bias_error_float is used to get an array of three numbers representing
- *			the current estimated error in the compass biases. These numbers are unitless and serve
- *          as rough estimates in which numbers less than 100 typically represent
- *          reasonably well calibrated compass axes.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_bias_error_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    if (inv_obj.large_field == 0) {
-        data[0] = (float)inv_obj.compass_bias_error[0];
-        data[1] = (float)inv_obj.compass_bias_error[1];
-        data[2] = (float)inv_obj.compass_bias_error[2];
-    } else {
-        data[0] = (float)P_INIT;
-        data[1] = (float)P_INIT;
-        data[2] = (float)P_INIT;
-    }
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_mag_scale_float is used to get magnetometer scale.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_mag_scale_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.compass_scale[0] / 65536.0f;
-    data[1] = (float)inv_obj.compass_scale[1] / 65536.0f;
-    data[2] = (float)inv_obj.compass_scale[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_local_field_float is used to get local magnetic field data.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 3 cells long</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_local_field_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.local_field[0] / 65536.0f;
-    data[1] = (float)inv_obj.local_field[1] / 65536.0f;
-    data[2] = (float)inv_obj.local_field[2] / 65536.0f;
-
-    return result;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_get_relative_quaternion_float is used to get relative quaternion data.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or MLDmpPedometerStandAloneOpen() \endif
- *          must have been called.
- *
- *  @param  data
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 4 cells long at least</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- *  @endcond
- */
-inv_error_t inv_get_relative_quaternion_float(float *data)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    data[0] = (float)inv_obj.relative_quat[0] / 1073741824.0f;
-    data[1] = (float)inv_obj.relative_quat[1] / 1073741824.0f;
-    data[2] = (float)inv_obj.relative_quat[2] / 1073741824.0f;
-    data[3] = (float)inv_obj.relative_quat[3] / 1073741824.0f;
-
-    return result;
-}
-
-/**
- * Returns the curren compass accuracy.
- *
- * - 0: Unknown: The accuracy is unreliable and compass data should not be used
- * - 1: Low: The compass accuracy is low.
- * - 2: Medium: The compass accuracy is medium.
- * - 3: High: The compas acurracy is high and can be trusted
- *
- * @param accuracy The accuracy level in the range 0-3
- *
- * @return ML_SUCCESS or non-zero error code
- */
-inv_error_t inv_get_compass_accuracy(int *accuracy)
-{
-    if (inv_get_state() != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    *accuracy = inv_obj.compass_accuracy;
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_gyro_bias is used to set the gyroscope bias.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled at 1 dps = 2^16 LSBs.
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_gyro_bias(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-    long biasTmp;
-    long sf = 0;
-    short offset[GYRO_NUM_AXES];
-    int i;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    if (mldl_cfg->gyro_sens_trim != 0) {
-        sf = 2000 * 131 / mldl_cfg->gyro_sens_trim;
-    } else {
-        sf = 2000;
-    }
-    for (i = 0; i < GYRO_NUM_AXES; i++) {
-        inv_obj.gyro_bias[i] = data[i];
-        biasTmp = -inv_obj.gyro_bias[i] / sf;
-        if (biasTmp < 0)
-            biasTmp += 65536L;
-        offset[i] = (short)biasTmp;
-    }
-    result = inv_set_offset(offset);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_accel_bias is used to set the accelerometer bias.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are scaled in units of g (gravity),
- *          where 1 g = 2^16 LSBs.
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_accel_bias(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-    long biasTmp;
-    int i, j;
-    unsigned char regs[6];
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    for (i = 0; i < ACCEL_NUM_AXES; i++) {
-        inv_obj.accel_bias[i] = data[i];
-        if (inv_obj.accel_sens != 0 && mldl_cfg && mldl_cfg->pdata) {
-            long long tmp64;
-            inv_obj.scaled_accel_bias[i] = 0;
-            for (j = 0; j < ACCEL_NUM_AXES; j++) {
-                inv_obj.scaled_accel_bias[i] +=
-                    data[j] *
-                    (long)mldl_cfg->pdata->accel.orientation[i * 3 + j];
-            }
-            tmp64 = (long long)inv_obj.scaled_accel_bias[i] << 13;
-            biasTmp = (long)(tmp64 / inv_obj.accel_sens);
-        } else {
-            biasTmp = 0;
-        }
-        if (biasTmp < 0)
-            biasTmp += 65536L;
-        regs[2 * i + 0] = (unsigned char)(biasTmp / 256);
-        regs[2 * i + 1] = (unsigned char)(biasTmp % 256);
-    }
-    result = inv_set_mpu_memory(KEY_D_1_8, 2, &regs[0]);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_mpu_memory(KEY_D_1_10, 2, &regs[2]);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_set_mpu_memory(KEY_D_1_2, 2, &regs[4]);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_mag_bias is used to set Compass Bias
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_mag_bias(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    inv_set_compass_bias(data);
-    inv_obj.init_compass_bias[0] = 0;
-    inv_obj.init_compass_bias[1] = 0;
-    inv_obj.init_compass_bias[2] = 0;
-    inv_obj.got_compass_bias = 1;
-    inv_obj.got_init_compass_bias = 1;
-    inv_obj.compass_state = SF_STARTUP_SETTLE;
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_gyro_temp_slope is used to set the temperature
- *          compensation algorithm's estimate of the gyroscope bias temperature
- *          coefficient.
- *          The argument array elements are ordered X,Y,Z.
- *          Values are in units of dps per deg C (degrees per second per degree
- *          Celcius), and scaled such that 1 dps per deg C = 2^16 LSBs.
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document.
- *
- *  @brief  inv_set_gyro_temp_slope is used to set Gyro temperature slope
- *
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_gyro_temp_slope(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-    int i;
-    long sf;
-    unsigned char regs[3];
-
-    inv_obj.factory_temp_comp = 1;
-    inv_obj.temp_slope[0] = data[0];
-    inv_obj.temp_slope[1] = data[1];
-    inv_obj.temp_slope[2] = data[2];
-    for (i = 0; i < GYRO_NUM_AXES; i++) {
-        sf = -inv_obj.temp_slope[i] / 1118;
-        if (sf > 127) {
-            sf -= 256;
-        }
-        regs[i] = (unsigned char)sf;
-    }
-    result = inv_set_offsetTC(regs);
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_local_field is used to set local magnetic field
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_local_field(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    inv_obj.local_field[0] = data[0];
-    inv_obj.local_field[1] = data[1];
-    inv_obj.local_field[2] = data[2];
-    inv_obj.new_local_field = 1;
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_mag_scale is used to set magnetometer scale
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_mag_scale(long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    inv_obj.compass_scale[0] = data[0];
-    inv_obj.compass_scale[1] = data[1];
-    inv_obj.compass_scale[2] = data[2];
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_gyro_temp_slope_float is used to get the temperature
- *          compensation algorithm's estimate of the gyroscope bias temperature
- *          coefficient.
- *          The argument array elements are ordered X,Y,Z.
- *          Values are in units of dps per deg C (degrees per second per degree
- *          Celcius)
-
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_gyro_temp_slope_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_gyro_temp_slope(arrayTmp);
-}
-
-/**
- *  @brief  inv_set_gyro_bias_float is used to set the gyroscope bias.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of dps (degrees per second).
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_gyro_bias_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_gyro_bias(arrayTmp);
-
-}
-
-/**
- *  @brief  inv_set_accel_bias_float is used to set the accelerometer bias.
- *          The argument array elements are ordered X,Y,Z.
- *          The values are in units of g (gravity).
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_accel_bias_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_accel_bias(arrayTmp);
-
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_mag_bias_float is used to set compass bias
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen()\ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_mag_bias_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_mag_bias(arrayTmp);
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_local_field_float is used to set local magnetic field
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_local_field_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_local_field(arrayTmp);
-}
-
-/**
- *  @cond MPL
- *  @brief  inv_set_mag_scale_float is used to set magnetometer scale
- *
- *          Please refer to the provided "9-Axis Sensor Fusion
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() \ifnot UMPL or
- *          MLDmpPedometerStandAloneOpen() \endif
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- *  @endcond
- */
-inv_error_t inv_set_mag_scale_float(float *data)
-{
-    long arrayTmp[3];
-    arrayTmp[0] = (long)(data[0] * 65536.f);
-    arrayTmp[1] = (long)(data[1] * 65536.f);
-    arrayTmp[2] = (long)(data[2] * 65536.f);
-    return inv_set_mag_scale(arrayTmp);
-}
diff --git a/60xx/mlsdk/mllite/mlarray_legacy.c b/60xx/mlsdk/mllite/mlarray_legacy.c
deleted file mode 100644
index 9dce8f3..0000000
--- a/60xx/mlsdk/mllite/mlarray_legacy.c
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- *
- * $Id: mlarray_legacy.c $
- *
- *****************************************************************************/
-
-/** 
- *  @defgroup MLArray_Legacy 
- *  @brief  Legacy Motion Library Array APIs.
- *          The Motion Library Array APIs provide the user access to the
- *          Motion Library state. These Legacy APIs provide access to
- *          individual state arrays using a data set name as the first
- *          argument to the API. This format has been replaced by unique
- *          named APIs for each data set, found in the MLArray group.
- *
- *  @{
- *      @file   mlarray_legacy.c
- *      @brief  The Legacy Motion Library Array APIs.
- */
-
-#include "ml.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "mlFIFO.h"
-#include "mldl_cfg.h"
-
-/**
- *  @brief  inv_get_array is used to get an array of processed motion sensor data.
- *          inv_get_array can be used to retrieve various data sets. Certain data
- *          sets require functions to be enabled using MLEnable in order to be
- *          valid.
- *
- *          The available data sets are:
- *
- *          - INV_ROTATION_MATRIX
- *          - INV_QUATERNION
- *          - INV_EULER_ANGLES_X
- *          - INV_EULER_ANGLES_Y
- *          - INV_EULER_ANGLES_Z
- *          - INV_EULER_ANGLES
- *          - INV_LINEAR_ACCELERATION
- *          - INV_LINEAR_ACCELERATION_WORLD
- *          - INV_GRAVITY
- *          - INV_ANGULAR_VELOCITY
- *          - INV_RAW_DATA
- *          - INV_GYROS
- *          - INV_ACCELS
- *          - INV_MAGNETOMETER
- *          - INV_GYRO_BIAS
- *          - INV_ACCEL_BIAS
- *          - INV_MAG_BIAS 
- *          - INV_HEADING
- *          - INV_MAG_BIAS_ERROR
- *          - INV_PRESSURE
- *
- *          Please refer to the documentation of inv_get_float_array() for a 
- *          description of these data sets.
- *
- *  @pre    MLDmpOpen() or MLDmpPedometerStandAloneOpen()
- *          must have been called.
- *
- *  @param  dataSet     
- *              A constant specifying an array of data processed by the
- *              motion processor.
- *  @param  data        
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long at least</b>.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_array(int dataSet, long *data)
-{
-    inv_error_t result;
-    switch (dataSet) {
-    case INV_GYROS:
-        result = inv_get_gyro(data);
-        break;
-    case INV_ACCELS:
-        result = inv_get_accel(data);
-        break;
-    case INV_TEMPERATURE:
-        result = inv_get_temperature(data);
-        break;
-    case INV_ROTATION_MATRIX:
-        result = inv_get_rot_mat(data);
-        break;
-    case INV_QUATERNION:
-        result = inv_get_quaternion(data);
-        break;
-    case INV_LINEAR_ACCELERATION:
-        result = inv_get_linear_accel(data);
-        break;
-    case INV_LINEAR_ACCELERATION_WORLD:
-        result = inv_get_linear_accel_in_world(data);
-        break;
-    case INV_GRAVITY:
-        result = inv_get_gravity(data);
-        break;
-    case INV_ANGULAR_VELOCITY:
-        result = inv_get_angular_velocity(data);
-        break;
-    case INV_EULER_ANGLES:
-        result = inv_get_euler_angles(data);
-        break;
-    case INV_EULER_ANGLES_X:
-        result = inv_get_euler_angles_x(data);
-        break;
-    case INV_EULER_ANGLES_Y:
-        result = inv_get_euler_angles_y(data);
-        break;
-    case INV_EULER_ANGLES_Z:
-        result = inv_get_euler_angles_z(data);
-        break;
-    case INV_GYRO_TEMP_SLOPE:
-        result = inv_get_gyro_temp_slope(data);
-        break;
-    case INV_GYRO_BIAS:
-        result = inv_get_gyro_bias(data);
-        break;
-    case INV_ACCEL_BIAS:
-        result = inv_get_accel_bias(data);
-        break;
-    case INV_MAG_BIAS:
-        result = inv_get_mag_bias(data);
-        break;
-    case INV_RAW_DATA:
-        result = inv_get_gyro_and_accel_sensor(data);
-        break;
-    case INV_MAG_RAW_DATA:
-        result = inv_get_mag_raw_data(data);
-        break;
-    case INV_MAGNETOMETER:
-        result = inv_get_magnetometer(data);
-        break;
-    case INV_PRESSURE:
-        result = inv_get_pressure(data);
-        break;
-    case INV_HEADING:
-        result = inv_get_heading(data);
-        break;
-    case INV_GYRO_CALIBRATION_MATRIX:
-        result = inv_get_gyro_cal_matrix(data);
-        break;
-    case INV_ACCEL_CALIBRATION_MATRIX:
-        result = inv_get_accel_cal_matrix(data);
-        break;
-    case INV_MAG_CALIBRATION_MATRIX:
-        result = inv_get_mag_cal_matrix(data);
-        break;
-    case INV_MAG_BIAS_ERROR:
-        result = inv_get_mag_bias_error(data);
-        break;
-    case INV_MAG_SCALE:
-        result = inv_get_mag_scale(data);
-        break;
-    case INV_LOCAL_FIELD:
-        result = inv_get_local_field(data);
-        break;
-    case INV_RELATIVE_QUATERNION:
-        result = inv_get_relative_quaternion(data);
-        break;
-    default:
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-    return result;
-}
-
-/**
- *  @brief  inv_get_float_array is used to get an array of processed motion sensor 
- *          data. inv_get_array can be used to retrieve various data sets. 
- *          Certain data sets require functions to be enabled using MLEnable 
- *          in order to be valid.
- *
- *          The available data sets are:
- *
- *          - INV_ROTATION_MATRIX :
- *          Returns an array of nine data points representing the rotation 
- *          matrix generated from all available sensors. 
- *          This requires that ML_SENSOR_FUSION be enabled.
- *          The array format will be R11, R12, R13, R21, R22, R23, R31, R32, 
- *          R33, representing the matrix:
- *          <center>R11 R12 R13</center>
- *          <center>R21 R22 R23</center>
- *          <center>R31 R32 R33</center>
- *          <b>Please refer to the "9-Axis Sensor Fusion Application Note" document, 
- *          section 7 "Sensor Fusion Output", for details regarding rotation 
- *          matrix output</b>.
- *
- *          - INV_QUATERNION :
- *          Returns an array of four data points representing the quaternion 
- *          generated from all available sensors. 
- *          This requires that ML_SENSOR_FUSION be enabled.
- *
- *          - INV_EULER_ANGLES_X :
- *          Returns an array of three data points representing roll, pitch, and 
- *          yaw using the X axis of the gyroscope, accelerometer, and compass as 
- *          reference axis. 
- *          This is typically the convention used for mobile devices where the X
- *          axis is the width of the screen, Y axis is the height, and Z the 
- *          depth. In this case roll is defined as the rotation around the X 
- *          axis of the device.
- *          The euler angles convention for this output is the following:
- *          <TABLE>
- *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
- *          <TR><TD>roll              </TD><TD>X axis                </TD></TR>
- *          <TR><TD>pitch             </TD><TD>Y axis                </TD></TR>
- *          <TR><TD>yaw               </TD><TD>Z axis                </TD></TR>
- *          </TABLE>
- *          INV_EULER_ANGLES_X corresponds to the INV_EULER_ANGLES output and is 
- *          therefore the default convention.
- *
- *          - INV_EULER_ANGLES_Y :
- *          Returns an array of three data points representing roll, pitch, and 
- *          yaw using the Y axis of the gyroscope, accelerometer, and compass as 
- *          reference axis. 
- *          This convention is typically used in augmented reality applications, 
- *          where roll is defined as the rotation around the axis along the 
- *          height of the screen of a mobile device, namely the Y axis.
- *          The euler angles convention for this output is the following:
- *          <TABLE>
- *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
- *          <TR><TD>roll              </TD><TD>Y axis                </TD></TR>
- *          <TR><TD>pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD>yaw               </TD><TD>Z axis                </TD></TR>
- *          </TABLE>
- *
- *          - INV_EULER_ANGLES_Z :
- *          Returns an array of three data points representing roll, pitch, and 
- *          yaw using the Z axis of the gyroscope, accelerometer, and compass as 
- *          reference axis. 
- *          This convention is mostly used in application involving the use 
- *          of a camera, typically placed on the back of a mobile device, that 
- *          is along the Z axis.  In this convention roll is defined as the 
- *          rotation around the Z axis.
- *          The euler angles convention for this output is the following:
- *          <TABLE>
- *          <TR><TD><b>EULER ANGLE</b></TD><TD><b>ROTATION AROUND</b></TD></TR>
- *          <TR><TD>roll              </TD><TD>Z axis                </TD></TR>
- *          <TR><TD>pitch             </TD><TD>X axis                </TD></TR>
- *          <TR><TD>yaw               </TD><TD>Y axis                </TD></TR>
- *          </TABLE>
- *
- *          - INV_EULER_ANGLES :
- *          Returns an array of three data points representing roll, pitch, and 
- *          yaw corresponding to the INV_EULER_ANGLES_X output and it is 
- *          therefore the default convention for Euler angles.
- *          Please refer to the INV_EULER_ANGLES_X for a detailed description.
- *
- *          - INV_LINEAR_ACCELERATION :
- *          Returns an array of three data points representing the linear 
- *          acceleration as derived from both gyroscopes and accelerometers. 
- *          This requires that ML_SENSOR_FUSION be enabled.
- *
- *          - INV_LINEAR_ACCELERATION_WORLD :
- *          Returns an array of three data points representing the linear 
- *          acceleration in world coordinates, as derived from both gyroscopes 
- *          and accelerometers.
- *          This requires that ML_SENSOR_FUSION be enabled.
- *
- *          - INV_GRAVITY :
- *          Returns an array of three data points representing the direction 
- *          of gravity in body coordinates, as derived from both gyroscopes 
- *          and accelerometers.
- *          This requires that ML_SENSOR_FUSION be enabled.
- *
- *          - INV_ANGULAR_VELOCITY :
- *          Returns an array of three data points representing the angular 
- *          velocity as derived from <b>both</b> gyroscopes and accelerometers.
- *          This requires that ML_SENSOR_FUSION be enabled, to fuse data from
- *          the gyroscope and accelerometer device, appropriately scaled and 
- *          oriented according to the respective mounting matrices.
- *
- *          - INV_RAW_DATA :
- *          Returns an array of nine data points representing raw sensor data 
- *          of the gyroscope X, Y, Z, accelerometer X, Y, Z, and 
- *          compass X, Y, Z values.
- *          These values are not scaled and come out directly from the devices'
- *          sensor data output. In case of accelerometers with lower output 
- *          resolution, e.g 8-bit, the sensor data is scaled up to match the 
- *          2^14 = 1 gee typical representation for a +/- 2 gee full scale 
- *          range.
- *
- *          - INV_GYROS :
- *          Returns an array of three data points representing the X gyroscope,
- *          Y gyroscope, and Z gyroscope values.
- *          The values are not sensor fused with other sensor types data but
- *          reflect the orientation from the mounting matrices in use.
- *          The INV_GYROS values are scaled to ensure 1 dps corresponds to 2^16 
- *          codes.
- *
- *          - INV_ACCELS :
- *          Returns an array of three data points representing the X 
- *          accelerometer, Y accelerometer, and Z accelerometer values.
- *          The values are not sensor fused with other sensor types data but
- *          reflect the orientation from the mounting matrices in use.
- *          The INV_ACCELS values are scaled to ensure 1 gee corresponds to 2^16
- *          codes.
- *
- *          - INV_MAGNETOMETER :
- *          Returns an array of three data points representing the compass
- *          X, Y, and Z values.
- *          The values are not sensor fused with other sensor types data but
- *          reflect the orientation from the mounting matrices in use.
- *          The INV_MAGNETOMETER values are scaled to ensure 1 micro Tesla (uT) 
- *          corresponds to 2^16 codes.
- *
- *          - INV_GYRO_BIAS :
- *          Returns an array of three data points representing the gyroscope 
- *          biases.
- *
- *          - INV_ACCEL_BIAS :
- *          Returns an array of three data points representing the 
- *          accelerometer biases.
- *
- *          - INV_MAG_BIAS :
- *          Returns an array of three data points representing the compass 
- *          biases.
- *
- *          - INV_GYRO_CALIBRATION_MATRIX :
- *          Returns an array of nine data points representing the calibration 
- *          matrix for the gyroscopes:
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *
- *          - INV_ACCEL_CALIBRATION_MATRIX :
- *          Returns an array of nine data points representing the calibration 
- *          matrix for the accelerometers:
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *
- *          - INV_MAG_CALIBRATION_MATRIX :
- *          Returns an array of nine data points representing the calibration 
- *          matrix for the compass:
- *          <center>C11 C12 C13</center>
- *          <center>C21 C22 C23</center>
- *          <center>C31 C32 C33</center>
- *
- *          - INV_PRESSURE :
- *          Returns a single value representing the pressure in Pascal
- *
- *          - INV_HEADING : 
- *          Returns a single number representing the heading of the device 
- *          relative to the Earth, in which 0 represents North, 90 degrees 
- *          represents East, and so on. 
- *          The heading is defined as the direction of the +Y axis if the Y 
- *          axis is horizontal, and otherwise the direction of the -Z axis.
- *
- *          - INV_MAG_BIAS_ERROR :
- *          Returns an array of three numbers representing the current estimated
- *          error in the compass biases. These numbers are unitless and serve
- *          as rough estimates in which numbers less than 100 typically represent
- *          reasonably well calibrated compass axes.
- *
- *  @pre    MLDmpOpen() or MLDmpPedometerStandAloneOpen()
- *          must have been called.
- *
- *  @param  dataSet     
- *              A constant specifying an array of data processed by 
- *              the motion processor.
- *  @param  data        
- *              A pointer to an array to be passed back to the user.
- *              <b>Must be 9 cells long at least</b>.
- *
- *  @return INV_SUCCESS if the command is successful; an error code otherwise.
- */
-inv_error_t inv_get_float_array(int dataSet, float *data)
-{
-    inv_error_t result;
-    switch (dataSet) {
-    case INV_GYROS:
-        result = inv_get_gyro_float(data);
-        break;
-    case INV_ACCELS:
-        result = inv_get_accel_float(data);
-        break;
-    case INV_TEMPERATURE:
-        result = inv_get_temperature_float(data);
-        break;
-    case INV_ROTATION_MATRIX:
-        result = inv_get_rot_mat_float(data);
-        break;
-    case INV_QUATERNION:
-        result = inv_get_quaternion_float(data);
-        break;
-    case INV_LINEAR_ACCELERATION:
-        result = inv_get_linear_accel_float(data);
-        break;
-    case INV_LINEAR_ACCELERATION_WORLD:
-        result = inv_get_linear_accel_in_world_float(data);
-        break;
-    case INV_GRAVITY:
-        result = inv_get_gravity_float(data);
-        break;
-    case INV_ANGULAR_VELOCITY:
-        result = inv_get_angular_velocity_float(data);
-        break;
-    case INV_EULER_ANGLES:
-        result = inv_get_euler_angles_float(data);
-        break;
-    case INV_EULER_ANGLES_X:
-        result = inv_get_euler_angles_x_float(data);
-        break;
-    case INV_EULER_ANGLES_Y:
-        result = inv_get_euler_angles_y_float(data);
-        break;
-    case INV_EULER_ANGLES_Z:
-        result = inv_get_euler_angles_z_float(data);
-        break;
-    case INV_GYRO_TEMP_SLOPE:
-        result = inv_get_gyro_temp_slope_float(data);
-        break;
-    case INV_GYRO_BIAS:
-        result = inv_get_gyro_bias_float(data);
-        break;
-    case INV_ACCEL_BIAS:
-        result = inv_get_accel_bias_float(data);
-        break;
-    case INV_MAG_BIAS:
-        result = inv_get_mag_bias_float(data);
-        break;
-    case INV_RAW_DATA:
-        result = inv_get_gyro_and_accel_sensor_float(data);
-        break;
-    case INV_MAG_RAW_DATA:
-        result = inv_get_mag_raw_data_float(data);
-        break;
-    case INV_MAGNETOMETER:
-        result = inv_get_magnetometer_float(data);
-        break;
-    case INV_PRESSURE:
-        result = inv_get_pressure_float(data);
-        break;
-    case INV_HEADING:
-        result = inv_get_heading_float(data);
-        break;
-    case INV_GYRO_CALIBRATION_MATRIX:
-        result = inv_get_gyro_cal_matrix_float(data);
-        break;
-    case INV_ACCEL_CALIBRATION_MATRIX:
-        result = inv_get_accel_cal_matrix_float(data);
-        break;
-    case INV_MAG_CALIBRATION_MATRIX:
-        result = inv_get_mag_cal_matrix_float(data);
-        break;
-    case INV_MAG_BIAS_ERROR:
-        result = inv_get_mag_bias_error_float(data);
-        break;
-    case INV_MAG_SCALE:
-        result = inv_get_mag_scale_float(data);
-        break;
-    case INV_LOCAL_FIELD:
-        result = inv_get_local_field_float(data);
-        break;
-    case INV_RELATIVE_QUATERNION:
-        result = inv_get_relative_quaternion_float(data);
-        break;
-    default:
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-    return result;
-}
-
-/**
- *  @brief  used to set an array of motion sensor data.
- *          Handles the following data sets:
- *          - INV_GYRO_BIAS
- *          - INV_ACCEL_BIAS
- *          - INV_MAG_BIAS
- *          - INV_GYRO_TEMP_SLOPE
- *
- *          For more details about the use of the data sets
- *          please refer to the documentation of inv_set_float_array().
- *
- *          Please also refer to the provided "9-Axis Sensor Fusion 
- *          Application Note" document provided.
- *
- *  @pre    MLDmpOpen() or 
- *          MLDmpPedometerStandAloneOpen() 
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  dataSet     A constant specifying an array of data.
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_array(int dataSet, long *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    switch (dataSet) {
-    case INV_GYRO_BIAS:
-        result = inv_set_gyro_bias(data);
-        break;
-    case INV_ACCEL_BIAS:
-        result = inv_set_accel_bias(data);
-        break;
-    case INV_MAG_BIAS:
-        result = inv_set_mag_bias(data);
-        break;
-    case INV_GYRO_TEMP_SLOPE:
-        result = inv_set_gyro_temp_slope(data);
-        break;
-    case INV_LOCAL_FIELD:
-        result = inv_set_local_field(data);
-        break;
-    case INV_MAG_SCALE:
-        result = inv_set_mag_scale(data);
-        break;
-    default:
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-    return result;
-}
-
-/**
- *  @brief  used to set an array of motion sensor data.
- *          Handles various data sets:
- *          - INV_GYRO_BIAS
- *          - INV_ACCEL_BIAS
- *          - INV_MAG_BIAS
- *          - INV_GYRO_TEMP_SLOPE
- *
- *          Please refer to the provided "9-Axis Sensor Fusion Application
- *          Note" document provided.
- *
- *  @pre    MLDmpOpen() or 
- *          MLDmpPedometerStandAloneOpen() 
- *  @pre    MLDmpStart() must <b>NOT</b> have been called.
- *
- *  @param  dataSet     A constant specifying an array of data.
- *  @param  data        A pointer to an array to be copied from the user.
- *
- *  @return INV_SUCCESS if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_set_float_array(int dataSet, float *data)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    switch (dataSet) {
-    case INV_GYRO_TEMP_SLOPE:  // internal
-        result = inv_set_gyro_temp_slope_float(data);
-        break;
-    case INV_GYRO_BIAS:        // internal
-        result = inv_set_gyro_bias_float(data);
-        break;
-    case INV_ACCEL_BIAS:       // internal
-        result = inv_set_accel_bias_float(data);
-        break;
-    case INV_MAG_BIAS:         // internal            
-        result = inv_set_mag_bias_float(data);
-        break;
-    case INV_LOCAL_FIELD:      // internal     
-        result = inv_set_local_field_float(data);
-        break;
-    case INV_MAG_SCALE:        // internal            
-        result = inv_set_mag_scale_float(data);
-        break;
-    default:
-        result = INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return result;
-}
diff --git a/60xx/mlsdk/mllite/mlcontrol.c b/60xx/mlsdk/mllite/mlcontrol.c
deleted file mode 100644
index bd186fa..0000000
--- a/60xx/mlsdk/mllite/mlcontrol.c
+++ /dev/null
@@ -1,797 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
- 
-/*******************************************************************************
- *
- * $Id: mlcontrol.c 5641 2011-06-14 02:10:02Z mcaramello $
- *
- *******************************************************************************/
-
-/**
- *  @defgroup   CONTROL
- *  @brief      Motion Library - Control Engine.
- *              The Control Library processes gyroscopes, accelerometers, and 
- *              compasses to provide control signals that can be used in user 
- *              interfaces.
- *              These signals can be used to manipulate objects such as documents,
- *              images, cursors, menus, etc.
- *
- *  @{
- *      @file   mlcontrol.c
- *      @brief  The Control Library.
- *
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "mltypes.h"
-#include "ml.h"
-#include "mlos.h"
-#include "mlsl.h"
-#include "mldl.h"
-#include "mlcontrol.h"
-#include "dmpKey.h"
-#include "mlstates.h"
-#include "mlFIFO.h"
-#include "string.h"
-
-/* - Global Vars. - */
-struct control_params cntrl_params = {
-    {
-     MLCTRL_SENSITIVITY_0_DEFAULT,
-     MLCTRL_SENSITIVITY_1_DEFAULT,
-     MLCTRL_SENSITIVITY_2_DEFAULT,
-     MLCTRL_SENSITIVITY_3_DEFAULT}, // sensitivity
-    MLCTRL_FUNCTIONS_DEFAULT,   // functions
-    {
-     MLCTRL_PARAMETER_ARRAY_0_DEFAULT,
-     MLCTRL_PARAMETER_ARRAY_1_DEFAULT,
-     MLCTRL_PARAMETER_ARRAY_2_DEFAULT,
-     MLCTRL_PARAMETER_ARRAY_3_DEFAULT}, // parameterArray
-    {
-     MLCTRL_PARAMETER_AXIS_0_DEFAULT,
-     MLCTRL_PARAMETER_AXIS_1_DEFAULT,
-     MLCTRL_PARAMETER_AXIS_2_DEFAULT,
-     MLCTRL_PARAMETER_AXIS_3_DEFAULT},  // parameterAxis
-    {
-     MLCTRL_GRID_THRESHOLD_0_DEFAULT,
-     MLCTRL_GRID_THRESHOLD_1_DEFAULT,
-     MLCTRL_GRID_THRESHOLD_2_DEFAULT,
-     MLCTRL_GRID_THRESHOLD_3_DEFAULT},  // gridThreshold
-    {
-     MLCTRL_GRID_MAXIMUM_0_DEFAULT,
-     MLCTRL_GRID_MAXIMUM_1_DEFAULT,
-     MLCTRL_GRID_MAXIMUM_2_DEFAULT,
-     MLCTRL_GRID_MAXIMUM_3_DEFAULT},    // gridMaximum
-    MLCTRL_GRID_CALLBACK_DEFAULT    // gridCallback
-};
-
-/* - Extern Vars. - */
-struct control_obj cntrl_obj;
-extern const unsigned char *dmpConfig1;
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-/**
- *  @brief  inv_set_control_sensitivity is used to set the sensitivity for a control
- *          signal.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param controlSignal    Indicates which control signal is being modified.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 or
- *                          - INV_CONTROL_4.
- *
- *  @param sensitivity      The sensitivity of the control signal.
- *
- *  @return error code
- */
-inv_error_t inv_set_control_sensitivity(unsigned short controlSignal,
-                                        long sensitivity)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[2];
-    long finalSens = 0;
-    inv_error_t result;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    finalSens = sensitivity * 100;
-    if (finalSens > 16384) {
-        finalSens = 16384;
-    }
-    regs[0] = (unsigned char)(finalSens / 256);
-    regs[1] = (unsigned char)(finalSens % 256);
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        result = inv_set_mpu_memory(KEY_D_0_224, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        cntrl_params.sensitivity[0] = (unsigned short)sensitivity;
-        break;
-    case INV_CONTROL_2:
-        result = inv_set_mpu_memory(KEY_D_0_228, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        cntrl_params.sensitivity[1] = (unsigned short)sensitivity;
-        break;
-    case INV_CONTROL_3:
-        result = inv_set_mpu_memory(KEY_D_0_232, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        cntrl_params.sensitivity[2] = (unsigned short)sensitivity;
-        break;
-    case INV_CONTROL_4:
-        result = inv_set_mpu_memory(KEY_D_0_236, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        cntrl_params.sensitivity[3] = (unsigned short)sensitivity;
-        break;
-    default:
-        break;
-    }
-    if (finalSens != sensitivity * 100) {
-        return INV_ERROR_INVALID_PARAMETER;
-    } else {
-        return INV_SUCCESS;
-    }
-}
-
-/**
- *  @brief  inv_set_control_func allows the user to choose how the sensor data will
- *          be processed in order to provide a control parameter.
- *          inv_set_control_func allows the user to choose which control functions
- *          will be incorporated in the sensor data processing.
- *          The control functions are:
- *          - INV_GRID
- *          Indicates that the user will be controlling a system that
- *          has discrete steps, such as icons, menu entries, pixels, etc.
- *          - INV_SMOOTH
- *          Indicates that noise from unintentional motion should be filtered out.
- *          - INV_DEAD_ZONE
- *          Indicates that a dead zone should be used, below which sensor
- *          data is set to zero.
- *          - INV_HYSTERESIS
- *          Indicates that, when INV_GRID is selected, hysteresis should
- *          be used to prevent the control signal from switching rapidly across
- *          elements of the grid.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param  function    Indicates what functions will be used.
- *                      Can be a bitwise OR of several values.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_set_control_func(unsigned short function)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[8] = { DINA06, DINA26,
-        DINA46, DINA66,
-        DINA0E, DINA2E,
-        DINA4E, DINA6E
-    };
-    unsigned char i;
-    inv_error_t result;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if ((function & INV_SMOOTH) == 0) {
-        for (i = 0; i < 8; i++) {
-            regs[i] = DINA80 + 3;
-        }
-    }
-    result = inv_set_mpu_memory(KEY_CFG_4, 8, regs);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    cntrl_params.functions = function;
-    result = inv_set_dead_zone();
-
-    return result;
-}
-
-/**
- *  @brief  inv_get_control_signal is used to get the current control signal with
- *          high precision.
- *          inv_get_control_signal is used to acquire the current data of a control signal.
- *          If INV_GRID is being used, inv_get_grid_number will probably be preferrable.
- *
- *  @param  controlSignal   Indicates which control signal is being queried.
- *          Must be one of:
- *          - INV_CONTROL_1,
- *          - INV_CONTROL_2,
- *          - INV_CONTROL_3 or
- *          - INV_CONTROL_4.
- *
- *  @param  reset   Indicates whether the control signal should be reset to zero.
- *                  Options are INV_RESET or INV_NO_RESET
- *  @param  data    A pointer to the current control signal data.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-inv_error_t inv_get_control_signal(unsigned short controlSignal,
-                                   unsigned short reset, long *data)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        *data = cntrl_obj.controlInt[0];
-        if (reset == INV_RESET) {
-            cntrl_obj.controlInt[0] = 0;
-        }
-        break;
-    case INV_CONTROL_2:
-        *data = cntrl_obj.controlInt[1];
-        if (reset == INV_RESET) {
-            cntrl_obj.controlInt[1] = 0;
-        }
-        break;
-    case INV_CONTROL_3:
-        *data = cntrl_obj.controlInt[2];
-        if (reset == INV_RESET) {
-            cntrl_obj.controlInt[2] = 0;
-        }
-        break;
-    case INV_CONTROL_4:
-        *data = cntrl_obj.controlInt[3];
-        if (reset == INV_RESET) {
-            cntrl_obj.controlInt[3] = 0;
-        }
-        break;
-    default:
-        break;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_get_grid_num is used to get the current grid location for a certain
- *          control signal.
- *          inv_get_grid_num is used to acquire the current grid location.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param  controlSignal   Indicates which control signal is being queried.
- *          Must be one of:
- *          - INV_CONTROL_1,
- *          - INV_CONTROL_2,
- *          - INV_CONTROL_3 or
- *          - INV_CONTROL_4.
- *
- *  @param  reset   Indicates whether the control signal should be reset to zero.
- *                  Options are INV_RESET or INV_NO_RESET
- *  @param  data    A pointer to the current grid number.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-
-inv_error_t inv_get_grid_num(unsigned short controlSignal, unsigned short reset,
-                             long *data)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        *data = cntrl_obj.gridNum[0];
-        if (reset == INV_RESET) {
-            cntrl_obj.gridNum[0] = 0;
-        }
-        break;
-    case INV_CONTROL_2:
-        *data = cntrl_obj.gridNum[1];
-        if (reset == INV_RESET) {
-            cntrl_obj.gridNum[1] = 0;
-        }
-        break;
-    case INV_CONTROL_3:
-        *data = cntrl_obj.gridNum[2];
-        if (reset == INV_RESET) {
-            cntrl_obj.gridNum[2] = 0;
-        }
-        break;
-    case INV_CONTROL_4:
-        *data = cntrl_obj.gridNum[3];
-        if (reset == INV_RESET) {
-            cntrl_obj.gridNum[3] = 0;
-        }
-        break;
-    default:
-        break;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_grid_thresh is used to set the grid size for a control signal.
- *          inv_set_grid_thresh is used to adjust the size of the grid being controlled.
- *  @param  controlSignal   Indicates which control signal is being modified.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 and
- *                          - INV_CONTROL_4.
- *  @param  threshold       The threshold of the control signal at which the grid
- *                          number will be incremented or decremented.
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-
-inv_error_t inv_set_grid_thresh(unsigned short controlSignal, long threshold)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() < INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        cntrl_params.gridThreshold[0] = threshold;
-        break;
-    case INV_CONTROL_2:
-        cntrl_params.gridThreshold[1] = threshold;
-        break;
-    case INV_CONTROL_3:
-        cntrl_params.gridThreshold[2] = threshold;
-        break;
-    case INV_CONTROL_4:
-        cntrl_params.gridThreshold[3] = threshold;
-        break;
-    default:
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_grid_max is used to set the maximum grid number for a control signal.
- *          inv_set_grid_max is used to adjust the maximum allowed grid number, above
- *          which the grid number will not be incremented.
- *          The minimum grid number is always zero.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param controlSignal    Indicates which control signal is being modified.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 and
- *                          - INV_CONTROL_4.
- *
- *  @param  maximum         The maximum grid number for a control signal.
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-
-inv_error_t inv_set_grid_max(unsigned short controlSignal, long maximum)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        cntrl_params.gridMaximum[0] = maximum;
-        break;
-    case INV_CONTROL_2:
-        cntrl_params.gridMaximum[1] = maximum;
-        break;
-    case INV_CONTROL_3:
-        cntrl_params.gridMaximum[2] = maximum;
-        break;
-    case INV_CONTROL_4:
-        cntrl_params.gridMaximum[3] = maximum;
-        break;
-    default:
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  GridCallback function pointer type, to be passed as argument of 
- *          inv_set_grid_callback.
- *
- *  @param  controlSignal   Indicates which control signal crossed a grid threshold.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 and
- *                          - INV_CONTROL_4.
- *
- *  @param  gridNumber  An array of four numbers representing the grid number for each
- *                      control signal.
- *  @param  gridChange  An array of four numbers representing the change in grid number
- *                      for each control signal.
-**/
-typedef void (*fpGridCb) (unsigned short controlSignal, long *gridNum,
-                          long *gridChange);
-
-/**
- *  @brief  inv_set_grid_callback is used to register a callback function that
- *          will trigger when the grid location changes.
- *          inv_set_grid_callback allows a user to define a callback function that will
- *          run when a control signal crosses a grid threshold.
-
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().  inv_dmp_start must <b>NOT</b> have 
- *          been called.
- *
- *  @param  func    A user defined callback function
- *  @return Zero if the command is successful; an ML error code otherwise.
-**/
-inv_error_t inv_set_grid_callback(fpGridCb func)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    cntrl_params.gridCallback = func;
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  inv_set_control_data is used to assign physical parameters to control signals.
- *          inv_set_control_data allows flexibility in assigning physical parameters to
- *          control signals. For example, the user is allowed to use raw gyroscope data
- *          as an input to the control algorithm.
- *          Alternatively, angular velocity can be used, which combines gyroscopes and
- *          accelerometers to provide a more robust physical parameter. Finally, angular
- *          velocity in world coordinates can be used, providing a control signal in
- *          which pitch and yaw are provided relative to gravity.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param  controlSignal   Indicates which control signal is being modified.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 or
- *                          - INV_CONTROL_4.
- *
- *  @param  parameterArray   Indicates which parameter array is being assigned to a
- *                          control signal. Must be one of:
- *                          - INV_GYROS,
- *                          - INV_ANGULAR_VELOCITY, or
- *
- *  @param  parameterAxis   Indicates which axis of the parameter array will be used.
- *                          Must be:
- *                          - INV_ROLL,
- *                          - INV_PITCH, or
- *                          - INV_YAW.
- */
-
-inv_error_t inv_set_control_data(unsigned short controlSignal,
-                                 unsigned short parameterArray,
-                                 unsigned short parameterAxis)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char regs[2] = { DINA80 + 10, DINA20 };
-    inv_error_t result;
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    if (parameterArray == INV_ANGULAR_VELOCITY) {
-        regs[0] = DINA80 + 5;
-        regs[1] = DINA00;
-    }
-    switch (controlSignal) {
-    case INV_CONTROL_1:
-        cntrl_params.parameterArray[0] = parameterArray;
-        switch (parameterAxis) {
-        case INV_PITCH:
-            regs[1] += 0x02;
-            cntrl_params.parameterAxis[0] = 0;
-            break;
-        case INV_ROLL:
-            regs[1] = DINA22;
-            cntrl_params.parameterAxis[0] = 1;
-            break;
-        case INV_YAW:
-            regs[1] = DINA42;
-            cntrl_params.parameterAxis[0] = 2;
-            break;
-        default:
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-        result = inv_set_mpu_memory(KEY_CFG_3, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case INV_CONTROL_2:
-        cntrl_params.parameterArray[1] = parameterArray;
-        switch (parameterAxis) {
-        case INV_PITCH:
-            regs[1] += DINA0E;
-            cntrl_params.parameterAxis[1] = 0;
-            break;
-        case INV_ROLL:
-            regs[1] += DINA2E;
-            cntrl_params.parameterAxis[1] = 1;
-            break;
-        case INV_YAW:
-            regs[1] += DINA4E;
-            cntrl_params.parameterAxis[1] = 2;
-            break;
-        default:
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-        result = inv_set_mpu_memory(KEY_CFG_3B, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case INV_CONTROL_3:
-        cntrl_params.parameterArray[2] = parameterArray;
-        switch (parameterAxis) {
-        case INV_PITCH:
-            regs[1] += DINA0E;
-            cntrl_params.parameterAxis[2] = 0;
-            break;
-        case INV_ROLL:
-            regs[1] += DINA2E;
-            cntrl_params.parameterAxis[2] = 1;
-            break;
-        case INV_YAW:
-            regs[1] += DINA4E;
-            cntrl_params.parameterAxis[2] = 2;
-            break;
-        default:
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-        result = inv_set_mpu_memory(KEY_CFG_3C, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case INV_CONTROL_4:
-        cntrl_params.parameterArray[3] = parameterArray;
-        switch (parameterAxis) {
-        case INV_PITCH:
-            regs[1] += DINA0E;
-            cntrl_params.parameterAxis[3] = 0;
-            break;
-        case INV_ROLL:
-            regs[1] += DINA2E;
-            cntrl_params.parameterAxis[3] = 1;
-            break;
-        case INV_YAW:
-            regs[1] += DINA4E;
-            cntrl_params.parameterAxis[3] = 2;
-            break;
-        default:
-            return INV_ERROR_INVALID_PARAMETER;
-        }
-        result = inv_set_mpu_memory(KEY_CFG_3D, 2, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    default:
-        result = INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-    return result;
-}
-
-/**
- *  @brief  inv_get_control_data is used to get the current control data.
- *
- *  @pre    inv_dmp_open() Must be called with MLDmpDefaultOpen() or 
- *          inv_open_low_power_pedometer().
- *
- *  @param  controlSignal   Indicates which control signal is being queried.
- *                          Must be one of:
- *                          - INV_CONTROL_1,
- *                          - INV_CONTROL_2,
- *                          - INV_CONTROL_3 or
- *                          - INV_CONTROL_4.
- *
- *  @param  gridNum     A pointer to pass gridNum info back to the user.
- *  @param  gridChange  A pointer to pass gridChange info back to the user.
- *
- *  @return Zero if the command is successful; an ML error code otherwise.
- */
-
-inv_error_t inv_get_control_data(long *controlSignal, long *gridNum,
-                                 long *gridChange)
-{
-    INVENSENSE_FUNC_START;
-    int_fast8_t i = 0;
-
-    if (inv_get_state() != INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    for (i = 0; i < 4; i++) {
-        controlSignal[i] = cntrl_obj.controlInt[i];
-        gridNum[i] = cntrl_obj.gridNum[i];
-        gridChange[i] = cntrl_obj.gridChange[i];
-    }
-    return INV_SUCCESS;
-}
-
-/** 
- * @internal
- * @brief   Update the ML Control engine.  This function should be called 
- *          every time new data from the MPU becomes available.
- *          Control engine outputs are written to the cntrl_obj data 
- *          structure.
- * @return  INV_SUCCESS or an error code.
-**/
-inv_error_t inv_update_control(struct inv_obj_t * inv_obj)
-{
-    INVENSENSE_FUNC_START;
-    unsigned char i;
-    long gridTmp;
-    long tmp;
-
-    inv_get_cntrl_data(cntrl_obj.mlGridNumDMP);
-
-    for (i = 0; i < 4; i++) {
-        if (cntrl_params.functions & INV_GRID) {
-            if (cntrl_params.functions & INV_HYSTERESIS) {
-                cntrl_obj.mlGridNumDMP[i] += cntrl_obj.gridNumOffset[i];
-            }
-            cntrl_obj.mlGridNumDMP[i] =
-                cntrl_obj.mlGridNumDMP[i] / 2 + 1073741824L;
-            cntrl_obj.controlInt[i] =
-                (cntrl_obj.mlGridNumDMP[i] %
-                 (128 * cntrl_params.gridThreshold[i])) / 128;
-            gridTmp =
-                cntrl_obj.mlGridNumDMP[i] / (128 *
-                                             cntrl_params.gridThreshold[i]);
-            tmp = 1 + 16777216L / cntrl_params.gridThreshold[i];
-            cntrl_obj.gridChange[i] = gridTmp - cntrl_obj.lastGridNum[i];
-            if (cntrl_obj.gridChange[i] > tmp / 2) {
-                cntrl_obj.gridChange[i] =
-                    gridTmp - tmp - cntrl_obj.lastGridNum[i];
-            } else if (cntrl_obj.gridChange[i] < -tmp / 2) {
-                cntrl_obj.gridChange[i] =
-                    gridTmp + tmp - cntrl_obj.lastGridNum[i];
-            }
-            if ((cntrl_params.functions & INV_HYSTERESIS)
-                && (cntrl_obj.gridChange[i] != 0)) {
-                if (cntrl_obj.gridChange[i] > 0) {
-                    cntrl_obj.gridNumOffset[i] +=
-                        128 * cntrl_params.gridThreshold[i];
-                    cntrl_obj.controlInt[i] = cntrl_params.gridThreshold[i] / 2;
-                }
-                if (cntrl_obj.gridChange[i] < 0) {
-                    cntrl_obj.gridNumOffset[i] -=
-                        128 * cntrl_params.gridThreshold[i];
-                    cntrl_obj.controlInt[i] = cntrl_params.gridThreshold[i] / 2;
-                }
-            }
-            cntrl_obj.gridNum[i] += cntrl_obj.gridChange[i];
-            if (cntrl_obj.gridNum[i] >= cntrl_params.gridMaximum[i]) {
-                cntrl_obj.gridNum[i] = cntrl_params.gridMaximum[i];
-                if (cntrl_obj.controlInt[i] >=
-                    cntrl_params.gridThreshold[i] / 2) {
-                    cntrl_obj.controlInt[i] = cntrl_params.gridThreshold[i] / 2;
-                }
-            } else if (cntrl_obj.gridNum[i] <= 0) {
-                cntrl_obj.gridNum[i] = 0;
-                if (cntrl_obj.controlInt[i] < cntrl_params.gridThreshold[i] / 2) {
-                    cntrl_obj.controlInt[i] = cntrl_params.gridThreshold[i] / 2;
-                }
-            }
-            cntrl_obj.lastGridNum[i] = gridTmp;
-            if ((cntrl_params.gridCallback) && (cntrl_obj.gridChange[i] != 0)) {
-                cntrl_params.gridCallback((INV_CONTROL_1 << i),
-                                          cntrl_obj.gridNum,
-                                          cntrl_obj.gridChange);
-            }
-
-        } else {
-            cntrl_obj.controlInt[i] = cntrl_obj.mlGridNumDMP[i];
-        }
-
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief Enables the INV_CONTROL engine.
- *
- * @note  This function replaces MLEnable(INV_CONTROL)
- *
- * @pre inv_dmp_open() with MLDmpDefaultOpen or MLDmpPedometerStandAlone() must 
- *      have been called.
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_enable_control(void)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() != INV_STATE_DMP_OPENED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    memset(&cntrl_obj, 0, sizeof(cntrl_obj));
-
-    inv_register_fifo_rate_process(inv_update_control, INV_PRIORITY_CONTROL);   // fixme, someone needs to send control data to the fifo
-    return INV_SUCCESS;
-}
-
-/**
- * @brief Disables the INV_CONTROL engine.
- *
- * @note  This function replaces MLDisable(INV_CONTROL)
- *
- * @pre inv_dmp_open() with MLDmpDefaultOpen or MLDmpPedometerStandAlone() must 
- *      have been called.
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_disable_control(void)
-{
-    INVENSENSE_FUNC_START;
-
-    if (inv_get_state() < INV_STATE_DMP_STARTED)
-        return INV_ERROR_SM_IMPROPER_STATE;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @}
- */
diff --git a/60xx/mlsdk/mllite/mlcontrol.h b/60xx/mlsdk/mllite/mlcontrol.h
deleted file mode 100644
index a834fc6..0000000
--- a/60xx/mlsdk/mllite/mlcontrol.h
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $RCSfile: mlcontrol.h,v $
- *
- * $Date: 2011-06-10 20:13:08 -0700 (Fri, 10 Jun 2011) $
- *
- * $Revision: 5629 $
- *
- *******************************************************************************/
-
-/*******************************************************************************/
-/** @defgroup INV_CONTROL
-
-    The Control processes gyroscopes and accelerometers to provide control 
-    signals that can be used in user interfaces to manipulate objects such as 
-    documents, images, cursors, menus, etc.
-    
-    @{
-        @file mlcontrol.h
-        @brief Header file for the Control Library.
-*/
-/******************************************************************************/
-#ifndef MLCONTROL_H
-#define MLCONTROL_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#include "ml.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlcontrol_legacy.h"
-#endif
-
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-    /*******************************************************************************/
-    /* Control Signals.                                                            */
-    /*******************************************************************************/
-
-#define INV_CONTROL_1                    0x0001
-#define INV_CONTROL_2                    0x0002
-#define INV_CONTROL_3                    0x0004
-#define INV_CONTROL_4                    0x0008
-
-    /*******************************************************************************/
-    /* Control Functions.                                                          */
-    /*******************************************************************************/
-
-#define INV_GRID                         0x0001 // Indicates that the user will be controlling a system that
-    //   has discrete steps, such as icons, menu entries, pixels, etc.
-#define INV_SMOOTH                       0x0002 // Indicates that noise from unintentional motion should be filtered out.
-#define INV_DEAD_ZONE                    0x0004 // Indicates that a dead zone should be used, below which sensor data is set to zero.
-#define INV_HYSTERESIS                   0x0008 // Indicates that, when INV_GRID is selected, hysteresis should be used to prevent
-    //   the control signal from switching rapidly across elements of the grid.</dd>
-
-    /*******************************************************************************/
-    /* Integral reset options.                                                     */
-    /*******************************************************************************/
-
-#define INV_NO_RESET                     0x0000
-#define INV_RESET                        0x0001
-
-    /*******************************************************************************/
-    /* Data select options.                                                        */
-    /*******************************************************************************/
-
-#define INV_CTRL_SIGNAL                  0x0000
-#define INV_CTRL_GRID_NUM                0x0001
-
-    /*******************************************************************************/
-    /* Control Axis.                                                               */
-    /*******************************************************************************/
-#define INV_CTRL_PITCH                   0x0000 // (INV_PITCH >> 1)
-#define INV_CTRL_ROLL                    0x0001 // (INV_ROLL  >> 1)
-#define INV_CTRL_YAW                     0x0002 // (INV_YAW   >> 1)
-
-    /*******************************************************************************/
-    /* control_params structure default values.                                   */
-    /*******************************************************************************/
-
-#define MLCTRL_SENSITIVITY_0_DEFAULT           128
-#define MLCTRL_SENSITIVITY_1_DEFAULT           128
-#define MLCTRL_SENSITIVITY_2_DEFAULT           128
-#define MLCTRL_SENSITIVITY_3_DEFAULT           128
-#define MLCTRL_FUNCTIONS_DEFAULT                 0
-#define MLCTRL_CONTROL_SIGNALS_DEFAULT           0
-#define MLCTRL_PARAMETER_ARRAY_0_DEFAULT         0
-#define MLCTRL_PARAMETER_ARRAY_1_DEFAULT         0
-#define MLCTRL_PARAMETER_ARRAY_2_DEFAULT         0
-#define MLCTRL_PARAMETER_ARRAY_3_DEFAULT         0
-#define MLCTRL_PARAMETER_AXIS_0_DEFAULT          0
-#define MLCTRL_PARAMETER_AXIS_1_DEFAULT          0
-#define MLCTRL_PARAMETER_AXIS_2_DEFAULT          0
-#define MLCTRL_PARAMETER_AXIS_3_DEFAULT          0
-#define MLCTRL_GRID_THRESHOLD_0_DEFAULT          1
-#define MLCTRL_GRID_THRESHOLD_1_DEFAULT          1
-#define MLCTRL_GRID_THRESHOLD_2_DEFAULT          1
-#define MLCTRL_GRID_THRESHOLD_3_DEFAULT          1
-#define MLCTRL_GRID_MAXIMUM_0_DEFAULT            0
-#define MLCTRL_GRID_MAXIMUM_1_DEFAULT            0
-#define MLCTRL_GRID_MAXIMUM_2_DEFAULT            0
-#define MLCTRL_GRID_MAXIMUM_3_DEFAULT            0
-#define MLCTRL_GRID_CALLBACK_DEFAULT             0
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-    /**************************************************************************/
-    /* Control Parameters Structure.                                          */
-    /**************************************************************************/
-
-    struct control_params {
-        // Sensitivity of control signal 1, 2, 3, and 4.
-        unsigned short sensitivity[4];
-        // Indicates what functions will be used. Can be a bitwise OR of INV_GRID,
-        // ML_SMOOT, INV_DEAD_ZONE, and INV_HYSTERISIS.
-        unsigned short functions;
-        // Indicates which parameter array is being assigned to a control signal.
-        // Must be one of INV_GYROS, INV_ANGULAR_VELOCITY, or
-        // INV_ANGULAR_VELOCITY_WORLD.
-        unsigned short parameterArray[4];
-        // Indicates which axis of the parameter array will be used. Must be
-        // INV_ROLL, INV_PITCH, or INV_YAW.
-        unsigned short parameterAxis[4];
-        // Threshold of the control signal at which the grid number will be
-        // incremented or decremented.
-        long gridThreshold[4];
-        // Maximum grid number for the control signal.
-        long gridMaximum[4];
-        // User defined callback that will trigger when the grid location changes.
-        void (*gridCallback) (
-                                 // Indicates which control signal crossed a grid threshold. Must be
-                                 // one of INV_CONTROL_1, INV_CONTROL_2, INV_CONTROL_3 or INV_CONTROL_4.
-                                 unsigned short controlSignal,
-                                 // An array of four numbers representing the grid number for each
-                                 // control signal.
-                                 long *gridNum,
-                                 // An array of four numbers representing the change in grid number
-                                 // for each control signal.
-                                 long *gridChange);
-    };
-
-    struct control_obj {
-
-        long gridNum[4];        // Current grid number for each control signal.
-        long controlInt[4];     // Current data for each control signal.
-        long lastGridNum[4];    // Previous grid number
-        unsigned char controlDir[4];    // Direction of control signal
-        long gridChange[4];     // Change in grid number
-
-        long mlGridNumDMP[4];
-        long gridNumOffset[4];
-        long prevDMPGridNum[4];
-
-    };
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-
-    /**************************************************************************/
-    /* ML Control Functions.                                                  */
-    /**************************************************************************/
-
-    unsigned short inv_get_control_params(struct control_params *params);
-    unsigned short inv_set_control_params(struct control_params *params);
-
-    /*API for handling control signals */
-    inv_error_t inv_set_control_sensitivity(unsigned short controlSignal,
-                                            long sensitivity);
-    inv_error_t inv_set_control_func(unsigned short function);
-    inv_error_t inv_get_control_signal(unsigned short controlSignal,
-                                       unsigned short reset, long *data);
-    inv_error_t inv_get_grid_num(unsigned short controlSignal,
-                                 unsigned short reset, long *data);
-    inv_error_t inv_set_grid_thresh(unsigned short controlSignal,
-                                    long threshold);
-    inv_error_t inv_set_grid_max(unsigned short controlSignal, long maximum);
-    inv_error_t
-        inv_set_grid_callback(void (*func)
-                              (unsigned short controlSignal, long *gridNum,
-                               long *gridChange));
-    inv_error_t inv_set_control_data(unsigned short controlSignal,
-                                     unsigned short parameterArray,
-                                     unsigned short parameterNum);
-    inv_error_t inv_get_control_data(long *controlSignal, long *gridNum,
-                                     long *gridChange);
-    inv_error_t inv_update_control(struct inv_obj_t *inv_obj);
-    inv_error_t inv_enable_control(void);
-    inv_error_t inv_disable_control(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          /* MLCONTROL_H */
diff --git a/60xx/mlsdk/mllite/mldl.c b/60xx/mlsdk/mllite/mldl.c
deleted file mode 100644
index 7054532..0000000
--- a/60xx/mlsdk/mllite/mldl.c
+++ /dev/null
@@ -1,1092 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- *
- * $Id: mldl.c 5653 2011-06-16 21:06:55Z nroyer $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup   MLDL 
- *  @brief      Motion Library - Driver Layer.
- *              The Motion Library Driver Layer provides the intrface to the 
- *              system drivers that are used by the Motion Library.
- *
- *  @{
- *      @file   mldl.c
- *      @brief  The Motion Library Driver Layer.
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <string.h>
-
-#include "mpu.h"
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-#    include "mpu6050a2.h"
-#elif defined CONFIG_MPU_SENSORS_MPU6050B1
-#    include "mpu6050b1.h"
-#elif defined CONFIG_MPU_SENSORS_MPU3050
-#  include "mpu3050.h"
-#else
-#error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
-#endif
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "compass.h"
-#include "mlsl.h"
-#include "mlos.h"
-#include "mlinclude.h"
-#include "ml.h"
-#include "dmpKey.h"
-#include "mlFIFOHW.h"
-#include "compass.h"
-#include "pressure.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-mldl"
-
-#define _mldlDebug(x)           //{x}
-
-/* --------------------- */
-/* -    Variables.     - */
-/* --------------------- */
-
-#define MAX_LOAD_WRITE_SIZE (MPU_MEM_BANK_SIZE/2)   /* 128 */
-
-/*---- structure containing control variables used by MLDL ----*/
-static struct mldl_cfg mldlCfg;
-struct ext_slave_descr gAccel;
-struct ext_slave_descr gCompass;
-struct ext_slave_descr gPressure;
-struct mpu_platform_data gPdata;
-static void *sMLSLHandle;
-int_fast8_t intTrigger[NUM_OF_INTSOURCES];
-
-/*******************************************************************************
- * Functions for accessing the DMP memory via keys
- ******************************************************************************/
-
-unsigned short (*sGetAddress) (unsigned short key) = NULL;
-static const unsigned char *localDmpMemory = NULL;
-static unsigned short localDmpMemorySize = 0;
-
-/**
- *  @internal
- *  @brief Sets the function to use to convert keys to addresses. This
- *         will changed for each DMP code loaded.
- *  @param func
- *              Function used to convert keys to addresses.
- *  @endif
- */
-void inv_set_get_address(unsigned short (*func) (unsigned short key))
-{
-    INVENSENSE_FUNC_START;
-    _mldlDebug(MPL_LOGV("setGetAddress %d", (int)func);
-        )
-        sGetAddress = func;
-}
-
-/**
- *  @internal
- *  @brief  Check if the feature is supported in the currently loaded
- *          DMP code basing on the fact that the key is assigned a
- *          value or not.
- *  @param  key     the DMP key
- *  @return whether the feature associated with the key is supported
- *          or not.
- */
-uint_fast8_t inv_dmpkey_supported(unsigned short key)
-{
-    unsigned short memAddr;
-
-    if (sGetAddress == NULL) {
-        MPL_LOGE("%s : sGetAddress is NULL\n", __func__);
-        return FALSE;
-    }
-
-    memAddr = sGetAddress(key);
-    if (memAddr >= 0xffff) {
-        MPL_LOGV("inv_set_mpu_memory unsupported key\n");
-        return FALSE;
-    }
-
-    return TRUE;
-}
-
-/**
- *  @internal
- *  @brief  used to get the specified number of bytes from the original
- *          MPU memory location specified by the key.
- *          Reads the specified number of bytes from the MPU location
- *          that was used to program the MPU specified by the key. Each
- *          set of code specifies a function that changes keys into
- *          addresses. This function is set with setGetAddress().
- *
- *  @param  key     The key to use when looking up the address.
- *  @param  length  Number of bytes to read.
- *  @param  buffer  Result for data.
- *
- *  @return INV_SUCCESS if the command is successful, INV_ERROR otherwise. The key
- *          not corresponding to a memory address will result in INV_ERROR.
- *  @endif
- */
-inv_error_t inv_get_mpu_memory_original(unsigned short key,
-                                        unsigned short length,
-                                        unsigned char *buffer)
-{
-    unsigned short offset;
-
-    if (sGetAddress == NULL) {
-        return INV_ERROR_NOT_OPENED;
-    }
-
-    offset = sGetAddress(key);
-    if (offset >= localDmpMemorySize || (offset + length) > localDmpMemorySize) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    memcpy(buffer, &localDmpMemory[offset], length);
-
-    return INV_SUCCESS;
-}
-
-unsigned short inv_dl_get_address(unsigned short key)
-{
-    unsigned short offset;
-    if (sGetAddress == NULL) {
-        return INV_ERROR_NOT_OPENED;
-    }
-
-    offset = sGetAddress(key);
-    return offset;
-}
-
-/* ---------------------- */
-/* -  Static Functions. - */
-/* ---------------------- */
-
-/**
- *  @brief  Open the driver layer and resets the internal
- *          gyroscope, accelerometer, and compass data
- *          structures.
- *  @param  mlslHandle
- *              the serial handle.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_dl_open(void *mlslHandle)
-{
-    inv_error_t result;
-    memset(&mldlCfg, 0, sizeof(mldlCfg));
-    memset(intTrigger, INT_CLEAR, sizeof(intTrigger));
-
-    sMLSLHandle = mlslHandle;
-
-    mldlCfg.addr  = 0x68; /* default incase the driver doesn't set it */
-    mldlCfg.accel = &gAccel;
-    mldlCfg.compass = &gCompass;
-    mldlCfg.pressure = &gPressure;
-    mldlCfg.pdata = &gPdata;
-
-    result = (inv_error_t) inv_mpu_open(&mldlCfg, sMLSLHandle,
-                                        sMLSLHandle, sMLSLHandle, sMLSLHandle);
-    return result;
-}
-
-/**
- *  @brief  Closes/Cleans up the ML Driver Layer.
- *          Put the device in sleep mode.
- *  @return INV_SUCCESS or non-zero error code.
- */
-inv_error_t inv_dl_close(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    result = (inv_error_t) inv_mpu_suspend(&mldlCfg,
-                                           sMLSLHandle,
-                                           sMLSLHandle,
-                                           sMLSLHandle,
-                                           sMLSLHandle, 
-                                           INV_ALL_SENSORS);
-
-    result = (inv_error_t) inv_mpu_close(&mldlCfg, sMLSLHandle,
-                                         sMLSLHandle, sMLSLHandle, sMLSLHandle);
-    /* Clear all previous settings */
-    memset(&mldlCfg, 0, sizeof(mldlCfg));
-    sMLSLHandle = NULL;
-    sGetAddress = NULL;
-    return result;
-}
-
-/**
- * @brief Sets the requested_sensors
- *
- * Accessor to set the requested_sensors field of the mldl_cfg structure.
- * Typically set at initialization.
- *
- * @param sensors
- * Bitfield of the sensors that are going to be used.  Combination of the
- * following:
- *  - INV_X_GYRO
- *  - INV_Y_GYRO
- *  - INV_Z_GYRO
- *  - INV_DMP_PROCESSOR
- *  - INV_X_ACCEL
- *  - INV_Y_ACCEL
- *  - INV_Z_ACCEL
- *  - INV_X_COMPASS
- *  - INV_Y_COMPASS
- *  - INV_Z_COMPASS
- *  - INV_X_PRESSURE
- *  - INV_Y_PRESSURE
- *  - INV_Z_PRESSURE
- *  - INV_THREE_AXIS_GYRO
- *  - INV_THREE_AXIS_ACCEL
- *  - INV_THREE_AXIS_COMPASS
- *  - INV_THREE_AXIS_PRESSURE
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_init_requested_sensors(unsigned long sensors)
-{
-    mldlCfg.requested_sensors = sensors;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief Starts the DMP running
- *
- * Resumes the sensor if any of the sensor axis or components are requested
- *
- * @param sensors
- * Bitfield of the sensors to turn on.  Combination of the following:
- *  - INV_X_GYRO
- *  - INV_Y_GYRO
- *  - INV_Z_GYRO
- *  - INV_DMP_PROCESSOR
- *  - INV_X_ACCEL
- *  - INV_Y_ACCEL
- *  - INV_Z_ACCEL
- *  - INV_X_COMPASS
- *  - INV_Y_COMPASS
- *  - INV_Z_COMPASS
- *  - INV_X_PRESSURE
- *  - INV_Y_PRESSURE
- *  - INV_Z_PRESSURE
- *  - INV_THREE_AXIS_GYRO
- *  - INV_THREE_AXIS_ACCEL
- *  - INV_THREE_AXIS_COMPASS
- *  - INV_THREE_AXIS_PRESSURE
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_dl_start(unsigned long sensors)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    mldlCfg.requested_sensors = sensors;
-    result = inv_mpu_resume(&mldlCfg,
-                            sMLSLHandle,
-                            sMLSLHandle,
-                            sMLSLHandle,
-                            sMLSLHandle,
-                            sensors);
-    return result;
-}
-
-/**
- * @brief Stops the DMP running and puts it in low power as requested
- *
- * Suspends each sensor according to the bitfield, if all axis and components
- * of the sensor is off.
- *
- * @param sensors Bitfiled of the sensors to leave on.  Combination of the
- * following:
- *  - INV_X_GYRO
- *  - INV_Y_GYRO
- *  - INV_Z_GYRO
- *  - INV_X_ACCEL
- *  - INV_Y_ACCEL
- *  - INV_Z_ACCEL
- *  - INV_X_COMPASS
- *  - INV_Y_COMPASS
- *  - INV_Z_COMPASS
- *  - INV_X_PRESSURE
- *  - INV_Y_PRESSURE
- *  - INV_Z_PRESSURE
- *  - INV_THREE_AXIS_GYRO
- *  - INV_THREE_AXIS_ACCEL
- *  - INV_THREE_AXIS_COMPASS
- *  - INV_THREE_AXIS_PRESSURE
- *
- *
- * @return INV_SUCCESS or non-zero error code
- */
-inv_error_t inv_dl_stop(unsigned long sensors)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result = INV_SUCCESS;
-
-    result = inv_mpu_suspend(&mldlCfg,
-                             sMLSLHandle,
-                             sMLSLHandle,
-                             sMLSLHandle,
-                             sMLSLHandle,
-                             sensors);
-    return result;
-}
-
-/**
- *  @brief  Get a pointer to the internal data structure
- *          storing the configuration for the MPU, the accelerometer
- *          and the compass in use.
- *  @return a pointer to the data structure of type 'struct mldl_cfg'.
- */
-struct mldl_cfg *inv_get_dl_config(void)
-{
-    return &mldlCfg;
-}
-
-/**
- *  @brief   Query the MPU slave address.
- *  @return  The 7-bit mpu slave address.
- */
-unsigned char inv_get_mpu_slave_addr(void)
-{
-    INVENSENSE_FUNC_START;
-    return mldlCfg.addr;
-}
-
-/**
- *  @internal
- * @brief   MLDLCfgDMP configures the Digital Motion Processor internal to
- *          the MPU. The DMP can be enabled or disabled and the start address
- *          can be set.
- *
- * @param   enableRun   Enables the DMP processing if set to TRUE.
- * @param   enableFIFO  Enables DMP output to the FIFO if set to TRUE.
- * @param   startAddress start address
- *
- * @return  Zero if the command is successful, an error code otherwise.
-*/
-inv_error_t inv_get_dl_ctrl_dmp(unsigned char enableRun,
-                                unsigned char enableFIFO)
-{
-    INVENSENSE_FUNC_START;
-
-    mldlCfg.dmp_enable = enableRun;
-    mldlCfg.fifo_enable = enableFIFO;
-    mldlCfg.gyro_needs_reset = TRUE;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   inv_get_dl_cfg_int configures the interrupt function on the specified pin.
- *          The basic interrupt signal characteristics can be set
- *          (i.e. active high/low, open drain/push pull, etc.) and the
- *          triggers can be set.
- *          Currently only INTPIN_MPU is supported.
- *
- * @param   triggers
- *              bitmask of triggers to enable for interrupt.
- *              The available triggers are:
- *              - BIT_MPU_RDY_EN
- *              - BIT_DMP_INT_EN
- *              - BIT_RAW_RDY_EN
- *
- * @return  Zero if the command is successful, an error code otherwise.
-*/
-inv_error_t inv_get_dl_cfg_int(unsigned char triggers)
-{
-    inv_error_t result = INV_SUCCESS;
-
-#if defined CONFIG_MPU_SENSORS_MPU3050
-    /* Mantis has 8 bits of interrupt config bits */
-    if (triggers & !(BIT_MPU_RDY_EN | BIT_DMP_INT_EN | BIT_RAW_RDY_EN)) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-#endif
-
-    mldlCfg.int_config = triggers;
-    if (!mldlCfg.gyro_is_suspended) {
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_INT_CFG,
-                                         (mldlCfg.int_config | mldlCfg.pdata->
-                                          int_config));
-    } else {
-        mldlCfg.gyro_needs_reset = TRUE;
-    }
-
-    return result;
-}
-
-/**
- * @brief   configures the output sampling rate on the MPU.
- *          Three parameters control the sampling:
- *
- *          1) Low pass filter bandwidth, and
- *          2) output sampling divider.
- *
- *          The output sampling rate is determined by the divider and the low
- *          pass filter setting. If the low pass filter is set to
- *          'MPUFILTER_256HZ_NOLPF2', then the sample rate going into the
- *          divider is 8kHz; for all other settings it is 1kHz.
- *          The 8-bit divider will divide this frequency to get the resulting
- *          sample frequency.
- *          For example, if the filter setting is not 256Hz and the divider is
- *          set to 7, then the sample rate is as follows:
- *          sample rate = internal sample rate / div = 1kHz / 8 = 125Hz (or 8ms).
- *
- *          The low pass filter selection codes control both the cutoff frequency of
- *          the internal low pass filter and internal analog sampling rate. The
- *          latter, in turn, affects the final output sampling rate according to the
- *          sample rate divider settig.
- *              0 -> 256 Hz  cutoff BW, 8 kHz analog sample rate,
- *              1 -> 188 Hz  cutoff BW, 1 kHz analog sample rate,
- *              2 ->  98 Hz  cutoff BW, 1 kHz analog sample rate,
- *              3 ->  42 Hz  cutoff BW, 1 kHz analog sample rate,
- *              4 ->  20 Hz  cutoff BW, 1 kHz analog sample rate,
- *              5 ->  10 Hz  cutoff BW, 1 kHz analog sample rate,
- *              6 ->   5 Hz  cutoff BW, 1 kHz analog sample rate,
- *              7 -> 2.1 kHz cutoff BW, 8 kHz analog sample rate.
- *
- * @param   lpf         low pass filter,   0 to 7.
- * @param   divider     Output sampling rate divider, 0 to 255.
- *
- * @return  ML_SUCESS if successful; a non-zero error code otherwise.
-**/
-inv_error_t inv_dl_cfg_sampling(unsigned char lpf, unsigned char divider)
-{
-    /*---- do range checking ----*/
-    if (lpf >= NUM_MPU_FILTER) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    mldlCfg.lpf = lpf;
-    mldlCfg.divider = divider;
-    mldlCfg.gyro_needs_reset = TRUE;
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  set the full scale range for the gyros.
- *          The full scale selection codes correspond to:
- *              0 -> 250  dps,
- *              1 -> 500  dps,
- *              2 -> 1000 dps,
- *              3 -> 2000 dps.
- *          Full scale range affect the MPU's measurement
- *          sensitivity.
- *
- *  @param  fullScale
- *              the gyro full scale range in dps.
- *
- *  @return INV_SUCCESS or non-zero error code.
-**/
-inv_error_t inv_set_full_scale(float fullScale)
-{
-    if (fullScale == 250.f)
-        mldlCfg.full_scale = MPU_FS_250DPS;
-    else if (fullScale == 500.f)
-        mldlCfg.full_scale = MPU_FS_500DPS;
-    else if (fullScale == 1000.f)
-        mldlCfg.full_scale = MPU_FS_1000DPS;
-    else if (fullScale == 2000.f)
-        mldlCfg.full_scale = MPU_FS_2000DPS;
-    else {                      // not a valid setting
-        MPL_LOGE("Invalid full scale range specification for gyros : %f\n",
-                 fullScale);
-        MPL_LOGE
-            ("\tAvailable values : +/- 250 dps, +/- 500 dps, +/- 1000 dps, +/- 2000 dps\n");
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    mldlCfg.gyro_needs_reset = TRUE;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   This function sets the external sync for the MPU sampling.
- *          It can be synchronized on the LSB of any of the gyros, any of the
- *          external accels, or on the temp readings.
- *
- * @param   extSync External sync selection, 0 to 7.
- * @return  Zero if the command is successful; an error code otherwise.
-**/
-inv_error_t inv_set_external_sync(unsigned char extSync)
-{
-    INVENSENSE_FUNC_START;
-
-    /*---- do range checking ----*/
-    if (extSync >= NUM_MPU_EXT_SYNC) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    mldlCfg.ext_sync = extSync;
-    mldlCfg.gyro_needs_reset = TRUE;
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_set_ignore_system_suspend(unsigned char ignore)
-{
-    INVENSENSE_FUNC_START;
-
-    mldlCfg.ignore_system_suspend = ignore;
-
-    return INV_SUCCESS;
-}
-
-/**
- * @brief   inv_clock_source function sets the clock source for the MPU gyro
- *          processing.
- *          The source can be any of the following:
- *          - Internal 8MHz oscillator,
- *          - PLL with X gyro as reference,
- *          - PLL with Y gyro as reference,
- *          - PLL with Z gyro as reference,
- *          - PLL with external 32.768Mhz reference, or
- *          - PLL with external 19.2MHz reference
- *
- *          For best accuracy and timing, it is highly recommended to use one
- *          of the gyros as the clock source; however this gyro must be
- *          enabled to use its clock (see 'MLDLPowerMgmtMPU()').
- *
- * @param   clkSource   Clock source selection.
- *                      Can be one of:
- *                      - CLK_INTERNAL,
- *                      - CLK_PLLGYROX,
- *                      - CLK_PLLGYROY,
- *                      - CLK_PLLGYROZ,
- *                      - CLK_PLLEXT32K, or
- *                      - CLK_PLLEXT19M.
- *
- * @return  Zero if the command is successful; an error code otherwise.
-**/
-inv_error_t inv_clock_source(unsigned char clkSource)
-{
-    INVENSENSE_FUNC_START;
-
-    /*---- do range checking ----*/
-    if (clkSource >= NUM_CLK_SEL) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    mldlCfg.clk_src = clkSource;
-    mldlCfg.gyro_needs_reset = TRUE;
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Set the Temperature Compensation offset.
- *  @param  tc
- *              a pointer to the temperature compensations offset
- *              for the 3 gyro axes.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_set_offsetTC(const unsigned char *tc)
-{
-    int ii;
-    inv_error_t result;
-
-    for (ii = 0; ii < ARRAY_SIZE(mldlCfg.offset_tc); ii++) {
-        mldlCfg.offset_tc[ii] = tc[ii];
-    }
-
-    if (!mldlCfg.gyro_is_suspended) {
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_XG_OFFS_TC, tc[0]);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_YG_OFFS_TC, tc[1]);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_ZG_OFFS_TC, tc[2]);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-#else
-        unsigned char reg;
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_XG_OFFS_TC,
-                                         ((mldlCfg.offset_tc[0] << 1)
-                                          & BITS_XG_OFFS_TC));
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        reg = ((mldlCfg.offset_tc[1] << 1) & BITS_YG_OFFS_TC);
-#ifdef CONFIG_MPU_SENSORS_MPU6050B1
-        if (mldlCfg.pdata->level_shifter)
-            reg |= BIT_I2C_MST_VDDIO;
-#endif
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_YG_OFFS_TC, reg);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        result = inv_serial_single_write(sMLSLHandle, mldlCfg.addr,
-                                         MPUREG_ZG_OFFS_TC,
-                                         ((mldlCfg.offset_tc[2] << 1)
-                                          & BITS_ZG_OFFS_TC));
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-#endif
-    } else {
-        mldlCfg.gyro_needs_reset = TRUE;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Set the gyro offset.
- *  @param  offset
- *              a pointer to the gyro offset for the 3 gyro axes. This is scaled
- *              as it would be written to the hardware registers.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_set_offset(const short *offset)
-{
-    inv_error_t result;
-    unsigned char regs[7];
-    int ii;
-    long sf;
-
-    sf = (2000L * 131) / mldlCfg.gyro_sens_trim;
-    for (ii = 0; ii < ARRAY_SIZE(mldlCfg.offset); ii++) {
-        // Record the bias in the units the register uses
-        mldlCfg.offset[ii] = offset[ii];
-        // Convert the bias to 1 dps = 1<<16
-        inv_obj.gyro_bias[ii] = -offset[ii] * sf;
-        regs[1 + ii * 2] = (unsigned char)(offset[ii] >> 8) & 0xff;
-        regs[1 + ii * 2 + 1] = (unsigned char)(offset[ii] & 0xff);
-    }
-
-    if (!mldlCfg.gyro_is_suspended) {
-        regs[0] = MPUREG_X_OFFS_USRH;
-        result = inv_serial_write(sMLSLHandle, mldlCfg.addr, 7, regs);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    } else {
-        mldlCfg.gyro_needs_reset = TRUE;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @internal
- *  @brief  used to get the specified number of bytes in the specified MPU
- *          memory bank.
- *          The memory bank is one of the following:
- *          - MPUMEM_RAM_BANK_0,
- *          - MPUMEM_RAM_BANK_1,
- *          - MPUMEM_RAM_BANK_2, or
- *          - MPUMEM_RAM_BANK_3.
- *
- *  @param  bank    Memory bank to write.
- *  @param  memAddr Starting address for write.
- *  @param  length  Number of bytes to write.
- *  @param  buffer  Result for data.
- *
- *  @return zero if the command is successful, an error code otherwise.
- *  @endif
- */
-inv_error_t
-inv_get_mpu_memory_one_bank(unsigned char bank,
-                            unsigned char memAddr,
-                            unsigned short length, unsigned char *buffer)
-{
-    inv_error_t result;
-
-    if ((bank >= MPU_MEM_NUM_RAM_BANKS) ||
-        //(memAddr >= MPU_MEM_BANK_SIZE) || always 0, memAddr is an u_char, therefore limited to 255
-        ((memAddr + length) > MPU_MEM_BANK_SIZE) || (NULL == buffer)) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    if (mldlCfg.gyro_is_suspended) {
-        memcpy(buffer, &mldlCfg.ram[bank][memAddr], length);
-        result = INV_SUCCESS;
-    } else {
-        result = inv_serial_read_mem(sMLSLHandle, mldlCfg.addr,
-                                     ((bank << 8) | memAddr), length, buffer);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  used to set the specified number of bytes in the specified MPU
- *          memory bank.
- *          The memory bank is one of the following:
- *          - MPUMEM_RAM_BANK_0,
- *          - MPUMEM_RAM_BANK_1,
- *          - MPUMEM_RAM_BANK_2, or
- *          - MPUMEM_RAM_BANK_3.
- *
- *  @param  bank    Memory bank to write.
- *  @param  memAddr Starting address for write.
- *  @param  length  Number of bytes to write.
- *  @param  buffer  Result for data.
- *
- *  @return zero if the command is successful, an error code otherwise.
- *  @endif
- */
-inv_error_t inv_set_mpu_memory_one_bank(unsigned char bank,
-                                        unsigned short memAddr,
-                                        unsigned short length,
-                                        const unsigned char *buffer)
-{
-    inv_error_t result = INV_SUCCESS;
-    int different;
-
-    if ((bank >= MPU_MEM_NUM_RAM_BANKS) || (memAddr >= MPU_MEM_BANK_SIZE) ||
-        ((memAddr + length) > MPU_MEM_BANK_SIZE) || (NULL == buffer)) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    different = memcmp(&mldlCfg.ram[bank][memAddr], buffer, length);
-    memcpy(&mldlCfg.ram[bank][memAddr], buffer, length);
-    if (!mldlCfg.gyro_is_suspended) {
-        result = inv_serial_write_mem(sMLSLHandle, mldlCfg.addr,
-                                      ((bank << 8) | memAddr), length, buffer);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    } else if (different) {
-        mldlCfg.gyro_needs_reset = TRUE;
-    }
-
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  used to get the specified number of bytes from the MPU location
- *          specified by the key.
- *          Reads the specified number of bytes from the MPU location
- *          specified by the key. Each set of code specifies a function
- *          that changes keys into addresses. This function is set with
- *          setGetAddress().
- *
- *  @param  key     The key to use when looking up the address.
- *  @param  length  Number of bytes to read.
- *  @param  buffer  Result for data.
- *
- *  @return INV_SUCCESS if the command is successful, INV_ERROR otherwise. The key
- *          not corresponding to a memory address will result in INV_ERROR.
- *  @endif
- */
-inv_error_t inv_get_mpu_memory(unsigned short key,
-                               unsigned short length, unsigned char *buffer)
-{
-    unsigned char bank;
-    inv_error_t result;
-    unsigned short memAddr;
-
-    if (sGetAddress == NULL) {
-        return INV_ERROR_NOT_OPENED;
-    }
-
-    memAddr = sGetAddress(key);
-    if (memAddr >= 0xffff)
-        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-    bank = memAddr >> 8;        // Get Bank
-    memAddr &= 0xff;
-
-    while (memAddr + length > MPU_MEM_BANK_SIZE) {
-        // We cross a bank in the middle
-        unsigned short sub_length = MPU_MEM_BANK_SIZE - memAddr;
-        result = inv_get_mpu_memory_one_bank(bank, (unsigned char)memAddr,
-                                             sub_length, buffer);
-        if (INV_SUCCESS != result)
-            return result;
-        bank++;
-        length -= sub_length;
-        buffer += sub_length;
-        memAddr = 0;
-    }
-    result = inv_get_mpu_memory_one_bank(bank, (unsigned char)memAddr,
-                                         length, buffer);
-
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  used to set the specified number of bytes from the MPU location
- *          specified by the key.
- *          Set the specified number of bytes from the MPU location
- *          specified by the key. Each set of DMP code specifies a function
- *          that changes keys into addresses. This function is set with
- *          setGetAddress().
- *
- *  @param  key     The key to use when looking up the address.
- *  @param  length  Number of bytes to write.
- *  @param  buffer  Result for data.
- *
- *  @return INV_SUCCESS if the command is successful, INV_ERROR otherwise. The key
- *          not corresponding to a memory address will result in INV_ERROR.
- *  @endif
- */
-inv_error_t inv_set_mpu_memory(unsigned short key,
-                               unsigned short length,
-                               const unsigned char *buffer)
-{
-    inv_error_t result = INV_SUCCESS;
-    unsigned short memAddr;
-    unsigned char bank;
-
-    if (sGetAddress == NULL) {
-        MPL_LOGE("MLDSetMemoryMPU sGetAddress is NULL\n");
-        return INV_ERROR_INVALID_MODULE;
-    }
-    memAddr = sGetAddress(key);
-
-    if (memAddr >= 0xffff) {
-        MPL_LOGE("inv_set_mpu_memory unsupported key\n");
-        return INV_ERROR_INVALID_MODULE; // This key not supported
-    }
-
-    bank = (unsigned char)(memAddr >> 8);
-    memAddr &= 0xff;
-
-    while (memAddr + length > MPU_MEM_BANK_SIZE) {
-        // We cross a bank in the middle
-        unsigned short sub_length = MPU_MEM_BANK_SIZE - memAddr;
-
-        result = inv_set_mpu_memory_one_bank(bank, memAddr, sub_length, buffer);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        bank++;
-        length -= sub_length;
-        buffer += sub_length;
-        memAddr = 0;
-    }
-    result = inv_set_mpu_memory_one_bank(bank, memAddr, length, buffer);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/**
- *  @brief  Load the DMP with the given code and configuration.
- *  @param  buffer
- *              the DMP data.
- *  @param  length
- *              the length in bytes of the DMP data.
- *  @param  config
- *              the DMP configuration.
- *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_load_dmp(const unsigned char *buffer,
-                         unsigned short length, unsigned short config)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result = INV_SUCCESS;
-    unsigned short toWrite;
-    unsigned short memAddr = 0;
-    localDmpMemory = buffer;
-    localDmpMemorySize = length;
-
-    mldlCfg.dmp_cfg1 = (config >> 8);
-    mldlCfg.dmp_cfg2 = (config & 0xff);
-
-    while (length > 0) {
-        toWrite = length;
-        if (toWrite > MAX_LOAD_WRITE_SIZE)
-            toWrite = MAX_LOAD_WRITE_SIZE;
-
-        result =
-            inv_set_mpu_memory_one_bank(memAddr >> 8, memAddr & 0xff, toWrite,
-                                        buffer);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        buffer += toWrite;
-        memAddr += toWrite;
-        length -= toWrite;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Get the silicon revision ID.
- *  @return The silicon revision ID
- *          (0 will be read if inv_mpu_open returned an error)
- */
-unsigned char inv_get_silicon_rev(void)
-{
-    return mldlCfg.silicon_revision;
-}
-
-/**
- *  @brief  Get the product revision ID.
- *  @return The product revision ID
- *          (0 will be read if inv_mpu_open returned an error)
- */
-unsigned char inv_get_product_rev(void)
-{
-    return mldlCfg.product_revision;
-}
-
-/*******************************************************************************
- *******************************************************************************
- *******************************************************************************
- * @todo these belong with an interface to the kernel driver layer
- *******************************************************************************
- *******************************************************************************
- ******************************************************************************/
-
-/**
- * @brief   inv_get_interrupt_status returns the interrupt status from the specified
- *          interrupt pin.
- * @param   intPin
- *              Currently only the value INTPIN_MPU is supported.
- * @param   status
- *              The available statuses are:
- *              - BIT_MPU_RDY_EN
- *              - BIT_DMP_INT_EN
- *              - BIT_RAW_RDY_EN
- *
- * @return  INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_get_interrupt_status(unsigned char intPin,
-                                     unsigned char *status)
-{
-    INVENSENSE_FUNC_START;
-
-    inv_error_t result;
-
-    switch (intPin) {
-
-    case INTPIN_MPU:
-            /*---- return the MPU interrupt status ----*/
-        result = inv_serial_read(sMLSLHandle, mldlCfg.addr,
-                                 MPUREG_INT_STATUS, 1, status);
-        break;
-
-    default:
-        result = INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return result;
-}
-
-/**
- *  @brief   query the current status of an interrupt source.
- *  @param   srcIndex
- *              index of the interrupt source.
- *              Currently the only source supported is INTPIN_MPU.
- *
- *  @return  1 if the interrupt has been triggered.
- */
-unsigned char inv_get_interrupt_trigger(unsigned char srcIndex)
-{
-    INVENSENSE_FUNC_START;
-    return intTrigger[srcIndex];
-}
-
-/**
- * @brief clear the 'triggered' status for an interrupt source.
- * @param srcIndex
- *          index of the interrupt source.
- *          Currently only INTPIN_MPU is supported.
- */
-void inv_clear_interrupt_trigger(unsigned char srcIndex)
-{
-    INVENSENSE_FUNC_START;
-    intTrigger[srcIndex] = 0;
-}
-
-/**
- * @brief   inv_interrupt_handler function should be called when an interrupt is
- *          received.  The source parameter identifies which interrupt source
- *          caused the interrupt. Note that this routine should not be called
- *          directly from the interrupt service routine.
- *
- * @param   intSource   MPU, AUX1, AUX2, or timer. Can be one of: INTSRC_MPU, INTSRC_AUX1,
- *                      INTSRC_AUX2, or INT_SRC_TIMER.
- *
- * @return  Zero if the command is successful; an error code otherwise.
- */
-inv_error_t inv_interrupt_handler(unsigned char intSource)
-{
-    INVENSENSE_FUNC_START;
-    /*---- range check ----*/
-    if (intSource >= NUM_OF_INTSOURCES) {
-        return INV_ERROR;
-    }
-
-    /*---- save source of interrupt ----*/
-    intTrigger[intSource] = INT_TRIGGERED;
-
-#ifdef ML_USE_DMP_SIM
-    if (intSource == INTSRC_AUX1 || intSource == INTSRC_TIMER) {
-        MLSimHWDataInput();
-    }
-#endif
-
-    return INV_SUCCESS;
-}
-
-/***************************/
-        /**@}*//* end of defgroup */
-/***************************/
diff --git a/60xx/mlsdk/mllite/mldl.h b/60xx/mlsdk/mllite/mldl.h
deleted file mode 100644
index 961d860..0000000
--- a/60xx/mlsdk/mllite/mldl.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mldl.h 5639 2011-06-14 01:23:05Z nroyer $
- *
- *******************************************************************************/
-
-#ifndef MLDL_H
-#define MLDL_H
-
-#include "mltypes.h"
-#include "mlsl.h"
-#include <linux/mpu.h>
-#include "mldl_cfg.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mldl_legacy.h"
-#endif
-
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-typedef enum _DEVICE_CONFIG {
-    DEVICE_MPU_ACCEL = 0,
-    DEVICE_MPU,
-    NUM_OF_DEVICES
-} DEVICE_CONFIG;
-
-#define SERIAL_I2C                  0
-#define SERIAL_SPI                  1
-
-#define DATAMODE_MANUAL             0   // Manual data mode
-#define DATAMODE_AUTO               1   // Auto data mode
-
-#define DATASRC_IMMEDIATE           0   // Return data immediately
-#define DATASRC_WHENREADY           1   // Only return data when new data is available
-#define DATASRC_FIFO                2   // Use FIFO for data
-
-#define SENSOR_DATA_GYROX           0x0001
-#define SENSOR_DATA_GYROY           0x0002
-#define SENSOR_DATA_GYROZ           0x0004
-#define SENSOR_DATA_ACCELX          0x0008
-#define SENSOR_DATA_ACCELY          0x0010
-#define SENSOR_DATA_ACCELZ          0x0020
-#define SENSOR_DATA_AUX1            0x0040
-#define SENSOR_DATA_AUX2            0x0080
-#define SENSOR_DATA_AUX3            0x0100
-#define SENSOR_DATA_TEMP            0x0200
-
-#define INTPIN_MPU                  0
-
-#define INTLOGIC_HIGH               0
-#define INTLOGIC_LOW                1
-
-#define INTTYPE_PUSHPULL            0
-#define INTTYPE_OPENDRAIN           1
-
-#define INTLATCH_DISABLE            0
-#define INTLATCH_ENABLE             1
-
-#define MPUINT_MPU_READY            0x04
-#define MPUINT_DMP_DONE             0x02
-#define MPUINT_DATA_READY           0x01
-
-#define INTLATCHCLEAR_READSTATUS    0
-#define INTLATCHCLEAR_ANYREAD       1
-
-#define DMP_DONTRUN                 0
-#define DMP_RUN                     1
-
-    /*---- defines for external interrupt status (via external call into library) ----*/
-#define INT_CLEAR                   0
-#define INT_TRIGGERED               1
-
-typedef enum {
-    INTSRC_MPU = 0,
-    INTSRC_AUX1,
-    INTSRC_AUX2,
-    INTSRC_AUX3,
-    INTSRC_TIMER,
-    INTSRC_UNKNOWN,
-    INTSRC_MPU_FIFO,
-    INTSRC_MPU_MOTION,
-    NUM_OF_INTSOURCES,
-} INT_SOURCE;
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-    /* --------------- */
-    /* - Variables.  - */
-    /* --------------- */
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_dl_open(void *mlslHandle);
-    inv_error_t inv_dl_close(void);
-
-    inv_error_t inv_dl_start(unsigned long sensors);
-    inv_error_t inv_dl_stop(unsigned long sensors);
-
-    struct mldl_cfg *inv_get_dl_config(void);
-
-    inv_error_t inv_init_requested_sensors(unsigned long sensors);
-    unsigned char inv_get_mpu_slave_addr(void);
-    inv_error_t inv_get_dl_ctrl_dmp(unsigned char enableRun,
-                                    unsigned char enableFIFO);
-    inv_error_t inv_get_dl_cfg_int(unsigned char triggers);
-    inv_error_t inv_dl_cfg_sampling(unsigned char lpf, unsigned char divider);
-    inv_error_t inv_set_full_scale(float fullScale);
-    inv_error_t inv_set_external_sync(unsigned char extSync);
-    inv_error_t inv_set_ignore_system_suspend(unsigned char ignore);
-    inv_error_t inv_clock_source(unsigned char clkSource);
-    inv_error_t inv_get_mpu_memory(unsigned short key,
-                                   unsigned short length,
-                                   unsigned char *buffer);
-    inv_error_t inv_set_mpu_memory(unsigned short key,
-                                   unsigned short length,
-                                   const unsigned char *buffer);
-    inv_error_t inv_load_dmp(const unsigned char *buffer,
-                             unsigned short length,
-                             unsigned short startAddress);
-
-    unsigned char inv_get_slicon_rev(void);
-    inv_error_t inv_set_offsetTC(const unsigned char *tc);
-    inv_error_t inv_set_offset(const short *offset);
-
-    /* Functions for setting and retrieving the DMP memory */
-    inv_error_t inv_get_mpu_memory_original(unsigned short key,
-                                            unsigned short length,
-                                            unsigned char *buffer);
-    void inv_set_get_address(unsigned short (*func) (unsigned short key));
-    unsigned short inv_dl_get_address(unsigned short key);
-    uint_fast8_t inv_dmpkey_supported(unsigned short key);
-
-    inv_error_t inv_get_interrupt_status(unsigned char intPin,
-                                         unsigned char *value);
-    unsigned char inv_get_interrupt_trigger(unsigned char index);
-    void inv_clear_interrupt_trigger(unsigned char index);
-    inv_error_t inv_interrupt_handler(unsigned char intSource);
-
-    /** Only exposed for testing purposes */
-    inv_error_t inv_set_mpu_memory_one_bank(unsigned char bank,
-                                            unsigned short memAddr,
-                                            unsigned short length,
-                                            const unsigned char *buffer);
-    inv_error_t inv_get_mpu_memory_one_bank(unsigned char bank,
-                                            unsigned char memAddr,
-                                            unsigned short length,
-                                            unsigned char *buffer);
-#ifdef __cplusplus
-}
-#endif
-#endif                          // MLDL_H
diff --git a/60xx/mlsdk/mllite/mldl_cfg.h b/60xx/mlsdk/mllite/mldl_cfg.h
deleted file mode 100644
index b4914e2..0000000
--- a/60xx/mlsdk/mllite/mldl_cfg.h
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/**
- *  @addtogroup MLDL
- *
- *  @{
- *      @file   mldl_cfg.h
- *      @brief  The Motion Library Driver Layer Configuration header file.
- */
-
-#ifndef __MLDL_CFG_H__
-#define __MLDL_CFG_H__
-
-#include "mltypes.h"
-#include "mlsl.h"
-#include <linux/mpu.h>
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-#    include "mpu6050a2.h"
-#elif defined CONFIG_MPU_SENSORS_MPU6050B1
-#    include "mpu6050b1.h"
-#elif defined CONFIG_MPU_SENSORS_MPU3050
-#  include "mpu3050.h"
-#else
-#error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
-#endif
-
-#include "log.h"
-
-/*************************************************************************
- *  Sensors
- *************************************************************************/
-
-#define INV_X_GYRO			(0x0001)
-#define INV_Y_GYRO			(0x0002)
-#define INV_Z_GYRO			(0x0004)
-#define INV_DMP_PROCESSOR		(0x0008)
-
-#define INV_X_ACCEL			(0x0010)
-#define INV_Y_ACCEL			(0x0020)
-#define INV_Z_ACCEL			(0x0040)
-
-#define INV_X_COMPASS			(0x0080)
-#define INV_Y_COMPASS			(0x0100)
-#define INV_Z_COMPASS			(0x0200)
-
-#define INV_X_PRESSURE			(0x0300)
-#define INV_Y_PRESSURE			(0x0800)
-#define INV_Z_PRESSURE			(0x1000)
-
-#define INV_TEMPERATURE			(0x2000)
-#define INV_TIME			(0x4000)
-
-#define INV_THREE_AXIS_GYRO		(0x000F)
-#define INV_THREE_AXIS_ACCEL		(0x0070)
-#define INV_THREE_AXIS_COMPASS		(0x0380)
-#define INV_THREE_AXIS_PRESSURE		(0x1C00)
-
-#define INV_FIVE_AXIS			(0x007B)
-#define INV_SIX_AXIS_GYRO_ACCEL		(0x007F)
-#define INV_SIX_AXIS_ACCEL_COMPASS	(0x03F0)
-#define INV_NINE_AXIS			(0x03FF)
-#define INV_ALL_SENSORS			(0x7FFF)
-
-#define MPL_PROD_KEY(ver, rev) (ver * 100 + rev)
-
-/* -------------------------------------------------------------------------- */
-
-/* Platform data for the MPU */
-struct mldl_cfg {
-	/* MPU related configuration */
-	unsigned long requested_sensors;
-	unsigned char ignore_system_suspend;
-	unsigned char addr;
-	unsigned char int_config;
-	unsigned char ext_sync;
-	unsigned char full_scale;
-	unsigned char lpf;
-	unsigned char clk_src;
-	unsigned char divider;
-	unsigned char dmp_enable;
-	unsigned char fifo_enable;
-	unsigned char dmp_cfg1;
-	unsigned char dmp_cfg2;
-	unsigned char offset_tc[GYRO_NUM_AXES];
-	unsigned short offset[GYRO_NUM_AXES];
-	unsigned char ram[MPU_MEM_NUM_RAM_BANKS][MPU_MEM_BANK_SIZE];
-
-	/* MPU Related stored status and info */
-	unsigned char product_revision;
-	unsigned char silicon_revision;
-	unsigned char product_id;
-	unsigned short gyro_sens_trim;
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-	unsigned short accel_sens_trim;
-#endif
-
-	/* Driver/Kernel related state information */
-	int gyro_is_bypassed;
-	int i2c_slaves_enabled;
-	int dmp_is_running;
-	int gyro_is_suspended;
-	int accel_is_suspended;
-	int compass_is_suspended;
-	int pressure_is_suspended;
-	int gyro_needs_reset;
-
-	/* Slave related information */
-	struct ext_slave_descr *accel;
-	struct ext_slave_descr *compass;
-	struct ext_slave_descr *pressure;
-
-	/* Platform Data */
-	struct mpu_platform_data *pdata;
-};
-
-/* -------------------------------------------------------------------------- */
-
-int inv_mpu_open(struct mldl_cfg *mldl_cfg,
-		 void *mlsl_handle,
-		 void *accel_handle,
-		 void *compass_handle,
-		 void *pressure_handle);
-int inv_mpu_close(struct mldl_cfg *mldl_cfg,
-		  void *mlsl_handle,
-		  void *accel_handle,
-		  void *compass_handle,
-		  void *pressure_handle);
-int inv_mpu_resume(struct mldl_cfg *mldl_cfg,
-		   void *gyro_handle,
-		   void *accel_handle,
-		   void *compass_handle,
-		   void *pressure_handle,
-		   unsigned long sensors);
-int inv_mpu_suspend(struct mldl_cfg *mldl_cfg,
-		    void *gyro_handle,
-		    void *accel_handle,
-		    void *compass_handle,
-		    void *pressure_handle,
-		    unsigned long sensors);
-
-/* Slave Read functions */
-int inv_mpu_slave_read(struct mldl_cfg *mldl_cfg,
-		       void *gyro_handle,
-		       void *slave_handle,
-		       struct ext_slave_descr *slave,
-		       struct ext_slave_platform_data *pdata,
-		       unsigned char *data);
-static inline int inv_mpu_read_accel(struct mldl_cfg *mldl_cfg,
-				     void *gyro_handle,
-				     void *accel_handle, unsigned char *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_read(mldl_cfg, gyro_handle, accel_handle,
-				  mldl_cfg->accel, &mldl_cfg->pdata->accel,
-				  data);
-}
-
-static inline int inv_mpu_read_compass(struct mldl_cfg *mldl_cfg,
-				       void *gyro_handle,
-				       void *compass_handle,
-				       unsigned char *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_read(mldl_cfg, gyro_handle, compass_handle,
-				  mldl_cfg->compass, &mldl_cfg->pdata->compass,
-				  data);
-}
-
-static inline int inv_mpu_read_pressure(struct mldl_cfg *mldl_cfg,
-					void *gyro_handle,
-					void *pressure_handle,
-					unsigned char *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_read(mldl_cfg, gyro_handle, pressure_handle,
-				  mldl_cfg->pressure,
-				  &mldl_cfg->pdata->pressure, data);
-}
-
-/* Slave Config functions */
-int inv_mpu_slave_config(struct mldl_cfg *mldl_cfg,
-			 void *gyro_handle,
-			 void *slave_handle,
-			 struct ext_slave_config *data,
-			 struct ext_slave_descr *slave,
-			 struct ext_slave_platform_data *pdata);
-static inline int inv_mpu_config_accel(struct mldl_cfg *mldl_cfg,
-				       void *gyro_handle,
-				       void *accel_handle,
-				       struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_config(mldl_cfg, gyro_handle, accel_handle, data,
-				    mldl_cfg->accel, &mldl_cfg->pdata->accel);
-}
-
-static inline int inv_mpu_config_compass(struct mldl_cfg *mldl_cfg,
-					 void *gyro_handle,
-					 void *compass_handle,
-					 struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_config(mldl_cfg, gyro_handle, compass_handle, data,
-				    mldl_cfg->compass,
-				    &mldl_cfg->pdata->compass);
-}
-
-static inline int inv_mpu_config_pressure(struct mldl_cfg *mldl_cfg,
-					  void *gyro_handle,
-					  void *pressure_handle,
-					  struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_slave_config(mldl_cfg, gyro_handle, pressure_handle,
-				    data, mldl_cfg->pressure,
-				    &mldl_cfg->pdata->pressure);
-}
-
-/* Slave get config functions */
-int inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg,
-			     void *gyro_handle,
-			     void *slave_handle,
-			     struct ext_slave_config *data,
-			     struct ext_slave_descr *slave,
-			     struct ext_slave_platform_data *pdata);
-
-static inline int inv_mpu_get_accel_config(struct mldl_cfg *mldl_cfg,
-					   void *gyro_handle,
-					   void *accel_handle,
-					   struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle, accel_handle,
-					data, mldl_cfg->accel,
-					&mldl_cfg->pdata->accel);
-}
-
-static inline int inv_mpu_get_compass_config(struct mldl_cfg *mldl_cfg,
-					     void *gyro_handle,
-					     void *compass_handle,
-					     struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle, compass_handle,
-					data, mldl_cfg->compass,
-					&mldl_cfg->pdata->compass);
-}
-
-static inline int inv_mpu_get_pressure_config(struct mldl_cfg *mldl_cfg,
-					      void *gyro_handle,
-					      void *pressure_handle,
-					      struct ext_slave_config *data)
-{
-	if (!mldl_cfg || !(mldl_cfg->pdata)) {
-		LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-		return INV_ERROR_INVALID_PARAMETER;
-	}
-
-	return inv_mpu_get_slave_config(mldl_cfg, gyro_handle,
-					pressure_handle, data,
-					mldl_cfg->pressure,
-					&mldl_cfg->pdata->pressure);
-}
-
-/* -------------------------------------------------------------------------- */
-
-static inline long inv_mpu_get_sampling_rate_hz(struct mldl_cfg *mldl_cfg)
-{
-	if (((mldl_cfg->lpf) == 0) || ((mldl_cfg->lpf) == 7))
-		return 8000L / (mldl_cfg->divider + 1);
-	else
-		return 1000L / (mldl_cfg->divider + 1);
-}
-
-static inline long inv_mpu_get_sampling_period_us(struct mldl_cfg *mldl_cfg)
-{
-	if (((mldl_cfg->lpf) == 0) || ((mldl_cfg->lpf) == 7))
-		return (long) (1000000L * (mldl_cfg->divider + 1)) / 8000L;
-	else
-		return (long) (1000000L * (mldl_cfg->divider + 1)) / 1000L;
-}
-
-#endif				/* __MLDL_CFG_H__ */
-
-/**
- *@}
- */
diff --git a/60xx/mlsdk/mllite/mldl_cfg_mpu.c b/60xx/mlsdk/mllite/mldl_cfg_mpu.c
deleted file mode 100644
index 3d4496e..0000000
--- a/60xx/mlsdk/mllite/mldl_cfg_mpu.c
+++ /dev/null
@@ -1,477 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mldl_cfg_mpu.c 5653 2011-06-16 21:06:55Z nroyer $
- *
- *****************************************************************************/
-
-/** 
- *  @addtogroup MLDL
- *
- *  @{
- *      @file   mldl_cfg_mpu.c
- *      @brief  The Motion Library Driver Layer.
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <stddef.h>
-#include "mldl_cfg.h"
-#include "mlsl.h"
-#include "mpu.h"
-
-#ifdef LINUX
-#include <sys/ioctl.h>
-#endif
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-mldl_cfg_mpu:"
-
-/* --------------------- */
-/* -    Variables.     - */
-/* --------------------- */
-
-
-/* ---------------------- */
-/* -  Static Functions. - */
-/* ---------------------- */
-void mpu_print_cfg(struct mldl_cfg * mldl_cfg)
-{
-    struct mpu_platform_data   *pdata   = mldl_cfg->pdata;
-    struct ext_slave_platform_data *accel   = &mldl_cfg->pdata->accel;
-    struct ext_slave_platform_data *compass = &mldl_cfg->pdata->compass;
-    struct ext_slave_platform_data *pressure = &mldl_cfg->pdata->pressure;
-
-    MPL_LOGD("mldl_cfg.addr             = %02x\n", mldl_cfg->addr);
-    MPL_LOGD("mldl_cfg.int_config       = %02x\n", mldl_cfg->int_config);
-    MPL_LOGD("mldl_cfg.ext_sync         = %02x\n", mldl_cfg->ext_sync);
-    MPL_LOGD("mldl_cfg.full_scale       = %02x\n", mldl_cfg->full_scale);
-    MPL_LOGD("mldl_cfg.lpf              = %02x\n", mldl_cfg->lpf);
-    MPL_LOGD("mldl_cfg.clk_src          = %02x\n", mldl_cfg->clk_src);
-    MPL_LOGD("mldl_cfg.divider          = %02x\n", mldl_cfg->divider);
-    MPL_LOGD("mldl_cfg.dmp_enable       = %02x\n", mldl_cfg->dmp_enable);
-    MPL_LOGD("mldl_cfg.fifo_enable      = %02x\n", mldl_cfg->fifo_enable);
-    MPL_LOGD("mldl_cfg.dmp_cfg1         = %02x\n", mldl_cfg->dmp_cfg1);
-    MPL_LOGD("mldl_cfg.dmp_cfg2         = %02x\n", mldl_cfg->dmp_cfg2);
-    MPL_LOGD("mldl_cfg.offset_tc[0]     = %02x\n", mldl_cfg->offset_tc[0]);
-    MPL_LOGD("mldl_cfg.offset_tc[1]     = %02x\n", mldl_cfg->offset_tc[1]);
-    MPL_LOGD("mldl_cfg.offset_tc[2]     = %02x\n", mldl_cfg->offset_tc[2]);
-    MPL_LOGD("mldl_cfg.silicon_revision = %02x\n", mldl_cfg->silicon_revision);
-    MPL_LOGD("mldl_cfg.product_id       = %02x\n", mldl_cfg->product_id);
-    MPL_LOGD("mldl_cfg.gyro_sens_trim   = %02x\n", mldl_cfg->gyro_sens_trim);
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
-    MPL_LOGD("mldl_cfg.accel_sens_trim   = %02x\n", mldl_cfg->accel_sens_trim);
-#endif
-
-    if (mldl_cfg->accel) {
-        MPL_LOGD("slave_accel->suspend      = %p\n", mldl_cfg->accel->suspend);
-        MPL_LOGD("slave_accel->resume       = %p\n", mldl_cfg->accel->resume);
-        MPL_LOGD("slave_accel->read         = %p\n", mldl_cfg->accel->read);
-        MPL_LOGD("slave_accel->type         = %02x\n", mldl_cfg->accel->type);
-        MPL_LOGD("slave_accel->read_reg     = %02x\n",
-                 mldl_cfg->accel->read_reg);
-        MPL_LOGD("slave_accel->read_len     = %02x\n",
-                 mldl_cfg->accel->read_len);
-        MPL_LOGD("slave_accel->endian       = %02x\n", mldl_cfg->accel->endian);
-        MPL_LOGD("slave_accel->range.mantissa= %02x\n", (int)mldl_cfg->accel->range.mantissa);
-        MPL_LOGD("slave_accel->range.fraction= %02x\n", (int)mldl_cfg->accel->range.fraction);
-    } else {
-        MPL_LOGD("slave_accel               = NULL\n");
-    }
-
-    if (mldl_cfg->compass) {
-        MPL_LOGD("slave_compass->suspend    = %p\n", mldl_cfg->compass->suspend);
-        MPL_LOGD("slave_compass->resume     = %p\n", mldl_cfg->compass->resume);
-        MPL_LOGD("slave_compass->read       = %p\n", mldl_cfg->compass->read);
-        MPL_LOGD("slave_compass->type       = %02x\n", mldl_cfg->compass->type);
-        MPL_LOGD("slave_compass->read_reg   = %02x\n",
-                 mldl_cfg->compass->read_reg);
-        MPL_LOGD("slave_compass->read_len   = %02x\n",
-                 mldl_cfg->compass->read_len);
-        MPL_LOGD("slave_compass->endian     = %02x\n", mldl_cfg->compass->endian);
-        MPL_LOGD("slave_compass->range.mantissa= %02x\n", (int)mldl_cfg->compass->range.mantissa);
-        MPL_LOGD("slave_compass->range.fraction= %02x\n", (int)mldl_cfg->compass->range.fraction);
-    } else {
-        MPL_LOGD("slave_compass             = NULL\n");
-    }
-
-    if (mldl_cfg->pressure) {
-        MPL_LOGD("slave_pressure->suspend    = %p\n", mldl_cfg->pressure->suspend);
-        MPL_LOGD("slave_pressure->resume     = %p\n", mldl_cfg->pressure->resume);
-        MPL_LOGD("slave_pressure->read       = %p\n", mldl_cfg->pressure->read);
-        MPL_LOGD("slave_pressure->type       = %02x\n", mldl_cfg->pressure->type);
-        MPL_LOGD("slave_pressure->read_reg   = %02x\n",
-                 mldl_cfg->pressure->read_reg);
-        MPL_LOGD("slave_pressure->read_len   = %02x\n",
-                 mldl_cfg->pressure->read_len);
-        MPL_LOGD("slave_pressure->endian     = %02x\n", mldl_cfg->pressure->endian);
-        MPL_LOGD("slave_pressure->range.mantissa= %02x\n", (int)mldl_cfg->pressure->range.mantissa);
-        MPL_LOGD("slave_pressure->range.fraction= %02x\n", (int)mldl_cfg->pressure->range.fraction);
-    } else {
-        MPL_LOGD("slave_pressure             = NULL\n");
-    }
-
-    MPL_LOGD("accel->get_slave_descr    = %p\n",accel->get_slave_descr);
-    MPL_LOGD("accel->adapt_num          = %02x\n", accel->adapt_num);
-    MPL_LOGD("accel->bus                = %02x\n", accel->bus);
-    MPL_LOGD("accel->address            = %02x\n", accel->address);
-    MPL_LOGD("accel->orientation        = \n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n",
-             accel->orientation[0],accel->orientation[1],accel->orientation[2],
-             accel->orientation[3],accel->orientation[4],accel->orientation[5],
-             accel->orientation[6],accel->orientation[7],accel->orientation[8]);
-    MPL_LOGD("compass->get_slave_descr  = %p\n",compass->get_slave_descr);
-    MPL_LOGD("compass->adapt_num        = %02x\n", compass->adapt_num);
-    MPL_LOGD("compass->bus              = %02x\n", compass->bus);
-    MPL_LOGD("compass->address          = %02x\n", compass->address);
-    MPL_LOGD("compass->orientation      = \n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n",
-             compass->orientation[0],compass->orientation[1],compass->orientation[2],
-             compass->orientation[3],compass->orientation[4],compass->orientation[5],
-             compass->orientation[6],compass->orientation[7],compass->orientation[8]);
-    MPL_LOGD("pressure->get_slave_descr  = %p\n",pressure->get_slave_descr);
-    MPL_LOGD("pressure->adapt_num        = %02x\n", pressure->adapt_num);
-    MPL_LOGD("pressure->bus              = %02x\n", pressure->bus);
-    MPL_LOGD("pressure->address          = %02x\n", pressure->address);
-    MPL_LOGD("pressure->orientation      = \n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n",
-             pressure->orientation[0],pressure->orientation[1],pressure->orientation[2],
-             pressure->orientation[3],pressure->orientation[4],pressure->orientation[5],
-             pressure->orientation[6],pressure->orientation[7],pressure->orientation[8]);
-    
-    MPL_LOGD("pdata->int_config         = %02x\n", pdata->int_config);
-    MPL_LOGD("pdata->level_shifter      = %02x\n", pdata->level_shifter);
-    MPL_LOGD("pdata->orientation        = \n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n"
-             "                            %2d %2d %2d\n",
-             pdata->orientation[0],pdata->orientation[1],pdata->orientation[2],
-             pdata->orientation[3],pdata->orientation[4],pdata->orientation[5],
-             pdata->orientation[6],pdata->orientation[7],pdata->orientation[8]);
-
-    MPL_LOGD("Struct sizes: mldl_cfg: %zu, "
-             "ext_slave_descr:%zu, mpu_platform_data:%zu: RamOffset: %zu\n",
-             sizeof(struct mldl_cfg), sizeof(struct ext_slave_descr), 
-             sizeof(struct mpu_platform_data), 
-             offsetof(struct mldl_cfg, ram));
-}
-
-/******************************************************************************
- ******************************************************************************
- * Exported functions
- ******************************************************************************
- *****************************************************************************/
-
-/** 
- * Initializes the pdata structure to defaults.
- *
- * Opens the device to read silicon revision, product id and whoami.  Leaves
- * the device in suspended state for low power.
- * 
- * @param mldl_cfg handle to the config structure
- * @param mlsl_handle handle to the mpu serial layer
- * @param accel_handle handle to the accel serial layer
- * @param compass_handle handle to the compass serial layer
- * @param pressure_handle handle to the pressure serial layer
- *
- * @return INV_SUCCESS if silicon revision, product id and woami are supported
- *         by this software.
- */
-int inv_mpu_open(struct mldl_cfg *mldl_cfg, 
-                 void *mlsl_handle,
-                 void *accel_handle,
-                 void *compass_handle,
-                 void *pressure_handle)
-{
-    int result;
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    result = inv_mpu_suspend(mldl_cfg, mlsl_handle, NULL, NULL, NULL,
-                             INV_ALL_SENSORS);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    return result;
-}
-
-/** 
- * Stub for driver close.  Just verify that the devices are suspended
- * 
- * @param mldl_cfg handle to the config structure
- * @param mlsl_handle handle to the mpu serial layer
- * @param accel_handle handle to the accel serial layer
- * @param compass_handle handle to the compass serial layer
- * @param pressure_handle handle to the compass serial layer
- * 
- * @return INV_SUCCESS or non-zero error code
- */
-int inv_mpu_close(struct mldl_cfg *mldl_cfg, 
-		  void *mlsl_handle,
-		  void *accel_handle,
-		  void *compass_handle,
-		  void *pressure_handle)
-{
-    int result = INV_SUCCESS;
-
-    result = inv_mpu_suspend(mldl_cfg, mlsl_handle, NULL, NULL, NULL,
-                             INV_ALL_SENSORS);
-    return result;
-}
-
-int inv_mpu_resume(struct mldl_cfg* mldl_cfg, 
-                   void *mlsl_handle, 
-                   void *accel_handle, 
-                   void *compass_handle, 
-                   void *pressure_handle,
-                   unsigned long sensors)
-{
-    int result;
-    
-    mldl_cfg->requested_sensors = sensors;
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SET_MPU_CONFIG, mldl_cfg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_RESUME, NULL);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    //MPL_LOGI("%s: Resuming to %04lx\n", __func__, mldl_cfg->requested_sensors);
-
-    return result;
-}
-
-
-int inv_mpu_suspend(struct mldl_cfg *mldl_cfg, 
-          	    void *mlsl_handle,
-                    void *accel_handle,
-                    void *compass_handle,
-                    void *pressure_handle,
-                    unsigned long sensors)
-{
-    int result;
-    unsigned long requested = mldl_cfg->requested_sensors;
-
-    mldl_cfg->requested_sensors = (~sensors) & INV_ALL_SENSORS;
-    //MPL_LOGI("%s: suspending sensors to %04lx\n", __func__,
-    //         mldl_cfg->requested_sensors);
-
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SET_MPU_CONFIG, mldl_cfg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_SUSPEND, NULL);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = ioctl((int)(uintptr_t)mlsl_handle, MPU_GET_MPU_CONFIG, mldl_cfg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    mldl_cfg->requested_sensors = requested;
-    //MPL_LOGI("%s: Will resume next to %04lx\n", __func__, requested);
-
-    return result;
-}
-
-/**
- * Send slave configuration information
- *
- * @param mldl_cfg pointer to the mldl configuration structure
- * @param gyro_handle handle to the gyro sensor
- * @param slave_handle handle to the slave sensor
- * @param slave slave description
- * @param pdata slave platform data
- * @param data where to store the read data
- *
- * @return 0 or non-zero error code
- */
-int inv_mpu_slave_read(struct mldl_cfg *mldl_cfg,
-		void *gyro_handle,
-		void *slave_handle,
-		struct ext_slave_descr *slave,
-		struct ext_slave_platform_data *pdata,
-		unsigned char *data)
-{
-    int result;
-    if (!mldl_cfg || !gyro_handle || !data || !slave) {
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    switch (slave->type) {
-    case EXT_SLAVE_TYPE_ACCELEROMETER:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_ACCEL, data);
-        break;
-    case EXT_SLAVE_TYPE_COMPASS:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_COMPASS, data);
-        break;
-    case EXT_SLAVE_TYPE_PRESSURE:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_READ_PRESSURE, data);
-        break;
-    default:
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return result;
-}
-
-/**
- * Send slave configuration information
- *
- * @param mldl_cfg pointer to the mldl configuration structure
- * @param gyro_handle handle to the gyro sensor
- * @param slave_handle handle to the slave sensor
- * @param data the data being sent
- * @param slave slave description
- * @param pdata slave platform data
- *
- * @return 0 or non-zero error code
- */
-int inv_mpu_slave_config(struct mldl_cfg *mldl_cfg,
-                     void *gyro_handle,
-                     void *slave_handle,
-                     struct ext_slave_config *data,
-                     struct ext_slave_descr *slave,
-                     struct ext_slave_platform_data *pdata)
-{
-    int result;
-    if (!mldl_cfg || !data || !slave || !pdata || !slave) {
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    switch (slave->type) {
-    case EXT_SLAVE_TYPE_ACCELEROMETER:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_ACCEL, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case EXT_SLAVE_TYPE_COMPASS:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_COMPASS, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case EXT_SLAVE_TYPE_PRESSURE:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_CONFIG_PRESSURE, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    default:
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-
-    return result;
-}
-
-/**
- * Request slave configuration information
- *
- * Use this specifically after requesting a slave configuration to see what the
- * slave accually accepted.
- *
- * @param mldl_cfg pointer to the mldl configuration structure
- * @param gyro_handle handle to the gyro sensor
- * @param slave_handle handle to the slave sensor
- * @param data the data being requested.
- * @param slave slave description
- * @param pdata slave platform data
- *
- * @return 0 or non-zero error code
- */
-int inv_mpu_get_slave_config(struct mldl_cfg *mldl_cfg,
-                         void *gyro_handle,
-                         void *slave_handle,
-                         struct ext_slave_config *data,
-                         struct ext_slave_descr *slave,
-                         struct ext_slave_platform_data *pdata)
-{
-    int result;
-    if (!mldl_cfg || !data || !slave) {
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-    switch (slave->type) {
-    case EXT_SLAVE_TYPE_ACCELEROMETER:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_ACCEL, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case EXT_SLAVE_TYPE_COMPASS:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_COMPASS, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    case EXT_SLAVE_TYPE_PRESSURE:
-        result = ioctl((int)(uintptr_t)gyro_handle, MPU_GET_CONFIG_PRESSURE, data);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        break;
-    default:
-        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
-        return INV_ERROR_INVALID_PARAMETER;
-        break;
-    }
-    return result;
-}
-/**
- *@}
- */
diff --git a/60xx/mlsdk/mllite/mldmp.c b/60xx/mlsdk/mllite/mldmp.c
deleted file mode 100644
index 7381dd4..0000000
--- a/60xx/mlsdk/mllite/mldmp.c
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mldmp.c 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- * @addtogroup MLDMP
- *
- * @{
- *      @file     mldmp.c
- *      @brief    Shared functions between all the different DMP versions
-**/
-
-#include <stdio.h>
-
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "mltypes.h"
-#include "ml.h"
-#include "mldl_cfg.h"
-#include "mldl.h"
-#include "compass.h"
-#include "mlSetGyroBias.h"
-#include "mlsl.h"
-#include "mlFIFO.h"
-#include "mldmp.h"
-#include "mlstates.h"
-#include "dmpDefault.h"
-#include "mlFIFOHW.h"
-#include "mlsupervisor.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-dmp"
-
-/**
- *  @brief  Open the default motion sensor engine.
- *          This function is used to open the default MPL engine, 
- *          featuring, for example, sensor fusion (6 axes and 9 axes), 
- *          sensor calibration, accelerometer data byte swapping, among 
- *          others.  
- *          Compare with the other provided engines.
- *
- *  @pre    inv_serial_start() must have been called to instantiate the serial 
- *          communication.
- *  
- *  Example:
- *  @code
- *    result = inv_dmp_open( );
- *    if (INV_SUCCESS != result) {
- *        // Handle the error case
- *    }
- *  @endcode
- *
- *  @return Zero on success; Error Code on any failure.
- *
- */
-inv_error_t inv_dmp_open(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    unsigned char state = inv_get_state();
-    struct mldl_cfg *mldl_cfg;
-    unsigned long requested_sensors;
-
-    /*************************************************************
-     * Common operations before calling DMPOpen
-     ************************************************************/
-    if (state == INV_STATE_DMP_OPENED)
-        return INV_SUCCESS;
-
-    if (state == INV_STATE_DMP_STARTED) {
-        return inv_dmp_stop();
-    }
-
-    result = inv_state_transition(INV_STATE_DMP_OPENED);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    result = inv_dl_open(inv_get_serial_handle());
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-#ifdef ML_USE_DMP_SIM
-    do {
-        void setup_univ();
-        setup_univ();           /* hijack the read and write paths 
-                                   and re-direct them to the simulator */
-    } while (0);
-#endif
-
-    result = inv_setup_dmp();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    // Init vars.
-    inv_init_ml();
-
-    result = inv_init_fifo_param();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_enable_set_bias();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    inv_init_fifo_hardare();
-    mldl_cfg = inv_get_dl_config();
-    requested_sensors = INV_THREE_AXIS_GYRO;
-    if (mldl_cfg->accel && mldl_cfg->accel->resume)
-        requested_sensors |= INV_THREE_AXIS_ACCEL;
-
-    if (mldl_cfg->compass && mldl_cfg->compass->resume)
-        requested_sensors |= INV_THREE_AXIS_COMPASS;
-
-    if (mldl_cfg->pressure && mldl_cfg->pressure->resume)
-        requested_sensors |= INV_THREE_AXIS_PRESSURE;
-
-    result = inv_init_requested_sensors(requested_sensors);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_apply_calibration();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    if (NULL != mldl_cfg->accel){
-        result = inv_apply_endian_accel();
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Start the DMP.
- *
- *  @pre    inv_dmp_open() must have been called.
- * 
- *  @code
- *     result = inv_dmp_start();
- *     if (INV_SUCCESS != result) {
- *         // Handle the error case
- *     }
- *  @endcode
- *
- *  @return INV_SUCCESS if successful, or Non-zero error code otherwise.
- */
-inv_error_t inv_dmp_start(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    if (inv_get_state() == INV_STATE_DMP_STARTED)
-        return INV_SUCCESS;
-
-    result = inv_state_transition(INV_STATE_DMP_STARTED);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    inv_init_sensor_fusion_supervisor();
-    result = inv_dl_start(inv_get_dl_config()->requested_sensors);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    /* This is done after the start since it will modify DMP memory, which 
-     * will cause a full reset is most cases */
-    result = inv_reset_motion();
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Stops the DMP and puts it in low power.
- *
- *  @pre    inv_dmp_start() must have been called.
- * 
- *  @return INV_SUCCESS, Non-zero error code otherwise.
- */
-inv_error_t inv_dmp_stop(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-
-    if (inv_get_state() == INV_STATE_DMP_OPENED)
-        return INV_SUCCESS;
-
-    result = inv_state_transition(INV_STATE_DMP_OPENED);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_dl_stop(INV_ALL_SENSORS);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  Closes the motion sensor engine.
- *          Does not close the serial communication. To do that,
- *          call inv_serial_stop().
- *          After calling inv_dmp_close() another DMP module can be
- *          loaded in the MPL with the corresponding necessary 
- *          intialization and configurations, via any of the 
- *          MLDmpXXXOpen functions.
- *
- *  @pre    inv_dmp_open() must have been called.
- * 
- *  @code
- *     result = inv_dmp_close();
- *     if (INV_SUCCESS != result) {
- *         // Handle the error case
- *     }
- *  @endcode
- *
- *  @return INV_SUCCESS, Non-zero error code otherwise.
- */
-inv_error_t inv_dmp_close(void)
-{
-    INVENSENSE_FUNC_START;
-    inv_error_t result;
-    inv_error_t firstError = INV_SUCCESS;
-
-    if (inv_get_state() <= INV_STATE_DMP_CLOSED)
-        return INV_SUCCESS;
-
-    result = inv_disable_set_bias();
-    ERROR_CHECK_FIRST(firstError, result);
-
-    result = inv_dl_stop(INV_ALL_SENSORS);
-    ERROR_CHECK_FIRST(firstError, result);
-
-    result = inv_close_fifo();
-    ERROR_CHECK_FIRST(firstError, result);
-
-    result = inv_dl_close();
-    ERROR_CHECK_FIRST(firstError, result);
-
-    result = inv_state_transition(INV_STATE_SERIAL_OPENED);
-    ERROR_CHECK_FIRST(firstError, result);
-
-    return result;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/mllite/mldmp.h b/60xx/mlsdk/mllite/mldmp.h
deleted file mode 100644
index f519798..0000000
--- a/60xx/mlsdk/mllite/mldmp.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/***************************************************************************** *
- * $Id: mldmp.h 5629 2011-06-11 03:13:08Z mcaramello $
- ******************************************************************************/
-
-/**
- * @defgroup MLDMP
- * @brief 
- *
- *  These are the top level functions that define how to load the MPL.  In order
- *  to use most of the features, the DMP must be loaded with some code.  The 
- *  loading procedure takes place when calling inv_dmp_open with a given DMP set 
- *  function, after having open the serial communication with the device via 
- *  inv_serial_start().  
- *  The DMP set function will load the DMP memory and enable a certain
- *  set of features.
- *
- *  First select a DMP version from one of the released DMP sets.  
- *  These could be:
- *  - DMP default to load and use the default DMP code featuring pedometer, 
- *    gestures, and orientation.  Use inv_dmp_open().
- *  - DMP pedometer stand-alone to load and use the standalone pedometer
- *    implementation. Use inv_open_low_power_pedometer().
- *  <!-- - DMP EIS ... Use inv_eis_open_dmp(). -->
- *
- *  After inv_dmp_openXXX any number of appropriate initialization and configuration 
- *  routines can be called. Each one of these routines will return an error code 
- *  and will check to make sure that it is compatible with the the DMP version 
- *  selected during the call to inv_dmp_open.
- *
- *  Once the configuration is complete, make a call to inv_dmp_start(). This will
- *  finally turn on the DMP and run the code previously loaded.
- *
- *  While the DMP is running, all data fetching, polling or other functions can 
- *  be called and will return valid data. Some parameteres can be changed while 
- *  the DMP is runing, while others cannot.  Therefore it is important to always 
- *  check the return code of each function.  Check the error code list in mltypes
- *  to know what each returned error corresponds to.
- *
- *  When no more motion processing is required, the library can be shut down and
- *  the DMP turned off.  We can do that by calling inv_dmp_close().  Note that 
- *  inv_dmp_close() will not close the serial communication automatically, which will
- *  remain open an active, in case another module needs to be loaded instead.
- *  If the intention is shutting down the MPL as well, an explicit call to 
- *  inv_serial_stop() following inv_dmp_close() has to be made.
- *
- *  The MPL additionally implements a basic state machine, whose purpose is to
- *  give feedback to the user on whether he is following all the required 
- *  initialization steps.  If an anomalous transition is detected, the user will
- *  be warned by a terminal message with the format:
- *
- *  <tt>"Error : illegal state transition from STATE_1 to STATE_3"</tt>
- *
- *  @{
- *      @file     mldmp.h
- *      @brief    Top level entry functions to the MPL library with DMP support
- */
-
-#ifndef MLDMP_H
-#define MLDMP_H
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mldmp_legacy.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-    inv_error_t inv_dmp_open(void);
-    inv_error_t inv_dmp_start(void);
-    inv_error_t inv_dmp_stop(void);
-    inv_error_t inv_dmp_close(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          /* MLDMP_H */
-/**
- * @}
-**/
diff --git a/60xx/mlsdk/mllite/mlinclude.h b/60xx/mlsdk/mllite/mlinclude.h
deleted file mode 100644
index dcbe904..0000000
--- a/60xx/mlsdk/mllite/mlinclude.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 INV_INCLUDE_H__
-#define INV_INCLUDE_H__
-
-#define INVENSENSE_FUNC_START  typedef int invensensePutFunctionCallsHere
-
-#ifdef COVERAGE
-#include "utestCommon.h"
-#endif
-#ifdef PROFILE
-#include "profile.h"
-#endif
-
-#ifdef WIN32
-#ifdef COVERAGE
-
-extern int functionEnterLog(const char *file, const char *func);
-extern int functionExitLog(const char *file, const char *func);
-
-#undef INVENSENSE_FUNC_START
-#define INVENSENSE_FUNC_START  __pragma(message(__FILE__ "|"__FUNCTION__ )) \
-    int dslkQjDsd = functionEnterLog(__FILE__, __FUNCTION__)
-#endif // COVERAGE
-#endif // WIN32
-
-#ifdef PROFILE
-#undef INVENSENSE_FUNC_START
-#define INVENSENSE_FUNC_START int dslkQjDsd = profileEnter(__FILE__, __FUNCTION__)
-#define return if ( profileExit(__FILE__, __FUNCTION__) ) return
-#endif // PROFILE
-
-// #define return if ( functionExitLog(__FILE__, __FUNCTION__) ) return
-
-#endif //INV_INCLUDE_H__
diff --git a/60xx/mlsdk/mllite/mlstates.c b/60xx/mlsdk/mllite/mlstates.c
deleted file mode 100644
index 8ebb086..0000000
--- a/60xx/mlsdk/mllite/mlstates.c
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlstates.c 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *******************************************************************************/
-
-/** 
- *  @defgroup MLSTATES
- *  @brief  Basic state machine definition and support for the Motion Library.
- *
- *  @{
- *      @file mlstates.c
- *      @brief The Motion Library state machine definition.
- */
-
-#define ML_C
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <stdio.h>
-#include <string.h>
-
-#include "mlstates.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "ml.h"
-#include "mlos.h"
-
-#include <log.h>
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-mlstates"
-
-#define _stateDebug(x)          //{x}
-
-#define MAX_STATE_CHANGE_PROCESSES (8)
-
-struct state_callback_obj {
-    int_fast8_t numStateChangeCallbacks;
-    HANDLE mutex;
-    state_change_callback_t stateChangeCallbacks[MAX_STATE_CHANGE_PROCESSES];
-};
-
-static struct state_callback_obj sStateChangeCallbacks = { 0 };
-
-/* --------------- */
-/* -  Functions. - */
-/* --------------- */
-
-static inv_error_t inv_init_state_callbacks(void)
-{
-    memset(&sStateChangeCallbacks, 0, sizeof(sStateChangeCallbacks));
-    return inv_create_mutex(&sStateChangeCallbacks.mutex);
-}
-
-static inv_error_t MLStateCloseCallbacks(void)
-{
-    inv_error_t result;
-    result = inv_destroy_mutex(sStateChangeCallbacks.mutex);
-    memset(&sStateChangeCallbacks, 0, sizeof(sStateChangeCallbacks));
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  return a string containing the label assigned to the given state.
- *  @param  state   The state of which the label has to be returned.
- *  @return A string containing the state label.
-**/
-char *inv_state_name(unsigned char state)
-{
-    switch (state) {
-    case INV_STATE_SERIAL_CLOSED:
-        return INV_STATE_NAME(INV_STATE_SERIAL_CLOSED);
-        break;
-    case INV_STATE_SERIAL_OPENED:
-        return INV_STATE_NAME(INV_STATE_SERIAL_OPENED);
-        break;
-    case INV_STATE_DMP_OPENED:
-        return INV_STATE_NAME(INV_STATE_DMP_OPENED);
-        break;
-    case INV_STATE_DMP_STARTED:
-        return INV_STATE_NAME(INV_STATE_DMP_STARTED);
-        break;
-    default:
-        return NULL;
-    }
-}
-
-/**
- *  @internal
- *  @brief  Perform a transition from the current state to newState.
- *          Check for the correctness of the transition.
- *          Print out an error message if the transition is illegal .
- *          This routine is also called if a certain normally constant parameters
- *          are changed such as the FIFO Rate.
- *  @param  newState    state we are transitioning to.
- *  @return  
-**/
-inv_error_t inv_state_transition(unsigned char newState)
-{
-    inv_error_t result = INV_SUCCESS;
-
-    if (newState == INV_STATE_SERIAL_CLOSED) {
-        // Always allow transition to closed
-    } else if (newState == INV_STATE_SERIAL_OPENED) {
-        inv_init_state_callbacks(); // Always allow first transition to start over
-    } else if (((newState == INV_STATE_DMP_OPENED) &&
-                ((inv_params_obj.state == INV_STATE_SERIAL_OPENED) ||
-                 (inv_params_obj.state == INV_STATE_DMP_STARTED)))
-               ||
-               ((newState == INV_STATE_DMP_STARTED) &&
-                (inv_params_obj.state == INV_STATE_DMP_OPENED))) {
-        // Valid transitions but no special action required
-    } else {
-        // All other combinations are illegal
-        MPL_LOGE("Error : illegal state transition from %s to %s\n",
-                 inv_state_name(inv_params_obj.state),
-                 inv_state_name(newState));
-        result = INV_ERROR_SM_TRANSITION;
-    }
-
-    if (result == INV_SUCCESS) {
-        _stateDebug(MPL_LOGV
-                    ("ML State transition from %s to %s\n",
-                     inv_state_name(inv_params_obj.state),
-                     inv_state_name(newState)));
-        result = inv_run_state_callbacks(newState);
-        if (INV_SUCCESS == result && newState == INV_STATE_SERIAL_CLOSED) {
-            MLStateCloseCallbacks();
-        }
-        inv_params_obj.state = newState;
-    }
-    return result;
-}
-
-/**
- *  @internal
- *  @brief  To be moved in mlstates.c
-**/
-unsigned char inv_get_state(void)
-{
-    return (inv_params_obj.state);
-}
-
-/**
- * @internal
- * @brief   This registers a function to be called each time the state 
- *          changes. It may also be called when the FIFO Rate is changed.
- *          It will be called at the start of a state change before the
- *          state change has taken place. See Also inv_unregister_state_callback()
- *          The FIFO does not have to be on for this callback.
- * @param func Function to be called when a DMP interrupt occurs.
- * @return INV_SUCCESS or non-zero error code.
- */
-
-inv_error_t inv_register_state_callback(state_change_callback_t callback)
-{
-    INVENSENSE_FUNC_START;
-    int kk;
-    inv_error_t result;
-
-    result = inv_lock_mutex(sStateChangeCallbacks.mutex);
-    if (INV_SUCCESS != result) {
-        return result;
-    }
-    // Make sure we have not filled up our number of allowable callbacks
-    if (sStateChangeCallbacks.numStateChangeCallbacks <
-        MAX_STATE_CHANGE_PROCESSES) {
-        // Make sure we haven't registered this function already
-        for (kk = 0; kk < sStateChangeCallbacks.numStateChangeCallbacks; ++kk) {
-            if (sStateChangeCallbacks.stateChangeCallbacks[kk] == callback) {
-                result = INV_ERROR_INVALID_PARAMETER;
-                break;
-            }
-        }
-
-        if (INV_SUCCESS == result) {
-            // Add new callback
-            sStateChangeCallbacks.stateChangeCallbacks[sStateChangeCallbacks.
-                                                       numStateChangeCallbacks]
-                = callback;
-            sStateChangeCallbacks.numStateChangeCallbacks++;
-        }
-    } else {
-        result = INV_ERROR_MEMORY_EXAUSTED;
-    }
-
-    inv_unlock_mutex(sStateChangeCallbacks.mutex);
-    return result;
-}
-
-/**
- * @internal
- * @brief   This unregisters a function to be called each time the state 
- *          changes. See Also inv_register_state_callback()
- *          The FIFO does not have to be on for this callback.
- * @return INV_SUCCESS or non-zero error code.
- */
-inv_error_t inv_unregister_state_callback(state_change_callback_t callback)
-{
-    INVENSENSE_FUNC_START;
-    int kk, jj;
-    inv_error_t result;
-
-    result = inv_lock_mutex(sStateChangeCallbacks.mutex);
-    if (INV_SUCCESS != result) {
-        return result;
-    }
-    // Make sure we haven't registered this function already
-    result = INV_ERROR_INVALID_PARAMETER;
-    for (kk = 0; kk < sStateChangeCallbacks.numStateChangeCallbacks; ++kk) {
-        if (sStateChangeCallbacks.stateChangeCallbacks[kk] == callback) {
-            for (jj = kk + 1;
-                 jj < sStateChangeCallbacks.numStateChangeCallbacks; ++jj) {
-                sStateChangeCallbacks.stateChangeCallbacks[jj - 1] =
-                    sStateChangeCallbacks.stateChangeCallbacks[jj];
-            }
-            sStateChangeCallbacks.numStateChangeCallbacks--;
-            result = INV_SUCCESS;
-            break;
-        }
-    }
-
-    inv_unlock_mutex(sStateChangeCallbacks.mutex);
-    return result;
-}
-
-inv_error_t inv_run_state_callbacks(unsigned char newState)
-{
-    int kk;
-    inv_error_t result;
-
-    result = inv_lock_mutex(sStateChangeCallbacks.mutex);
-    if (INV_SUCCESS != result) {
-        MPL_LOGE("MLOsLockMutex returned %d\n", result);
-        return result;
-    }
-
-    for (kk = 0; kk < sStateChangeCallbacks.numStateChangeCallbacks; ++kk) {
-        if (sStateChangeCallbacks.stateChangeCallbacks[kk]) {
-            result = sStateChangeCallbacks.stateChangeCallbacks[kk] (newState);
-            if (INV_SUCCESS != result) {
-                break;          // Can't return, must release mutex
-            }
-        }
-    }
-
-    inv_unlock_mutex(sStateChangeCallbacks.mutex);
-    return result;
-}
diff --git a/60xx/mlsdk/mllite/mlstates.h b/60xx/mlsdk/mllite/mlstates.h
deleted file mode 100644
index cbaa610..0000000
--- a/60xx/mlsdk/mllite/mlstates.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlstates.h 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *******************************************************************************/
-
-#ifndef INV_STATES_H__
-#define INV_STATES_H__
-
-#include "mltypes.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlstates_legacy.h"
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* See inv_state_transition for the transition mask */
-#define INV_STATE_SERIAL_CLOSED      (0)
-#define INV_STATE_SERIAL_OPENED      (1)
-#define INV_STATE_DMP_OPENED         (2)
-#define INV_STATE_DMP_STARTED        (3)
-#define INV_STATE_DMP_STOPPED        (INV_STATE_DMP_OPENED)
-#define INV_STATE_DMP_CLOSED         (INV_STATE_SERIAL_OPENED)
-
-#define INV_STATE_NAME(x)            (#x)
-
-    typedef inv_error_t(*state_change_callback_t) (unsigned char newState);
-
-    char *inv_state_name(unsigned char x);
-    inv_error_t inv_state_transition(unsigned char newState);
-    unsigned char inv_get_state(void);
-    inv_error_t inv_register_state_callback(state_change_callback_t callback);
-    inv_error_t inv_unregister_state_callback(state_change_callback_t callback);
-    inv_error_t inv_run_state_callbacks(unsigned char newState);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // INV_STATES_H__
diff --git a/60xx/mlsdk/mllite/mlsupervisor.c b/60xx/mlsdk/mllite/mlsupervisor.c
deleted file mode 100644
index 139297f..0000000
--- a/60xx/mlsdk/mllite/mlsupervisor.c
+++ /dev/null
@@ -1,597 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mlsupervisor.c 5637 2011-06-14 01:13:53Z mcaramello $
- *
- *****************************************************************************/
-
-/**
- *  @defgroup   ML_SUPERVISOR
- *  @brief      Basic sensor fusion supervisor functionalities.
- *
- *  @{
- *      @file   mlsupervisor.c
- *      @brief  Basic sensor fusion supervisor functionalities.
- */
-
-#include "ml.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mltypes.h"
-#include "mlinclude.h"
-#include "compass.h"
-#include "pressure.h"
-#include "dmpKey.h"
-#include "dmpDefault.h"
-#include "mlstates.h"
-#include "mlFIFO.h"
-#include "mlFIFOHW.h"
-#include "mlMathFunc.h"
-#include "mlsupervisor.h"
-#include "mlmath.h"
-
-#include "mlsl.h"
-#include "mlos.h"
-
-#include <log.h>
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-sup"
-
-static unsigned long lastCompassTime = 0;
-static unsigned long polltime = 0;
-static unsigned long coiltime = 0;
-static int accCount = 0;
-static int compassCalStableCount = 0;
-static int compassCalCount = 0;
-static int coiltimerstart = 0;
-static unsigned long disturbtime = 0;
-static int disturbtimerstart = 0;
-
-static yas_filter_if_s f;
-static yas_filter_handle_t handle;
-
-#define SUPERVISOR_DEBUG 0
-
-struct inv_supervisor_cb_obj ml_supervisor_cb = { 0 };
-
-/**
- *  @brief  This initializes all variables that should be reset on
- */
-void inv_init_sensor_fusion_supervisor(void)
-{
-    lastCompassTime = 0;
-    polltime = 0;
-    inv_obj.acc_state = SF_STARTUP_SETTLE;
-    accCount = 0;
-    compassCalStableCount = 0;
-    compassCalCount = 0;
-
-    yas_filter_init(&f);
-    f.init(&handle);
-
-#if defined CONFIG_MPU_SENSORS_MPU6050A2 || \
-	defined CONFIG_MPU_SENSORS_MPU6050B1
-    if (inv_compass_present()) {
-        struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-        if (mldl_cfg->pdata->compass.bus == EXT_SLAVE_BUS_SECONDARY) {
-            (void)inv_send_external_sensor_data(INV_ELEMENT_1 | INV_ELEMENT_2 | INV_ELEMENT_3, INV_16_BIT);
-        }
-    }
-#endif
-
-    if (ml_supervisor_cb.supervisor_reset_func != NULL) {
-        ml_supervisor_cb.supervisor_reset_func();
-    }
-}
-
-static int MLUpdateCompassCalibration3DOF(int command, long *data,
-                                          unsigned long deltaTime)
-{
-    INVENSENSE_FUNC_START;
-    int retValue = INV_SUCCESS;
-    static float m[10][10] = { {0} };
-    float mInv[10][10] = { {0} };
-    float mTmp[10][10] = { {0} };
-    static float xTransY[4] = { 0 };
-    float magSqr = 0;
-    float inpData[3] = { 0 };
-    int i, j;
-    int a, b;
-    float d;
-
-    switch (command) {
-    case CAL_ADD_DATA:
-        inpData[0] = (float)data[0];
-        inpData[1] = (float)data[1];
-        inpData[2] = (float)data[2];
-        m[0][0] += (-2 * inpData[0]) * (-2 * inpData[0]);
-        m[0][1] += (-2 * inpData[0]) * (-2 * inpData[1]);
-        m[0][2] += (-2 * inpData[0]) * (-2 * inpData[2]);
-        m[0][3] += (-2 * inpData[0]);
-        m[1][0] += (-2 * inpData[1]) * (-2 * inpData[0]);
-        m[1][1] += (-2 * inpData[1]) * (-2 * inpData[1]);
-        m[1][2] += (-2 * inpData[1]) * (-2 * inpData[2]);
-        m[1][3] += (-2 * inpData[1]);
-        m[2][0] += (-2 * inpData[2]) * (-2 * inpData[0]);
-        m[2][1] += (-2 * inpData[2]) * (-2 * inpData[1]);
-        m[2][2] += (-2 * inpData[2]) * (-2 * inpData[2]);
-        m[2][3] += (-2 * inpData[2]);
-        m[3][0] += (-2 * inpData[0]);
-        m[3][1] += (-2 * inpData[1]);
-        m[3][2] += (-2 * inpData[2]);
-        m[3][3] += 1.0f;
-        magSqr =
-            inpData[0] * inpData[0] + inpData[1] * inpData[1] +
-            inpData[2] * inpData[2];
-        xTransY[0] += (-2 * inpData[0]) * magSqr;
-        xTransY[1] += (-2 * inpData[1]) * magSqr;
-        xTransY[2] += (-2 * inpData[2]) * magSqr;
-        xTransY[3] += magSqr;
-        break;
-    case CAL_RUN:
-        a = 4;
-        b = a;
-        for (i = 0; i < b; i++) {
-            for (j = 0; j < b; j++) {
-                a = b;
-                inv_matrix_det_inc(&m[0][0], &mTmp[0][0], &a, i, j);
-                mInv[j][i] = SIGNM(i + j) * inv_matrix_det(&mTmp[0][0], &a);
-            }
-        }
-        a = b;
-        d = inv_matrix_det(&m[0][0], &a);
-        if (d == 0) {
-            return INV_ERROR;
-        }
-        for (i = 0; i < 3; i++) {
-            float tmp = 0;
-            for (j = 0; j < 4; j++) {
-                tmp += mInv[j][i] / d * xTransY[j];
-            }
-            inv_obj.compass_test_bias[i] =
-                -(long)(tmp * inv_obj.compass_sens / 16384.0f);
-        }
-        break;
-    case CAL_RESET:
-        for (i = 0; i < 4; i++) {
-            for (j = 0; j < 4; j++) {
-                m[i][j] = 0;
-            }
-            xTransY[i] = 0;
-        }
-    default:
-        break;
-    }
-    return retValue;
-}
-
-/**
- * Entry point for Sensor Fusion operations
- * @internal
- * @param magFB magnetormeter FB
- * @param accSF accelerometer SF
- */
-static inv_error_t MLSensorFusionSupervisor(double *magFB, long *accSF,
-                                            unsigned long deltaTime)
-{
-    static long prevCompassBias[3] = { 0 };
-    static long magMax[3] = {
-        -1073741824L,
-        -1073741824L,
-        -1073741824L
-    };
-    static long magMin[3] = {
-        1073741824L,
-        1073741824L,
-        1073741824L
-    };
-    int gyroMag;
-    long accMag;
-    inv_error_t result;
-    int i;
-
-    if (ml_supervisor_cb.progressive_no_motion_supervisor_func != NULL) {
-        ml_supervisor_cb.progressive_no_motion_supervisor_func(deltaTime);
-    }
-
-    gyroMag = inv_get_gyro_sum_of_sqr() >> GYRO_MAG_SQR_SHIFT;
-    accMag = inv_accel_sum_of_sqr();
-
-    // Scaling below assumes certain scaling.
-#if ACC_MAG_SQR_SHIFT != 16
-#error
-#endif
-
-    if (ml_supervisor_cb.sensor_fusion_advanced_func != NULL) {
-        result = ml_supervisor_cb.sensor_fusion_advanced_func(magFB, deltaTime);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    } else if (inv_params_obj.bias_mode & INV_MAG_BIAS_FROM_MOTION) {
-        //Most basic compass calibration, used only with lite MPL
-        if (inv_obj.resetting_compass == 1) {
-            for (i = 0; i < 3; i++) {
-                magMax[i] = -1073741824L;
-                magMin[i] = 1073741824L;
-                prevCompassBias[i] = 0;
-            }
-            compassCalStableCount = 0;
-            compassCalCount = 0;
-            inv_obj.resetting_compass = 0;
-        }
-        if ((gyroMag > 400) || (inv_get_gyro_present() == 0)) {
-            if (compassCalStableCount < 1000) {
-                for (i = 0; i < 3; i++) {
-                    if (inv_obj.compass_sensor_data[i] > magMax[i]) {
-                        magMax[i] = inv_obj.compass_sensor_data[i];
-                    }
-                    if (inv_obj.compass_sensor_data[i] < magMin[i]) {
-                        magMin[i] = inv_obj.compass_sensor_data[i];
-                    }
-                }
-                MLUpdateCompassCalibration3DOF(CAL_ADD_DATA,
-                                               inv_obj.compass_sensor_data,
-                                               deltaTime);
-                compassCalStableCount += deltaTime;
-                for (i = 0; i < 3; i++) {
-                    if (magMax[i] - magMin[i] <
-                        (long long)40 * 1073741824 / inv_obj.compass_sens) {
-                        compassCalStableCount = 0;
-                    }
-                }
-            } else {
-                if (compassCalStableCount >= 1000) {
-                    if (MLUpdateCompassCalibration3DOF
-                        (CAL_RUN, inv_obj.compass_sensor_data,
-                         deltaTime) == INV_SUCCESS) {
-                        inv_obj.got_compass_bias = 1;
-                        inv_obj.compass_accuracy = 3;
-                        for(i=0; i<3; i++) {
-                            inv_obj.compass_bias_error[i] = 35;
-                        }
-                        if (inv_obj.compass_state == SF_UNCALIBRATED)
-                            inv_obj.compass_state = SF_STARTUP_SETTLE;
-                        inv_set_compass_bias(inv_obj.compass_test_bias);
-                    }
-                    compassCalCount = 0;
-                    compassCalStableCount = 0;
-                    for (i = 0; i < 3; i++) {
-                        magMax[i] = -1073741824L;
-                        magMin[i] = 1073741824L;
-                        prevCompassBias[i] = 0;
-                    }
-                    MLUpdateCompassCalibration3DOF(CAL_RESET,
-                                                   inv_obj.compass_sensor_data,
-                                                   deltaTime);
-                }
-            }
-        }
-        compassCalCount += deltaTime;
-        if (compassCalCount > 20000) {
-            compassCalCount = 0;
-            compassCalStableCount = 0;
-            for (i = 0; i < 3; i++) {
-                magMax[i] = -1073741824L;
-                magMin[i] = 1073741824L;
-                prevCompassBias[i] = 0;
-            }
-            MLUpdateCompassCalibration3DOF(CAL_RESET,
-                                           inv_obj.compass_sensor_data,
-                                           deltaTime);
-        }
-    }
-
-    if (inv_obj.acc_state != SF_STARTUP_SETTLE) {
-        if (((accMag > 260000L) || (accMag < 6000)) || (gyroMag > 2250000L)) {
-            inv_obj.acc_state = SF_DISTURBANCE; //No accels, fast swing
-            accCount = 0;
-        } else {
-            if ((gyroMag < 400) && (accMag < 200000L) && (accMag > 26214)
-                && ((inv_obj.acc_state == SF_DISTURBANCE)
-                    || (inv_obj.acc_state == SF_SLOW_SETTLE))) {
-                accCount += deltaTime;
-                if (accCount > 0) {
-                    inv_obj.acc_state = SF_FAST_SETTLE;
-                    accCount = 0;
-                }
-            } else {
-                if (inv_obj.acc_state == SF_DISTURBANCE) {
-                    accCount += deltaTime;
-                    if (accCount > 500) {
-                        inv_obj.acc_state = SF_SLOW_SETTLE;
-                        accCount = 0;
-                    }
-                } else if (inv_obj.acc_state == SF_SLOW_SETTLE) {
-                    accCount += deltaTime;
-                    if (accCount > 1000) {
-                        inv_obj.acc_state = SF_NORMAL;
-                        accCount = 0;
-                    }
-                } else if (inv_obj.acc_state == SF_FAST_SETTLE) {
-                    accCount += deltaTime;
-                    if (accCount > 250) {
-                        inv_obj.acc_state = SF_NORMAL;
-                        accCount = 0;
-                    }
-                }
-            }
-        }
-    }
-    if (inv_obj.acc_state == SF_STARTUP_SETTLE) {
-        accCount += deltaTime;
-        if (accCount > 50) {
-            *accSF = 1073741824;    //Startup settling
-            inv_obj.acc_state = SF_NORMAL;
-            accCount = 0;
-        }
-    } else if ((inv_obj.acc_state == SF_NORMAL)
-               || (inv_obj.acc_state == SF_SLOW_SETTLE)) {
-        *accSF = inv_obj.accel_sens * 64;   //Normal
-    } else if ((inv_obj.acc_state == SF_DISTURBANCE)) {
-        *accSF = inv_obj.accel_sens * 64;   //Don't use accel (should be 0)
-    } else if (inv_obj.acc_state == SF_FAST_SETTLE) {
-        *accSF = inv_obj.accel_sens * 512;  //Amplify accel
-    }
-    if (!inv_get_gyro_present()) {
-        *accSF = inv_obj.accel_sens * 128;
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Entry point for software sensor fusion operations.
- *          Manages hardware interaction, calls sensor fusion supervisor for
- *          bias calculation.
- *  @return error code. INV_SUCCESS if no error occurred.
- */
-inv_error_t inv_accel_compass_supervisor(void)
-{
-    inv_error_t result;
-    int adjustSensorFusion = 0;
-    long accSF = 1073741824;
-    static double magFB = 0;
-    long magSensorData[3];
-    float fcin[3];
-    float fcout[3];
-    
-
-    if (inv_compass_present()) {    /* check for compass data */
-        int i, j;
-        long long tmp[3] = { 0 };
-        long long tmp64 = 0;
-        unsigned long ctime = inv_get_tick_count();
-        if (((inv_get_compass_id() == COMPASS_ID_AK8975) &&
-             ((ctime - polltime) > 20)) ||
-            (polltime == 0 || ((ctime - polltime) > 20))) { // 50Hz max
-            if (SUPERVISOR_DEBUG) {
-                MPL_LOGV("Fetch compass data from inv_process_fifo_packet\n");
-                MPL_LOGV("delta time = %ld\n", ctime - polltime);
-            }
-            polltime = ctime;
-            result = inv_get_compass_data(magSensorData);
-            /* external slave wants the data even if there is an error */
-            if (result && !inv_obj.external_slave_callback) {
-                if (SUPERVISOR_DEBUG) {
-                    MPL_LOGW("inv_get_compass_data returned %d\n", result);
-                }
-            } else {
-                unsigned long compassTime = inv_get_tick_count();
-                unsigned long deltaTime = 1;
-
-                if (result == INV_SUCCESS) {
-                    if (lastCompassTime != 0) {
-                        deltaTime = compassTime - lastCompassTime;
-                    }
-                    lastCompassTime = compassTime;
-                    adjustSensorFusion = 1;
-                    if (inv_obj.got_init_compass_bias == 0) {
-                        inv_obj.got_init_compass_bias = 1;
-                        for (i = 0; i < 3; i++) {
-                            inv_obj.init_compass_bias[i] = magSensorData[i];
-                        }
-                    }
-                    for (i = 0; i < 3; i++) {
-                        inv_obj.compass_sensor_data[i] = (long)magSensorData[i];
-                        inv_obj.compass_sensor_data[i] -=
-                            inv_obj.init_compass_bias[i];
-                        tmp[i] = ((long long)inv_obj.compass_sensor_data[i])
-                            * inv_obj.compass_sens / 16384;
-                        tmp[i] -= inv_obj.compass_bias[i];
-                        tmp[i] = (tmp[i] * inv_obj.compass_scale[i]) / 65536L;
-                    }
-                    for (i = 0; i < 3; i++) {
-                        tmp64 = 0;
-                        for (j = 0; j < 3; j++) {
-                            tmp64 += (long long) tmp[j] *
-                                inv_obj.compass_cal[i * 3 + j];
-                        }
-                        inv_obj.compass_calibrated_data[i] =
-                            (long) (tmp64 / inv_obj.compass_sens);
-                    }
-                    //Additions:
-                    if ((inv_obj.compass_state == 1) &&
-                            (inv_obj.compass_overunder == 0)) {
-                        if (disturbtimerstart == 0) {
-                            disturbtimerstart = 1;
-                            disturbtime = ctime;
-                        }
-                    } else {
-                        disturbtimerstart = 0;
-                    }
-
-                    if (inv_obj.compass_overunder) {
-                        if (coiltimerstart == 0) {
-                            coiltimerstart = 1;
-                            coiltime = ctime;
-                        }
-                    }
-                    if (coiltimerstart == 1) {
-                        if (ctime - coiltime > 3000) {
-                            inv_obj.flags[INV_COMPASS_OFFSET_VALID] = 0;
-                            inv_set_compass_offset();
-                            inv_reset_compass_calibration();
-                            coiltimerstart = 0;
-                        }
-                    }
-
-                    if (disturbtimerstart == 1) {
-                        if (ctime - disturbtime > 10000) {
-                            inv_obj.flags[INV_COMPASS_OFFSET_VALID] = 0;
-                            inv_set_compass_offset();
-                            inv_reset_compass_calibration();
-                            MPL_LOGI("Compass reset! inv_reset_compass_calibration \n");
-                            disturbtimerstart = 0;
-                        }
-                    }
-                }
-                if (inv_obj.external_slave_callback) {
-                    result = inv_obj.external_slave_callback(&inv_obj);
-                    if (result) {
-                        LOG_RESULT_LOCATION(result);
-                        return result;
-                    }
-                }
-
-#ifdef APPLY_COMPASS_FILTER
-                if (inv_get_compass_id() == COMPASS_ID_YAS530)
-                {
-                    fcin[0] = 1000*((float)inv_obj.compass_calibrated_data[0] /65536.f);
-                    fcin[1] = 1000*((float)inv_obj.compass_calibrated_data[1] /65536.f);
-                    fcin[2] = 1000*((float)inv_obj.compass_calibrated_data[2] /65536.f);
-
-                    f.update(&handle, fcin, fcout);
-
-                    inv_obj.compass_calibrated_data[0] = (long)(fcout[0]*65536.f/1000.f);
-                    inv_obj.compass_calibrated_data[1] = (long)(fcout[1]*65536.f/1000.f);
-                    inv_obj.compass_calibrated_data[2] = (long)(fcout[2]*65536.f/1000.f);
-                }
-#endif
-
-                if (SUPERVISOR_DEBUG) {
-                    MPL_LOGI("RM : %+10.6f %+10.6f %+10.6f\n",
-                             (float)inv_obj.compass_calibrated_data[0] /
-                             65536.f,
-                             (float)inv_obj.compass_calibrated_data[1] /
-                             65536.f,
-                             (float)inv_obj.compass_calibrated_data[2] /
-                             65536.f);
-                }
-                magFB = 1.0;
-                adjustSensorFusion = 1;
-                result = MLSensorFusionSupervisor(&magFB, &accSF, deltaTime);
-                if (result) {
-                    LOG_RESULT_LOCATION(result);
-                    return result;
-                }
-            }
-        }
-    } else {
-        //No compass, but still modify accel
-        unsigned long ctime = inv_get_tick_count();
-        if (polltime == 0 || ((ctime - polltime) > 80)) {   // at the beginning AND every 1/8 second
-            unsigned long deltaTime = 1;
-            adjustSensorFusion = 1;
-            magFB = 0;
-            if (polltime != 0) {
-                deltaTime = ctime - polltime;
-            }
-            MLSensorFusionSupervisor(&magFB, &accSF, deltaTime);
-            polltime = ctime;
-        }
-    }
-    if (adjustSensorFusion == 1) {
-        unsigned char regs[4];
-        static int prevAccSF = 1;
-
-        if (accSF != prevAccSF) {
-            regs[0] = (unsigned char)((accSF >> 24) & 0xff);
-            regs[1] = (unsigned char)((accSF >> 16) & 0xff);
-            regs[2] = (unsigned char)((accSF >> 8) & 0xff);
-            regs[3] = (unsigned char)(accSF & 0xff);
-            result = inv_set_mpu_memory(KEY_D_0_96, 4, regs);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            prevAccSF = accSF;
-        }
-    }
-
-    if (ml_supervisor_cb.accel_compass_fusion_func != NULL)
-        ml_supervisor_cb.accel_compass_fusion_func(magFB);
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Entry point for software sensor fusion operations.
- *          Manages hardware interaction, calls sensor fusion supervisor for
- *          bias calculation.
- *  @return INV_SUCCESS or non-zero error code on error.
- */
-inv_error_t inv_pressure_supervisor(void)
-{
-    long pressureSensorData[1];
-    static unsigned long pressurePolltime = 0;
-    if (inv_pressure_present()) {   /* check for pressure data */
-        unsigned long ctime = inv_get_tick_count();
-        if ((pressurePolltime == 0 || ((ctime - pressurePolltime) > 80))) { //every 1/8 second
-            if (SUPERVISOR_DEBUG) {
-                MPL_LOGV("Fetch pressure data\n");
-                MPL_LOGV("delta time = %ld\n", ctime - pressurePolltime);
-            }
-            pressurePolltime = ctime;
-            if (inv_get_pressure_data(&pressureSensorData[0]) == INV_SUCCESS) {
-                inv_obj.pressure = pressureSensorData[0];
-            }
-        }
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  Resets the magnetometer calibration algorithm.
- *  @return INV_SUCCESS if successful, or non-zero error code otherwise.
- */
-inv_error_t inv_reset_compass_calibration(void)
-{
-    if (inv_params_obj.bias_mode & INV_MAG_BIAS_FROM_GYRO) {
-        if (ml_supervisor_cb.reset_advanced_compass_func != NULL)
-            ml_supervisor_cb.reset_advanced_compass_func();
-    }
-    MLUpdateCompassCalibration3DOF(CAL_RESET, inv_obj.compass_sensor_data, 1);
-
-    inv_obj.compass_bias_error[0] = P_INIT;
-    inv_obj.compass_bias_error[1] = P_INIT;
-    inv_obj.compass_bias_error[2] = P_INIT;
-    inv_obj.compass_accuracy = 0;
-
-    inv_obj.got_compass_bias = 0;
-    inv_obj.got_init_compass_bias = 0;
-    inv_obj.compass_state = SF_UNCALIBRATED;
-    inv_obj.resetting_compass = 1;
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/mllite/mlsupervisor.h b/60xx/mlsdk/mllite/mlsupervisor.h
deleted file mode 100644
index 62b427e..0000000
--- a/60xx/mlsdk/mllite/mlsupervisor.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mlsupervisor.h 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *****************************************************************************/
-
-#ifndef __INV_SUPERVISOR_H__
-#define __INV_SUPERVISOR_H__
-
-#include "mltypes.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "mlsupervisor_legacy.h"
-#endif
-
-// The value of inv_get_gyro_sum_of_sqr is scaled such the (1 dps)^2 = 2^this_number
-// this number must be >=0 and even.
-#define GYRO_MAG_SQR_SHIFT 6
-// The value of inv_accel_sum_of_sqr is scaled such that (1g)^2 = 2^this_number
-#define ACC_MAG_SQR_SHIFT 16
-
-#define CAL_RUN             0
-#define CAL_RESET           1
-#define CAL_CHANGED_DATA    2
-#define CAL_RESET_TIME      3
-#define CAL_ADD_DATA        4
-#define CAL_COMBINE         5
-
-#define P_INIT  100000
-
-#define SF_NORMAL           0
-#define SF_DISTURBANCE      1
-#define SF_FAST_SETTLE      2
-#define SF_SLOW_SETTLE      3
-#define SF_STARTUP_SETTLE   4
-#define SF_UNCALIBRATED     5
-
-struct inv_supervisor_cb_obj {
-    void (*accel_compass_fusion_func) (double magFB);
-     inv_error_t(*progressive_no_motion_supervisor_func) (unsigned long
-                                                          deltaTime);
-     inv_error_t(*sensor_fusion_advanced_func) (double *magFB,
-                                                unsigned long deltaTime);
-    void (*reset_advanced_compass_func) (void);
-    void (*supervisor_reset_func) (void);
-};
-
-inv_error_t inv_reset_compass_calibration(void);
-void inv_init_sensor_fusion_supervisor(void);
-inv_error_t inv_accel_compass_supervisor(void);
-inv_error_t inv_pressure_supervisor(void);
-
-#endif // __INV_SUPERVISOR_H__
-
diff --git a/60xx/mlsdk/mllite/pressure.c b/60xx/mlsdk/mllite/pressure.c
deleted file mode 100644
index 9c162ec..0000000
--- a/60xx/mlsdk/mllite/pressure.c
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: pressure.c 4120 2010-11-21 19:56:16Z mcaramello $
- *
- *******************************************************************************/
-
-/** 
- *  @defgroup PRESSUREDL 
- *  @brief  Motion Library - Pressure Driver Layer.
- *          Provides the interface to setup and handle a pressure sensor
- *          connected to either the primary or the seconday I2C interface 
- *          of the gyroscope.
- *
- *  @{
- *      @file   pressure.c
- *      @brief  Pressure setup and handling methods.
-**/
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-
-#include <string.h>
-
-#include "pressure.h"
-
-#include "ml.h"
-#include "mlinclude.h"
-#include "dmpKey.h"
-#include "mlFIFO.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "mlMathFunc.h"
-#include "mlsl.h"
-#include "mlos.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-pressure"
-
-#define _pressureDebug(x)       //{x}
-
-/* --------------------- */
-/* - Global Variables. - */
-/* --------------------- */
-
-/* --------------------- */
-/* - Static Variables. - */
-/* --------------------- */
-
-/* --------------- */
-/* - Prototypes. - */
-/* --------------- */
-
-/* -------------- */
-/* - Externs.   - */
-/* -------------- */
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-/** 
- *  @brief  Is a pressure configured and used by MPL?
- *  @return INV_SUCCESS if the pressure is present.
- */
-unsigned char inv_pressure_present(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->pressure &&
-        NULL != mldl_cfg->pressure->resume &&
-        mldl_cfg->requested_sensors & INV_THREE_AXIS_PRESSURE)
-        return TRUE;
-    else
-        return FALSE;
-}
-
-/**
- *  @brief   Query the pressure slave address.
- *  @return  The 7-bit pressure slave address.
- */
-unsigned char inv_get_pressure_slave_addr(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->pdata)
-        return mldl_cfg->pdata->pressure.address;
-    else
-        return 0;
-}
-
-/**
- *  @brief   Get the ID of the pressure in use.
- *  @return  ID of the pressure in use.
- */
-unsigned short inv_get_pressure_id(void)
-{
-    INVENSENSE_FUNC_START;
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-    if (NULL != mldl_cfg->pressure) {
-        return mldl_cfg->pressure->id;
-    }
-    return ID_INVALID;
-}
-
-/**
- *  @brief  Get a sample of pressure data from the device.
- *  @param  data
- *              the buffer to store the pressure raw data for
- *              X, Y, and Z axes.
- *  @return INV_SUCCESS or a non-zero error code.
- */
-inv_error_t inv_get_pressure_data(long *data)
-{
-    inv_error_t result = INV_SUCCESS;
-    unsigned char tmp[3];
-    struct mldl_cfg *mldl_cfg = inv_get_dl_config();
-
-    /*--- read the pressure sensor data.
-          The pressure read function may return an INV_ERROR_PRESSURE_* errors
-          when the data is not ready (read/refresh frequency mismatch) or 
-          the internal data sampling timing of the device was not respected. 
-          Returning the error code will make the sensor fusion supervisor 
-          ignore this pressure data sample. ---*/
-    result = (inv_error_t) inv_mpu_read_pressure(mldl_cfg,
-                                                 inv_get_serial_handle(),
-                                                 inv_get_serial_handle(), tmp);
-    if (result) {
-        _pressureDebug(MPL_LOGV
-                       ("inv_mpu_read_pressure returned %d (%s)\n", result,
-                        MLErrorCode(result)));
-        return result;
-    }
-    if (EXT_SLAVE_BIG_ENDIAN == mldl_cfg->pressure->endian)
-        data[0] =
-            (((long)((signed char)tmp[0])) << 16) + (((long)tmp[1]) << 8) +
-            ((long)tmp[2]);
-    else
-        data[0] =
-            (((long)((signed char)tmp[2])) << 16) + (((long)tmp[1]) << 8) +
-            ((long)tmp[0]);
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/mllite/pressure.h b/60xx/mlsdk/mllite/pressure.h
deleted file mode 100644
index 77c5d43..0000000
--- a/60xx/mlsdk/mllite/pressure.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: pressure.h 4092 2010-11-17 23:49:22Z kkeal $
- *
- *******************************************************************************/
-
-#ifndef PRESSURE_H
-#define PRESSURE_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#include "mpu.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "pressure_legacy.h"
-#endif
-
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-#define USE_PRESSURE_BMA                    0
-
-#define PRESSURE_SLAVEADDR_INVALID          0x00
-#define PRESSURE_SLAVEADDR_BMA085           0x77
-
-/*
-    Define default pressure to use if no selection is made
-*/
-#if USE_PRESSURE_BMA
-#define DEFAULT_PRESSURE_TYPE              PRESSURE_ID_BMA
-#endif
-
-    /* --------------- */
-    /* - Structures. - */
-    /* --------------- */
-
-    /* --------------------- */
-    /* - Function p-types. - */
-    /* --------------------- */
-
-    unsigned char inv_pressure_present(void);
-    unsigned char inv_get_pressure_slave_addr(void);
-    inv_error_t inv_suspend_pressure(void);
-    inv_error_t inv_resume_presure(void);
-    inv_error_t inv_get_pressure_data(long *data);
-    unsigned short inv_get_pressure_id(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          // PRESSURE_H
diff --git a/60xx/mlsdk/mlutils/checksum.c b/60xx/mlsdk/mlutils/checksum.c
deleted file mode 100644
index a97477d..0000000
--- a/60xx/mlsdk/mlutils/checksum.c
+++ /dev/null
@@ -1,16 +0,0 @@
-#include "mltypes.h"
-
-/** bernstein hash, from public domain source */
-
-uint32_t inv_checksum(unsigned char *str, int len)
-{
-    uint32_t hash = 5381;
-    int i, c;
-
-    for (i = 0; i < len; i++) {
-        c = *(str + i);
-        hash = ((hash << 5) + hash) + c;    /* hash * 33 + c */
-    }
-
-    return hash;
-}
diff --git a/60xx/mlsdk/mlutils/checksum.h b/60xx/mlsdk/mlutils/checksum.h
deleted file mode 100644
index 4d3f046..0000000
--- a/60xx/mlsdk/mlutils/checksum.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef MPLCHECKSUM_H
-#define MPLCHECKSUM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mltypes.h"
-#ifdef INV_INCLUDE_LEGACY_HEADERS
-#include "checksum_legacy.h"
-#endif
-
-    uint32_t inv_checksum(unsigned char *str, int len);
-
-#ifdef __cplusplus
-}
-#endif
-#endif                          /* MPLCHECKSUM_H */
diff --git a/60xx/mlsdk/mlutils/mputest.c b/60xx/mlsdk/mlutils/mputest.c
deleted file mode 100644
index ac0fa30..0000000
--- a/60xx/mlsdk/mlutils/mputest.c
+++ /dev/null
@@ -1,1396 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mputest.c 5637 2011-06-14 01:13:53Z mcaramello $
- *
- *****************************************************************************/
-
-/*
- *  MPU Self Test functions
- *  Version 2.4
- *  May 13th, 2011
- */
-
-/**
- *  @defgroup MPU_SELF_TEST
- *  @brief  MPU Self Test functions
- *
- *  These functions provide an in-site test of the MPU 3xxx chips. The main
- *      entry point is the inv_mpu_test function.
- *  This runs the tests (as described in the accompanying documentation) and
- *      writes a configuration file containing initial calibration data.
- *  inv_mpu_test returns INV_SUCCESS if the chip passes the tests.
- *  Otherwise, an error code is returned.
- *  The functions in this file rely on MLSL and MLOS: refer to the MPL
- *      documentation for more information regarding the system interface
- *      files.
- *
- *  @{
- *      @file   mputest.c
- *      @brief  MPU Self Test routines for assessing gyro sensor status
- *              after surface mount has happened on the target host platform.
- */
-
-#include <stdio.h>
-#include <time.h>
-#include <string.h>
-#include <math.h>
-#include <stdlib.h>
-#ifdef LINUX
-#include <unistd.h>
-#endif
-
-#include "mpu.h"
-#include "mldl.h"
-#include "mldl_cfg.h"
-#include "accel.h"
-#include "mlFIFO.h"
-#include "slave.h"
-#include "ml.h"
-#include "ml_stored_data.h"
-#include "checksum.h"
-
-#include "mlsl.h"
-#include "mlos.h"
-
-#include "log.h"
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-mpust"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
-    Defines
-*/
-
-#define VERBOSE_OUT 0
-
-/*#define TRACK_IDS*/
-
-/*--- Test parameters defaults. See set_test_parameters for more details ---*/
-
-#define DEF_MPU_ADDR             (0x68)        /* I2C address of the mpu     */
-
-#if (USE_SENSE_PATH_TEST == 1)                 /* gyro full scale dps        */
-#define DEF_GYRO_FULLSCALE       (2000)
-#else
-#define DEF_GYRO_FULLSCALE       (250)
-#endif
-
-#define DEF_GYRO_SENS            (32768.f / DEF_GYRO_FULLSCALE)
-                                               /* gyro sensitivity LSB/dps   */
-#define DEF_PACKET_THRESH        (75)          /* 600 ms / 8ms / sample      */
-#define DEF_TOTAL_TIMING_TOL     (.03f)        /* 3% = 2 pkts + 1% proc tol. */
-#define DEF_BIAS_THRESH          (40 * DEF_GYRO_SENS)
-                                               /* 40 dps in LSBs             */
-#define DEF_RMS_THRESH           (0.4f * DEF_GYRO_SENS)
-                                               /* 0.4 dps-rms in LSB-rms     */
-#define DEF_SP_SHIFT_THRESH_CUST (.05f)        /* 5%                         */
-#define DEF_TEST_TIME_PER_AXIS   (600)         /* ms of time spent collecting
-                                                  data for each axis,
-                                                  multiple of 600ms          */
-#define DEF_N_ACCEL_SAMPLES      (20)          /* num of accel samples to
-                                                  average from, if applic.   */
-
-#define ML_INIT_CAL_LEN          (36)          /* length in bytes of
-                                                  calibration data file      */
-
-/*
-    Macros
-*/
-
-#define CHECK_TEST_ERROR(x)                                                 \
-    if (x) {                                                                \
-        MPL_LOGI("error %d @ %s|%d\n", x, __func__, __LINE__);              \
-        return (-1);                                                        \
-    }
-
-#define SHORT_TO_TEMP_C(shrt)         (((shrt+13200.f)/280.f)+35.f)
-
-#define USHORT_TO_CHARS(chr,shrt)     (chr)[0]=(unsigned char)(shrt>>8);    \
-                                      (chr)[1]=(unsigned char)(shrt);
-
-#define UINT_TO_CHARS(chr,ui)         (chr)[0]=(unsigned char)(ui>>24);     \
-                                      (chr)[1]=(unsigned char)(ui>>16);     \
-                                      (chr)[2]=(unsigned char)(ui>>8);      \
-                                      (chr)[3]=(unsigned char)(ui);
-
-#define FLOAT_TO_SHORT(f)             (                                     \
-                                        (fabs(f-(short)f)>=0.5) ? (         \
-                                            ((short)f)+(f<0?(-1):(+1))) :   \
-                                            ((short)f)                      \
-                                      )
-
-#define CHARS_TO_SHORT(d)             ((((short)(d)[0])<<8)+(d)[1])
-#define CHARS_TO_SHORT_SWAPPED(d)     ((((short)(d)[1])<<8)+(d)[0])
-
-#define ACCEL_UNPACK(d) d[0], d[1], d[2], d[3], d[4], d[5]
-
-#define CHECK_NACKS(d)  (                               \
-                         d[0]==0xff && d[1]==0xff &&    \
-                         d[2]==0xff && d[3]==0xff &&    \
-                         d[4]==0xff && d[5]==0xff       \
-                        )
-
-/*
-    Prototypes
-*/
-
-static inv_error_t test_get_data(
-                    void *mlsl_handle,
-                    struct mldl_cfg *mputestCfgPtr,
-                    short *vals);
-
-/*
-    Types
-*/
-typedef struct {
-    float gyro_sens;
-    int gyro_fs;
-    int packet_thresh;
-    float total_timing_tol;
-    int bias_thresh;
-    float rms_threshSq;
-    float sp_shift_thresh;
-    unsigned int test_time_per_axis;
-    unsigned short accel_samples;
-} tTestSetup;
-
-/*
-    Global variables
-*/
-static unsigned char dataout[20];
-static unsigned char dataStore[ML_INIT_CAL_LEN];
-
-static tTestSetup test_setup = {
-    DEF_GYRO_SENS,
-    DEF_GYRO_FULLSCALE,
-    DEF_PACKET_THRESH,
-    DEF_TOTAL_TIMING_TOL,
-    (int)DEF_BIAS_THRESH,
-    DEF_RMS_THRESH * DEF_RMS_THRESH,
-    DEF_SP_SHIFT_THRESH_CUST,
-    DEF_TEST_TIME_PER_AXIS,
-    DEF_N_ACCEL_SAMPLES
-};
-
-static float adjGyroSens;
-static char a_name[3][2] = {"X", "Y", "Z"};
-
-/*
-    NOTE :  modify get_slave_descr parameter below to reflect
-                the DEFAULT accelerometer in use. The accelerometer in use
-                can be modified at run-time using the inv_test_setup_accel API.
-    NOTE :  modify the expected z axis orientation (Z axis pointing
-                upward or downward)
-*/
-
-signed char g_z_sign = +1;
-struct mldl_cfg *mputestCfgPtr = NULL;
-
-#ifndef LINUX
-/**
- *  @internal
- *  @brief  usec precision sleep function.
- *  @param  number of micro seconds (us) to sleep for.
- */
-static void usleep(unsigned long t)
-{
-    unsigned long start = inv_get_tick_count();
-    while (inv_get_tick_count()-start < t / 1000);
-}
-#endif
-
-/**
- *  @brief  Modify the self test limits from their default values.
- *
- *  @param  slave_addr
- *              the slave address the MPU device is setup to respond at.
- *              The default is DEF_MPU_ADDR = 0x68.
- *  @param  sensitivity
- *              the read sensitivity of the device in LSB/dps as it is trimmed.
- *              NOTE :  if using the self test as part of the MPL, the
- *                      sensitivity the different sensitivity trims are already
- *                      taken care of.
- *  @param  p_thresh
- *              number of packets expected to be received in a 600 ms period.
- *              Depends on the sampling frequency of choice (set by default to
- *              125 Hz) and low pass filter cut-off frequency selection (set
- *              to 42 Hz).
- *              The default is DEF_PACKET_THRESH = 75 packets.
- *  @param  total_time_tol
- *              time skew tolerance, taking into account imprecision in turning
- *              the FIFO on and off and the processor time imprecision (for
- *              1 GHz processor).
- *              The default is DEF_TOTAL_TIMING_TOL = 3 %, about 2 packets.
- *  @param  bias_thresh
- *              bias level threshold, the maximun acceptable no motion bias
- *              for a production quality part.
- *              The default is DEF_BIAS_THRESH = 40 dps.
- *  @param  rms_thresh
- *              the limit standard deviation (=~ RMS) set to assess whether
- *              the noise level on the part is acceptable.
- *              The default is DEF_RMS_THRESH = 0.2 dps-rms.
- *  @param  sp_shift_thresh
- *              the limit shift applicable to the Sense Path self test
- *              calculation.
- */
-void inv_set_test_parameters(unsigned int slave_addr, float sensitivity,
-                             int p_thresh, float total_time_tol,
-                             int bias_thresh, float rms_thresh,
-                             float sp_shift_thresh,
-                             unsigned short accel_samples)
-{
-    mputestCfgPtr->addr = slave_addr;
-    test_setup.gyro_sens = sensitivity;
-    test_setup.gyro_fs = (int)(32768.f / sensitivity);
-    test_setup.packet_thresh = p_thresh;
-    test_setup.total_timing_tol = total_time_tol;
-    test_setup.bias_thresh = bias_thresh;
-    test_setup.rms_threshSq = rms_thresh * rms_thresh;
-    test_setup.sp_shift_thresh = sp_shift_thresh;
-    test_setup.accel_samples = accel_samples;
-}
-
-#define X   (0)
-#define Y   (1)
-#define Z   (2)
-
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-/**
- *  @brief  Test the gyroscope sensor.
- *          Implements the core logic of the MPU Self Test.
- *          Produces the PASS/FAIL result. Loads the calculated gyro biases
- *          and temperature datum into the corresponding pointers.
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  gyro_biases
- *              output pointer to store the initial bias calculation provided
- *              by the MPU Self Test.  Requires 3 elements for gyro X, Y,
- *              and Z.
- *  @param  temp_avg
- *              output pointer to store the initial average temperature as
- *              provided by the MPU Self Test.
- *  @param  perform_full_test
- *              If 1:
- *              calculates offset, drive frequency, and noise and compare it
- *              against set thresholds.
- *              Report also the final result using a bit-mask like error code
- *              as explained in return value description.
- *              When 0:
- *              skip the noise and drive frequency calculation and pass/fail
- *              assessment; simply calculates the gyro biases.
- *
- *  @return 0 on success.
- *          On error, the return value is a bitmask representing:
- *          0, 1, 2     Failures with PLLs on X, Y, Z gyros respectively
- *                      (decimal values will be 1, 2, 4 respectively).
- *          3, 4, 5     Excessive offset with X, Y, Z gyros respectively
- *                      (decimal values will be 8, 16, 32 respectively).
- *          6, 7, 8     Excessive noise with X, Y, Z gyros respectively
- *                      (decimal values will be 64, 128, 256 respectively).
- *          9           If any of the RMS noise values is zero, it could be
- *                      due to a non-functional gyro or FIFO/register failure.
- *                      (decimal value will be 512).
- *                      (decimal values will be 1024, 2048, 4096 respectively).
- */
-int inv_test_gyro_3050(void *mlsl_handle,
-                       short gyro_biases[3], short *temp_avg,
-                       uint_fast8_t perform_full_test)
-{
-    int retVal = 0;
-    inv_error_t result;
-
-    int total_count = 0;
-    int total_count_axis[3] = {0, 0, 0};
-    int packet_count;
-    short x[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    short y[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    short z[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    unsigned char regs[7];
-
-    int temperature;
-    float Avg[3];
-    float RMS[3];
-    int i, j, tmp;
-    char tmpStr[200];
-
-    temperature = 0;
-
-    /* sample rate = 8ms */
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_SMPLRT_DIV, 0x07);
-    CHECK_TEST_ERROR(result);
-
-    regs[0] = 0x03; /* filter = 42Hz, analog_sample rate = 1 KHz */
-    switch (DEF_GYRO_FULLSCALE) {
-        case 2000:
-            regs[0] |= 0x18;
-            break;
-        case 1000:
-            regs[0] |= 0x10;
-            break;
-        case 500:
-            regs[0] |= 0x08;
-            break;
-        case 250:
-        default:
-            regs[0] |= 0x00;
-            break;
-    }
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_DLPF_FS_SYNC, regs[0]);
-    CHECK_TEST_ERROR(result);
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_INT_CFG, 0x00);
-    CHECK_TEST_ERROR(result);
-
-    /* 1st, timing test */
-    for (j = 0; j < 3; j++) {
-
-        MPL_LOGI("Collecting gyro data from %s gyro PLL\n", a_name[j]);
-
-        /* turn on all gyros, use gyro X for clocking
-           Set to Y and Z for 2nd and 3rd iteration */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGM, j + 1);
-        CHECK_TEST_ERROR(result);
-
-        /* wait for 2 ms after switching clock source */
-        usleep(2000);
-
-        /* we will enable XYZ gyro in FIFO and nothing else */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_FIFO_EN2, 0x00);
-        CHECK_TEST_ERROR(result);
-        /* enable/reset FIFO */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_USER_CTRL, BIT_FIFO_EN | BIT_FIFO_RST);
-        CHECK_TEST_ERROR(result);
-
-        tmp = (int)(test_setup.test_time_per_axis / 600);
-        while (tmp-- > 0) {
-            /* enable XYZ gyro in FIFO and nothing else */
-            result = inv_serial_single_write(mlsl_handle,
-                        mputestCfgPtr->addr, MPUREG_FIFO_EN1,
-                        BIT_GYRO_XOUT | BIT_GYRO_YOUT | BIT_GYRO_ZOUT);
-            CHECK_TEST_ERROR(result);
-
-            /* wait for 600 ms for data */
-            usleep(600000);
-
-            /* stop storing gyro in the FIFO */
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_FIFO_EN1, 0x00);
-            CHECK_TEST_ERROR(result);
-
-            /* Getting number of bytes in FIFO */
-            result = inv_serial_read(
-                           mlsl_handle, mputestCfgPtr->addr,
-                           MPUREG_FIFO_COUNTH, 2, dataout);
-            CHECK_TEST_ERROR(result);
-            /* number of 6 B packets in the FIFO */
-            packet_count = CHARS_TO_SHORT(dataout) / 6;
-            sprintf(tmpStr, "Packet Count: %d - ", packet_count);
-
-            if ( abs(packet_count - test_setup.packet_thresh)
-                        <=      /* Within +/- total_timing_tol % range */
-                     test_setup.total_timing_tol * test_setup.packet_thresh) {
-                for (i = 0; i < packet_count; i++) {
-                    /* getting FIFO data */
-                    result = inv_serial_read_fifo(mlsl_handle,
-                                mputestCfgPtr->addr, 6, dataout);
-                    CHECK_TEST_ERROR(result);
-                    x[total_count + i] = CHARS_TO_SHORT(&dataout[0]);
-                    y[total_count + i] = CHARS_TO_SHORT(&dataout[2]);
-                    z[total_count + i] = CHARS_TO_SHORT(&dataout[4]);
-                    if (VERBOSE_OUT) {
-                        MPL_LOGI("Gyros %-4d    : %+13d %+13d %+13d\n",
-                                    total_count + i, x[total_count + i],
-                                    y[total_count + i], z[total_count + i]);
-                    }
-                }
-                total_count += packet_count;
-                total_count_axis[j] += packet_count;
-                sprintf(tmpStr, "%sOK", tmpStr);
-            } else {
-                if (perform_full_test)
-                    retVal |= 1 << j;
-                sprintf(tmpStr, "%sNOK - samples ignored", tmpStr);
-            }
-            MPL_LOGI("%s\n", tmpStr);
-        }
-
-        /* remove gyros from FIFO */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_FIFO_EN1, 0x00);
-        CHECK_TEST_ERROR(result);
-
-        /* Read Temperature */
-        result = inv_serial_read(mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_TEMP_OUT_H, 2, dataout);
-        CHECK_TEST_ERROR(result);
-        temperature += (short)CHARS_TO_SHORT(dataout);
-    }
-
-    MPL_LOGI("\n");
-    MPL_LOGI("Total %d samples\n", total_count);
-    MPL_LOGI("\n");
-
-    /* 2nd, check bias from X and Y PLL clock source */
-    tmp = total_count != 0 ? total_count : 1;
-    for (i = 0,
-            Avg[X] = .0f, Avg[Y] = .0f, Avg[Z] = .0f;
-         i < total_count; i++) {
-        Avg[X] += 1.f * x[i] / tmp;
-        Avg[Y] += 1.f * y[i] / tmp;
-        Avg[Z] += 1.f * z[i] / tmp;
-    }
-    MPL_LOGI("bias          : %+13.3f %+13.3f %+13.3f (LSB)\n",
-             Avg[X], Avg[Y], Avg[Z]);
-    if (VERBOSE_OUT) {
-        MPL_LOGI("              : %+13.3f %+13.3f %+13.3f (dps)\n",
-                 Avg[X] / adjGyroSens,
-                 Avg[Y] / adjGyroSens,
-                 Avg[Z] / adjGyroSens);
-    }
-    if(perform_full_test) {
-        for (j = 0; j < 3; j++) {
-            if (fabs(Avg[j]) > test_setup.bias_thresh) {
-                MPL_LOGI("%s-Gyro bias (%.0f) exceeded threshold "
-                         "(threshold = %d)\n",
-                         a_name[j], Avg[j], test_setup.bias_thresh);
-                retVal |= 1 << (3+j);
-            }
-        }
-    }
-
-    /* 3rd, check RMS */
-    if (perform_full_test) {
-        for (i = 0,
-                RMS[X] = 0.f, RMS[Y] = 0.f, RMS[Z] = 0.f;
-             i < total_count; i++) {
-            RMS[X] += (x[i] - Avg[X]) * (x[i] - Avg[X]);
-            RMS[Y] += (y[i] - Avg[Y]) * (y[i] - Avg[Y]);
-            RMS[Z] += (z[i] - Avg[Z]) * (z[i] - Avg[Z]);
-        }
-        for (j = 0; j < 3; j++) {
-            if (RMS[j] > test_setup.rms_threshSq * total_count) {
-                MPL_LOGI("%s-Gyro RMS (%.2f) exceeded threshold "
-                         "(threshold = %.2f)\n",
-                         a_name[j], sqrt(RMS[j] / total_count),
-                         sqrt(test_setup.rms_threshSq));
-                retVal |= 1 << (6+j);
-            }
-        }
-
-        MPL_LOGI("RMS           : %+13.3f %+13.3f %+13.3f (LSB-rms)\n",
-                    sqrt(RMS[X] / total_count),
-                    sqrt(RMS[Y] / total_count),
-                    sqrt(RMS[Z] / total_count));
-        if (VERBOSE_OUT) {
-            MPL_LOGI("RMS ^ 2       : %+13.3f %+13.3f %+13.3f\n",
-                        RMS[X] / total_count,
-                        RMS[Y] / total_count,
-                        RMS[Z] / total_count);
-        }
-
-        if (RMS[X] == 0 || RMS[Y] == 0 || RMS[Z] == 0) {
-            /*  If any of the RMS noise value returns zero,
-                then we might have dead gyro or FIFO/register failure,
-                the part is sleeping, or the part is not responsive */
-            retVal |= 1 << 9;
-        }
-    }
-
-    /* 4th, temperature average */
-    temperature /= 3;
-    if (VERBOSE_OUT)
-        MPL_LOGI("Temperature   : %+13.3f %13s %13s (deg. C)\n",
-                 SHORT_TO_TEMP_C(temperature), "", "");
-
-    /* load into final storage */
-    *temp_avg = (short)temperature;
-    gyro_biases[X] = FLOAT_TO_SHORT(Avg[X]);
-    gyro_biases[Y] = FLOAT_TO_SHORT(Avg[Y]);
-    gyro_biases[Z] = FLOAT_TO_SHORT(Avg[Z]);
-
-    return retVal;
-}
-
-#else /* CONFIG_MPU_SENSORS_MPU3050 */
-
-/**
- *  @brief  Test the gyroscope sensor.
- *          Implements the core logic of the MPU Self Test but does not provide
- *          a PASS/FAIL output as in the MPU-3050 implementation.
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  gyro_biases
- *              output pointer to store the initial bias calculation provided
- *              by the MPU Self Test.  Requires 3 elements for gyro X, Y,
- *              and Z.
- *  @param  temp_avg
- *              output pointer to store the initial average temperature as
- *              provided by the MPU Self Test.
- *
- *  @return 0 on success.
- *          A non-zero error code on error.
- */
-int inv_test_gyro_6050(void *mlsl_handle,
-                       short gyro_biases[3], short *temp_avg)
-{
-    inv_error_t result;
-
-    int total_count = 0;
-    int total_count_axis[3] = {0, 0, 0};
-    int packet_count;
-    short x[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    short y[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    short z[DEF_TEST_TIME_PER_AXIS / 8 * 4] = {0};
-    unsigned char regs[7];
-
-    int temperature = 0;
-    float Avg[3];
-    int i, j, tmp;
-    char tmpStr[200];
-
-    /* sample rate = 8ms */
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_SMPLRT_DIV, 0x07);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    regs[0] = 0x03; /* filter = 42Hz, analog_sample rate = 1 KHz */
-    switch (DEF_GYRO_FULLSCALE) {
-        case 2000:
-            regs[0] |= 0x18;
-            break;
-        case 1000:
-            regs[0] |= 0x10;
-            break;
-        case 500:
-            regs[0] |= 0x08;
-            break;
-        case 250:
-        default:
-            regs[0] |= 0x00;
-            break;
-    }
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_CONFIG, regs[0]);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-    result = inv_serial_single_write(
-                mlsl_handle, mputestCfgPtr->addr,
-                MPUREG_INT_ENABLE, 0x00);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    /* 1st, timing test */
-    for (j = 0; j < 3; j++) {
-        MPL_LOGI("Collecting gyro data from %s gyro PLL\n", a_name[j]);
-
-        /* turn on all gyros, use gyro X for clocking
-           Set to Y and Z for 2nd and 3rd iteration */
-#ifdef CONFIG_MPU_SENSORS_MPU6050A2
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGMT_1, BITS_PWRSEL | (j + 1));
-#else
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGMT_1, j + 1);
-#endif
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        /* wait for 2 ms after switching clock source */
-        usleep(2000);
-
-        /* enable/reset FIFO */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_USER_CTRL, BIT_FIFO_EN | BIT_FIFO_RST);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        tmp = (int)(test_setup.test_time_per_axis / 600);
-        while (tmp-- > 0) {
-            /* enable XYZ gyro in FIFO and nothing else */
-            result = inv_serial_single_write(mlsl_handle,
-                        mputestCfgPtr->addr, MPUREG_FIFO_EN,
-                        BIT_GYRO_XOUT | BIT_GYRO_YOUT | BIT_GYRO_ZOUT);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-
-            /* wait for 600 ms for data */
-            usleep(600000);
-            /* stop storing gyro in the FIFO */
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_FIFO_EN, 0x00);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            /* Getting number of bytes in FIFO */
-            result = inv_serial_read(
-                           mlsl_handle, mputestCfgPtr->addr,
-                           MPUREG_FIFO_COUNTH, 2, dataout);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-            /* number of 6 B packets in the FIFO */
-            packet_count = CHARS_TO_SHORT(dataout) / 6;
-            sprintf(tmpStr, "Packet Count: %d - ", packet_count);
-
-            if (abs(packet_count - test_setup.packet_thresh)
-                        <=      /* Within +/- total_timing_tol % range */
-                     test_setup.total_timing_tol * test_setup.packet_thresh) {
-                for (i = 0; i < packet_count; i++) {
-                    /* getting FIFO data */
-                    result = inv_serial_read_fifo(mlsl_handle,
-                                mputestCfgPtr->addr, 6, dataout);
-                    if (result) {
-                        LOG_RESULT_LOCATION(result);
-                        return result;
-                    }
-                    x[total_count + i] = CHARS_TO_SHORT(&dataout[0]);
-                    y[total_count + i] = CHARS_TO_SHORT(&dataout[2]);
-                    z[total_count + i] = CHARS_TO_SHORT(&dataout[4]);
-                    if (VERBOSE_OUT) {
-                        MPL_LOGI("Gyros %-4d    : %+13d %+13d %+13d\n",
-                                    total_count + i, x[total_count + i],
-                                    y[total_count + i], z[total_count + i]);
-                    }
-                }
-                total_count += packet_count;
-                total_count_axis[j] += packet_count;
-                sprintf(tmpStr, "%sOK", tmpStr);
-            } else {
-                sprintf(tmpStr, "%sNOK - samples ignored", tmpStr);
-            }
-            MPL_LOGI("%s\n", tmpStr);
-        }
-
-        /* remove gyros from FIFO */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_FIFO_EN, 0x00);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        /* Read Temperature */
-        result = inv_serial_read(mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_TEMP_OUT_H, 2, dataout);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-        temperature += (short)CHARS_TO_SHORT(dataout);
-    }
-
-    MPL_LOGI("\n");
-    MPL_LOGI("Total %d samples\n", total_count);
-    MPL_LOGI("\n");
-
-    /* 2nd, check bias from X and Y PLL clock source */
-    tmp = total_count != 0 ? total_count : 1;
-    for (i = 0,
-            Avg[X] = .0f, Avg[Y] = .0f, Avg[Z] = .0f;
-         i < total_count; i++) {
-        Avg[X] += 1.f * x[i] / tmp;
-        Avg[Y] += 1.f * y[i] / tmp;
-        Avg[Z] += 1.f * z[i] / tmp;
-    }
-    MPL_LOGI("bias          : %+13.3f %+13.3f %+13.3f (LSB)\n",
-             Avg[X], Avg[Y], Avg[Z]);
-    if (VERBOSE_OUT) {
-        MPL_LOGI("              : %+13.3f %+13.3f %+13.3f (dps)\n",
-                 Avg[X] / adjGyroSens,
-                 Avg[Y] / adjGyroSens,
-                 Avg[Z] / adjGyroSens);
-    }
-
-    temperature /= 3;
-    if (VERBOSE_OUT)
-        MPL_LOGI("Temperature   : %+13.3f %13s %13s (deg. C)\n",
-                 SHORT_TO_TEMP_C(temperature), "", "");
-
-    /* load into final storage */
-    *temp_avg = (short)temperature;
-    gyro_biases[X] = FLOAT_TO_SHORT(Avg[X]);
-    gyro_biases[Y] = FLOAT_TO_SHORT(Avg[Y]);
-    gyro_biases[Z] = FLOAT_TO_SHORT(Avg[Z]);
-
-    return INV_SUCCESS;
-}
-
-#endif /* CONFIG_MPU_SENSORS_MPU3050 */
-
-#ifdef TRACK_IDS
-/**
- *  @internal
- *  @brief  Retrieve the unique MPU device identifier from the internal OTP
- *          bank 0 memory.
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @return 0 on success, a non-zero error code from the serial layer on error.
- */
-static inv_error_t test_get_mpu_id(void *mlsl_handle)
-{
-    inv_error_t result;
-    unsigned char otp0[8];
-
-
-    result =
-        inv_serial_read_mem(mlsl_handle, mputestCfgPtr->addr,
-            (BIT_PRFTCH_EN | BIT_CFG_USER_BANK | MPU_MEM_OTP_BANK_0) << 8 |
-            0x00, 6, otp0);
-    if (result)
-        goto close;
-
-    MPL_LOGI("\n");
-    MPL_LOGI("DIE_ID   : %06X\n",
-                ((int)otp0[1] << 8 | otp0[0]) & 0x1fff);
-    MPL_LOGI("WAFER_ID : %06X\n",
-                (((int)otp0[2] << 8 | otp0[1]) & 0x03ff ) >> 5);
-    MPL_LOGI("A_LOT_ID : %06X\n",
-                ( ((int)otp0[4] << 16 | (int)otp0[3] << 8 |
-                otp0[2]) & 0x3ffff) >> 2);
-    MPL_LOGI("W_LOT_ID : %06X\n",
-                ( ((int)otp0[5] << 8 | otp0[4]) & 0x3fff) >> 2);
-    MPL_LOGI("WP_ID    : %06X\n",
-                ( ((int)otp0[6] << 8 | otp0[5]) & 0x03ff) >> 7);
-    MPL_LOGI("REV_ID   : %06X\n", otp0[6] >> 2);
-    MPL_LOGI("\n");
-
-close:
-    result =
-        inv_serial_single_write(mlsl_handle, mputestCfgPtr->addr, MPUREG_BANK_SEL, 0x00);
-    return result;
-}
-#endif /* TRACK_IDS */
-
-/**
- *  @brief  If requested via inv_test_setup_accel(), test the accelerometer biases
- *          and calculate the necessary bias correction.
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  bias
- *              output pointer to store the initial bias calculation provided
- *              by the MPU Self Test.  Requires 3 elements to store accel X, Y,
- *              and Z axis bias.
- *  @param  perform_full_test
- *              If 1:
- *              calculates offsets and noise and compare it against set
- *              thresholds. The final exist status will reflect if any of the
- *              value is outside of the expected range.
- *              When 0;
- *              skip the noise calculation and pass/fail assessment; simply
- *              calculates the accel biases.
- *
- *  @return 0 on success. A non-zero error code on error.
- */
-int inv_test_accel(void *mlsl_handle,
-                   short *bias, long gravity,
-                   uint_fast8_t perform_full_test)
-{
-    int i;
-
-    short *p_vals;
-    float x = 0.f, y = 0.f, z = 0.f, zg = 0.f;
-    float RMS[3];
-    float accelRmsThresh = 1000000.f; /* enourmous so that the test always
-                                         passes - future deployment */
-    unsigned short res;
-    unsigned long orig_requested_sensors;
-    struct mpu_platform_data *mputestPData = mputestCfgPtr->pdata;
-
-    p_vals = (short*)inv_malloc(sizeof(short) * 3 * test_setup.accel_samples);
-
-    /* load the slave descr from the getter */
-    if (mputestPData->accel.get_slave_descr == NULL) {
-        MPL_LOGI("\n");
-        MPL_LOGI("No accelerometer configured\n");
-        return 0;
-    }
-    if (mputestCfgPtr->accel == NULL) {
-        MPL_LOGI("\n");
-        MPL_LOGI("No accelerometer configured\n");
-        return 0;
-    }
-
-    /* resume the accel */
-    orig_requested_sensors = mputestCfgPtr->requested_sensors;
-    mputestCfgPtr->requested_sensors = INV_THREE_AXIS_ACCEL | INV_THREE_AXIS_GYRO;
-    res = inv_mpu_resume(mputestCfgPtr,
-                         mlsl_handle, NULL, NULL, NULL,
-                         mputestCfgPtr->requested_sensors);
-    if(res != INV_SUCCESS)
-        goto accel_error;
-
-    /* wait at least a sample cycle for the
-       accel data to be retrieved by MPU */
-    inv_sleep(inv_mpu_get_sampling_period_us(mputestCfgPtr) / 1000);
-
-    /* collect the samples  */
-    for(i = 0; i < test_setup.accel_samples; i++) {
-        short *vals = &p_vals[3 * i];
-        if (test_get_data(mlsl_handle, mputestCfgPtr, vals)) {
-            goto accel_error;
-        }
-        x += 1.f * vals[X] / test_setup.accel_samples;
-        y += 1.f * vals[Y] / test_setup.accel_samples;
-        z += 1.f * vals[Z] / test_setup.accel_samples;
-    }
-
-    mputestCfgPtr->requested_sensors = orig_requested_sensors;
-    res = inv_mpu_suspend(mputestCfgPtr,
-                          mlsl_handle, NULL, NULL, NULL,
-                          INV_ALL_SENSORS);
-    if (res != INV_SUCCESS)
-        goto accel_error;
-
-    MPL_LOGI("Accel biases  : %+13.3f %+13.3f %+13.3f (LSB)\n", x, y, z);
-    if (VERBOSE_OUT) {
-        MPL_LOGI("Accel biases  : %+13.3f %+13.3f %+13.3f (gee)\n",
-                    x / gravity, y / gravity, z / gravity);
-    }
-
-    bias[0] = FLOAT_TO_SHORT(x);
-    bias[1] = FLOAT_TO_SHORT(y);
-    zg = z - g_z_sign * gravity;
-    bias[2] = FLOAT_TO_SHORT(zg);
-
-    MPL_LOGI("Accel correct.: %+13d %+13d %+13d (LSB)\n",
-             bias[0], bias[1], bias[2]);
-    if (VERBOSE_OUT) {
-        MPL_LOGI("Accel correct.: "
-               "%+13.3f %+13.3f %+13.3f (gee)\n",
-                    1.f * bias[0] / gravity,
-                    1.f * bias[1] / gravity,
-                    1.f * bias[2] / gravity);
-    }
-
-    if (perform_full_test) {
-        /* accel RMS - for now the threshold is only indicative */
-        for (i = 0,
-                 RMS[X] = 0.f, RMS[Y] = 0.f, RMS[Z] = 0.f;
-             i <  test_setup.accel_samples; i++) {
-            short *vals = &p_vals[3 * i];
-            RMS[X] += (vals[X] - x) * (vals[X] - x);
-            RMS[Y] += (vals[Y] - y) * (vals[Y] - y);
-            RMS[Z] += (vals[Z] - z) * (vals[Z] - z);
-        }
-        for (i = 0; i < 3; i++) {
-            if (RMS[i] >  accelRmsThresh * accelRmsThresh
-                            * test_setup.accel_samples) {
-                MPL_LOGI("%s-Accel RMS (%.2f) exceeded threshold "
-                         "(threshold = %.2f)\n",
-                         a_name[i], sqrt(RMS[i] / test_setup.accel_samples),
-                         accelRmsThresh);
-                goto accel_error;
-            }
-        }
-        MPL_LOGI("RMS           : %+13.3f %+13.3f %+13.3f (LSB-rms)\n",
-                 sqrt(RMS[X] / DEF_N_ACCEL_SAMPLES),
-                 sqrt(RMS[Y] / DEF_N_ACCEL_SAMPLES),
-                 sqrt(RMS[Z] / DEF_N_ACCEL_SAMPLES));
-    }
-
-    return 0; /* success */
-
-accel_error:  /* error */
-    bias[0] = bias[1] = bias[2] = 0;
-    return 1;
-}
-
-/**
- *  @brief  an user-space substitute of the power management function(s)
- *          in mldl_cfg.c for self test usage.
- *          Wake up and sleep the device, whether that is MPU3050, MPU6050A2,
- *          or MPU6050B1.
- *  @param  mlsl_handle
- *              a file handle for the serial communication port used to
- *              communicate with the MPU device.
- *  @param  power_level
- *              the power state to change the device into. Currently only 0 or
- *              1 are supported, for sleep and full-power respectively.
- *  @return 0 on success; a non-zero error code on error.
- */
-static inv_error_t inv_device_power_mgmt(void *mlsl_handle,
-                                         uint_fast8_t power_level)
-{
-    inv_error_t result;
-    static unsigned char pwr_mgm;
-    unsigned char b;
-
-    if (power_level != 0 && power_level != 1) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    if (power_level) {
-        result = inv_serial_read(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGM, 1, &pwr_mgm);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        /* reset */
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGM, pwr_mgm | BIT_H_RESET);
-#ifndef CONFIG_MPU_SENSORS_MPU6050A2
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-#endif
-        inv_sleep(5);
-
-        /* re-read power mgmt reg -
-           it may have reset after H_RESET is applied */
-        result = inv_serial_read(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_PWR_MGM, 1, &b);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-
-        /* wake up */
-#ifdef CONFIG_MPU_SENSORS_MPU6050A2
-        if ((b & BITS_PWRSEL) != BITS_PWRSEL) {
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_PWR_MGM, BITS_PWRSEL);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-#else
-        if (pwr_mgm & BIT_SLEEP) {
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_PWR_MGM, 0x00);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-#endif
-        inv_sleep(60);
-
-#if defined(CONFIG_MPU_SENSORS_MPU6050A2) || \
-    defined(CONFIG_MPU_SENSORS_MPU6050B1)
-        result = inv_serial_single_write(
-                    mlsl_handle, mputestCfgPtr->addr,
-                    MPUREG_INT_PIN_CFG, BIT_BYPASS_EN);
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-#endif
-    } else {
-        /* restore the power state the part was found in */
-#ifdef CONFIG_MPU_SENSORS_MPU6050A2
-        if ((pwr_mgm & BITS_PWRSEL) != BITS_PWRSEL) {
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_PWR_MGM, pwr_mgm);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-#else
-        if (pwr_mgm & BIT_SLEEP) {
-            result = inv_serial_single_write(
-                        mlsl_handle, mputestCfgPtr->addr,
-                        MPUREG_PWR_MGM, pwr_mgm);
-            if (result) {
-                LOG_RESULT_LOCATION(result);
-                return result;
-            }
-        }
-#endif
-    }
-
-    return INV_SUCCESS;
-}
-
-/**
- *  @brief  The main entry point of the MPU Self Test, triggering the run of
- *          the single tests, for gyros and accelerometers.
- *          Prepares the MPU for the test, taking the device out of low power
- *          state if necessary, switching the MPU secondary I2C interface into
- *          bypass mode and restoring the original power state at the end of
- *          the test.
- *          This function is also responsible for encoding the output of each
- *          test in the correct format as it is stored on the file/medium of
- *          choice (according to inv_serial_write_cal() function).
- *          The format needs to stay perfectly consistent with the one expected
- *          by the corresponding loader in ml_stored_data.c; currectly the
- *          loaded in use is inv_load_cal_V1 (record type 1 - initial
- *          calibration).
- *
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  provide_result
- *              If 1:
- *              perform and analyze the offset, drive frequency, and noise
- *              calculation and compare it against set threshouds. Report
- *              also the final result using a bit-mask like error code as
- *              described in the inv_test_gyro() function.
- *              When 0:
- *              skip the noise and drive frequency calculation and pass/fail
- *              assessment. It simply calculates the gyro and accel biases.
- *              NOTE: for MPU6050 devices, this parameter is currently
- *              ignored.
- *
- *  @return 0 on success.  A non-zero error code on error.
- *          Propagates the errors from the tests up to the caller.
- */
-int inv_mpu_test(void *mlsl_handle, uint_fast8_t provide_result)
-{
-    int result = 0;
-
-    short temp_avg;
-    short gyro_biases[3] = {0, 0, 0};
-    short accel_biases[3] = {0, 0, 0};
-
-    unsigned long testStart = inv_get_tick_count();
-    long accelSens[3] = {0};
-    int ptr;
-    int tmp;
-    long long lltmp;
-    uint32_t chk;
-
-    MPL_LOGI("Collecting %d groups of 600 ms samples for each axis\n",
-                DEF_TEST_TIME_PER_AXIS / 600);
-    MPL_LOGI("\n");
-
-    result = inv_device_power_mgmt(mlsl_handle, TRUE);
-
-#ifdef TRACK_IDS
-    result = test_get_mpu_id(mlsl_handle);
-    if (result != INV_SUCCESS) {
-        MPL_LOGI("Could not read the device's unique ID\n");
-        MPL_LOGI("\n");
-        return result;
-    }
-#endif
-
-    /* adjust the gyro sensitivity according to the gyro_sens_trim value */
-    adjGyroSens = test_setup.gyro_sens * mputestCfgPtr->gyro_sens_trim / 131.f;
-    test_setup.gyro_fs = (int)(32768.f / adjGyroSens);
-
-    /* collect gyro and temperature data */
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-    result = inv_test_gyro_3050(mlsl_handle,
-                gyro_biases, &temp_avg, provide_result);
-#else
-    MPL_LOGW_IF(provide_result,
-                "Self Test for MPU-6050 devices is for bias correction only: "
-                "no test PASS/FAIL result will be provided\n");
-    result = inv_test_gyro_6050(mlsl_handle, gyro_biases, &temp_avg);
-#endif
-
-    MPL_LOGI("\n");
-    MPL_LOGI("Test time : %ld ms\n", inv_get_tick_count() - testStart);
-    if (result)
-        return result;
-
-    /* collect accel data.  if this step is skipped,
-       ensure the array still contains zeros. */
-    if (mputestCfgPtr->accel != NULL) {
-        float fs;
-        RANGE_FIXEDPOINT_TO_FLOAT(mputestCfgPtr->accel->range, fs);
-        accelSens[0] = (long)(32768L / fs);
-        accelSens[1] = (long)(32768L / fs);
-        accelSens[2] = (long)(32768L / fs);
-#if defined CONFIG_MPU_SENSORS_MPU6050B1
-        if (MPL_PROD_KEY(mputestCfgPtr->product_id,
-                mputestCfgPtr->product_revision) == MPU_PRODUCT_KEY_B1_E1_5) {
-            accelSens[2] /= 2;
-        } else {
-            unsigned short trim_corr = 16384 / mputestCfgPtr->accel_sens_trim;
-            accelSens[0] /= trim_corr;
-            accelSens[1] /= trim_corr;
-            accelSens[2] /= trim_corr;
-        }
-#endif
-    } else {
-        /* would be 0, but 1 to avoid divide-by-0 below */
-        accelSens[0] = accelSens[1] = accelSens[2] = 1;
-    }
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-    result = inv_test_accel(mlsl_handle, accel_biases, accelSens[2],
-                            provide_result);
-#else
-    result = inv_test_accel(mlsl_handle, accel_biases, accelSens[2],
-                            FALSE);
-#endif
-    if (result)
-        return result;
-
-    result = inv_device_power_mgmt(mlsl_handle, FALSE);
-    if (result)
-        return result;
-
-    ptr = 0;
-    dataStore[ptr++] = 0;       /* total len of factory cal */
-    dataStore[ptr++] = 0;
-    dataStore[ptr++] = 0;
-    dataStore[ptr++] = ML_INIT_CAL_LEN;
-    dataStore[ptr++] = 0;
-    dataStore[ptr++] = 5;       /* record type 5 - initial calibration */
-
-    tmp = temp_avg;             /* temperature */
-    if (tmp < 0) tmp += 2 << 16;
-    USHORT_TO_CHARS(&dataStore[ptr], tmp);
-    ptr += 2;
-
-    /* NOTE : 2 * test_setup.gyro_fs == 65536 / (32768 / test_setup.gyro_fs) */
-    lltmp = (long)gyro_biases[0] * 2 * test_setup.gyro_fs; /* x gyro avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-    lltmp = (long)gyro_biases[1] * 2 * test_setup.gyro_fs; /* y gyro avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-    lltmp = (long)gyro_biases[2] * 2 * test_setup.gyro_fs; /* z gyro avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-
-    lltmp = (long)accel_biases[0] * 65536L / accelSens[0]; /* x accel avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-    lltmp = (long)accel_biases[1] * 65536L / accelSens[1]; /* y accel avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-    lltmp = (long)accel_biases[2] * 65536L / accelSens[2]; /* z accel avg */
-    if (lltmp < 0) lltmp += 1LL << 32;
-    UINT_TO_CHARS(&dataStore[ptr], (uint32_t)lltmp);
-    ptr += 4;
-
-    /* add a checksum for data */
-    chk = inv_checksum(
-        dataStore + INV_CAL_HDR_LEN,
-        ML_INIT_CAL_LEN - INV_CAL_HDR_LEN - INV_CAL_CHK_LEN);
-    UINT_TO_CHARS(&dataStore[ptr], chk);
-    ptr += 4;
-
-    if (ptr != ML_INIT_CAL_LEN) {
-        MPL_LOGI("Invalid calibration data length: exp %d, got %d\n",
-                    ML_INIT_CAL_LEN, ptr);
-        return -1;
-    }
-
-    return result;
-}
-
-/**
- *  @brief  The main test API. Runs the MPU Self Test and, if successful,
- *          stores the encoded initial calibration data on the final storage
- *          medium of choice (cfr. inv_serial_write_cal() and the MLCAL_FILE
- *          define in your mlsl implementation).
- *
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  provide_result
- *              If 1:
- *              perform and analyze the offset, drive frequency, and noise
- *              calculation and compare it against set threshouds. Report
- *              also the final result using a bit-mask like error code as
- *              described in the inv_test_gyro() function.
- *              When 0:
- *              skip the noise and drive frequency calculation and pass/fail
- *              assessment. It simply calculates the gyro and accel biases.
- *
- *  @return 0 on success or a non-zero error code from the callees on error.
- */
-inv_error_t inv_factory_calibrate(void *mlsl_handle,
-                                  uint_fast8_t provide_result)
-{
-    int result;
-
-    result = inv_mpu_test(mlsl_handle, provide_result);
-    if (provide_result) {
-        MPL_LOGI("\n");
-        if (result == 0) {
-            MPL_LOGI("Test : PASSED\n");
-        } else {
-            MPL_LOGI("Test : FAILED %d/%04X - Biases NOT stored\n", result, result);
-            return result; /* abort writing the calibration if the
-                              test is not successful */
-        }
-        MPL_LOGI("\n");
-    } else {
-        MPL_LOGI("\n");
-        if (result) {
-            LOG_RESULT_LOCATION(result);
-            return result;
-        }
-    }
-
-    result = inv_serial_write_cal(dataStore, ML_INIT_CAL_LEN);
-    if (result) {
-        MPL_LOGI("Error : cannot write calibration on file - error %d\n",
-            result);
-        return result;
-    }
-
-    return INV_SUCCESS;
-}
-
-
-
-/* -----------------------------------------------------------------------
-    accel interface functions
- -----------------------------------------------------------------------*/
-
-/**
- *  @internal
- *  @brief  Reads data for X, Y, and Z axis from the accelerometer device.
- *          Used only if an accelerometer has been setup using the
- *          inv_test_setup_accel() API.
- *          Takes care of the accelerometer endianess according to how the
- *          device has been described in the corresponding accelerometer driver
- *          file.
- *  @param  mlsl_handle
- *              serial interface handle to allow serial communication with the
- *              device, both gyro and accelerometer.
- *  @param  slave
- *              a pointer to the descriptor of the slave accelerometer device
- *              in use. Contains the necessary information to operate, read,
- *              and communicate with the accelerometer device of choice.
- *              See the declaration of struct ext_slave_descr in mpu.h.
- *  @param  pdata
- *              a pointer to the platform info of the slave accelerometer
- *              device in use. Describes how the device is oriented and
- *              mounted on host platform's PCB.
- *  @param  vals
- *              output pointer to return the accelerometer's X, Y, and Z axis
- *              sensor data collected.
- *  @return 0 on success or a non-zero error code on error.
- */
-static inv_error_t test_get_data(
-                    void *mlsl_handle,
-                    struct mldl_cfg *mputestCfgPtr,
-                    short *vals)
-{
-    inv_error_t result;
-    unsigned char data[20];
-    struct ext_slave_descr *slave = mputestCfgPtr->accel;
-#ifndef CONFIG_MPU_SENSORS_MPU3050
-    struct ext_slave_platform_data *pdata = &mputestCfgPtr->pdata->accel;
-#endif
-
-#ifdef CONFIG_MPU_SENSORS_MPU3050
-    result = inv_serial_read(mlsl_handle, mputestCfgPtr->addr, 0x23,
-                             6, data);
-#else
-    result = inv_serial_read(mlsl_handle, pdata->address, slave->read_reg,
-                            slave->read_len, data);
-#endif
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    }
-
-    if (VERBOSE_OUT) {
-        MPL_LOGI("Accel         :        0x%02X%02X        0x%02X%02X        0x%02X%02X (raw)\n",
-            ACCEL_UNPACK(data));
-    }
-
-    if (CHECK_NACKS(data)) {
-        MPL_LOGI("Error fetching data from the accelerometer : "
-                 "all bytes read 0xff\n");
-        return INV_ERROR_SERIAL_READ;
-    }
-
-    if (slave->endian == EXT_SLAVE_BIG_ENDIAN) {
-        vals[0] = CHARS_TO_SHORT(&data[0]);
-        vals[1] = CHARS_TO_SHORT(&data[2]);
-        vals[2] = CHARS_TO_SHORT(&data[4]);
-    } else {
-        vals[0] = CHARS_TO_SHORT_SWAPPED(&data[0]);
-        vals[1] = CHARS_TO_SHORT_SWAPPED(&data[2]);
-        vals[2] = CHARS_TO_SHORT_SWAPPED(&data[4]);
-    }
-
-    if (VERBOSE_OUT) {
-        MPL_LOGI("Accel         : %+13d %+13d %+13d (LSB)\n",
-                 vals[0], vals[1], vals[2]);
-    }
-    return INV_SUCCESS;
-}
-
-#ifdef __cplusplus
-}
-#endif
-
-/**
- *  @}
- */
-
diff --git a/60xx/mlsdk/mlutils/mputest.h b/60xx/mlsdk/mlutils/mputest.h
deleted file mode 100644
index d3347c5..0000000
--- a/60xx/mlsdk/mlutils/mputest.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- *
- * $Id: mputest.h 4051 2010-11-19 04:51:58Z mcaramello $
- *
- *****************************************************************************/
-
-#ifndef MPUTEST_H
-#define MPUTEST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "mlsl.h"
-#include "mldl_cfg.h"
-#include "mputest_legacy.h"
-
-/* user facing APIs */
-inv_error_t inv_factory_calibrate(void *mlsl_handle,
-                                  uint_fast8_t provide_result);
-void inv_set_test_parameters(unsigned int slave_addr, float sensitivity,
-                             int p_thresh, float total_time_tol,
-                             int bias_thresh, float rms_thresh,
-                             float sp_shift_thresh,
-                             unsigned short accel_samples);
-
-/* additional functions */
-int  inv_mpu_test(void *mlsl_handle, uint_fast8_t provide_result);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* MPUTEST_H */
-
diff --git a/60xx/mlsdk/mlutils/slave.h b/60xx/mlsdk/mlutils/slave.h
deleted file mode 100644
index 45449f6..0000000
--- a/60xx/mlsdk/mlutils/slave.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: slave.h 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *******************************************************************************/
-
-#ifndef SLAVE_H
-#define SLAVE_H
-
-/**
- *  @addtogroup SLAVEDL
- *
- *  @{
- *      @file     slave.h
- *      @brief    Top level descriptions for Accelerometer support
- *
- */
-
-#include "mltypes.h"
-#include "mpu.h"
-
-    /* ------------ */
-    /* - Defines. - */
-    /* ------------ */
-
-/*--- default accel support - selection ---*/
-#define ACCEL_ST_LIS331                 0
-#define ACCEL_KIONIX_KXTF9              1
-#define ACCEL_BOSCH                     0
-#define ACCEL_ADI                       0
-
-#define ACCEL_SLAVEADDR_INVALID         0x00
-
-#define ACCEL_SLAVEADDR_LIS331          0x18
-#define ACCEL_SLAVEADDR_LSM303          0x18
-#define ACCEL_SLAVEADDR_LIS3DH          0x18
-#define ACCEL_SLAVEADDR_KXSD9           0x18
-#define ACCEL_SLAVEADDR_KXTF9           0x0F
-#define ACCEL_SLAVEADDR_BMA150          0x38
-#define ACCEL_SLAVEADDR_BMA222          0x08
-#define ACCEL_SLAVEADDR_BMA250          0x18
-#define ACCEL_SLAVEADDR_ADXL34X         0x53
-#define ACCEL_SLAVEADDR_ADXL34X_ALT     0x1D /* alternative addr */
-#define ACCEL_SLAVEADDR_MMA8450         0x1C
-#define ACCEL_SLAVEADDR_MMA845X         0x1C
-
-#define ACCEL_SLAVEADDR_INVENSENSE      0x68
-/*
-    Define default accelerometer to use if no selection is made
-*/
-#if ACCEL_ST_LIS331
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_LIS331
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_LIS331
-#endif
-
-#if ACCEL_ST_LSM303
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_LSM303
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_LSM303A
-#endif
-
-#if ACCEL_KIONIX_KXSD9
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_KXSD9
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_KXSD9
-#endif
-
-#if ACCEL_KIONIX_KXTF9
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_KXTF9
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_KXTF9
-#endif
-
-#if ACCEL_BOSCH
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_BMA150
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_BMA150
-#endif
-
-#if ACCEL_BMA222
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_BMA222
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_BMA222
-#endif
-
-#if ACCEL_BOSCH
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_BMA250
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_BMA250
-#endif
-
-#if ACCEL_ADI
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_ADXL34X
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_ADXL34X
-#endif
-
-#if ACCEL_MMA8450
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_MMA8450
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_MMA8450
-#endif
-
-#if ACCEL_MMA845X
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_MMA845X
-#define DEFAULT_ACCEL_ID                  ACCEL_ID_MMA845X
-#endif
-
-/*--- if no default accelerometer was selected ---*/
-#ifndef DEFAULT_ACCEL_SLAVEADDR
-#define DEFAULT_ACCEL_SLAVEADDR           ACCEL_SLAVEADDR_INVALID
-#endif
-
-#define USE_COMPASS_AICHI                  0
-#define USE_COMPASS_AKM                    0
-#define USE_COMPASS_YAS529                 0
-#define USE_COMPASS_YAS530                 0
-#define USE_COMPASS_HMC5883                0
-#define USE_COMPASS_MMC314X                0
-#define USE_COMPASS_HSCDTD002B             0
-#define USE_COMPASS_HSCDTD004A             0
-
-#define COMPASS_SLAVEADDR_INVALID          0x00
-#define COMPASS_SLAVEADDR_AKM_BASE         0x0C
-#define COMPASS_SLAVEADDR_AKM              0x0E
-#define COMPASS_SLAVEADDR_AMI304           0x0E
-#define COMPASS_SLAVEADDR_AMI305           0x0F /*Slave address for AMI 305/306*/
-#define COMPASS_SLAVEADDR_AMI306           0x0E /*Slave address for AMI 305/306*/
-#define COMPASS_SLAVEADDR_YAS529           0x2E
-#define COMPASS_SLAVEADDR_YAS530           0x2E
-#define COMPASS_SLAVEADDR_HMC5883          0x1E
-#define COMPASS_SLAVEADDR_MMC314X          0x30
-#define COMPASS_SLAVEADDR_HSCDTD00XX       0x0C
-
-/*
-    Define default compass to use if no selection is made
-*/
- #if USE_COMPASS_AKM
- #define DEFAULT_COMPASS_TYPE              COMPASS_ID_AK8975
- #endif
-
- #if USE_COMPASS_AICHI
- #define DEFAULT_COMPASS_TYPE              COMPASS_ID_AMI30X
- #endif
-
- #if USE_COMPASS_YAS529
- #define DEFAULT_COMPASS_TYPE              COMPASS_ID_YAS529
- #endif
-
- #if USE_COMPASS_YAS530
- #define DEFAULT_COMPASS_TYPE              COMPASS_ID_YAS530
- #endif
-
- #if USE_COMPASS_HMC5883
- #define DEFAULT_COMPASS_TYPE              COMPASS_ID_HMC5883
- #endif
-
-#if USE_COMPASS_MMC314X
-#define DEFAULT_COMPASS_TYPE              COMPASS_ID_MMC314X
-#endif
-
-#if USE_COMPASS_HSCDTD002B
-#define DEFAULT_COMPASS_TYPE              COMPASS_ID_HSCDTD002B
-#endif
-
-#if USE_COMPASS_HSCDTD004A
-#define DEFAULT_COMPASS_TYPE              COMPASS_ID_HSCDTD004A
-#endif
-
-#ifndef DEFAULT_COMPASS_TYPE
-#define DEFAULT_COMPASS_TYPE               ID_INVALID
-#endif
-
-
-#endif // SLAVE_H
-
-/**
- *  @}
- */
diff --git a/60xx/mlsdk/platform/include/i2c.h b/60xx/mlsdk/platform/include/i2c.h
deleted file mode 100644
index 39dd255..0000000
--- a/60xx/mlsdk/platform/include/i2c.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: i2c.h 5629 2011-06-11 03:13:08Z mcaramello $
- * 
- *******************************************************************************/
-
-#ifndef _I2C_H
-#define _I2C_H
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ------------ */
-/* - Defines. - */
-/* ------------ */
-
-/* - Error Codes. - */
-
-#define I2C_SUCCESS 0
-#define I2C_ERROR   1
-
-/* ---------- */
-/* - Enums. - */
-/* ---------- */
-
-/* --------------- */
-/* - Structures. - */
-/* --------------- */
-
-#define I2C_RBUFF_MAX    128
-#define I2C_RBUFF_SIZE    17
-
-#ifdef BB_I2C
-#define I2C_RBUFF_DYNAMIC  0
-#else
-#define I2C_RBUFF_DYNAMIC  1
-#endif
-
-typedef struct {
-
-	HANDLE  i2cHndl;
-	HANDLE  hDevice;                    // handle to the drive to be examined 
-
-    MLU8      readBuffer[1024];
-	MLU8      writeBuffer[1024];
-
-    MLU16     rBuffRIndex;
-	MLU16     rBuffWIndex;
-#if !I2C_RBUFF_DYNAMIC 
-    MLU8      rBuff[I2C_RBUFF_MAX][I2C_RBUFF_SIZE];
-#else
-    MLU8     *rBuff;
-#endif
-    MLU16     rBuffMax;
-	MLU16     rBuffNumBytes;
-
-    MLU8      runThread;
-	MLU8      autoProcess;
-
-} I2C_Vars_t;
-
-/* --------------------- */
-/* - Function p-types. - */
-/* --------------------- */
-
-#if (defined(BB_I2C))
-void set_i2c_open_bind_cb(int (*func)(unsigned int i2c_slave_addr));
-void set_i2c_open_cb(int (*func)(const char *dev, int rw));
-void set_i2c_close_cb(int (*func)(int fd));
-void set_i2c_lltransfer_cb(int (*func)(int fd, int client_addr, const char *write_buf, unsigned int write_len,
-                                                                      char *read_buf,  unsigned int read_len ));
-void set_i2c_write_register_cb(int (*func)(int fd, int client_addr, unsigned char reg, unsigned char value));
-void set_i2c_read_register_cb(unsigned char (*func)(int fd, int client_addr, unsigned char reg));
-void set_i2c_dump_register_cb(int (*func)(int fd, int client_addr, unsigned char start_reg, unsigned char *buff, int len));
-
-int           _i2c_write_register(int fd, int client_addr, unsigned char reg, unsigned char value);
-unsigned char _i2c_read_register (int fd, int client_addr, unsigned char reg);
-int            i2c_lltransfer    (int fd, int client_addr, const char *write_buf, unsigned int write_len,
-                                                                 char *read_buf,  unsigned int read_len );
-int            i2c_write_register(int fd, int client_addr, unsigned char reg, unsigned char value);
-unsigned char  i2c_read_register (int fd, int client_addr, unsigned char reg);
-int            i2c_dump_register (int fd, int client_addr, unsigned char start_reg, unsigned char *buff, int len);
-int i2c_open         (const char *dev, int rw);
-int i2c_close        (int fd);
-int i2c_open_bind    (unsigned int i2c_slave_addr);
-#endif
-
-int I2COpen           (unsigned char autoProcess, unsigned char createThread);
-int I2CClose          (void);
-int I2CDeviceIoControl(void);
-int I2CRead           (void);
-int I2CWrite          (void);
-int I2CSetBufferSize  (unsigned short bufferSize);
-int I2CBufferUpdate   (void);
-int I2CHandler        (void);
-int I2CReadBuffer     (unsigned short cnt, unsigned char bufferMode, unsigned char *rBuff);
-int I2CEmptyBuffer    (void);
-int I2CPktsInBuffer   (unsigned short *pktsInBuffer);
-int I2CCreateMutex    (void);
-int I2CLockMutex      (void);
-int I2CUnlockMutex    (void);
-
-int I2CWriteBurst     (unsigned char slaveAddr, unsigned char registerAddr, unsigned short length, unsigned char *data);
-int I2CReadBurst      (unsigned char slaveAddr, unsigned char registerAddr, unsigned short length, unsigned char *data);
-
-int I2COpenBB         (void);
-int I2CCloseBB        (int i2cHandle);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _TEMPLATE_H */
diff --git a/60xx/mlsdk/platform/include/linux/mpu.h b/60xx/mlsdk/platform/include/linux/mpu.h
deleted file mode 100644
index 04fa7b6..0000000
--- a/60xx/mlsdk/platform/include/linux/mpu.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __MPU_H_
-#define __MPU_H_
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#include <linux/ioctl.h>
-#elif defined LINUX
-#include <sys/ioctl.h>
-#endif
-
-/* Number of axes on each sensor */
-#define GYRO_NUM_AXES               (3)
-#define ACCEL_NUM_AXES              (3)
-#define COMPASS_NUM_AXES            (3)
-
-struct mpu_read_write {
-	/* Memory address or register address depending on ioctl */
-	unsigned short address;
-	unsigned short length;
-	unsigned char *data;
-};
-
-enum mpuirq_data_type {
-	MPUIRQ_DATA_TYPE_MPU_IRQ,
-	MPUIRQ_DATA_TYPE_SLAVE_IRQ,
-	MPUIRQ_DATA_TYPE_PM_EVENT,
-	MPUIRQ_DATA_TYPE_NUM_TYPES,
-};
-
-/* User space PM event notification */
-#define MPU_PM_EVENT_SUSPEND_PREPARE (3)
-#define MPU_PM_EVENT_POST_SUSPEND    (4)
-
-struct mpuirq_data {
-	int interruptcount;
-	unsigned long long irqtime;
-	int data_type;
-	long data;
-};
-
-enum ext_slave_config_key {
-	MPU_SLAVE_CONFIG_ODR_SUSPEND,
-	MPU_SLAVE_CONFIG_ODR_RESUME,
-	MPU_SLAVE_CONFIG_FSR_SUSPEND,
-	MPU_SLAVE_CONFIG_FSR_RESUME,
-	MPU_SLAVE_CONFIG_MOT_THS,
-	MPU_SLAVE_CONFIG_NMOT_THS,
-	MPU_SLAVE_CONFIG_MOT_DUR,
-	MPU_SLAVE_CONFIG_NMOT_DUR,
-	MPU_SLAVE_CONFIG_IRQ_SUSPEND,
-	MPU_SLAVE_CONFIG_IRQ_RESUME,
-	MPU_SLAVE_WRITE_REGISTERS,
-	MPU_SLAVE_READ_REGISTERS,
-	/* AMI 306 specific config keys */
-	MPU_SLAVE_PARAM,
-	MPU_SLAVE_WINDOW,
-	MPU_SLAVE_READWINPARAMS,
-	MPU_SLAVE_SEARCHOFFSET,
-	/* AKM specific config keys */
-	MPU_SLAVE_READ_SCALE,
-	/* YAS specific config keys */
-	MPU_SLAVE_OFFSET_VALS,
-	MPU_SLAVE_RANGE_CHECK,
-
-	MPU_SLAVE_CONFIG_NUM_CONFIG_KEYS,
-};
-
-/* For the MPU_SLAVE_CONFIG_IRQ_SUSPEND and MPU_SLAVE_CONFIG_IRQ_RESUME */
-enum ext_slave_config_irq_type {
-	MPU_SLAVE_IRQ_TYPE_NONE,
-	MPU_SLAVE_IRQ_TYPE_MOTION,
-	MPU_SLAVE_IRQ_TYPE_DATA_READY,
-};
-
-/* Structure for the following IOCTS's
- * MPU_CONFIG_ACCEL
- * MPU_CONFIG_COMPASS
- * MPU_CONFIG_PRESSURE
- * MPU_GET_CONFIG_ACCEL
- * MPU_GET_CONFIG_COMPASS
- * MPU_GET_CONFIG_PRESSURE
- *
- * @key one of enum ext_slave_config_key
- * @len length of data pointed to by data
- * @apply zero if communication with the chip is not necessary, false otherwise
- *        This flag can be used to select cached data or to refresh cashed data
- *        cache data to be pushed later or push immediately.  If true and the
- *        slave is on the secondary bus the MPU will first enger bypass mode
- *        before calling the slaves .config or .get_config funcion
- * @data pointer to the data to confgure or get
- */
-struct ext_slave_config {
-	int key;
-	int len;
-	int apply;
-	void *data;
-};
-
-enum ext_slave_type {
-	EXT_SLAVE_TYPE_GYROSCOPE,
-	EXT_SLAVE_TYPE_ACCELEROMETER,
-	EXT_SLAVE_TYPE_COMPASS,
-	EXT_SLAVE_TYPE_PRESSURE,
-	/*EXT_SLAVE_TYPE_TEMPERATURE */
-
-	EXT_SLAVE_NUM_TYPES
-};
-
-enum ext_slave_id {
-	ID_INVALID = 0,
-
-	ACCEL_ID_LIS331,
-	ACCEL_ID_LSM303A,
-	ACCEL_ID_LIS3DH,
-	ACCEL_ID_KXSD9,
-	ACCEL_ID_KXTF9,
-	ACCEL_ID_BMA150,
-	ACCEL_ID_BMA222,
-	ACCEL_ID_BMA250,
-	ACCEL_ID_ADXL34X,
-	ACCEL_ID_MMA8450,
-	ACCEL_ID_MMA845X,
-	ACCEL_ID_MPU6050,
-
-	COMPASS_ID_AK8975,
-	COMPASS_ID_AMI30X,
-	COMPASS_ID_AMI306,
-	COMPASS_ID_YAS529,
-	COMPASS_ID_YAS530,
-	COMPASS_ID_HMC5883,
-	COMPASS_ID_LSM303M,
-	COMPASS_ID_MMC314X,
-	COMPASS_ID_HSCDTD002B,
-	COMPASS_ID_HSCDTD004A,
-
-	PRESSURE_ID_BMA085,
-};
-
-enum ext_slave_endian {
-	EXT_SLAVE_BIG_ENDIAN,
-	EXT_SLAVE_LITTLE_ENDIAN,
-	EXT_SLAVE_FS8_BIG_ENDIAN,
-	EXT_SLAVE_FS16_BIG_ENDIAN,
-};
-
-enum ext_slave_bus {
-	EXT_SLAVE_BUS_INVALID = -1,
-	EXT_SLAVE_BUS_PRIMARY = 0,
-	EXT_SLAVE_BUS_SECONDARY = 1
-};
-
-
-/**
- *  struct ext_slave_platform_data - Platform data for mpu3050 and mpu6050
- *  slave devices
- *
- *  @get_slave_descr: Function pointer to retrieve the struct ext_slave_descr
- *                    for this slave
- *  @irq: the irq number attached to the slave if any.
- *  @adapt_num: the I2C adapter number.
- *  @bus: the bus the slave is attached to: enum ext_slave_bus
- *  @address: the I2C slave address of the slave device.
- *  @orientation: the mounting matrix of the device relative to MPU.
- *  @irq_data: private data for the slave irq handler
- *  @private_data: additional data, user customizable.  Not touched by the MPU
- *                 driver.
- *
- * The orientation matricies are 3x3 rotation matricies
- * that are applied to the data to rotate from the mounting orientation to the
- * platform orientation.  The values must be one of 0, 1, or -1 and each row and
- * column should have exactly 1 non-zero value.
- */
-struct ext_slave_platform_data {
-	struct ext_slave_descr *(*get_slave_descr) (void);
-	int irq;
-	int adapt_num;
-	int bus;
-	unsigned char address;
-	signed char orientation[9];
-	void *irq_data;
-	void *private_data;
-};
-
-struct fix_pnt_range {
-	long mantissa;
-	long fraction;
-};
-
-static inline long range_fixedpoint_to_long_mg(struct fix_pnt_range rng)
-{
-	return (long)(rng.mantissa * 1000 + rng.fraction / 10);
-}
-
-struct ext_slave_read_trigger {
-	unsigned char reg;
-	unsigned char value;
-};
-
-/**
- *  struct ext_slave_descr - Description of the slave device for programming.
- *
- *  @suspend:	function pointer to put the device in suspended state
- *  @resume:	function pointer to put the device in running state
- *  @read:	function that reads the device data
- *  @init:	function used to preallocate memory used by the driver
- *  @exit:	function used to free memory allocated for the driver
- *  @config:	function used to configure the device
- *  @get_config:function used to get the device's configuration
- *
- *  @name:	text name of the device
- *  @type:	device type. enum ext_slave_type
- *  @id:	enum ext_slave_id
- *  @reg:	starting register address to retrieve data.
- *  @len:	length in bytes of the sensor data.  Should be 6.
- *  @endian:	byte order of the data. enum ext_slave_endian
- *  @range:	full scale range of the slave ouput: struct fix_pnt_range
- *  @trigger:	If reading data first requires writing a register this is the
- *		data to write.
- *
- *  Defines the functions and information about the slave the mpu3050 and
- *  mpu6050 needs to use the slave device.
- */
-struct ext_slave_descr {
-	int (*init) (void *mlsl_handle,
-		     struct ext_slave_descr *slave,
-		     struct ext_slave_platform_data *pdata);
-	int (*exit) (void *mlsl_handle,
-		     struct ext_slave_descr *slave,
-		     struct ext_slave_platform_data *pdata);
-	int (*suspend) (void *mlsl_handle,
-			struct ext_slave_descr *slave,
-			struct ext_slave_platform_data *pdata);
-	int (*resume) (void *mlsl_handle,
-		       struct ext_slave_descr *slave,
-		       struct ext_slave_platform_data *pdata);
-	int (*read) (void *mlsl_handle,
-		     struct ext_slave_descr *slave,
-		     struct ext_slave_platform_data *pdata,
-		     unsigned char *data);
-	int (*config) (void *mlsl_handle,
-		       struct ext_slave_descr *slave,
-		       struct ext_slave_platform_data *pdata,
-		       struct ext_slave_config *config);
-	int (*get_config) (void *mlsl_handle,
-			   struct ext_slave_descr *slave,
-			   struct ext_slave_platform_data *pdata,
-			   struct ext_slave_config *config);
-
-	char *name;
-	unsigned char type;
-	unsigned char id;
-	unsigned char read_reg;
-	unsigned int read_len;
-	unsigned char endian;
-	struct fix_pnt_range range;
-	struct ext_slave_read_trigger *trigger;
-};
-
-/**
- * struct mpu_platform_data - Platform data for the mpu driver
- * @int_config:		Bits [7:3] of the int config register.
- * @orientation:	Orientation matrix of the gyroscope
- * @level_shifter:	0: VLogic, 1: VDD
- * @accel:		Accel platform data
- * @compass:		Compass platform data
- * @pressure:		Pressure platform data
- *
- * Contains platform specific information on how to configure the MPU3050 to
- * work on this platform.  The orientation matricies are 3x3 rotation matricies
- * that are applied to the data to rotate from the mounting orientation to the
- * platform orientation.  The values must be one of 0, 1, or -1 and each row and
- * column should have exactly 1 non-zero value.
- */
-struct mpu_platform_data {
-	unsigned char int_config;
-	signed char orientation[GYRO_NUM_AXES * GYRO_NUM_AXES];
-	unsigned char level_shifter;
-	struct ext_slave_platform_data accel;
-	struct ext_slave_platform_data compass;
-	struct ext_slave_platform_data pressure;
-};
-
-#if defined __KERNEL__ || defined LINUX
-#define MPU_IOCTL (0x81) /* Magic number for MPU Iocts */
-/* IOCTL commands for /dev/mpu */
-#define MPU_SET_MPU_CONFIG	_IOWR(MPU_IOCTL, 0x00, struct mldl_cfg)
-#define MPU_GET_MPU_CONFIG	_IOW(MPU_IOCTL,  0x00, struct mldl_cfg)
-
-#define MPU_SET_PLATFORM_DATA	_IOWR(MPU_IOCTL, 0x01, struct mldl_cfg)
-
-#define MPU_READ		_IOWR(MPU_IOCTL, 0x10, struct mpu_read_write)
-#define MPU_WRITE		_IOW(MPU_IOCTL,  0x10, struct mpu_read_write)
-#define MPU_READ_MEM		_IOWR(MPU_IOCTL, 0x11, struct mpu_read_write)
-#define MPU_WRITE_MEM		_IOW(MPU_IOCTL,  0x11, struct mpu_read_write)
-#define MPU_READ_FIFO		_IOWR(MPU_IOCTL, 0x12, struct mpu_read_write)
-#define MPU_WRITE_FIFO		_IOW(MPU_IOCTL,  0x12, struct mpu_read_write)
-
-#define MPU_READ_COMPASS	_IOR(MPU_IOCTL, 0x12, unsigned char)
-#define MPU_READ_ACCEL		_IOR(MPU_IOCTL, 0x13, unsigned char)
-#define MPU_READ_PRESSURE	_IOR(MPU_IOCTL, 0x14, unsigned char)
-
-#define MPU_CONFIG_ACCEL	_IOW(MPU_IOCTL, 0x20, struct ext_slave_config)
-#define MPU_CONFIG_COMPASS	_IOW(MPU_IOCTL, 0x21, struct ext_slave_config)
-#define MPU_CONFIG_PRESSURE	_IOW(MPU_IOCTL, 0x22, struct ext_slave_config)
-
-#define MPU_GET_CONFIG_ACCEL	_IOWR(MPU_IOCTL, 0x20, struct ext_slave_config)
-#define MPU_GET_CONFIG_COMPASS	_IOWR(MPU_IOCTL, 0x21, struct ext_slave_config)
-#define MPU_GET_CONFIG_PRESSURE	_IOWR(MPU_IOCTL, 0x22, struct ext_slave_config)
-
-#define MPU_SUSPEND		_IO(MPU_IOCTL, 0x30)
-#define MPU_RESUME		_IO(MPU_IOCTL, 0x31)
-/* Userspace PM Event response */
-#define MPU_PM_EVENT_HANDLED	_IO(MPU_IOCTL, 0x32)
-
-#endif
-
-#endif				/* __MPU_H_ */
diff --git a/60xx/mlsdk/platform/include/log.h b/60xx/mlsdk/platform/include/log.h
deleted file mode 100644
index 8485074..0000000
--- a/60xx/mlsdk/platform/include/log.h
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/*
- * This file incorporates work covered by the following copyright and
- * permission notice:
- *
- * Copyright (C) 2005 The Android Open Source Project
- *
- * 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.
- */
-
-/*
- * C/C++ logging functions.  See the logging documentation for API details.
- *
- * We'd like these to be available from C code (in case we import some from
- * somewhere), so this has a C interface.
- *
- * The output will be correct when the log file is shared between multiple
- * threads and/or multiple processes so long as the operating system
- * supports O_APPEND.  These calls have mutex-protected data structures
- * and so are NOT reentrant.  Do not use MPL_LOG in a signal handler.
- */
-#ifndef _LIBS_CUTILS_MPL_LOG_H
-#define _LIBS_CUTILS_MPL_LOG_H
-
-#include "mltypes.h"
-#include <stdarg.h>
-
-#ifdef ANDROID
-#ifdef NDK_BUILD
-#include "log_macros.h"
-#else
-#include <utils/Log.h>		/* For the LOG macro */
-#endif
-#endif
-
-#ifdef __KERNEL__
-#include <linux/kernel.h>
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Normally we strip MPL_LOGV (VERBOSE messages) from release builds.
- * You can modify this (for example with "#define MPL_LOG_NDEBUG 0"
- * at the top of your source file) to change that behavior.
- */
-#ifndef MPL_LOG_NDEBUG
-#ifdef NDEBUG
-#define MPL_LOG_NDEBUG 1
-#else
-#define MPL_LOG_NDEBUG 0
-#endif
-#endif
-
-#ifdef __KERNEL__
-#define MPL_LOG_UNKNOWN MPL_LOG_VERBOSE
-#define MPL_LOG_DEFAULT KERN_DEFAULT
-#define MPL_LOG_VERBOSE KERN_CONT
-#define MPL_LOG_DEBUG   KERN_NOTICE
-#define MPL_LOG_INFO    KERN_INFO
-#define MPL_LOG_WARN    KERN_WARNING
-#define MPL_LOG_ERROR   KERN_ERR
-#define MPL_LOG_SILENT  MPL_LOG_VERBOSE
-
-#else
-	/* Based off the log priorities in android
-	   /system/core/include/android/log.h */
-#define MPL_LOG_UNKNOWN		(0)
-#define MPL_LOG_DEFAULT		(1)
-#define MPL_LOG_VERBOSE		(2)
-#define MPL_LOG_DEBUG		(3)
-#define MPL_LOG_INFO		(4)
-#define MPL_LOG_WARN		(5)
-#define MPL_LOG_ERROR		(6)
-#define MPL_LOG_SILENT		(8)
-#endif
-
-
-/*
- * This is the local tag used for the following simplified
- * logging macros.  You can change this preprocessor definition
- * before using the other macros to change the tag.
- */
-#ifndef MPL_LOG_TAG
-#ifdef __KERNEL__
-#define MPL_LOG_TAG
-#else
-#define MPL_LOG_TAG NULL
-#endif
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Simplified macro to send a verbose log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGV
-#if MPL_LOG_NDEBUG
-#define MPL_LOGV(fmt, ...)						\
-	do {								\
-		if (0)							\
-			MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__);\
-	} while (0)
-#else
-#define MPL_LOGV(fmt, ...) MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef CONDITION
-#define CONDITION(cond)     ((cond) != 0)
-#endif
-
-#ifndef MPL_LOGV_IF
-#if MPL_LOG_NDEBUG
-#define MPL_LOGV_IF(cond, fmt, ...)  \
-	do { if (0) MPL_LOG(fmt, ##__VA_ARGS__); } while (0)
-#else
-#define MPL_LOGV_IF(cond, fmt, ...) \
-	((CONDITION(cond))						\
-		? MPL_LOG(LOG_VERBOSE, MPL_LOG_TAG, fmt, ##__VA_ARGS__) \
-		: (void)0)
-#endif
-#endif
-
-/*
- * Simplified macro to send a debug log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGD
-#define MPL_LOGD(fmt, ...) MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-
-#ifndef MPL_LOGD_IF
-#define MPL_LOGD_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_DEBUG, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send an info log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGI
-#define MPL_LOGI(fmt, ...) MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-
-#ifndef MPL_LOGI_IF
-#define MPL_LOGI_IF(cond, fmt, ...) \
-	((CONDITION(cond))                                              \
-		? MPL_LOG(LOG_INFO, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send a warning log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGW
-#ifdef __KERNEL__
-#define MPL_LOGW(fmt, ...) printk(KERN_WARNING MPL_LOG_TAG fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOGW(fmt, ...) MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef MPL_LOGW_IF
-#define MPL_LOGW_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_WARN, MPL_LOG_TAG, fmt, ##__VA_ARGS__)   \
-		: (void)0)
-#endif
-
-/*
- * Simplified macro to send an error log message using the current MPL_LOG_TAG.
- */
-#ifndef MPL_LOGE
-#ifdef __KERNEL__
-#define MPL_LOGE(fmt, ...) printk(KERN_ERR MPL_LOG_TAG fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOGE(fmt, ...) MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-#ifndef MPL_LOGE_IF
-#define MPL_LOGE_IF(cond, fmt, ...) \
-	((CONDITION(cond))					       \
-		? MPL_LOG(LOG_ERROR, MPL_LOG_TAG, fmt, ##__VA_ARGS__)  \
-		: (void)0)
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Log a fatal error.  If the given condition fails, this stops program
- * execution like a normal assertion, but also generating the given message.
- * It is NOT stripped from release builds.  Note that the condition test
- * is -inverted- from the normal assert() semantics.
- */
-#define MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ...) \
-	((CONDITION(cond))					   \
-		? ((void)android_printAssert(#cond, MPL_LOG_TAG,   \
-						fmt, ##__VA_ARGS__))	\
-		: (void)0)
-
-#define MPL_LOG_ALWAYS_FATAL(fmt, ...) \
-	(((void)android_printAssert(NULL, MPL_LOG_TAG, fmt, ##__VA_ARGS__)))
-
-/*
- * Versions of MPL_LOG_ALWAYS_FATAL_IF and MPL_LOG_ALWAYS_FATAL that
- * are stripped out of release builds.
- */
-#if MPL_LOG_NDEBUG
-#define MPL_LOG_FATAL_IF(cond, fmt, ...)				\
-	do {								\
-		if (0)							\
-			MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__); \
-	} while (0)
-#define MPL_LOG_FATAL(fmt, ...)						\
-	do {								\
-		if (0)							\
-			MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)	\
-	} while (0)
-#else
-#define MPL_LOG_FATAL_IF(cond, fmt, ...) \
-	MPL_LOG_ALWAYS_FATAL_IF(cond, fmt, ##__VA_ARGS__)
-#define MPL_LOG_FATAL(fmt, ...) \
-	MPL_LOG_ALWAYS_FATAL(fmt, ##__VA_ARGS__)
-#endif
-
-/*
- * Assertion that generates a log message when the assertion fails.
- * Stripped out of release builds.  Uses the current MPL_LOG_TAG.
- */
-#define MPL_LOG_ASSERT(cond, fmt, ...)			\
-	MPL_LOG_FATAL_IF(!(cond), fmt, ##__VA_ARGS__)
-
-/* --------------------------------------------------------------------- */
-
-/*
- * Basic log message macro.
- *
- * Example:
- *  MPL_LOG(MPL_LOG_WARN, NULL, "Failed with error %d", errno);
- *
- * The second argument may be NULL or "" to indicate the "global" tag.
- */
-#ifndef MPL_LOG
-#define MPL_LOG(priority, tag, fmt, ...)		\
-	MPL_LOG_PRI(priority, tag, fmt, ##__VA_ARGS__)
-#endif
-
-/*
- * Log macro that allows you to specify a number for the priority.
- */
-#ifndef MPL_LOG_PRI
-#ifdef ANDROID
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-        ALOG(priority, tag, fmt, ##__VA_ARGS__)
-#elif defined __KERNEL__
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-	pr_debug(MPL_##priority tag fmt, ##__VA_ARGS__)
-#else
-#define MPL_LOG_PRI(priority, tag, fmt, ...) \
-	_MLPrintLog(MPL_##priority, tag, fmt, ##__VA_ARGS__)
-#endif
-#endif
-
-/*
- * Log macro that allows you to pass in a varargs ("args" is a va_list).
- */
-#ifndef MPL_LOG_PRI_VA
-#ifdef ANDROID
-#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
-	android_vprintLog(priority, NULL, tag, fmt, args)
-#elif defined __KERNEL__
-/* not allowed in the Kernel because there is no dev_dbg that takes a va_list */
-#else
-#define MPL_LOG_PRI_VA(priority, tag, fmt, args) \
-	_MLPrintVaLog(priority, NULL, tag, fmt, args)
-#endif
-#endif
-
-/* --------------------------------------------------------------------- */
-
-/*
- * ===========================================================================
- *
- * The stuff in the rest of this file should not be used directly.
- */
-
-#ifndef ANDROID
-int _MLPrintLog(int priority, const char *tag, const char *fmt,	...);
-int _MLPrintVaLog(int priority, const char *tag, const char *fmt, va_list args);
-/* Final implementation of actual writing to a character device */
-int _MLWriteLog(const char *buf, int buflen);
-#endif
-
-static inline void __print_result_location(int result,
-					   const char *file,
-					   const char *func, int line)
-{
-	MPL_LOGE("%s|%s|%d returning %d\n", file, func, line, result);
-}
-
-#define LOG_RESULT_LOCATION(condition) \
-	do {								\
-		__print_result_location((int)(condition), __FILE__,	\
-					__func__, __LINE__);		\
-	} while (0)
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif				/* _LIBS_CUTILS_MPL_LOG_H */
diff --git a/60xx/mlsdk/platform/include/mlmath.h b/60xx/mlsdk/platform/include/mlmath.h
deleted file mode 100644
index bf54870..0000000
--- a/60xx/mlsdk/platform/include/mlmath.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlmath.h 5629 2011-06-11 03:13:08Z mcaramello $ 
- * 
- *******************************************************************************/
-
-#ifndef _ML_MATH_H_
-#define	_ML_MATH_H_
-
-#ifndef MLMATH
-// This define makes Microsoft pickup things like M_PI
-#define _USE_MATH_DEFINES
-#include <math.h>
-
-#ifdef WIN32
-// Microsoft doesn't follow standards
-#define  round(x)(((double)((long long)((x)>0?(x)+.5:(x)-.5))))
-#define roundf(x)(((float )((long long)((x)>0?(x)+.5f:(x)-.5f))))
-#endif
-
-#else  // MLMATH
-
-#ifdef __cplusplus 
-extern "C" {
-#endif
-/* MPL needs below functions */
-double	ml_asin(double);
-double	ml_atan(double);
-double	ml_atan2(double, double);
-double	ml_log(double);
-double	ml_sqrt(double);
-double	ml_ceil(double);
-double	ml_floor(double);
-double  ml_cos(double);
-double  ml_sin(double);
-double  ml_acos(double);
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-/*
- * We rename functions here to provide the hook for other 
- * customized math functions.
- */
-#define	sqrt(x)      ml_sqrt(x)
-#define	log(x)       ml_log(x)
-#define	asin(x)      ml_asin(x)
-#define	atan(x)      ml_atan(x)
-#define	atan2(x,y)   ml_atan2(x,y)
-#define	ceil(x)      ml_ceil(x)
-#define	floor(x)     ml_floor(x)
-#define fabs(x)      (((x)<0)?-(x):(x))
-#define round(x)     (((double)((long long)((x)>0?(x)+.5:(x)-.5))))
-#define roundf(x)    (((float )((long long)((x)>0?(x)+.5f:(x)-.5f))))
-#define cos(x)       ml_cos(x)
-#define sin(x)       ml_sin(x)
-#define acos(x)      ml_acos(x)
-
-#define pow(x,y)     ml_pow(x,y)
-
-#ifdef LINUX
-/* stubs for float version of math functions */
-#define cosf(x)      ml_cos(x)
-#define sinf(x)      ml_sin(x)
-#define atan2f(x,y)  ml_atan2(x,y)
-#define sqrtf(x)     ml_sqrt(x)
-#endif
-
-
-
-#endif // MLMATH
-
-#ifndef M_PI
-#define M_PI 3.14159265358979
-#endif
-
-#ifndef ABS
-#define ABS(x) (((x)>=0)?(x):-(x))
-#endif
-
-#ifndef MIN
-#define MIN(x,y) (((x)<(y))?(x):(y))
-#endif
-
-#ifndef MAX
-#define MAX(x,y) (((x)>(y))?(x):(y))
-#endif
-
-/*---------------------------*/
-#endif /* !_ML_MATH_H_ */
diff --git a/60xx/mlsdk/platform/include/mlos.h b/60xx/mlsdk/platform/include/mlos.h
deleted file mode 100644
index 0aeda96..0000000
--- a/60xx/mlsdk/platform/include/mlos.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 _MLOS_H
-#define _MLOS_H
-
-#ifndef __KERNEL__
-#include <stdio.h>
-#endif
-
-#include "mltypes.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(LINUX) || defined(__KERNEL__)
-#include <stdint.h>
-typedef uintptr_t HANDLE;
-#endif
-
-	/* ------------ */
-	/* - Defines. - */
-	/* ------------ */
-
-	/* - MLOSCreateFile defines. - */
-
-#define MLOS_GENERIC_READ         ((unsigned int)0x80000000)
-#define MLOS_GENERIC_WRITE        ((unsigned int)0x40000000)
-#define MLOS_FILE_SHARE_READ      ((unsigned int)0x00000001)
-#define MLOS_FILE_SHARE_WRITE     ((unsigned int)0x00000002)
-#define MLOS_OPEN_EXISTING        ((unsigned int)0x00000003)
-
-	/* ---------- */
-	/* - Enums. - */
-	/* ---------- */
-
-	/* --------------- */
-	/* - Structures. - */
-	/* --------------- */
-
-	/* --------------------- */
-	/* - Function p-types. - */
-	/* --------------------- */
-
-#ifndef __KERNEL__
-#include <string.h>
-	void *inv_malloc(unsigned int numBytes);
-	inv_error_t inv_free(void *ptr);
-	inv_error_t inv_create_mutex(HANDLE *mutex);
-	inv_error_t inv_lock_mutex(HANDLE mutex);
-	inv_error_t inv_unlock_mutex(HANDLE mutex);
-	FILE *inv_fopen(char *filename);
-	void inv_fclose(FILE *fp);
-
-	inv_error_t inv_destroy_mutex(HANDLE handle);
-
-	void inv_sleep(int mSecs);
-	unsigned long inv_get_tick_count(void);
-
-	/* Kernel implmentations */
-#define GFP_KERNEL (0x70)
-	static inline void *kmalloc(size_t size,
-				    unsigned int gfp_flags)
-	{
-		return inv_malloc((unsigned int)size);
-	}
-	static inline void *kzalloc(size_t size, unsigned int gfp_flags)
-	{
-		void *tmp = inv_malloc((unsigned int)size);
-		if (tmp)
-			memset(tmp, 0, size);
-		return tmp;
-	}
-	static inline void kfree(void *ptr)
-	{
-		inv_free(ptr);
-	}
-	static inline void msleep(long msecs)
-	{
-		inv_sleep(msecs);
-	}
-	static inline void udelay(unsigned long usecs)
-	{
-		inv_sleep((usecs + 999) / 1000);
-	}
-#else
-#include <linux/delay.h>
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-#endif				/* _MLOS_H */
diff --git a/60xx/mlsdk/platform/include/mlsl.h b/60xx/mlsdk/platform/include/mlsl.h
deleted file mode 100644
index 535d117..0000000
--- a/60xx/mlsdk/platform/include/mlsl.h
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __MLSL_H__
-#define __MLSL_H__
-
-/**
- *  @defgroup   MLSL
- *  @brief      Motion Library - Serial Layer.
- *              The Motion Library System Layer provides the Motion Library
- *              with the communication interface to the hardware.
- *
- *              The communication interface is assumed to support serial
- *              transfers in burst of variable length up to
- *              SERIAL_MAX_TRANSFER_SIZE.
- *              The default value for SERIAL_MAX_TRANSFER_SIZE is 128 bytes.
- *              Transfers of length greater than SERIAL_MAX_TRANSFER_SIZE, will
- *              be subdivided in smaller transfers of length <=
- *              SERIAL_MAX_TRANSFER_SIZE.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be modified to
- *              overcome any host processor transfer size limitation down to
- *              1 B, the minimum.
- *              An higher value for SERIAL_MAX_TRANSFER_SIZE will favor
- *              performance and efficiency while requiring higher resource usage
- *              (mostly buffering). A smaller value will increase overhead and
- *              decrease efficiency but allows to operate with more resource
- *              constrained processor and master serial controllers.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
- *              mlsl.h header file and master serial controllers.
- *              The SERIAL_MAX_TRANSFER_SIZE definition can be found in the
- *              mlsl.h header file.
- *
- *  @{
- *      @file   mlsl.h
- *      @brief  The Motion Library System Layer.
- *
- */
-
-#include "mltypes.h"
-#include <linux/mpu.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * NOTE : to properly support Yamaha compass reads,
- *	  the max transfer size should be at least 9 B.
- *	  Length in bytes, typically a power of 2 >= 2
- */
-#define SERIAL_MAX_TRANSFER_SIZE 128
-
-#ifndef __KERNEL__
-/**
- *  inv_serial_open() - used to open the serial port.
- *  @port	The COM port specification associated with the device in use.
- *  @sl_handle	a pointer to the file handle to the serial device to be open
- *		for the communication.
- *	This port is used to send and receive data to the device.
- *
- *	This function is called by inv_serial_start().
- *	Unlike previous MPL Software releases, explicitly calling
- *	inv_serial_start() is mandatory to instantiate the communication
- *	with the device.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_open(char const *port, void **sl_handle);
-
-/**
- *  inv_serial_close() - used to close the serial port.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *
- *	This port is used to send and receive data to the device.
- *
- *	This function is called by inv_serial_stop().
- *	Unlike previous MPL Software releases, explicitly calling
- *	inv_serial_stop() is mandatory to properly shut-down the
- *	communication with the device.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_close(void *sl_handle);
-
-/**
- *  inv_serial_reset() - used to reset any buffering the driver may be doing
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_reset(void *sl_handle);
-#endif
-
-/**
- *  inv_serial_single_write() - used to write a single byte of data.
- *  @sl_handle		pointer to the serial device used for the communication.
- *  @slave_addr		I2C slave address of device.
- *  @register_addr	Register address to write.
- *  @data		Single byte of data to write.
- *
- *	It is called by the MPL to write a single byte of data to the MPU.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_single_write(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char register_addr,
-	unsigned char data);
-
-/**
- *  inv_serial_write() - used to write multiple bytes of data to registers.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @register_addr	Register address to write.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_write(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short length,
-	unsigned char const *data);
-
-/**
- *  inv_serial_read() - used to read multiple bytes of data from registers.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @register_addr	Register address to read.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_serial_read(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned char register_addr,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_read_mem() - used to read multiple bytes of data from the memory.
- *	    This should be sent by I2C or SPI.
- *
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @mem_addr	The location in the memory to read from.
- *  @length	Length of burst data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_serial_read_mem(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short mem_addr,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_write_mem() - used to write multiple bytes of data to the memory.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @mem_addr	The location in the memory to write to.
- *  @length	Length of burst data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_serial_write_mem(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short mem_addr,
-	unsigned short length,
-	unsigned char const *data);
-
-/**
- *  inv_serial_read_fifo() - used to read multiple bytes of data from the fifo.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_serial_read_fifo(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short length,
-	unsigned char *data);
-
-/**
- *  inv_serial_write_fifo() - used to write multiple bytes of data to the fifo.
- *  @sl_handle	a file handle to the serial device used for the communication.
- *  @slave_addr	I2C slave address of device.
- *  @length	Length of burst of data.
- *  @data	Pointer to block of data.
- *
- *  returns INV_SUCCESS == 0 if successful; a non-zero error code otherwise.
- */
-inv_error_t inv_serial_write_fifo(
-	void *sl_handle,
-	unsigned char slave_addr,
-	unsigned short length,
-	unsigned char const *data);
-
-#ifndef __KERNEL__
-/**
- *  inv_serial_read_cfg() - used to get the configuration data.
- *  @cfg	Pointer to the configuration data.
- *  @len	Length of the configuration data.
- *
- *		Is called by the MPL to get the configuration data
- *		used by the motion library.
- *		This data would typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_read_cfg(unsigned char *cfg, unsigned int len);
-
-/**
- *  inv_serial_write_cfg() - used to save the configuration data.
- *  @cfg	Pointer to the configuration data.
- *  @len	Length of the configuration data.
- *
- *		Is called by the MPL to save the configuration data used by the
- *		motion library.
- *		This data would typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_write_cfg(unsigned char *cfg, unsigned int len);
-
-/**
- *  inv_serial_read_cal() - used to get the calibration data.
- *  @cfg	Pointer to the calibration data.
- *  @len	Length of the calibration data.
- *
- *		It is called by the MPL to get the calibration data used by the
- *		motion library.
- *		This data is typically be saved in non-volatile memory.
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_read_cal(unsigned char *cal, unsigned int len);
-
-/**
- *  inv_serial_write_cal() - used to save the calibration data.
- *
- *  @cfg	Pointer to the calibration data.
- *  @len	Length of the calibration data.
- *
- *	    It is called by the MPL to save the calibration data used by the
- *	    motion library.
- *	    This data is typically be saved in non-volatile memory.
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_write_cal(unsigned char *cal, unsigned int len);
-
-/**
- *  inv_serial_get_cal_length() - Get the calibration length from the storage.
- *  @len	lenght to be returned
- *
- *  returns INV_SUCCESS if successful, a non-zero error code otherwise.
- */
-inv_error_t inv_serial_get_cal_length(unsigned int *len);
-#endif
-#ifdef __cplusplus
-}
-#endif
-/**
- * @}
- */
-#endif				/* __MLSL_H__ */
diff --git a/60xx/mlsdk/platform/include/mltypes.h b/60xx/mlsdk/platform/include/mltypes.h
deleted file mode 100644
index 90a126b..0000000
--- a/60xx/mlsdk/platform/include/mltypes.h
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/**
- *  @defgroup MLERROR
- *  @brief  Motion Library - Error definitions.
- *          Definition of the error codes used within the MPL and
- *          returned to the user.
- *          Every function tries to return a meaningful error code basing
- *          on the occuring error condition. The error code is numeric.
- *
- *          The available error codes and their associated values are:
- *          - (0)       INV_SUCCESS
- *          - (1)       INV_ERROR
- *          - (2)       INV_ERROR_INVALID_PARAMETER
- *          - (3)       INV_ERROR_FEATURE_NOT_ENABLED
- *          - (4)       INV_ERROR_FEATURE_NOT_IMPLEMENTED
- *          - (6)       INV_ERROR_DMP_NOT_STARTED
- *          - (7)       INV_ERROR_DMP_STARTED
- *          - (8)       INV_ERROR_NOT_OPENED
- *          - (9)       INV_ERROR_OPENED
- *          - (10)      INV_ERROR_INVALID_MODULE
- *          - (11)      INV_ERROR_MEMORY_EXAUSTED
- *          - (12)      INV_ERROR_DIVIDE_BY_ZERO
- *          - (13)      INV_ERROR_ASSERTION_FAILURE
- *          - (14)      INV_ERROR_FILE_OPEN
- *          - (15)      INV_ERROR_FILE_READ
- *          - (16)      INV_ERROR_FILE_WRITE
- *          - (17)      INV_ERROR_INVALID_CONFIGURATION
- *          - (20)      INV_ERROR_SERIAL_CLOSED
- *          - (21)      INV_ERROR_SERIAL_OPEN_ERROR
- *          - (22)      INV_ERROR_SERIAL_READ
- *          - (23)      INV_ERROR_SERIAL_WRITE
- *          - (24)      INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED
- *          - (25)      INV_ERROR_SM_TRANSITION
- *          - (26)      INV_ERROR_SM_IMPROPER_STATE
- *          - (30)      INV_ERROR_FIFO_OVERFLOW
- *          - (31)      INV_ERROR_FIFO_FOOTER
- *          - (32)      INV_ERROR_FIFO_READ_COUNT
- *          - (33)      INV_ERROR_FIFO_READ_DATA
- *          - (40)      INV_ERROR_MEMORY_SET
- *          - (50)      INV_ERROR_LOG_MEMORY_ERROR
- *          - (51)      INV_ERROR_LOG_OUTPUT_ERROR
- *          - (60)      INV_ERROR_OS_BAD_PTR
- *          - (61)      INV_ERROR_OS_BAD_HANDLE
- *          - (62)      INV_ERROR_OS_CREATE_FAILED
- *          - (63)      INV_ERROR_OS_LOCK_FAILED
- *          - (70)      INV_ERROR_COMPASS_DATA_OVERFLOW
- *          - (71)      INV_ERROR_COMPASS_DATA_UNDERFLOW
- *          - (72)      INV_ERROR_COMPASS_DATA_NOT_READY
- *          - (73)      INV_ERROR_COMPASS_DATA_ERROR
- *          - (75)      INV_ERROR_CALIBRATION_LOAD
- *          - (76)      INV_ERROR_CALIBRATION_STORE
- *          - (77)      INV_ERROR_CALIBRATION_LEN
- *          - (78)      INV_ERROR_CALIBRATION_CHECKSUM
- *          - (79)      INV_ERROR_ACCEL_DATA_OVERFLOW
- *          - (80)      INV_ERROR_ACCEL_DATA_UNDERFLOW
- *          - (81)      INV_ERROR_ACCEL_DATA_NOT_READY
- *          - (82)      INV_ERROR_ACCEL_DATA_ERROR
- *
- *  @{
- *      @file mltypes.h
- *  @}
- */
-
-#ifndef MLTYPES_H
-#define MLTYPES_H
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include "stdint_invensense.h"
-#endif
-
-/*---------------------------
-    ML Types
----------------------------*/
-
-/**
- *  @struct inv_error_t mltypes.h "mltypes"
- *  @brief  The MPL Error Code return type.
- *
- *  @code
- *      typedef unsigned char inv_error_t;
- *  @endcode
- */
-typedef unsigned char inv_error_t;
-
-#ifndef __cplusplus
-#ifndef __KERNEL__
-typedef int_fast8_t bool;
-#endif
-#endif
-
-/*---------------------------
-    ML Defines
----------------------------*/
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#ifndef __KERNEL__
-#ifndef ARRAY_SIZE
-/* Dimension of an array */
-#define ARRAY_SIZE(array) (sizeof(array)/sizeof((array)[0]))
-#endif
-#endif
-/* - ML Errors. - */
-#define ERROR_NAME(x)   (#x)
-#define ERROR_CHECK_FIRST(first, x)                                     \
-	{ if (INV_SUCCESS == first) first = x; }
-
-#define INV_SUCCESS                       (0)
-/* Generic Error code.  Proprietary Error Codes only */
-#define INV_ERROR                         (1)
-
-/* Compatibility and other generic error codes */
-#define INV_ERROR_INVALID_PARAMETER       (2)
-#define INV_ERROR_FEATURE_NOT_ENABLED     (3)
-#define INV_ERROR_FEATURE_NOT_IMPLEMENTED (4)
-#define INV_ERROR_DMP_NOT_STARTED         (6)
-#define INV_ERROR_DMP_STARTED             (7)
-#define INV_ERROR_NOT_OPENED              (8)
-#define INV_ERROR_OPENED                  (9)
-#define INV_ERROR_INVALID_MODULE         (10)
-#define INV_ERROR_MEMORY_EXAUSTED        (11)
-#define INV_ERROR_DIVIDE_BY_ZERO         (12)
-#define INV_ERROR_ASSERTION_FAILURE      (13)
-#define INV_ERROR_FILE_OPEN              (14)
-#define INV_ERROR_FILE_READ              (15)
-#define INV_ERROR_FILE_WRITE             (16)
-#define INV_ERROR_INVALID_CONFIGURATION  (17)
-
-/* Serial Communication */
-#define INV_ERROR_SERIAL_CLOSED          (20)
-#define INV_ERROR_SERIAL_OPEN_ERROR      (21)
-#define INV_ERROR_SERIAL_READ            (22)
-#define INV_ERROR_SERIAL_WRITE           (23)
-#define INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED  (24)
-
-/* SM = State Machine */
-#define INV_ERROR_SM_TRANSITION          (25)
-#define INV_ERROR_SM_IMPROPER_STATE      (26)
-
-/* Fifo */
-#define INV_ERROR_FIFO_OVERFLOW          (30)
-#define INV_ERROR_FIFO_FOOTER            (31)
-#define INV_ERROR_FIFO_READ_COUNT        (32)
-#define INV_ERROR_FIFO_READ_DATA         (33)
-
-/* Memory & Registers, Set & Get */
-#define INV_ERROR_MEMORY_SET             (40)
-
-#define INV_ERROR_LOG_MEMORY_ERROR       (50)
-#define INV_ERROR_LOG_OUTPUT_ERROR       (51)
-
-/* OS interface errors */
-#define INV_ERROR_OS_BAD_PTR             (60)
-#define INV_ERROR_OS_BAD_HANDLE          (61)
-#define INV_ERROR_OS_CREATE_FAILED       (62)
-#define INV_ERROR_OS_LOCK_FAILED         (63)
-
-/* Compass errors */
-#define INV_ERROR_COMPASS_DATA_OVERFLOW  (70)
-#define INV_ERROR_COMPASS_DATA_UNDERFLOW (71)
-#define INV_ERROR_COMPASS_DATA_NOT_READY (72)
-#define INV_ERROR_COMPASS_DATA_ERROR     (73)
-
-/* Load/Store calibration */
-#define INV_ERROR_CALIBRATION_LOAD       (75)
-#define INV_ERROR_CALIBRATION_STORE      (76)
-#define INV_ERROR_CALIBRATION_LEN        (77)
-#define INV_ERROR_CALIBRATION_CHECKSUM   (78)
-
-/* Accel errors */
-#define INV_ERROR_ACCEL_DATA_OVERFLOW    (79)
-#define INV_ERROR_ACCEL_DATA_UNDERFLOW   (80)
-#define INV_ERROR_ACCEL_DATA_NOT_READY   (81)
-#define INV_ERROR_ACCEL_DATA_ERROR       (82)
-
-#ifdef INV_USE_LEGACY_NAMES
-#define ML_SUCCESS                       INV_SUCCESS
-#define ML_ERROR                         INV_ERROR
-#define ML_ERROR_INVALID_PARAMETER       INV_ERROR_INVALID_PARAMETER
-#define ML_ERROR_FEATURE_NOT_ENABLED     INV_ERROR_FEATURE_NOT_ENABLED
-#define ML_ERROR_FEATURE_NOT_IMPLEMENTED INV_ERROR_FEATURE_NOT_IMPLEMENTED
-#define ML_ERROR_DMP_NOT_STARTED         INV_ERROR_DMP_NOT_STARTED
-#define ML_ERROR_DMP_STARTED             INV_ERROR_DMP_STARTED
-#define ML_ERROR_NOT_OPENED              INV_ERROR_NOT_OPENED
-#define ML_ERROR_OPENED                  INV_ERROR_OPENED
-#define ML_ERROR_INVALID_MODULE          INV_ERROR_INVALID_MODULE
-#define ML_ERROR_MEMORY_EXAUSTED         INV_ERROR_MEMORY_EXAUSTED
-#define ML_ERROR_DIVIDE_BY_ZERO          INV_ERROR_DIVIDE_BY_ZERO
-#define ML_ERROR_ASSERTION_FAILURE       INV_ERROR_ASSERTION_FAILURE
-#define ML_ERROR_FILE_OPEN               INV_ERROR_FILE_OPEN
-#define ML_ERROR_FILE_READ               INV_ERROR_FILE_READ
-#define ML_ERROR_FILE_WRITE              INV_ERROR_FILE_WRITE
-#define ML_ERROR_INVALID_CONFIGURATION   INV_ERROR_INVALID_CONFIGURATION
-#define ML_ERROR_SERIAL_CLOSED           INV_ERROR_SERIAL_CLOSED
-#define ML_ERROR_SERIAL_OPEN_ERROR       INV_ERROR_SERIAL_OPEN_ERROR
-#define ML_ERROR_SERIAL_READ             INV_ERROR_SERIAL_READ
-#define ML_ERROR_SERIAL_WRITE            INV_ERROR_SERIAL_WRITE
-#define ML_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED  \
-	INV_ERROR_SERIAL_DEVICE_NOT_RECOGNIZED
-#define ML_ERROR_SM_TRANSITION          INV_ERROR_SM_TRANSITION
-#define ML_ERROR_SM_IMPROPER_STATE      INV_ERROR_SM_IMPROPER_STATE
-#define ML_ERROR_FIFO_OVERFLOW          INV_ERROR_FIFO_OVERFLOW
-#define ML_ERROR_FIFO_FOOTER            INV_ERROR_FIFO_FOOTER
-#define ML_ERROR_FIFO_READ_COUNT        INV_ERROR_FIFO_READ_COUNT
-#define ML_ERROR_FIFO_READ_DATA         INV_ERROR_FIFO_READ_DATA
-#define ML_ERROR_MEMORY_SET             INV_ERROR_MEMORY_SET
-#define ML_ERROR_LOG_MEMORY_ERROR       INV_ERROR_LOG_MEMORY_ERROR
-#define ML_ERROR_LOG_OUTPUT_ERROR       INV_ERROR_LOG_OUTPUT_ERROR
-#define ML_ERROR_OS_BAD_PTR             INV_ERROR_OS_BAD_PTR
-#define ML_ERROR_OS_BAD_HANDLE          INV_ERROR_OS_BAD_HANDLE
-#define ML_ERROR_OS_CREATE_FAILED       INV_ERROR_OS_CREATE_FAILED
-#define ML_ERROR_OS_LOCK_FAILED         INV_ERROR_OS_LOCK_FAILED
-#define ML_ERROR_COMPASS_DATA_OVERFLOW  INV_ERROR_COMPASS_DATA_OVERFLOW
-#define ML_ERROR_COMPASS_DATA_UNDERFLOW INV_ERROR_COMPASS_DATA_UNDERFLOW
-#define ML_ERROR_COMPASS_DATA_NOT_READY INV_ERROR_COMPASS_DATA_NOT_READY
-#define ML_ERROR_COMPASS_DATA_ERROR     INV_ERROR_COMPASS_DATA_ERROR
-#define ML_ERROR_CALIBRATION_LOAD       INV_ERROR_CALIBRATION_LOAD
-#define ML_ERROR_CALIBRATION_STORE      INV_ERROR_CALIBRATION_STORE
-#define ML_ERROR_CALIBRATION_LEN        INV_ERROR_CALIBRATION_LEN
-#define ML_ERROR_CALIBRATION_CHECKSUM   INV_ERROR_CALIBRATION_CHECKSUM
-#define ML_ERROR_ACCEL_DATA_OVERFLOW    INV_ERROR_ACCEL_DATA_OVERFLOW
-#define ML_ERROR_ACCEL_DATA_UNDERFLOW   INV_ERROR_ACCEL_DATA_UNDERFLOW
-#define ML_ERROR_ACCEL_DATA_NOT_READY   INV_ERROR_ACCEL_DATA_NOT_READY
-#define ML_ERROR_ACCEL_DATA_ERROR       INV_ERROR_ACCEL_DATA_ERROR
-#endif
-
-/* For Linux coding compliance */
-#ifndef __KERNEL__
-#define EXPORT_SYMBOL(x)
-#endif
-
-/*---------------------------
-    p-Types
----------------------------*/
-
-#endif				/* MLTYPES_H */
diff --git a/60xx/mlsdk/platform/include/mpu3050.h b/60xx/mlsdk/platform/include/mpu3050.h
deleted file mode 100644
index c363a00..0000000
--- a/60xx/mlsdk/platform/include/mpu3050.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __MPU_H_
-#error Do not include this file directly.  Include mpu.h instead.
-#endif
-
-#ifndef __MPU3050_H_
-#define __MPU3050_H_
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#endif
-
-#if !defined CONFIG_MPU_SENSORS_MPU3050
-#error MPU6000 build including MPU3050 header
-#endif
-
-#define MPU_NAME "mpu3050"
-#define DEFAULT_MPU_SLAVEADDR       0x68
-
-/*==== MPU REGISTER SET ====*/
-enum mpu_register {
-	MPUREG_WHO_AM_I = 0,	/* 00 0x00 */
-	MPUREG_PRODUCT_ID,	/* 01 0x01 */
-	MPUREG_02_RSVD,		/* 02 0x02 */
-	MPUREG_03_RSVD,		/* 03 0x03 */
-	MPUREG_04_RSVD,		/* 04 0x04 */
-	MPUREG_XG_OFFS_TC,	/* 05 0x05 */
-	MPUREG_06_RSVD,		/* 06 0x06 */
-	MPUREG_07_RSVD,		/* 07 0x07 */
-	MPUREG_YG_OFFS_TC,	/* 08 0x08 */
-	MPUREG_09_RSVD,		/* 09 0x09 */
-	MPUREG_0A_RSVD,		/* 10 0x0a */
-	MPUREG_ZG_OFFS_TC,	/* 11 0x0b */
-	MPUREG_X_OFFS_USRH,	/* 12 0x0c */
-	MPUREG_X_OFFS_USRL,	/* 13 0x0d */
-	MPUREG_Y_OFFS_USRH,	/* 14 0x0e */
-	MPUREG_Y_OFFS_USRL,	/* 15 0x0f */
-	MPUREG_Z_OFFS_USRH,	/* 16 0x10 */
-	MPUREG_Z_OFFS_USRL,	/* 17 0x11 */
-	MPUREG_FIFO_EN1,	/* 18 0x12 */
-	MPUREG_FIFO_EN2,	/* 19 0x13 */
-	MPUREG_AUX_SLV_ADDR,	/* 20 0x14 */
-	MPUREG_SMPLRT_DIV,	/* 21 0x15 */
-	MPUREG_DLPF_FS_SYNC,	/* 22 0x16 */
-	MPUREG_INT_CFG,		/* 23 0x17 */
-	MPUREG_ACCEL_BURST_ADDR,/* 24 0x18 */
-	MPUREG_19_RSVD,		/* 25 0x19 */
-	MPUREG_INT_STATUS,	/* 26 0x1a */
-	MPUREG_TEMP_OUT_H,	/* 27 0x1b */
-	MPUREG_TEMP_OUT_L,	/* 28 0x1c */
-	MPUREG_GYRO_XOUT_H,	/* 29 0x1d */
-	MPUREG_GYRO_XOUT_L,	/* 30 0x1e */
-	MPUREG_GYRO_YOUT_H,	/* 31 0x1f */
-	MPUREG_GYRO_YOUT_L,	/* 32 0x20 */
-	MPUREG_GYRO_ZOUT_H,	/* 33 0x21 */
-	MPUREG_GYRO_ZOUT_L,	/* 34 0x22 */
-	MPUREG_23_RSVD,		/* 35 0x23 */
-	MPUREG_24_RSVD,		/* 36 0x24 */
-	MPUREG_25_RSVD,		/* 37 0x25 */
-	MPUREG_26_RSVD,		/* 38 0x26 */
-	MPUREG_27_RSVD,		/* 39 0x27 */
-	MPUREG_28_RSVD,		/* 40 0x28 */
-	MPUREG_29_RSVD,		/* 41 0x29 */
-	MPUREG_2A_RSVD,		/* 42 0x2a */
-	MPUREG_2B_RSVD,		/* 43 0x2b */
-	MPUREG_2C_RSVD,		/* 44 0x2c */
-	MPUREG_2D_RSVD,		/* 45 0x2d */
-	MPUREG_2E_RSVD,		/* 46 0x2e */
-	MPUREG_2F_RSVD,		/* 47 0x2f */
-	MPUREG_30_RSVD,		/* 48 0x30 */
-	MPUREG_31_RSVD,		/* 49 0x31 */
-	MPUREG_32_RSVD,		/* 50 0x32 */
-	MPUREG_33_RSVD,		/* 51 0x33 */
-	MPUREG_34_RSVD,		/* 52 0x34 */
-	MPUREG_DMP_CFG_1,	/* 53 0x35 */
-	MPUREG_DMP_CFG_2,	/* 54 0x36 */
-	MPUREG_BANK_SEL,	/* 55 0x37 */
-	MPUREG_MEM_START_ADDR,	/* 56 0x38 */
-	MPUREG_MEM_R_W,		/* 57 0x39 */
-	MPUREG_FIFO_COUNTH,	/* 58 0x3a */
-	MPUREG_FIFO_COUNTL,	/* 59 0x3b */
-	MPUREG_FIFO_R_W,	/* 60 0x3c */
-	MPUREG_USER_CTRL,	/* 61 0x3d */
-	MPUREG_PWR_MGM,		/* 62 0x3e */
-	MPUREG_3F_RSVD,		/* 63 0x3f */
-	NUM_OF_MPU_REGISTERS	/* 64 0x40 */
-};
-
-/*==== BITS FOR MPU ====*/
-
-/*---- MPU 'FIFO_EN1' register (12) ----*/
-#define BIT_TEMP_OUT                0x80
-#define BIT_GYRO_XOUT               0x40
-#define BIT_GYRO_YOUT               0x20
-#define BIT_GYRO_ZOUT               0x10
-#define BIT_ACCEL_XOUT              0x08
-#define BIT_ACCEL_YOUT              0x04
-#define BIT_ACCEL_ZOUT              0x02
-#define BIT_AUX_1OUT                0x01
-/*---- MPU 'FIFO_EN2' register (13) ----*/
-#define BIT_AUX_2OUT                0x02
-#define BIT_AUX_3OUT                0x01
-/*---- MPU 'DLPF_FS_SYNC' register (16) ----*/
-#define BITS_EXT_SYNC_NONE          0x00
-#define BITS_EXT_SYNC_TEMP          0x20
-#define BITS_EXT_SYNC_GYROX         0x40
-#define BITS_EXT_SYNC_GYROY         0x60
-#define BITS_EXT_SYNC_GYROZ         0x80
-#define BITS_EXT_SYNC_ACCELX        0xA0
-#define BITS_EXT_SYNC_ACCELY        0xC0
-#define BITS_EXT_SYNC_ACCELZ        0xE0
-#define BITS_EXT_SYNC_MASK          0xE0
-#define BITS_FS_250DPS              0x00
-#define BITS_FS_500DPS              0x08
-#define BITS_FS_1000DPS             0x10
-#define BITS_FS_2000DPS             0x18
-#define BITS_FS_MASK                0x18
-#define BITS_DLPF_CFG_256HZ_NOLPF2  0x00
-#define BITS_DLPF_CFG_188HZ         0x01
-#define BITS_DLPF_CFG_98HZ          0x02
-#define BITS_DLPF_CFG_42HZ          0x03
-#define BITS_DLPF_CFG_20HZ          0x04
-#define BITS_DLPF_CFG_10HZ          0x05
-#define BITS_DLPF_CFG_5HZ           0x06
-#define BITS_DLPF_CFG_2100HZ_NOLPF  0x07
-#define BITS_DLPF_CFG_MASK          0x07
-/*---- MPU 'INT_CFG' register (17) ----*/
-#define BIT_ACTL                    0x80
-#define BIT_ACTL_LOW                0x80
-#define BIT_ACTL_HIGH               0x00
-#define BIT_OPEN                    0x40
-#define BIT_OPEN_DRAIN              0x40
-#define BIT_PUSH_PULL               0x00
-#define BIT_LATCH_INT_EN            0x20
-#define BIT_INT_PULSE_WIDTH_50US    0x00
-#define BIT_INT_ANYRD_2CLEAR        0x10
-#define BIT_INT_STAT_READ_2CLEAR    0x00
-#define BIT_MPU_RDY_EN              0x04
-#define BIT_DMP_INT_EN              0x02
-#define BIT_RAW_RDY_EN              0x01
-/*---- MPU 'INT_STATUS' register (1A) ----*/
-#define BIT_INT_STATUS_FIFO_OVERLOW 0x80
-#define BIT_MPU_RDY                 0x04
-#define BIT_DMP_INT                 0x02
-#define BIT_RAW_RDY                 0x01
-/*---- MPU 'BANK_SEL' register (37) ----*/
-#define BIT_PRFTCH_EN               0x20
-#define BIT_CFG_USER_BANK           0x10
-#define BITS_MEM_SEL                0x0f
-/*---- MPU 'USER_CTRL' register (3D) ----*/
-#define BIT_DMP_EN                  0x80
-#define BIT_FIFO_EN                 0x40
-#define BIT_AUX_IF_EN               0x20
-#define BIT_AUX_RD_LENG             0x10
-#define BIT_AUX_IF_RST              0x08
-#define BIT_DMP_RST                 0x04
-#define BIT_FIFO_RST                0x02
-#define BIT_GYRO_RST                0x01
-/*---- MPU 'PWR_MGM' register (3E) ----*/
-#define BIT_H_RESET                 0x80
-#define BIT_SLEEP                   0x40
-#define BIT_STBY_XG                 0x20
-#define BIT_STBY_YG                 0x10
-#define BIT_STBY_ZG                 0x08
-#define BITS_CLKSEL                 0x07
-
-/*---- MPU Silicon Revision ----*/
-#define MPU_SILICON_REV_A4           1	/* MPU A4 Device */
-#define MPU_SILICON_REV_B1           2	/* MPU B1 Device */
-#define MPU_SILICON_REV_B4           3	/* MPU B4 Device */
-#define MPU_SILICON_REV_B6           4	/* MPU B6 Device */
-
-/*---- MPU Memory ----*/
-#define MPU_MEM_BANK_SIZE           (256)
-#define FIFO_HW_SIZE                (512)
-
-enum MPU_MEMORY_BANKS {
-	MPU_MEM_RAM_BANK_0 = 0,
-	MPU_MEM_RAM_BANK_1,
-	MPU_MEM_RAM_BANK_2,
-	MPU_MEM_RAM_BANK_3,
-	MPU_MEM_NUM_RAM_BANKS,
-	MPU_MEM_OTP_BANK_0 = MPU_MEM_NUM_RAM_BANKS,
-	/* This one is always last */
-	MPU_MEM_NUM_BANKS
-};
-
-/*---- structure containing control variables used by MLDL ----*/
-/*---- MPU clock source settings ----*/
-/*---- MPU filter selections ----*/
-enum mpu_filter {
-	MPU_FILTER_256HZ_NOLPF2 = 0,
-	MPU_FILTER_188HZ,
-	MPU_FILTER_98HZ,
-	MPU_FILTER_42HZ,
-	MPU_FILTER_20HZ,
-	MPU_FILTER_10HZ,
-	MPU_FILTER_5HZ,
-	MPU_FILTER_2100HZ_NOLPF,
-	NUM_MPU_FILTER
-};
-
-enum mpu_fullscale {
-	MPU_FS_250DPS = 0,
-	MPU_FS_500DPS,
-	MPU_FS_1000DPS,
-	MPU_FS_2000DPS,
-	NUM_MPU_FS
-};
-
-enum mpu_clock_sel {
-	MPU_CLK_SEL_INTERNAL = 0,
-	MPU_CLK_SEL_PLLGYROX,
-	MPU_CLK_SEL_PLLGYROY,
-	MPU_CLK_SEL_PLLGYROZ,
-	MPU_CLK_SEL_PLLEXT32K,
-	MPU_CLK_SEL_PLLEXT19M,
-	MPU_CLK_SEL_RESERVED,
-	MPU_CLK_SEL_STOP,
-	NUM_CLK_SEL
-};
-
-enum mpu_ext_sync {
-	MPU_EXT_SYNC_NONE = 0,
-	MPU_EXT_SYNC_TEMP,
-	MPU_EXT_SYNC_GYROX,
-	MPU_EXT_SYNC_GYROY,
-	MPU_EXT_SYNC_GYROZ,
-	MPU_EXT_SYNC_ACCELX,
-	MPU_EXT_SYNC_ACCELY,
-	MPU_EXT_SYNC_ACCELZ,
-	NUM_MPU_EXT_SYNC
-};
-
-#define DLPF_FS_SYNC_VALUE(ext_sync, full_scale, lpf) \
-	((ext_sync << 5) | (full_scale << 3) | lpf)
-
-#endif				/* __MPU3050_H_ */
diff --git a/60xx/mlsdk/platform/include/stdint_invensense.h b/60xx/mlsdk/platform/include/stdint_invensense.h
deleted file mode 100644
index d238813..0000000
--- a/60xx/mlsdk/platform/include/stdint_invensense.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 STDINT_INVENSENSE_H
-#define STDINT_INVENSENSE_H
-
-#ifndef WIN32
-
-#ifdef __KERNEL__
-#include <linux/types.h>
-#else
-#include <stdint.h>
-#endif
-
-#else
-
-#include <windows.h>
-
-typedef char int8_t;
-typedef short int16_t;
-typedef long int32_t;
-
-typedef unsigned char uint8_t;
-typedef unsigned short uint16_t;
-typedef unsigned long uint32_t;
-
-typedef int int_fast8_t;
-typedef int int_fast16_t;
-typedef long int_fast32_t;
-
-typedef unsigned int uint_fast8_t;
-typedef unsigned int uint_fast16_t;
-typedef unsigned long uint_fast32_t;
-
-#endif
-
-#endif // STDINT_INVENSENSE_H
diff --git a/60xx/mlsdk/platform/linux/kernel/mpuirq.h b/60xx/mlsdk/platform/linux/kernel/mpuirq.h
deleted file mode 100644
index 352170b..0000000
--- a/60xx/mlsdk/platform/linux/kernel/mpuirq.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __MPUIRQ__
-#define __MPUIRQ__
-
-#ifdef __KERNEL__
-#include <linux/time.h>
-#include <linux/ioctl.h>
-#include "mldl_cfg.h"
-#else
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#endif
-
-#define MPUIRQ_SET_TIMEOUT           _IOW(MPU_IOCTL, 0x40, unsigned long)
-#define MPUIRQ_GET_INTERRUPT_CNT     _IOR(MPU_IOCTL, 0x41, unsigned long)
-#define MPUIRQ_GET_IRQ_TIME          _IOR(MPU_IOCTL, 0x42, struct timeval)
-#define MPUIRQ_SET_FREQUENCY_DIVIDER _IOW(MPU_IOCTL, 0x43, unsigned long)
-
-#ifdef __KERNEL__
-void mpuirq_exit(void);
-int mpuirq_init(struct i2c_client *mpu_client, struct mldl_cfg *mldl_cfg);
-#endif
-
-#endif
diff --git a/60xx/mlsdk/platform/linux/kernel/slaveirq.h b/60xx/mlsdk/platform/linux/kernel/slaveirq.h
deleted file mode 100644
index beb352b..0000000
--- a/60xx/mlsdk/platform/linux/kernel/slaveirq.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __SLAVEIRQ__
-#define __SLAVEIRQ__
-
-#include <linux/mpu.h>
-#include "mpuirq.h"
-
-#define SLAVEIRQ_SET_TIMEOUT           _IOW(MPU_IOCTL, 0x50, unsigned long)
-#define SLAVEIRQ_GET_INTERRUPT_CNT     _IOR(MPU_IOCTL, 0x51, unsigned long)
-#define SLAVEIRQ_GET_IRQ_TIME          _IOR(MPU_IOCTL, 0x52, unsigned long)
-
-
-void slaveirq_exit(struct ext_slave_platform_data *pdata);
-int slaveirq_init(struct i2c_adapter *slave_adapter,
-		  struct ext_slave_platform_data *pdata, char *name);
-
-
-#endif
diff --git a/60xx/mlsdk/platform/linux/kernel/timerirq.h b/60xx/mlsdk/platform/linux/kernel/timerirq.h
deleted file mode 100644
index dc3eea2..0000000
--- a/60xx/mlsdk/platform/linux/kernel/timerirq.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- $License:
-   Copyright 2011 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 __TIMERIRQ__
-#define __TIMERIRQ__
-
-#include <linux/mpu.h>
-
-#define TIMERIRQ_SET_TIMEOUT           _IOW(MPU_IOCTL, 0x60, unsigned long)
-#define TIMERIRQ_GET_INTERRUPT_CNT     _IOW(MPU_IOCTL, 0x61, unsigned long)
-#define TIMERIRQ_START                 _IOW(MPU_IOCTL, 0x62, unsigned long)
-#define TIMERIRQ_STOP                  _IO(MPU_IOCTL, 0x63)
-
-#endif
diff --git a/60xx/mlsdk/platform/linux/log_linux.c b/60xx/mlsdk/platform/linux/log_linux.c
deleted file mode 100644
index 8e75753..0000000
--- a/60xx/mlsdk/platform/linux/log_linux.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/******************************************************************************
- * $Id: log_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 
- ******************************************************************************/
- 
-/**
- * @defgroup MPL_LOG
- * @brief Logging facility for the MPL
- *
- * @{
- *      @file     log.c
- *      @brief    Core logging facility functions.
- *
- *
-**/
-
-#include <stdio.h>
-#include <string.h>
-#include "log.h"
-#include "mltypes.h"
-
-#define LOG_BUFFER_SIZE (256)
-
-#ifdef WIN32
-#define snprintf _snprintf
-#define vsnprintf _vsnprintf
-#endif
-
-int _MLPrintLog (int priority, const char* tag, const char* fmt, ...)
-{
-    va_list ap;
-    int result;
-
-    va_start(ap, fmt);
-    result = _MLPrintVaLog(priority,tag,fmt,ap);
-    va_end(ap);
-
-    return result;
-}
-
-int _MLPrintVaLog(int priority, const char* tag, const char* fmt, va_list args)
-{
-    int result;
-    char buf[LOG_BUFFER_SIZE];
-    char new_fmt[LOG_BUFFER_SIZE];
-    char priority_char;
-
-    if (NULL == fmt) {
-        fmt = "";
-    }
-
-    switch (priority) {
-    case MPL_LOG_UNKNOWN:
-        priority_char = 'U';
-        break;
-    case MPL_LOG_VERBOSE:
-        priority_char = 'V';
-        break;
-    case MPL_LOG_DEBUG:
-        priority_char = 'D';
-        break;
-    case MPL_LOG_INFO:
-        priority_char = 'I';
-        break;
-    case MPL_LOG_WARN:
-        priority_char = 'W';
-        break;
-    case MPL_LOG_ERROR:
-        priority_char = 'E';
-        break;
-    case MPL_LOG_SILENT:
-        priority_char = 'S';
-        break;
-    case MPL_LOG_DEFAULT:
-    default:
-        priority_char = 'D';
-        break;
-    };
-
-    result = snprintf(new_fmt, sizeof(new_fmt), "%c/%s:%s", 
-                       priority_char, tag, fmt);
-    if (result <= 0) {
-        return INV_ERROR_LOG_MEMORY_ERROR;
-    }
-    result = vsnprintf(buf,sizeof(buf),new_fmt, args);
-    if (result <= 0) {
-        return INV_ERROR_LOG_OUTPUT_ERROR;
-    }
-    
-    result = _MLWriteLog(buf, strlen(buf));
-    return INV_SUCCESS;
-}
-
-/**
- * @}
-**/
-
-
diff --git a/60xx/mlsdk/platform/linux/log_printf_linux.c b/60xx/mlsdk/platform/linux/log_printf_linux.c
deleted file mode 100644
index 744a223..0000000
--- a/60xx/mlsdk/platform/linux/log_printf_linux.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: log_printf_linux.c 5629 2011-06-11 03:13:08Z mcaramello $ 
- *
- ******************************************************************************/
- 
-/**
- * @addtogroup MPL_LOG
- *
- * @{
- *      @file   log_printf.c
- *      @brief  printf replacement for _MLWriteLog.
- */
-
-#include <stdio.h>
-#include "log.h"
-
-int _MLWriteLog (const char * buf, int buflen)
-{
-    return fputs(buf, stdout);
-}
-
-/**
- * @}
- */
-
diff --git a/60xx/mlsdk/platform/linux/mlos_linux.c b/60xx/mlsdk/platform/linux/mlos_linux.c
deleted file mode 100644
index fd3b002..0000000
--- a/60xx/mlsdk/platform/linux/mlos_linux.c
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-/*******************************************************************************
- *
- * $Id: mlos_linux.c 5629 2011-06-11 03:13:08Z mcaramello $
- *
- *******************************************************************************/
-
-/**
- *  @defgroup MLOS
- *  @brief OS Interface.
- *
- *  @{
- *      @file mlos.c
- *      @brief OS Interface.
-**/
-
-/* ------------- */
-/* - Includes. - */
-/* ------------- */
-
-#include <sys/time.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <stdlib.h>
-
-#include "stdint_invensense.h"
-
-#include "mlos.h"
-#include <errno.h>
-
-
-/* -------------- */
-/* - Functions. - */
-/* -------------- */
-
-/**
- *  @brief  Allocate space
- *  @param  numBytes  number of bytes
- *  @return pointer to allocated space
-**/
-void *inv_malloc(unsigned int numBytes)
-{
-    // Allocate space.
-    void *allocPtr = malloc(numBytes);
-    return allocPtr;
-}
-
-
-/**
- *  @brief  Free allocated space
- *  @param  ptr pointer to space to deallocate
- *  @return error code.
-**/
-inv_error_t inv_free(void *ptr)
-{
-    // Deallocate space.
-    free(ptr);
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex create function
- *  @param  mutex   pointer to mutex handle
- *  @return error code.
- */
-inv_error_t inv_create_mutex(HANDLE *mutex)
-{
-    int res;
-    pthread_mutex_t *pm = malloc(sizeof(pthread_mutex_t));
-    if(pm == NULL) 
-        return INV_ERROR;
-
-    res = pthread_mutex_init(pm, NULL);
-    if(res == -1) {
-        free(pm);
-        return INV_ERROR_OS_CREATE_FAILED;
-    }
-
-    *mutex = (HANDLE)pm;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex lock function
- *  @param  mutex   Mutex handle
- *  @return error code.
- */
-inv_error_t inv_lock_mutex(HANDLE mutex)
-{
-    int res;
-    pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
-
-    res = pthread_mutex_lock(pm);
-    if(res == -1) 
-        return INV_ERROR_OS_LOCK_FAILED;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  Mutex unlock function
- *  @param  mutex   mutex handle
- *  @return error code.
-**/
-inv_error_t inv_unlock_mutex(HANDLE mutex)
-{
-    int res;
-    pthread_mutex_t *pm = (pthread_mutex_t*)mutex;
-
-    res = pthread_mutex_unlock(pm);
-    if(res == -1) 
-        return INV_ERROR_OS_LOCK_FAILED;
-
-    return INV_SUCCESS;
-}
-
-
-/**
- *  @brief  open file
- *  @param  filename    name of the file to open.
- *  @return error code.
- */
-FILE *inv_fopen(char *filename)
-{
-    FILE *fp = fopen(filename,"r");
-    return fp;
-}
-
-
-/**
- *  @brief  close the file.
- *  @param  fp  handle to file to close.
- *  @return error code.
- */
-void inv_fclose(FILE *fp)
-{
-    fclose(fp);
-}
-
-/**
- *  @brief  Close Handle
- *  @param  handle  handle to the resource.
- *  @return Zero if success, an error code otherwise.
- */
-inv_error_t inv_destroy_mutex(HANDLE handle)
-{
-    int error;
-    pthread_mutex_t *pm = (pthread_mutex_t*)handle;
-    error = pthread_mutex_destroy(pm);
-    if (error) {
-        return errno;
-    }
-    free((void*) handle);
-    
-    return INV_SUCCESS;}
-
-
-/**
- *  @brief  Sleep function.
- */
-void inv_sleep(int mSecs)
-{
-    usleep(mSecs*1000);
-}
-
-
-/**
- *  @brief  get system's internal tick count.
- *          Used for time reference.
- *  @return current tick count.
- */
-unsigned long inv_get_tick_count()
-{
-    struct timeval tv;
-
-    if (gettimeofday(&tv, NULL) !=0)
-        return 0;
-
-    return (long)((tv.tv_sec * 1000000LL + tv.tv_usec) / 1000LL);
-}
-
-  /**********************/
- /** @} */ /* defgroup */
-/**********************/
-
diff --git a/60xx/mlsdk/platform/linux/mlsl_linux_mpu.c b/60xx/mlsdk/platform/linux/mlsl_linux_mpu.c
deleted file mode 100644
index 1bd71de..0000000
--- a/60xx/mlsdk/platform/linux/mlsl_linux_mpu.c
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- $License:
-   Copyright 2011 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.
-  $
- */
-
-/******************************************************************************
- * $Id: mlsl_linux_mpu.c 5653 2011-06-16 21:06:55Z nroyer $
- *****************************************************************************/
-
-/**
- *  @defgroup MLSL (Motion Library - Serial Layer)
- *  @brief  The Motion Library System Layer provides the Motion Library the
- *          interface to the system functions.
- *
- *  @{
- *      @file   mlsl_linux_mpu.c
- *      @brief  The Motion Library System Layer.
- *
- */
-
-/* ------------------ */
-/* - Include Files. - */
-/* ------------------ */
-#include <stdio.h>
-#include <sys/ioctl.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <unistd.h>
-#include <linux/fs.h>
-#include <linux/i2c.h>
-#include <string.h>
-#include <signal.h>
-#include <time.h>
-
-#include "mpu.h"
-#if defined CONFIG_MPU_SENSORS_MPU6050A2
-#    include "mpu6050a2.h"
-#elif defined CONFIG_MPU_SENSORS_MPU6050B1
-#    include "mpu6050b1.h"
-#elif defined CONFIG_MPU_SENSORS_MPU3050
-#  include "mpu3050.h"
-#else
-#error Invalid or undefined CONFIG_MPU_SENSORS_MPUxxxx
-#endif
-
-#include "mlsl.h"
-#include "mlos.h"
-#include "mlmath.h"
-#include "mlinclude.h"
-
-#define MLCAL_ID      (0x0A0B0C0DL)
-#define MLCAL_FILE    "/data/cal.bin"
-#define MLCFG_ID      (0x01020304L)
-#define MLCFG_FILE    "/data/cfg.bin"
-
-#include <log.h>
-#undef MPL_LOG_TAG
-#define MPL_LOG_TAG "MPL-mlsl"
-
-#ifndef I2CDEV
-#define I2CDEV "/dev/mpu"
-#endif
-
-#define SERIAL_FULL_DEBUG (0)
-
-/* --------------- */
-/* - Prototypes. - */
-/* --------------- */
-
-/* ----------------------- */
-/* -  Function Pointers. - */
-/* ----------------------- */
-
-/* --------------------------- */
-/* - Global and Static vars. - */
-/* --------------------------- */
-
-/* ---------------- */
-/* - Definitions. - */
-/* ---------------- */
-
-inv_error_t inv_serial_read_cfg(unsigned char *cfg, unsigned int len)
-{
-    FILE *fp;
-    int bytesRead;
-
-    fp = fopen(MLCFG_FILE, "rb");
-    if (fp == NULL) {
-        MPL_LOGE("Unable to open \"%s\" for read\n", MLCFG_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-    bytesRead = fread(cfg, 1, len, fp);
-    if (bytesRead != len) {
-        MPL_LOGE("bytes read (%d) don't match requested length (%d)\n",
-                 bytesRead, len);
-        return INV_ERROR_FILE_READ;
-    }
-    fclose(fp);
-
-    if (((unsigned int)cfg[0] << 24 | cfg[1] << 16 | cfg[2] << 8 | cfg[3])
-        != MLCFG_ID) {
-        return INV_ERROR_ASSERTION_FAILURE;
-    }
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_write_cfg(unsigned char *cfg, unsigned int len)
-{
-    FILE *fp;
-    int bytesWritten;
-    unsigned char cfgId[4];
-
-    fp = fopen(MLCFG_FILE,"wb");
-    if (fp == NULL) {
-        MPL_LOGE("Unable to open \"%s\" for write\n", MLCFG_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-
-    cfgId[0] = (unsigned char)(MLCFG_ID >> 24);
-    cfgId[1] = (unsigned char)(MLCFG_ID >> 16);
-    cfgId[2] = (unsigned char)(MLCFG_ID >> 8);
-    cfgId[3] = (unsigned char)(MLCFG_ID);
-    bytesWritten = fwrite(cfgId, 1, 4, fp);
-    if (bytesWritten != 4) {
-        MPL_LOGE("CFG ID could not be written on file\n");
-        return INV_ERROR_FILE_WRITE;
-    }
-
-    bytesWritten = fwrite(cfg, 1, len, fp);
-    if (bytesWritten != len) {
-        MPL_LOGE("bytes write (%d) don't match requested length (%d)\n",
-                 bytesWritten, len);
-        return INV_ERROR_FILE_WRITE;
-    }
-
-    fclose(fp);
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_read_cal(unsigned char *cal, unsigned int len)
-{
-    FILE *fp;
-    int bytesRead;
-    inv_error_t result = INV_SUCCESS;
-
-    fp = fopen(MLCAL_FILE,"rb");
-    if (fp == NULL) {
-        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-    bytesRead = fread(cal, 1, len, fp);
-    if (bytesRead != len) {
-        MPL_LOGE("bytes read (%d) don't match requested length (%d)\n",
-                 bytesRead, len);
-        result = INV_ERROR_FILE_READ;
-        goto read_cal_end;
-    }
-
-    /* MLCAL_ID not used
-    if (((unsigned int)cal[0] << 24 | cal[1] << 16 | cal[2] << 8 | cal[3])
-        != MLCAL_ID) {
-        result = INV_ERROR_ASSERTION_FAILURE;
-        goto read_cal_end;
-    }
-    */
-read_cal_end:
-    fclose(fp);
-    return result;
-}
-
-inv_error_t inv_serial_write_cal(unsigned char *cal, unsigned int len)
-{
-    FILE *fp;
-    int bytesWritten;
-    inv_error_t result = INV_SUCCESS;
-
-    fp = fopen(MLCAL_FILE,"wb");
-    if (fp == NULL) {
-        MPL_LOGE("Cannot open file \"%s\" for write\n", MLCAL_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-    bytesWritten = fwrite(cal, 1, len, fp);
-    if (bytesWritten != len) {
-        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
-                 bytesWritten, len);
-        result = INV_ERROR_FILE_WRITE;
-    }
-    fclose(fp);
-    return result;
-}
-
-inv_error_t inv_serial_get_cal_length(unsigned int *len)
-{
-    FILE *calFile;
-    *len = 0;
-
-    calFile = fopen(MLCAL_FILE, "rb");
-    if (calFile == NULL) {
-        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
-        return INV_ERROR_FILE_OPEN;
-    }
-
-    *len += (unsigned char)fgetc(calFile) << 24;
-    *len += (unsigned char)fgetc(calFile) << 16;
-    *len += (unsigned char)fgetc(calFile) << 8;
-    *len += (unsigned char)fgetc(calFile);
-
-    fclose(calFile);
-
-    if (*len <= 0)
-        return INV_ERROR_FILE_READ;
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_open(char const *port, void **sl_handle)
-{
-    INVENSENSE_FUNC_START;
-
-    if (NULL == port) {
-        port = I2CDEV;
-    }
-    *sl_handle = (void*)(uintptr_t) open(port, O_RDWR);
-    if((intptr_t)*sl_handle < 0) {
-        /* ERROR HANDLING; you can check errno to see what went wrong */
-        MPL_LOGE("inv_serial_open\n");
-        MPL_LOGE("I2C Error %d: Cannot open Adapter %s\n", errno, port);
-        return INV_ERROR_SERIAL_OPEN_ERROR;
-    } else {
-        MPL_LOGI("inv_serial_open: %s\n", port);
-    }
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_close(void *sl_handle)
-{
-    INVENSENSE_FUNC_START;
-
-    close((int)(uintptr_t)sl_handle);
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_reset(void *sl_handle)
-{
-    return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
-}
-
-inv_error_t inv_serial_single_write(void *sl_handle,
-                               unsigned char slaveAddr,
-                               unsigned char registerAddr,
-                               unsigned char data)
-{
-    unsigned char buf[2];
-    buf[0] = registerAddr;
-    buf[1] = data;
-    return inv_serial_write(sl_handle, slaveAddr, 2, buf);
-}
-
-inv_error_t inv_serial_write(void *sl_handle,
-                         unsigned char slaveAddr,
-                         unsigned short length,
-                         unsigned char const *data)
-{
-    INVENSENSE_FUNC_START;
-    struct mpu_read_write msg;
-    inv_error_t result;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    msg.address = 0; /* not used */
-    msg.length  = length;
-    msg.data    = (unsigned char*)data;
-
-    if ((result = ioctl((int)(uintptr_t)sl_handle, MPU_WRITE, &msg))) {
-        MPL_LOGE("I2C Error: could not write: R:%02x L:%d %d \n",
-                 data[0], length, result);
-       return result;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C Write Success %02x %02x: %s \n",
-                 data[0], length, data_buff);
-    }
-
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_read(void *sl_handle,
-                        unsigned char  slaveAddr,
-                        unsigned char  registerAddr,
-                        unsigned short length,
-                        unsigned char  *data)
-{
-    INVENSENSE_FUNC_START;
-    int result = INV_SUCCESS;
-    struct mpu_read_write msg;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    msg.address = registerAddr;
-    msg.length  = length;
-    msg.data    = data;
-
-    result = ioctl((int)(uintptr_t)sl_handle, MPU_READ, &msg);
-
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("I2C Error %08x: could not read: R:%02x L:%d\n",
-                 result, registerAddr, length);
-        result = INV_ERROR_SERIAL_READ;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C Read  Success %02x %02x: %s \n",
-                  registerAddr, length, data_buff);
-    }
-
-    return (inv_error_t) result;
-}
-
-inv_error_t inv_serial_write_mem(void *sl_handle,
-                            unsigned char mpu_addr,
-                            unsigned short memAddr,
-                            unsigned short length,
-                            const unsigned char *data)
-{
-    INVENSENSE_FUNC_START;
-    struct mpu_read_write msg;
-    int result;
-
-    msg.address = memAddr;
-    msg.length  = length;
-    msg.data    = (unsigned char *)data;
-
-    result = ioctl((int)(uintptr_t)sl_handle, MPU_WRITE_MEM, &msg);
-    if (result) {
-        LOG_RESULT_LOCATION(result);
-        return result;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C WriteMem Success %04x %04x: %s \n",
-                 memAddr, length, data_buff);
-    }
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_read_mem(void *sl_handle,
-                           unsigned char  mpu_addr,
-                           unsigned short memAddr,
-                           unsigned short length,
-                           unsigned char  *data)
-{
-    INVENSENSE_FUNC_START;
-    struct mpu_read_write msg;
-    int result;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    msg.address = memAddr;
-    msg.length  = length;
-    msg.data    = data;
-
-    result = ioctl((int)(uintptr_t)sl_handle, MPU_READ_MEM, &msg);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("I2C Error %08x: could not read memory: A:%04x L:%d\n",
-                 result, memAddr, length);
-        return INV_ERROR_SERIAL_READ;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C ReadMem Success %04x %04x: %s\n",
-                 memAddr, length, data_buff);
-    }
-    return INV_SUCCESS;
-}
-
-inv_error_t inv_serial_write_fifo(void *sl_handle,
-                             unsigned char mpu_addr,
-                             unsigned short length,
-                             const unsigned char *data)
-{
-    INVENSENSE_FUNC_START;
-    struct mpu_read_write msg;
-    int result;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    msg.address = 0; /* Not used */
-    msg.length  = length;
-    msg.data    = (unsigned char *)data;
-
-    result = ioctl((int)(uintptr_t)sl_handle, MPU_WRITE_FIFO, &msg);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("I2C Error: could not write fifo: %02x %02x\n",
-                  MPUREG_FIFO_R_W, length);
-        return INV_ERROR_SERIAL_WRITE;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C Write Success %02x %02x: %s\n",
-                 MPUREG_FIFO_R_W, length, data_buff);
-    }
-    return (inv_error_t) result;
-}
-
-inv_error_t inv_serial_read_fifo(void *sl_handle,
-                            unsigned char  mpu_addr,
-                            unsigned short length,
-                            unsigned char  *data)
-{
-    INVENSENSE_FUNC_START;
-    struct mpu_read_write msg;
-    int result;
-
-    if (NULL == data) {
-        return INV_ERROR_INVALID_PARAMETER;
-    }
-
-    msg.address = MPUREG_FIFO_R_W; /* Not used */
-    msg.length  = length;
-    msg.data    = data;
-
-    result = ioctl((int)(uintptr_t)sl_handle, MPU_READ_FIFO, &msg);
-    if (result != INV_SUCCESS) {
-        MPL_LOGE("I2C Error %08x: could not read fifo: R:%02x L:%d\n",
-                 result, MPUREG_FIFO_R_W, length);
-        return INV_ERROR_SERIAL_READ;
-    } else if (SERIAL_FULL_DEBUG) {
-        char data_buff[4096] = "";
-        char strchar[3];
-        int ii;
-        for (ii = 0; ii < length; ii++) {
-            snprintf(strchar, sizeof(strchar), "%02x", data[0]);
-            strncat(data_buff, strchar, sizeof(data_buff));
-        }
-        MPL_LOGI("I2C ReadFifo Success %02x %02x: %s\n",
-                 MPUREG_FIFO_R_W, length, data_buff);
-    }
-    return INV_SUCCESS;
-}
-
-/**
- *  @}
- */
-
-
diff --git a/65xx/libsensors_iio/sensors_mpl.cpp b/65xx/libsensors_iio/sensors_mpl.cpp
index e7a3116..5d52b1a 100644
--- a/65xx/libsensors_iio/sensors_mpl.cpp
+++ b/65xx/libsensors_iio/sensors_mpl.cpp
@@ -80,6 +80,7 @@
                 reserved: {0}
         },
         get_sensors_list: sensors__get_sensors_list,
+        set_operation_mode: NULL
 };
 
 struct sensors_poll_context_t {
diff --git a/Android.mk b/Android.mk
index 65c9e4f..ff26264 100644
--- a/Android.mk
+++ b/Android.mk
@@ -2,14 +2,7 @@
 ifneq ($(filter hammerhead, $(TARGET_DEVICE)),)
 # hammerhead expects 65xx sensors.
 include $(call all-named-subdir-makefiles,65xx)
-else
-ifneq ($(filter guppy dory, $(TARGET_DEVICE)),)
+else ifneq ($(filter guppy dory, $(TARGET_DEVICE)),)
 # dory and guppy expect 6515 sensors.
 include $(call all-named-subdir-makefiles,6515)
-else
-ifneq ($(filter manta grouper tuna mako, $(TARGET_DEVICE)),)
-# manta, grouper, tuna, and mako expect 60xx sensors.
-include $(call all-named-subdir-makefiles,60xx)
-endif
-endif
 endif
