149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/*
249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $License:
349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    Copyright (C) 2011 InvenSense Corporation, All Rights Reserved.
449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow $
549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/******************************************************************************
849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * $Id: ml_stored_data.c 6132 2011-10-01 03:17:27Z mcaramello $
1049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
1149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *****************************************************************************/
1249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
1349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
1449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @defgroup ML_STORED_DATA
1549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
1649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @{
1749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *      @file     ml_stored_data.c
1849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *      @brief    functions for reading and writing stored data sets.
1949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *                Typically, these functions process stored calibration data.
2049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
2149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#undef MPL_LOG_NDEBUG
2349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_NDEBUG 0 /* Use 0 to turn on MPL_LOGV output */
2449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#undef MPL_LOG_TAG
2549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include <stdio.h>
2749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
2849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "log.h"
2949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#undef MPL_LOG_TAG
3049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define MPL_LOG_TAG "MPL-storeload"
3149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "ml_stored_data.h"
3349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "storage_manager.h"
3449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#include "mlos.h"
3549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOADCAL_DEBUG    0
3749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define STORECAL_DEBUG   0
3849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
3949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define DEFAULT_KEY 29681
4049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
4149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define STORECAL_LOG MPL_LOGI
4249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow#define LOADCAL_LOG  MPL_LOGI
4349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
4449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_read_cal(unsigned char **calData, size_t *bytesRead)
4549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
4649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    FILE *fp;
4749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t result = INV_SUCCESS;
4849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    size_t fsize;
4949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fp = fopen(MLCAL_FILE,"rb");
5149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (fp == NULL) {
5249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
5349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_FILE_OPEN;
5449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
5549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
5649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    // obtain file size
5749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fseek (fp, 0 , SEEK_END);
5849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fsize = ftell (fp);
5949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    rewind (fp);
6049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
6149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    *calData = (unsigned char *)inv_malloc(fsize);
6249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (*calData==NULL) {
6349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not allocate buffer of %d bytes - "
6449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "aborting\n", fsize);
6549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        fclose(fp);
6649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_MEMORY_EXAUSTED;
6749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
6849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
6949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    *bytesRead = fread(*calData, 1, fsize, fp);
7049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (*bytesRead != fsize) {
7149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("bytes read (%d) don't match file size (%d)\n",
7249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 *bytesRead, fsize);
7349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        result = INV_ERROR_FILE_READ;
7449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        goto read_cal_end;
75cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    } else {
76cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro        MPL_LOGV("Bytes read = %d", *bytesRead);
7749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
7849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
7949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowread_cal_end:
8049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fclose(fp);
8149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return result;
8249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
8349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
8449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_write_cal(unsigned char *cal, size_t len)
8549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
8649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    FILE *fp;
8749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int bytesWritten;
8849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t result = INV_SUCCESS;
8949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
9049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (len <= 0) {
9149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Nothing to write");
9249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_FILE_WRITE;
93cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    } else {
94cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro        MPL_LOGV("cal data size to write = %d", len);
9549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
9649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fp = fopen(MLCAL_FILE,"wb");
9749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (fp == NULL) {
9849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Cannot open file \"%s\" for write\n", MLCAL_FILE);
9949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_FILE_OPEN;
10049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
10149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    bytesWritten = fwrite(cal, 1, len, fp);
10249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (bytesWritten != len) {
10349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
10449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 bytesWritten, len);
10549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        result = INV_ERROR_FILE_WRITE;
106cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    } else {
107cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro        MPL_LOGV("Bytes written = %d", bytesWritten);
10849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
10949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    fclose(fp);
11049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return result;
11149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
11249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
11349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
11449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief  Loads a type 0 set of calibration data.
11549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          It parses a binary data set containing calibration data.
11649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          The binary data set is intended to be loaded from a file.
11749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          This calibrations data format stores values for (in order of
11849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          appearance) :
11949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - temperature compensation : temperature data points,
12049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - temperature compensation : gyro biases data points for X, Y,
12149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              and Z axes.
12249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - accel biases for X, Y, Z axes.
12349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          This calibration data is produced internally by the MPL and its
12449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          size is 2777 bytes (header and checksum included).
12549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          Calibration format type 1 is currently used for ITG3500
12649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
12749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @pre    inv_init_storage_manager()
12849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          must have been called.
12949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
13049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  calData
13149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              A pointer to an array of bytes to be parsed.
13249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  len
13349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              the length of the calibration
13449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
13549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
13649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
13749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_load_cal_V0(unsigned char *calData, size_t len)
13849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
13949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t result;
14049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
14149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    LOADCAL_LOG("Entering inv_load_cal_V0\n");
14249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
14349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /*if (len != expLen) {
14449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Calibration data type 0 must be %d bytes long (got %d)\n",
14549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 expLen, len);
14649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_FILE_READ;
14749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }*/
14849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
14949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_load_mpl_states(calData, len);
15049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return result;
15149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
15249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
15349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
15449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief  Loads a type 1 set of calibration data.
15549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          It parses a binary data set containing calibration data.
15649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          The binary data set is intended to be loaded from a file.
15749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          This calibrations data format stores values for (in order of
15849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          appearance) :
15949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - temperature,
16049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - gyro biases for X, Y, Z axes,
16149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          - accel biases for X, Y, Z axes.
16249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          This calibration data would normally be produced by the MPU Self
16349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          Test and its size is 36 bytes (header and checksum included).
16449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          Calibration format type 1 is produced by the MPU Self Test and
16549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          substitutes the type 0 : inv_load_cal_V0().
16649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
16749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @pre
16849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
16949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  calData
17049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              A pointer to an array of bytes to be parsed.
17149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  len
17249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              the length of the calibration
17349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
17449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
17549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
17649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_load_cal_V1(unsigned char *calData, size_t len)
17749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
17849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return INV_SUCCESS;
17949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
18049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
18149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
18249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @brief   Loads a set of calibration data.
18349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          It parses a binary data set containing calibration data.
18449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          The binary data set is intended to be loaded from a file.
18549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
18649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @pre
18749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
18849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
18949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @param   calData
19049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              A pointer to an array of bytes to be parsed.
19149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
19249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow * @return  INV_SUCCESS if successful, a non-zero error code otherwise.
19349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
19449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_load_cal(unsigned char *calData)
19549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
19649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int calType = 0;
19749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    int len = 0;
19849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //int ptr;
19949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //uint32_t chk = 0;
20049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //uint32_t cmp_chk = 0;
20149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /*load_func_t loaders[] = {
20349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        inv_load_cal_V0,
20449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        inv_load_cal_V1,
20549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    };
20649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    */
20749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
20849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_load_cal_V0(calData, len);
20949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
21049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /* read the header (type and len)
21149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow       len is the total record length including header and checksum */
21249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    len = 0;
21349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    len += 16777216L * ((int)calData[0]);
21449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    len += 65536L * ((int)calData[1]);
21549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    len += 256 * ((int)calData[2]);
21649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    len += (int)calData[3];
21749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
21849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    calType = ((int)calData[4]) * 256 + ((int)calData[5]);
21949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (calType > 5) {
22049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Unsupported calibration file format %d. "
22149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "Valid types 0..5\n", calType);
22249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_INVALID_PARAMETER;
22349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
22449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
22549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /* call the proper method to read in the data */
22649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    //return loaders[calType] (calData, len);
22749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return 0;
22849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
22949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
23049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
23149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief  Stores a set of calibration data.
23249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          It generates a binary data set containing calibration data.
23349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          The binary data set is intended to be stored into a file.
23449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
23549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @pre    inv_dmp_open()
23649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
23749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  calData
23849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              A pointer to an array of bytes to be stored.
23949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @param  length
24049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *              The amount of bytes available in the array.
24149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
24249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
24349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
24449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_store_cal(unsigned char *calData, size_t length)
24549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
24649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t res = 0;
24749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    size_t size;
24849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
24949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    STORECAL_LOG("Entering inv_store_cal\n");
25049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_get_mpl_state_size(&size);
25249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
253cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    MPL_LOGV("inv_get_mpl_state_size() : size=%d", size);
25449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
25549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    /* store data */
25649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    res = inv_save_mpl_states(calData, size);
257cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    if(res != 0) {
25849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("inv_save_mpl_states() failed");
25949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
26049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
26149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    STORECAL_LOG("Exiting inv_store_cal\n");
26249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return INV_SUCCESS;
26349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
26449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
26549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
26649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief  Load a calibration file.
26749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
26849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @pre    Must be in INV_STATE_DMP_OPENED state.
26949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          inv_dmp_open() or inv_dmp_stop() must have been called.
27049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
27149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          been called.
27249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
27349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @return 0 or error code.
27449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
27549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_load_calibration(void)
27649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
27749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    unsigned char *calData= NULL;
27849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t result = 0;
27949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    size_t bytesRead = 0;
28049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
28149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_read_cal(&calData, &bytesRead);
28249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if(result != INV_SUCCESS) {
28349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not load cal file - "
28449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "aborting\n");
28549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        goto free_mem_n_exit;
28649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
28749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
28849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_load_mpl_states(calData, bytesRead);
28949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (result != INV_SUCCESS) {
29049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not load the calibration data - "
29149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "error %d - aborting\n", result);
29249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        goto free_mem_n_exit;
29349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
29449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
29549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowfree_mem_n_exit:
29649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_free(calData);
29749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return result;
29849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
29949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
30049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
30149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @brief  Store runtime calibration data to a file
30249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
30349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @pre    Must be in INV_STATE_DMP_OPENED state.
30449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          inv_dmp_open() or inv_dmp_stop() must have been called.
30549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
30649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *          been called.
30749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *
30849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @return 0 or error code.
30949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
31049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowinv_error_t inv_store_calibration(void)
31149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow{
31249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    unsigned char *calData;
31349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_error_t result;
31449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    size_t length;
31549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
31649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_get_mpl_state_size(&length);
31749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    calData = (unsigned char *)inv_malloc(length);
31849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (!calData) {
31949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not allocate buffer of %d bytes - "
32049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "aborting\n", length);
32149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        return INV_ERROR_MEMORY_EXAUSTED;
322cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    } else {
323cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro        MPL_LOGV("inv_get_mpl state size = %d", length);
32449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
32549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
32649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_save_mpl_states(calData, length);
32749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (result != INV_SUCCESS) {
32849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not save mpl states - "
32949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "error %d - aborting\n", result);
33049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        goto free_mem_n_exit;
331cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro    } else {
332cd79002b2edb60b25843e5f4f9a06e768bc1a568Nick Vaccaro        MPL_LOGV("calData from inv_save_mpl_states, size=%d",
33349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 strlen((char *)calData));
33449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
33549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
33649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    result = inv_write_cal(calData, length);
33749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    if (result != INV_SUCCESS) {
33849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        MPL_LOGE("Could not store calibrated data on file - "
33949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow                 "error %d - aborting\n", result);
34049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow        goto free_mem_n_exit;
34149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34249ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    }
34349ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34449ea3e26ca3c6a779e527a0322e49a663333350aRosa Chowfree_mem_n_exit:
34549ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    inv_free(calData);
34649ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow    return result;
34749ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow}
34849ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow
34949ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow/**
35049ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow *  @}
35149ea3e26ca3c6a779e527a0322e49a663333350aRosa Chow */
352