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