1c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/*
2c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro $License:
32eed2d4028b5706e977b016e49b010ee5595e48aNick Vaccaro    Copyright (C) 2014 InvenSense Corporation, All Rights Reserved.
4c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro $
5c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
6c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
7c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/******************************************************************************
8c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
9c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * $Id: ml_stored_data.c 6132 2011-10-01 03:17:27Z mcaramello $
10c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
11c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *****************************************************************************/
12c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
13c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
14c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @defgroup ML_STORED_DATA
15c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
16c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @{
17c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *      @file     ml_stored_data.c
18c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *      @brief    functions for reading and writing stored data sets.
19c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *                Typically, these functions process stored calibration data.
20c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
21c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
22c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#undef MPL_LOG_NDEBUG
23c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MPL_LOG_NDEBUG 0 /* Use 0 to turn on MPL_LOGV output */
24c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#undef MPL_LOG_TAG
25c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
26c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include <stdio.h>
27c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
28c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "log.h"
29c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#undef MPL_LOG_TAG
30c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define MPL_LOG_TAG "MPL-storeload"
31c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
32c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "ml_stored_data.h"
33c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "storage_manager.h"
34c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#include "mlos.h"
35c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
36c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOADCAL_DEBUG    0
37c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define STORECAL_DEBUG   0
38c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
39c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define DEFAULT_KEY 29681
40c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
41c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define STORECAL_LOG MPL_LOGI
42c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro#define LOADCAL_LOG  MPL_LOGI
43c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
44c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_read_cal(unsigned char **calData, size_t *bytesRead)
45c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
46c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
47c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t result = INV_SUCCESS;
48c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    size_t fsize;
49c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
50c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(MLCAL_FILE,"rb");
51c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (fp == NULL) {
52c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Cannot open file \"%s\" for read\n", MLCAL_FILE);
53c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_FILE_OPEN;
54c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
55c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
56c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    // obtain file size
57c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fseek (fp, 0 , SEEK_END);
58c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fsize = ftell (fp);
59c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    rewind (fp);
60c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
61c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *calData = (unsigned char *)inv_malloc(fsize);
62c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (*calData==NULL) {
63c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not allocate buffer of %d bytes - "
64c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "aborting\n", fsize);
65c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        fclose(fp);
66c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_MEMORY_EXAUSTED;
67c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
68c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
69c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    *bytesRead = fread(*calData, 1, fsize, fp);
70c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (*bytesRead != fsize) {
71c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("bytes read (%d) don't match file size (%d)\n",
72c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 *bytesRead, fsize);
73c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        result = INV_ERROR_FILE_READ;
74c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto read_cal_end;
75c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
76c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGV("Bytes read = %d", *bytesRead);
77c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
78c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
79c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroread_cal_end:
80c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
81c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
82c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
83c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
84c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_write_cal(unsigned char *cal, size_t len)
85c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
86c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    FILE *fp;
87c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int bytesWritten;
88c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t result = INV_SUCCESS;
89c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
90c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (len <= 0) {
91c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Nothing to write");
92c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_FILE_WRITE;
93c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
94c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGV("cal data size to write = %d", len);
95c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
96c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fp = fopen(MLCAL_FILE,"wb");
97c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (fp == NULL) {
98c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Cannot open file \"%s\" for write\n", MLCAL_FILE);
99c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_FILE_OPEN;
100c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
101c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    bytesWritten = fwrite(cal, 1, len, fp);
102c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (bytesWritten != len) {
103c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("bytes written (%d) don't match requested length (%d)\n",
104c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 bytesWritten, len);
105c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        result = INV_ERROR_FILE_WRITE;
106c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
107c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGV("Bytes written = %d", bytesWritten);
108c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
109c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    fclose(fp);
110c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
111c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
112c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
113c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
114c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  Loads a type 0 set of calibration data.
115c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          It parses a binary data set containing calibration data.
116c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          The binary data set is intended to be loaded from a file.
117c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          This calibrations data format stores values for (in order of
118c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          appearance) :
119c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - temperature compensation : temperature data points,
120c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - temperature compensation : gyro biases data points for X, Y,
121c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              and Z axes.
122c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - accel biases for X, Y, Z axes.
123c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          This calibration data is produced internally by the MPL and its
124c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          size is 2777 bytes (header and checksum included).
125c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          Calibration format type 1 is currently used for ITG3500
126c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
127c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @pre    inv_init_storage_manager()
128c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          must have been called.
129c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
130c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  calData
131c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              A pointer to an array of bytes to be parsed.
132c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  len
133c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              the length of the calibration
134c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
135c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
136c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
137c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_load_cal_V0(unsigned char *calData, size_t len)
138c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
139c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t result;
140c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
141c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    LOADCAL_LOG("Entering inv_load_cal_V0\n");
142c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
143c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*if (len != expLen) {
144c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Calibration data type 0 must be %d bytes long (got %d)\n",
145c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 expLen, len);
146c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_FILE_READ;
147c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }*/
148c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
149c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_load_mpl_states(calData, len);
150c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
151c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
152c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
153c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
154c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  Loads a type 1 set of calibration data.
155c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          It parses a binary data set containing calibration data.
156c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          The binary data set is intended to be loaded from a file.
157c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          This calibrations data format stores values for (in order of
158c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          appearance) :
159c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - temperature,
160c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - gyro biases for X, Y, Z axes,
161c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          - accel biases for X, Y, Z axes.
162c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          This calibration data would normally be produced by the MPU Self
163c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          Test and its size is 36 bytes (header and checksum included).
164c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          Calibration format type 1 is produced by the MPU Self Test and
165c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          substitutes the type 0 : inv_load_cal_V0().
166c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
167c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @pre
168c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
169c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  calData
170c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              A pointer to an array of bytes to be parsed.
171c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  len
172c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              the length of the calibration
173c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
174c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
175c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
176c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_load_cal_V1(unsigned char *calData, size_t len)
177c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
178c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return INV_SUCCESS;
179c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
180c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
181c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
182c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @brief   Loads a set of calibration data.
183c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          It parses a binary data set containing calibration data.
184c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          The binary data set is intended to be loaded from a file.
185c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
186c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @pre
187c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
188c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
189c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @param   calData
190c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              A pointer to an array of bytes to be parsed.
191c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
192c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro * @return  INV_SUCCESS if successful, a non-zero error code otherwise.
193c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
194c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_load_cal(unsigned char *calData)
195c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
196c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int calType = 0;
197c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    int len = 0;
198c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //int ptr;
199c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //uint32_t chk = 0;
200c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //uint32_t cmp_chk = 0;
201c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
202c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /*load_func_t loaders[] = {
203c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        inv_load_cal_V0,
204c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        inv_load_cal_V1,
205c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    };
206c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    */
207c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
208c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_load_cal_V0(calData, len);
209c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
210c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* read the header (type and len)
211c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro       len is the total record length including header and checksum */
212c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    len = 0;
213c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    len += 16777216L * ((int)calData[0]);
214c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    len += 65536L * ((int)calData[1]);
215c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    len += 256 * ((int)calData[2]);
216c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    len += (int)calData[3];
217c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
218c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    calType = ((int)calData[4]) * 256 + ((int)calData[5]);
219c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (calType > 5) {
220c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Unsupported calibration file format %d. "
221c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "Valid types 0..5\n", calType);
222c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_INVALID_PARAMETER;
223c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
224c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
225c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* call the proper method to read in the data */
226c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    //return loaders[calType] (calData, len);
227c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return 0;
228c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
229c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
230c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
231c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  Stores a set of calibration data.
232c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          It generates a binary data set containing calibration data.
233c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          The binary data set is intended to be stored into a file.
234c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
235c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @pre    inv_dmp_open()
236c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
237c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  calData
238c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              A pointer to an array of bytes to be stored.
239c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @param  length
240c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *              The amount of bytes available in the array.
241c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
242c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return INV_SUCCESS if successful, a non-zero error code otherwise.
243c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
244c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_store_cal(unsigned char *calData, size_t length)
245c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
246c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t res = 0;
247c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    size_t size;
248c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
249c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    STORECAL_LOG("Entering inv_store_cal\n");
250c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
251c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_get_mpl_state_size(&size);
252c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
253c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    MPL_LOGV("inv_get_mpl_state_size() : size=%d", size);
254c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
255c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    /* store data */
256c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    res = inv_save_mpl_states(calData, size);
257c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(res != 0) {
258c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("inv_save_mpl_states() failed");
259c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
260c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
261c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    STORECAL_LOG("Exiting inv_store_cal\n");
262c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return INV_SUCCESS;
263c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
264c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
265c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
266c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  Load a calibration file.
267c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
268c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @pre    Must be in INV_STATE_DMP_OPENED state.
269c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          inv_dmp_open() or inv_dmp_stop() must have been called.
270c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
271c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          been called.
272c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
273c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return 0 or error code.
274c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
275c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_load_calibration(void)
276c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
277c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned char *calData= NULL;
278c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t result = 0;
279c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    size_t bytesRead = 0;
280c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
281c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_read_cal(&calData, &bytesRead);
282c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if(result != INV_SUCCESS) {
283c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not load cal file - "
284c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "aborting\n");
285c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto free_mem_n_exit;
286c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
287c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
288c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_load_mpl_states(calData, bytesRead);
289c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (result != INV_SUCCESS) {
290c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not load the calibration data - "
291c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "error %d - aborting\n", result);
292c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto free_mem_n_exit;
293c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
294c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
295c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarofree_mem_n_exit:
296c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_free(calData);
297c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
298c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
299c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
300c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
301c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @brief  Store runtime calibration data to a file
302c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
303c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @pre    Must be in INV_STATE_DMP_OPENED state.
304c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          inv_dmp_open() or inv_dmp_stop() must have been called.
305c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          inv_dmp_start() and inv_dmp_close() must have <b>NOT</b>
306c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *          been called.
307c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *
308c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @return 0 or error code.
309c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
310c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaroinv_error_t inv_store_calibration(void)
311c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro{
312c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    unsigned char *calData;
313c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_error_t result;
314c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    size_t length;
315c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
316c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_get_mpl_state_size(&length);
317c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    calData = (unsigned char *)inv_malloc(length);
318c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (!calData) {
319c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not allocate buffer of %d bytes - "
320c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "aborting\n", length);
321c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        return INV_ERROR_MEMORY_EXAUSTED;
322c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
323c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGV("inv_get_mpl state size = %d", length);
324c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
325c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
326c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_save_mpl_states(calData, length);
327c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (result != INV_SUCCESS) {
328c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not save mpl states - "
329c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "error %d - aborting\n", result);
330c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto free_mem_n_exit;
331c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    } else {
332c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGV("calData from inv_save_mpl_states, size=%d",
333c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 strlen((char *)calData));
334c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
335c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
336c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    result = inv_write_cal(calData, length);
337c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    if (result != INV_SUCCESS) {
338c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        MPL_LOGE("Could not store calibrated data on file - "
339c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro                 "error %d - aborting\n", result);
340c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro        goto free_mem_n_exit;
341c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
342c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    }
343c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
344c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccarofree_mem_n_exit:
345c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    inv_free(calData);
346c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro    return result;
347c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro}
348c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro
349c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro/**
350c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro *  @}
351c3d4ca9f2df5ddf9894b36d1554fdfc95d625d3fNick Vaccaro */
352