17494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/*
27494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $License:
37494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
47494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall $
57494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
67494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
77494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/******************************************************************************
87494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
97494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * $Id: ml_stored_data.c 6132 2011-10-01 03:17:27Z mcaramello $
107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *****************************************************************************/
127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @defgroup ML_STORED_DATA
157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @{
177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *      @file     ml_stored_data.c
187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *      @brief    functions for reading and writing stored data sets.
197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *                Typically, these functions process stored calibration data.
207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include <stdio.h>
237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
248504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall#include "log.h"
257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#undef MPL_LOG_TAG
267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define MPL_LOG_TAG "MPL-storeload"
277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "ml_stored_data.h"
297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "storage_manager.h"
307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#include "mlos.h"
317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOADCAL_DEBUG    0
337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define STORECAL_DEBUG   0
347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define DEFAULT_KEY 29681
367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define STORECAL_LOG MPL_LOGI
387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall#define LOADCAL_LOG  MPL_LOGI
397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
4033ce91b37062fa63af192f5643de93f3beebe854JP Abgrallinv_error_t inv_read_cal(unsigned char **calData, size_t *bytesRead)
417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    FILE *fp;
437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t result = INV_SUCCESS;
4433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    size_t fsize;
457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    fp = fopen(MLCAL_FILE,"rb");
477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (fp == NULL) {
487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_FILE_OPEN;
507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
5133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
5233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    // obtain file size
5333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    fseek (fp, 0 , SEEK_END);
5433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    fsize = ftell (fp);
5533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    rewind (fp);
5633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
5733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    *calData = (unsigned char *)inv_malloc(fsize);
5833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (*calData==NULL) {
5933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        MPL_LOGE("Could not allocate buffer of %d bytes - "
6033ce91b37062fa63af192f5643de93f3beebe854JP Abgrall                 "aborting\n", fsize);
6133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        fclose(fp);
6233ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        return INV_ERROR_MEMORY_EXAUSTED;
6333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    }
6433ce91b37062fa63af192f5643de93f3beebe854JP Abgrall
6533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    *bytesRead = fread(*calData, 1, fsize, fp);
6633ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    if (*bytesRead != fsize) {
6733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        MPL_LOGE("bytes read (%d) don't match file size (%d)\n",
6833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall                 *bytesRead, fsize);
697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        result = INV_ERROR_FILE_READ;
707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        goto read_cal_end;
717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    else {
7333ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        MPL_LOGI("Bytes read = %d", *bytesRead);
747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallread_cal_end:
777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    fclose(fp);
787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return result;
797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_write_cal(unsigned char *cal, size_t len)
827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    FILE *fp;
847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    int bytesWritten;
857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t result = INV_SUCCESS;
867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (len <= 0) {
887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Nothing to write");
897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_FILE_WRITE;
907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    else {
927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGI("cal data size to write = %d", len);
937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    fp = fopen(MLCAL_FILE,"wb");
957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (fp == NULL) {
967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Cannot open file \"%s\" for write\n", MLCAL_FILE);
977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_FILE_OPEN;
987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    bytesWritten = fwrite(cal, 1, len, fp);
1007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (bytesWritten != len) {
1017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
1027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 bytesWritten, len);
1037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        result = INV_ERROR_FILE_WRITE;
1047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
1057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    else {
1067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGI("Bytes written = %d", bytesWritten);
1077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
1087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    fclose(fp);
1097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return result;
1107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
1117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
1137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @brief  Loads a type 0 set of calibration data.
1147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          It parses a binary data set containing calibration data.
1157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          The binary data set is intended to be loaded from a file.
1167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          This calibrations data format stores values for (in order of
1177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          appearance) :
1187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - temperature compensation : temperature data points,
1197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - temperature compensation : gyro biases data points for X, Y,
1207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              and Z axes.
1217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - accel biases for X, Y, Z axes.
1227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          This calibration data is produced internally by the MPL and its
1237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          size is 2777 bytes (header and checksum included).
1247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          Calibration format type 1 is currently used for ITG3500
1257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @pre    inv_init_storage_manager()
1277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          must have been called.
1287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  calData
1307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              A pointer to an array of bytes to be parsed.
1317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  len
1327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              the length of the calibration
1337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
1357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_load_cal_V0(unsigned char *calData, size_t len)
1377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
1387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t result;
1397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    LOADCAL_LOG("Entering inv_load_cal_V0\n");
1417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    /*if (len != expLen) {
1437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Calibration data type 0 must be %d bytes long (got %d)\n",
1447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 expLen, len);
1457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_FILE_READ;
1467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }*/
1477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    result = inv_load_mpl_states(calData, len);
1497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return result;
1507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
1517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
1537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @brief  Loads a type 1 set of calibration data.
1547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          It parses a binary data set containing calibration data.
1557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          The binary data set is intended to be loaded from a file.
1567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          This calibrations data format stores values for (in order of
1577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          appearance) :
1587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - temperature,
1597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - gyro biases for X, Y, Z axes,
1607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          - accel biases for X, Y, Z axes.
1617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          This calibration data would normally be produced by the MPU Self
1627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          Test and its size is 36 bytes (header and checksum included).
1637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          Calibration format type 1 is produced by the MPU Self Test and
1647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          substitutes the type 0 : inv_load_cal_V0().
1657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @pre
1677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  calData
1697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              A pointer to an array of bytes to be parsed.
1707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  len
1717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              the length of the calibration
1727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
1747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_load_cal_V1(unsigned char *calData, size_t len)
1767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
1777494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return INV_SUCCESS;
1787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
1797494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
1807494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
1817494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @brief   Loads a set of calibration data.
1827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          It parses a binary data set containing calibration data.
1837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          The binary data set is intended to be loaded from a file.
1847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1857494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @pre
1867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1887494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @param   calData
1897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              A pointer to an array of bytes to be parsed.
1907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
1917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall * @return  INV_SUCCESS if successful, a non-zero error code otherwise.
1927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
1937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_load_cal(unsigned char *calData)
1947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
1957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    int calType = 0;
1967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    int len = 0;
1977494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    //int ptr;
1987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    //uint32_t chk = 0;
1997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    //uint32_t cmp_chk = 0;
2007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    /*load_func_t loaders[] = {
2027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        inv_load_cal_V0,
2037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        inv_load_cal_V1,
2047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    };
2057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    */
2067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_load_cal_V0(calData, len);
2087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    /* read the header (type and len)
2107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall       len is the total record length including header and checksum */
2117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    len = 0;
2127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    len += 16777216L * ((int)calData[0]);
2137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    len += 65536L * ((int)calData[1]);
2147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    len += 256 * ((int)calData[2]);
2157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    len += (int)calData[3];
2167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    calType = ((int)calData[4]) * 256 + ((int)calData[5]);
2187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (calType > 5) {
2197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Unsupported calibration file format %d. "
2207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "Valid types 0..5\n", calType);
2217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_INVALID_PARAMETER;
2227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
2237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    /* call the proper method to read in the data */
2257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    //return loaders[calType] (calData, len);
2267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return 0;
2277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
2287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
2307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @brief  Stores a set of calibration data.
2317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          It generates a binary data set containing calibration data.
2327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          The binary data set is intended to be stored into a file.
2337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @pre    inv_dmp_open()
2357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  calData
2377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              A pointer to an array of bytes to be stored.
2387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @param  length
2397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *              The amount of bytes available in the array.
2407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
2427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_store_cal(unsigned char *calData, size_t length)
2447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
2457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t res = 0;
2467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    size_t size;
2477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2487494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    STORECAL_LOG("Entering inv_store_cal\n");
2497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_get_mpl_state_size(&size);
2517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    MPL_LOGI("inv_get_mpl_state_size() : size=%d", size);
2537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2547494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    /* store data */
2557494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    res = inv_save_mpl_states(calData, size);
2567494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if(res != 0)
2577494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    {
2587494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("inv_save_mpl_states() failed");
2597494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
2607494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2617494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    STORECAL_LOG("Exiting inv_store_cal\n");
2627494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    return INV_SUCCESS;
2637494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
2647494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2657494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
2667494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @brief  Load a calibration file.
2677494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2687494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @pre    Must be in INV_STATE_DMP_OPENED state.
2697494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          inv_dmp_open() or inv_dmp_stop() must have been called.
2707494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
2717494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          been called.
2727494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
2737494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @return 0 or error code.
2747494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
2757494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_load_calibration(void)
2767494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
27733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    unsigned char *calData= NULL;
2787494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t result = 0;
27933ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    size_t bytesRead = 0;
28064ca18f95225d0a86f7ccfd1d21c23971b9f77aeRamanan Rajeswaran
28133ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    result = inv_read_cal(&calData, &bytesRead);
2827494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if(result != INV_SUCCESS) {
2837494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Could not load cal file - "
2847494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "aborting\n");
28533ce91b37062fa63af192f5643de93f3beebe854JP Abgrall        goto free_mem_n_exit;
2867494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
2877494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
28833ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    result = inv_load_mpl_states(calData, bytesRead);
2897494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (result != INV_SUCCESS) {
2907494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Could not load the calibration data - "
2917494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "error %d - aborting\n", result);
2927494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        goto free_mem_n_exit;
2937494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
2947494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
2957494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallfree_mem_n_exit:
2967494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_free(calData);
29733ce91b37062fa63af192f5643de93f3beebe854JP Abgrall    return result;
2987494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
2997494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3007494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
3017494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @brief  Store runtime calibration data to a file
3027494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
3037494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @pre    Must be in INV_STATE_DMP_OPENED state.
3047494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          inv_dmp_open() or inv_dmp_stop() must have been called.
3057494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
3067494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *          been called.
3077494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *
3087494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @return 0 or error code.
3097494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
3107494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallinv_error_t inv_store_calibration(void)
3117494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall{
3127494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    unsigned char *calData;
3137494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_error_t result;
3147494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    size_t length;
3157494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3167494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    result = inv_get_mpl_state_size(&length);
3177494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    calData = (unsigned char *)inv_malloc(length);
3187494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (!calData) {
3197494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Could not allocate buffer of %d bytes - "
3207494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "aborting\n", length);
3217494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        return INV_ERROR_MEMORY_EXAUSTED;
3227494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3237494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    else {
3247494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGI("mpl state size = %d", length);
3257494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3267494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3277494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    result = inv_save_mpl_states(calData, length);
3287494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (result != INV_SUCCESS) {
3297494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Could not save mpl states - "
3307494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "error %d - aborting\n", result);
3317494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        goto free_mem_n_exit;
3327494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3337494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    else {
3347494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("calData from inv_save_mpl_states, size=%d",
3357494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 strlen((char *)calData));
3367494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3377494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3387494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    result = inv_write_cal(calData, length);
3397494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    if (result != INV_SUCCESS) {
3407494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        MPL_LOGE("Could not store calibrated data on file - "
3417494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall                 "error %d - aborting\n", result);
3427494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall        goto free_mem_n_exit;
3437494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3447494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    }
3457494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3467494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrallfree_mem_n_exit:
3477494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall    inv_free(calData);
3488504ee554e5ca7014b3160b1cbeb4506e231338bJP Abgrall    return result;
3497494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall}
3507494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall
3517494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall/**
3527494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall *  @}
3537494581689b0fc1d8addd016b1c92d74d01f5ad4JP Abgrall */
354