/*
 $License:
    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
 $
 */
/******************************************************************************
 *
 * $Id: mlsetup.c 6113 2011-09-29 23:40:55Z jcalizo $
 *
 *****************************************************************************/
#undef MPL_LOG_NDEBUG
#ifdef UNITTESTING
#define MPL_LOG_NDEBUG 1
#else
#define MPL_LOG_NDEBUG 0
#endif

/**
 *  @defgroup MLSETUP
 *  @brief  The Motion Library external slaves setup override suite.
 *
 *          Use these APIs to override the kernel/default settings in the
 *          corresponding data structures for gyros, accel, and compass.
 *
 *  @{
 *      @file mlsetup.c
 *      @brief The Motion Library external slaves setup override suite.
 */

/* ------------------ */
/* - Include Files. - */
/* ------------------ */

/*
    Defines
*/
/* these have to appear before inclusion of mpu.h */
#define CONFIG_MPU_SENSORS_KXSD9         y   // Kionix accel
#define CONFIG_MPU_SENSORS_KXTF9         y   // Kionix accel
#define CONFIG_MPU_SENSORS_LIS331DLH     y   // ST accelerometer
#define CONFIG_MPU_SENSORS_LSM303DLX_A   y   // ST accelerometer in LSM303DLx combo
#define CONFIG_MPU_SENSORS_LIS3DH        y   // ST accelerometer
#define CONFIG_MPU_SENSORS_BMA150        y   // Bosch 150 accelerometer
#define CONFIG_MPU_SENSORS_BMA222        y   // Bosch 222 accelerometer
#define CONFIG_MPU_SENSORS_BMA250        y   // Bosch 250 accelerometer
#define CONFIG_MPU_SENSORS_ADXL34X       y   // AD 345 or 346 accelerometer
#define CONFIG_MPU_SENSORS_MMA8450       y   // Freescale MMA8450 accelerometer
#define CONFIG_MPU_SENSORS_MMA845X       y   // Freescale MMA845X accelerometer
#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
#define CONFIG_MPU_SENSORS_MPU6050_ACCEL y   // Invensense MPU6050 built-in accelerometer
#endif

#define CONFIG_MPU_SENSORS_AK8975        y   // AKM compass
#define CONFIG_MPU_SENSORS_AMI30X        y   // AICHI AMI304/305 compass
#define CONFIG_MPU_SENSORS_AMI306        y   // AICHI AMI306 compass
#define CONFIG_MPU_SENSORS_HMC5883       y   // Honeywell compass
#define CONFIG_MPU_SENSORS_LSM303DLX_M   y   // ST compass in LSM303DLx combo
#define CONFIG_MPU_SENSORS_YAS529        y   // Yamaha compass
#define CONFIG_MPU_SENSORS_YAS530        y   // Yamaha compass
#define CONFIG_MPU_SENSORS_MMC314X       y   // MEMSIC compass
#define CONFIG_MPU_SENSORS_HSCDTD002B    y   // ALPS compass
#define CONFIG_MPU_SENSORS_HSCDTD004A    y   // ALPS HSCDTD004A compass

#define CONFIG_MPU_SENSORS_BMA085        y   // Bosch 085 pressure

#include "external_hardware.h"

#include <stdio.h>
#include <string.h>

#include "slave.h"
#include "compass.h"
#include "log.h"
#undef MPL_LOG_TAG
#define MPL_LOG_TAG "MPL-mlsetup"

#include "linux/mpu.h"

#include "mlsetup.h"

#ifdef LINUX
#include "errno.h"
#endif

/* Override these structures from mldl.c */
extern struct ext_slave_descr          g_slave_accel;
extern struct ext_slave_descr          g_slave_compass;
//extern struct ext_slave_descr          g_slave_pressure;
/* Platform Data */
//extern struct mpu_platform_data        g_pdata;
extern struct ext_slave_platform_data  g_pdata_slave_accel;
extern struct ext_slave_platform_data  g_pdata_slave_compass;
//extern struct ext_slave_platform_data  g_pdata_slave_pressure;
signed char g_gyro_orientation[9];

/*
    Typedefs
*/
typedef void tSetupFuncAccel(void);
typedef void tSetupFuncCompass(void);
typedef void tSetupFuncPressure(void);

#ifdef LINUX
#include <sys/ioctl.h>
#endif

/*********************************************************************
              Dragon - PLATFORM_ID_DRAGON_PROTOTYPE
*********************************************************************/
/**
 * @internal
 * @brief  performs a 180' rotation around Z axis to reflect
 *         usage of the multi sensor board (MSB) with the
 *         beagleboard
 * @note   assumes well formed mounting matrix, with only
 *         one 1 for each row.
 */
static void Rotate180DegAroundZAxis(signed char matrix[])
{
    int ii;
    for(ii=0; ii<6; ii++) {
        matrix[ii] = -matrix[ii];
    }
}

/**
 * @internal
 * Sets the orientation based on the position of the mounting.  For different
 * devices the relative position to pin 1 will be different.
 *
 * Positions are:
 * - 0-3 are Z up
 * - 4-7 are Z down
 * - 8-11 are Z right
 * - 12-15 are Z left
 * - 16-19 are Z front
 * - 20-23 are Z back
 *
 * @param position The position of the orientation
 * @param orientation the location to store the new oreintation
 */
static inv_error_t SetupOrientation(unsigned int position,
                                 signed char *orientation)
{
    memset(orientation, 0, 9);
    switch (position){
    case 0:
        /*-------------------------*/
        orientation[0] = +1;
        orientation[4] =     +1;
        orientation[8] =         +1;
        break;
    case 1:
        /*-------------------------*/
        orientation[1] =     +1;
        orientation[3] = -1;
        orientation[8] =         +1;
        break;
    case 2:
        /*-------------------------*/
        orientation[0] = -1;
        orientation[4] =     -1;
        orientation[8] =         +1;
        break;
    case 3:
        /*-------------------------*/
        orientation[1] =     -1;
        orientation[3] = +1;
        orientation[8] =         +1;
        break;
    case 4:
        /*-------------------------*/
        orientation[0] = -1;
        orientation[4] =     +1;
        orientation[8] =         -1;
        break;
    case 5:
        /*-------------------------*/
        orientation[1] =     -1;
        orientation[3] = -1;
        orientation[8] =         -1;
        break;
    case 6:
        /*-------------------------*/
        orientation[0] = +1;
        orientation[4] =     -1;
        orientation[8] =         -1;
        break;
    case 7:
        /*-------------------------*/
        orientation[1] =     +1;
        orientation[3] = +1;
        orientation[8] =         -1;
        break;
    case 8:
        /*-------------------------*/
        orientation[2] =         +1;
        orientation[3] = +1;
        orientation[7] =     +1;
        break;
    case 9:
        /*-------------------------*/
        orientation[2] = +1;
        orientation[4] = +1;
        orientation[6] = -1;
        break;
    case 10:
        orientation[2] = +1;
        orientation[3] = -1;
        orientation[7] = -1;
        break;
    case 11:
        orientation[2] = +1;
        orientation[4] = -1;
        orientation[6] = +1;
        break;
    case 12:
        orientation[2] = -1;
        orientation[3] = -1;
        orientation[7] = +1;
        break;
    case 13:
        orientation[2] = -1;
        orientation[4] = -1;
        orientation[6] = -1;
        break;
    case 14:
        orientation[2] = -1;
        orientation[3] = +1;
        orientation[7] = -1;
        break;
    case 15:
        orientation[2] = -1;
        orientation[4] = +1;
        orientation[6] = +1;
        break;
    case 16:
        orientation[0] = -1;
        orientation[5] = +1;
        orientation[7] = +1;
        break;
    case 17:
        orientation[1] = -1;
        orientation[5] = +1;
        orientation[6] = -1;
        break;
    case 18:
        orientation[0] = +1;
        orientation[5] = -1;
        orientation[7] = -1;
        break;
    case 19:
        orientation[1] = -1;
        orientation[5] = +1;
        orientation[6] = +1;
        break;
    case 20:
        orientation[0] = +1;
        orientation[5] = -1;
        orientation[7] = +1;
        break;
    case 21:
        orientation[1] = -1;
        orientation[5] = -1;
        orientation[6] = +1;
        break;
    case 22:
        orientation[0] = -1;
        orientation[5] = -1;
        orientation[7] = -1;
        break;
    case 23:
        orientation[1] = +1;
        orientation[5] = -1;
        orientation[6] = -1;
        break;
    default:
        MPL_LOGE("Invalid position %d\n", position);
        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
        return INV_ERROR_INVALID_PARAMETER;
    }

    return INV_SUCCESS;
}

static void PrintMountingOrientation(
    const char * header, signed char *orientation)
{
    MPL_LOGV("%s:\n", header);
    MPL_LOGV("\t[[%3d, %3d, %3d]\n",
             orientation[0], orientation[1], orientation[2]);
    MPL_LOGV("\t [%3d, %3d, %3d]\n",
             orientation[3], orientation[4], orientation[5]);
    MPL_LOGV("\t [%3d, %3d, %3d]]\n",
             orientation[6], orientation[7], orientation[8]);
}

/*****************************
 *   Accel Setup Functions   *
 *****************************/

static inv_error_t SetupAccelSTLIS331Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 5;
        break;
    case PLATFORM_ID_ST_6AXIS:
        position = 0;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *lis331_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_LIS331;
    return INV_SUCCESS;
}

static inv_error_t SetupAccelSTLIS3DHCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 1;
        break;
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 3;
        break;
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *lis3dh_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_LIS3DH;
    return result;
}

static inv_error_t SetupAccelKionixKXSD9Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 7;
        break;
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *kxsd9_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_KXSD9;
    return result;
}

static inv_error_t SetupAccelKionixKXTF9Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB_EVB:
        position =0;
            break;
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 7;
        break;
#ifdef WIN32
    case PLATFORM_ID_DONGLE:
        position = 1;
        break;
#endif
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 1;
        break;
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *kxtf9_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_KXTF9;
    return result;
}

static inv_error_t SetupAccelLSM303Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
        position = 3;
        break;
    case PLATFORM_ID_MSB_V2:
        position = 1;
        break;
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *lsm303dlx_a_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_LSM303;
    return result;
}

static inv_error_t SetupAccelBMA150Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 6;
        break;
#ifdef WIN32
    case PLATFORM_ID_DONGLE:
        position = 3;
        break;
#endif
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *bma150_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_BMA150;
    return result;
}

static inv_error_t SetupAccelBMA222Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 0;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *bma222_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_BMA222;
    return result;
}

static inv_error_t SetupAccelBMA250Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 0;
        break;
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 3;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:

    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *bma250_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_BMA250;
    return result;
}

static inv_error_t SetupAccelADXL34XCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 6;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *adxl34x_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_ADXL34X;
    return result;
}


static inv_error_t SetupAccelMMA8450Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 5;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *mma8450_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_MMA8450;
    return result;
}


static inv_error_t SetupAccelMMA845XCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 5;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_accel.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_accel = *mma845x_get_slave_descr();
#endif
    g_pdata_slave_accel.address         = ACCEL_SLAVEADDR_MMA845X;
    return result;
}


/**
 * @internal
 * Sets up the orientation matrix according to how the gyro was
 * mounted.
 *
 * @param platforId Platform identification for mounting information
 * @return INV_SUCCESS or non-zero error code
 */
static inv_error_t SetupAccelMPU6050Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_MANTIS_MSB:
        position = 6;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
	case PLATFORM_ID_DRAGON_USB_DONGLE:
        position = 1;
        break;
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    case PLATFORM_ID_MANTIS_EVB:
        position = 0;
        break;
    case PLATFORM_ID_MSB_V3:
        position = 2;
        break;
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        return INV_ERROR_INVALID_PARAMETER;
    };

    SetupOrientation(position, g_pdata_slave_accel.orientation);
    /* Interrupt */
#ifndef LINUX
#if defined CONFIG_MPU_SENSORS_MPU6050A2 || defined CONFIG_MPU_SENSORS_MPU6050B1
   // g_slave_accel = // fixme *mpu6050_get_slave_descr();
#endif
#endif
    g_pdata_slave_accel.address         = 0x68;
    return result;
}

/*****************************
    Compass Setup Functions
******************************/
static inv_error_t SetupCompassAKM8975Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_MANTIS_MSB:
        position = 2;
        break;
#ifdef WIN32
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
        position = 4;
        break;
#endif
    case PLATFORM_ID_SPIDER_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
        position = 7;
        break;
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V3:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 6;
        break;
    case PLATFORM_ID_DRAGON_USB_DONGLE:
    case PLATFORM_ID_MSB_EVB:
        position = 5;
        break;
    case PLATFORM_ID_MANTIS_EVB:
        position = 4;
        break;
	 case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *ak8975_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_AKM;
    return result;
}

static inv_error_t SetupCompassMMCCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 7;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *mmc314x_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_MMC314X;
    return result;
}

static inv_error_t SetupCompassAMI304Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 4;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_AMI304;
#ifndef LINUX
    g_slave_compass = *ami30x_get_slave_descr();
#endif
    return result;
}

static inv_error_t SetupCompassAMI306Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 3;
        break;
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 1;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *ami306_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_AMI306;
    return result;
}

static inv_error_t SetupCompassHMC5883Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 6;
        break;
#ifdef WIN32
    case PLATFORM_ID_DONGLE:
        position = 2;
        break;
#endif
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };

    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *hmc5883_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_HMC5883;
    return result;
}


static inv_error_t SetupCompassLSM303DLHCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_10AXIS:
        position = 1;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:

    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }
#ifndef LINUX
    g_slave_compass = *lsm303dlx_m_get_slave_descr();
    g_slave_compass.id = COMPASS_ID_LSM303DLH;
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_HMC5883;
    return result;
}

static inv_error_t SetupCompassLSM303DLMCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
        position = 8;
        break;
    case PLATFORM_ID_MSB_V2:
        position = 12;
        break;
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *lsm303dlx_m_get_slave_descr();
    g_slave_compass.id = COMPASS_ID_LSM303DLM;
#endif
    g_pdata_slave_compass.address       = COMPASS_SLAVEADDR_HMC5883;
    return result;
}

static inv_error_t SetupCompassYAS530Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
        position = 1;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *yas530_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_YAS530;
    return result;
}

static inv_error_t SetupCompassYAS529Calibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 6;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *yas529_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_YAS529;
    return result;
}


static inv_error_t SetupCompassHSCDTD002BCalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 2;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *hscdtd002b_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_HSCDTD00XX;
    return result;
}

static inv_error_t SetupCompassHSCDTD004ACalibration(unsigned short platformId)
{
    inv_error_t result = INV_SUCCESS;
    unsigned int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
        position = 1;
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_MANTIS_MSB:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        LOG_RESULT_LOCATION(INV_ERROR_FEATURE_NOT_IMPLEMENTED);
        return INV_ERROR_FEATURE_NOT_IMPLEMENTED;
    };
    result = SetupOrientation(position, g_pdata_slave_compass.orientation);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }

#ifndef LINUX
    g_slave_compass = *hscdtd004a_get_slave_descr();
#endif
    g_pdata_slave_compass.address         = COMPASS_SLAVEADDR_HSCDTD00XX;
    return result;
}


/*****************************
    Pressure Setup Functions
******************************/
#if 0
static inv_error_t SetupPressureBMA085Calibration(unsigned short platformId)
{
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    memset(g_pdata_slave_pressure.orientation, 0, sizeof(g_pdata_slave_pressure.orientation));

    g_pdata_slave_pressure.bus             = EXT_SLAVE_BUS_PRIMARY;
#ifndef LINUX
    g_slave_pressure = *bma085_get_slave_descr();
#endif
    g_pdata_slave_pressure.address         = PRESSURE_SLAVEADDR_BMA085;
    return INV_SUCCESS;
}
#endif
/**
 * @internal
 * Sets up the orientation matrix according to how the part was
 * mounted.
 *
 * @param platforId Platform identification for mounting information
 * @return INV_SUCCESS or non-zero error code
 */
static inv_error_t SetupAccelCalibration(unsigned short platformId,
                                      unsigned short accelId)
{
    /*----  setup the accels ----*/
    switch(accelId) {
    case ACCEL_ID_LSM303DLX:
        SetupAccelLSM303Calibration(platformId);
        break;
    case ACCEL_ID_LIS331:
        SetupAccelSTLIS331Calibration(platformId);
        break;
    case ACCEL_ID_KXSD9:
        SetupAccelKionixKXSD9Calibration(platformId);
        break;
    case ACCEL_ID_KXTF9:
        SetupAccelKionixKXTF9Calibration(platformId);
        break;
    case ACCEL_ID_BMA150:
        SetupAccelBMA150Calibration(platformId);
        break;
    case ACCEL_ID_BMA222:
        SetupAccelBMA222Calibration(platformId);
        break;
    case ACCEL_ID_BMA250:
        SetupAccelBMA250Calibration(platformId);
        break;
    case ACCEL_ID_ADXL34X:
        SetupAccelADXL34XCalibration(platformId);
        break;
    case ACCEL_ID_MMA8450:
        SetupAccelMMA8450Calibration(platformId);
        break;
    case ACCEL_ID_MMA845X:
        SetupAccelMMA845XCalibration(platformId);
        break;
    case ACCEL_ID_LIS3DH:
        SetupAccelSTLIS3DHCalibration(platformId);
        break;
    case ACCEL_ID_MPU6050:
        SetupAccelMPU6050Calibration(platformId);
        break;
    case ID_INVALID:
        break;
    default:
        LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
        return INV_ERROR_INVALID_PARAMETER;
    }

    if (accelId != ID_INVALID && accelId != ACCEL_ID_MPU6050) {
        g_pdata_slave_accel.bus             = EXT_SLAVE_BUS_SECONDARY;
    } else if (accelId != ACCEL_ID_MPU6050) {
        g_pdata_slave_accel.bus             = EXT_SLAVE_BUS_PRIMARY;
    }

#ifndef WIN32
    if (accelId != ID_INVALID)
        Rotate180DegAroundZAxis(g_pdata_slave_accel.orientation);
#endif

    return INV_SUCCESS;
}

/**
 * @internal
 * Sets up the orientation matrix according to how the part was
 * mounted.
 *
 * @param platforId Platform identification for mounting information
 * @return INV_SUCCESS or non-zero error code
 */
inv_error_t SetupCompassCalibration(unsigned short platformId,
                                 unsigned short compassId)
{
    /*----  setup the compass ----*/
    switch(compassId) {
    case COMPASS_ID_AK8975:
        SetupCompassAKM8975Calibration(platformId);
        break;
    case COMPASS_ID_AMI30X:
        SetupCompassAMI304Calibration(platformId);
        break;
    case COMPASS_ID_AMI306:
        SetupCompassAMI306Calibration(platformId);
        break;
    case COMPASS_ID_LSM303DLH:
        SetupCompassLSM303DLHCalibration(platformId);
        break;
    case COMPASS_ID_LSM303DLM:
        SetupCompassLSM303DLMCalibration(platformId);
        break;
    case COMPASS_ID_HMC5883:
        SetupCompassHMC5883Calibration(platformId);
        break;
    case COMPASS_ID_YAS529:
        SetupCompassYAS529Calibration(platformId);
        break;
    case COMPASS_ID_YAS530:
        SetupCompassYAS530Calibration(platformId);
        break;
    case COMPASS_ID_MMC314X:
        SetupCompassMMCCalibration(platformId);
        break;
    case COMPASS_ID_HSCDTD002B:
        SetupCompassHSCDTD002BCalibration(platformId);
        break;
    case COMPASS_ID_HSCDTD004A:
        SetupCompassHSCDTD004ACalibration(platformId);
        break;
    case ID_INVALID:
        break;
    default:
        if (INV_ERROR_INVALID_PARAMETER) {
            LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
            return INV_ERROR_INVALID_PARAMETER;
        }
        break;
    }

    if (platformId == PLATFORM_ID_MSB_V2_MANTIS     ||
        platformId == PLATFORM_ID_MANTIS_MSB        ||
        platformId == PLATFORM_ID_MANTIS_USB_DONGLE ||
        platformId == PLATFORM_ID_MANTIS_PROTOTYPE  ||
        platformId == PLATFORM_ID_DRAGON_PROTOTYPE) {
        switch (compassId) {
        case ID_INVALID:
            g_pdata_slave_compass.bus = EXT_SLAVE_BUS_INVALID;
            break;
        case COMPASS_ID_AK8975:
        case COMPASS_ID_AMI306:
            g_pdata_slave_compass.bus             = EXT_SLAVE_BUS_SECONDARY;
            break;
        default:
            g_pdata_slave_compass.bus             = EXT_SLAVE_BUS_PRIMARY;
        };
    } else {
        g_pdata_slave_compass.bus             = EXT_SLAVE_BUS_PRIMARY;
    }

#ifndef WIN32
    if (compassId != ID_INVALID)
        Rotate180DegAroundZAxis(g_pdata_slave_compass.orientation);
#endif

    return INV_SUCCESS;
}

/**
 * @internal
 * Sets up the orientation matrix according to how the part was
 * mounted.
 *
 * @param platforId Platform identification for mounting information
 * @return INV_SUCCESS or non-zero error code
 */
#if 0
inv_error_t SetupPressureCalibration(unsigned short platformId,
                                  unsigned short pressureId)
{
    inv_error_t result = INV_SUCCESS;
    /*----  setup the compass ----*/
    switch(pressureId) {
        case PRESSURE_ID_BMA085:
            result = SetupPressureBMA085Calibration(platformId);
            break;
        default:
            if (INV_ERROR_INVALID_PARAMETER) {
                LOG_RESULT_LOCATION(INV_ERROR_INVALID_PARAMETER);
                return INV_ERROR_INVALID_PARAMETER;
            }
    };

    return result;
}
#endif
/**
 * @internal
 * Sets up the orientation matrix according to how the gyro was
 * mounted.
 *
 * @param platforId Platform identification for mounting information
 * @return INV_SUCCESS or non-zero error code
 */
static inv_error_t SetupGyroCalibration(unsigned short platformId)
{
    int position;
    MPL_LOGV("Calibrating '%s'\n", __func__);

    /* Orientation */
    switch (platformId) {
    case PLATFORM_ID_SPIDER_PROTOTYPE:
        position = 2;
        break;
    case PLATFORM_ID_MSB:
    case PLATFORM_ID_MSB_10AXIS:
    case PLATFORM_ID_MANTIS_MSB:
#ifndef WIN32
        position = 4;
#else
        position = 6;
#endif
        break;
    case PLATFORM_ID_DONGLE:
    case PLATFORM_ID_MANTIS_USB_DONGLE:
        position = 1;
        break;
    case PLATFORM_ID_DRAGON_USB_DONGLE:
        position = 3;
        break;
    case PLATFORM_ID_MANTIS_PROTOTYPE:
    case PLATFORM_ID_DRAGON_PROTOTYPE:
    case PLATFORM_ID_ST_6AXIS:
    case PLATFORM_ID_MSB_V2:
    case PLATFORM_ID_MSB_V2_MANTIS:
#ifndef WIN32
        position = 2;
#else
        position = 0;
#endif
        break;
    case PLATFORM_ID_MANTIS_EVB:
    case PLATFORM_ID_MSB_EVB:
        position = 0;
        break;
    case PLATFORM_ID_MSB_V3:
        position = 2;
        break;
    default:
        MPL_LOGE("Unsupported platform %d\n", platformId);
        return INV_ERROR_INVALID_PARAMETER;
    };

    SetupOrientation(position, g_gyro_orientation);

    return INV_SUCCESS;
}

/**
 *  @brief  Setup the Hw orientation and full scale.
 *  @param  platfromId
 *              an user defined Id to distinguish the Hw platform in
 *              use from others.
 *  @param  accelId
 *              the accelerometer specific id, as specified in the MPL.
 *  @param  compassId
 *              the compass specific id, as specified in the MPL.
 *  @return INV_SUCCESS or a non-zero error code.
 */
inv_error_t SetupPlatform(
                unsigned short platformId,
                unsigned short accelId,
                unsigned short compassId)
{
    int result;

    memset(&g_slave_accel, 0, sizeof(g_slave_accel));
    memset(&g_slave_compass, 0, sizeof(g_slave_compass));
//    memset(&g_slave_pressure, 0, sizeof(g_slave_pressure));
//    memset(&g_pdata, 0, sizeof(g_pdata));

#ifdef LINUX
    /* On Linux initialize the global platform data with the driver defaults */
    {
        void *mpu_handle;
        int ii;

        struct ext_slave_descr *slave[EXT_SLAVE_NUM_TYPES];
        struct ext_slave_platform_data *pdata_slave[EXT_SLAVE_NUM_TYPES];
        slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
        slave[EXT_SLAVE_TYPE_ACCEL] = &g_slave_accel;
        slave[EXT_SLAVE_TYPE_COMPASS] = &g_slave_compass;
        //slave[EXT_SLAVE_TYPE_PRESSURE] = &g_slave_pressure;

        pdata_slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
        pdata_slave[EXT_SLAVE_TYPE_ACCEL] = &g_pdata_slave_accel;
        pdata_slave[EXT_SLAVE_TYPE_COMPASS] = &g_pdata_slave_compass;
        //pdata_slave[EXT_SLAVE_TYPE_PRESSURE] = &g_pdata_slave_pressure;

        MPL_LOGI("Getting the MPU_GET_PLATFORM_DATA\n");
        result = inv_serial_open("/dev/mpu",&mpu_handle);
        if (result) {
            MPL_LOGE("MPU_GET_PLATFORM_DATA failed %d\n", result);
        }
        for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
            if (!slave[ii])
                continue;
            slave[ii]->type = ii;
            result = ioctl((int)mpu_handle, MPU_GET_EXT_SLAVE_DESCR,
                           slave[ii]);
            if (result)
                result = errno;
            if(result == INV_ERROR_INVALID_MODULE) {
                slave[ii] = NULL;
                result = 0;
            } else if (result) {
                LOG_RESULT_LOCATION(result);
                LOG_RESULT_LOCATION(INV_ERROR_INVALID_MODULE);
                return result;
            }
        }
        //result = ioctl((int)mpu_handle, MPU_GET_MPU_PLATFORM_DATA, &g_pdata);
        if (result) {
            result = errno;
            LOG_RESULT_LOCATION(result);
            return result;
        }
        for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
            if (!pdata_slave[ii])
                continue;
            pdata_slave[ii]->type = ii;
            result = ioctl(
                (int)mpu_handle, MPU_GET_EXT_SLAVE_PLATFORM_DATA,
                pdata_slave[ii]);
            if (result)
                result = errno;
            if (result == INV_ERROR_INVALID_MODULE) {
                pdata_slave[ii] = NULL;
                result = 0;
            } else if (result) {
                LOG_RESULT_LOCATION(result);
                return result;
            }
        }
        if (result) {
            MPL_LOGE("MPU_GET_PLATFORM_DATA failed %d\n", result);
        }
        inv_serial_close(mpu_handle);
    }
#endif

    result = SetupGyroCalibration(platformId);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }
    PrintMountingOrientation("Gyroscope", g_gyro_orientation);
    result = SetupAccelCalibration(platformId, accelId);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }
    PrintMountingOrientation("Accelerometer", g_pdata_slave_accel.orientation);
    result = SetupCompassCalibration(platformId, compassId);
    if (result) {
        LOG_RESULT_LOCATION(result);
        return result;
    }
    PrintMountingOrientation("Compass", g_pdata_slave_compass.orientation);
#if 0
    if (platformId == PLATFORM_ID_MSB_10AXIS) {
        result = SetupPressureCalibration(platformId, PRESSURE_ID_BMA085);
        if (result) {
            LOG_RESULT_LOCATION(result);
            return result;
        }
        PrintMountingOrientation("Pressure", g_pdata_slave_pressure.orientation);
    }
#endif
#ifdef LINUX
    /* On Linux override the orientation, level shifter etc */
    {
        void *mpu_handle;
        int ii;
        struct ext_slave_descr *slave[EXT_SLAVE_NUM_TYPES];
        struct ext_slave_platform_data *pdata_slave[EXT_SLAVE_NUM_TYPES];
        slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
        slave[EXT_SLAVE_TYPE_ACCEL] = &g_slave_accel;
        slave[EXT_SLAVE_TYPE_COMPASS] = &g_slave_compass;
        //slave[EXT_SLAVE_TYPE_PRESSURE] = &g_slave_pressure;

        pdata_slave[EXT_SLAVE_TYPE_GYROSCOPE] = NULL;
        pdata_slave[EXT_SLAVE_TYPE_ACCEL] = &g_pdata_slave_accel;
        pdata_slave[EXT_SLAVE_TYPE_COMPASS] = &g_pdata_slave_compass;
        //pdata_slave[EXT_SLAVE_TYPE_PRESSURE] = &g_pdata_slave_pressure;

        MPL_LOGI("Setting the MPU_SET_PLATFORM_DATA\n");
        result = inv_serial_open("/dev/mpu",&mpu_handle);
        if (result) {
            MPL_LOGE("MPU_SET_PLATFORM_DATA failed %d\n", result);
        }
        for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
            if (!slave[ii])
                continue;
            slave[ii]->type = ii;
            result = ioctl((int)mpu_handle, MPU_SET_EXT_SLAVE_PLATFORM_DATA,
                           slave[ii]);
            if (result)
                result = errno;
            if (result == INV_ERROR_INVALID_MODULE) {
                slave[ii] = NULL;
                result = 0;
            } else if (result) {
                LOG_RESULT_LOCATION(result);
                return result;
            }
        }
        //result = ioctl((int)mpu_handle, MPU_SET_MPU_PLATFORM_DATA, &g_pdata);
        if (result) {
            result = errno;
            LOG_RESULT_LOCATION(result);
            return result;
        }
        for (ii = 0; ii < EXT_SLAVE_NUM_TYPES; ii++) {
            if (!pdata_slave[ii])
                continue;
            pdata_slave[ii]->type = ii;
            result = ioctl((int)mpu_handle, MPU_SET_EXT_SLAVE_PLATFORM_DATA,
                pdata_slave[ii]);
            if (result)
                result = errno;
            if (result == INV_ERROR_INVALID_MODULE) {
                pdata_slave[ii] = NULL;
                result = 0;
            } else if (result) {
                LOG_RESULT_LOCATION(result);
                return result;
            }
        }
        if (result) {
            MPL_LOGE("MPU_SET_PLATFORM_DATA failed %d\n", result);
        }
        inv_serial_close(mpu_handle);
    }
#endif
    return INV_SUCCESS;
}

/**
 * @}
 */


