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