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