Jake Greaves / Mbed OS AdiSense1000_V21
Committer:
ADIJake
Date:
Mon Oct 15 07:57:54 2018 +0000
Revision:
33:ea9e60457591
Parent:
28:4eb837cd71df
First Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevin1990 28:4eb837cd71df 1 /*
kevin1990 28:4eb837cd71df 2 CONFIDENTIAL AND PROPRIETARY INFORMATION
kevin1990 28:4eb837cd71df 3
kevin1990 28:4eb837cd71df 4 Copyright (c) 2018 Emutex Ltd. All rights reserved.
kevin1990 28:4eb837cd71df 5 This software and documentation contain confidential and
kevin1990 28:4eb837cd71df 6 proprietary information that is the property of
kevin1990 28:4eb837cd71df 7 Emutex Ltd. The software and documentation are
kevin1990 28:4eb837cd71df 8 furnished under a license agreement and may be used
kevin1990 28:4eb837cd71df 9 or copied only in accordance with the terms of the license
kevin1990 28:4eb837cd71df 10 agreement. No part of the software and documentation
kevin1990 28:4eb837cd71df 11 may be reproduced, transmitted, or translated, in any
kevin1990 28:4eb837cd71df 12 form or by any means, electronic, mechanical, manual,
kevin1990 28:4eb837cd71df 13 optical, or otherwise, without prior written permission
kevin1990 28:4eb837cd71df 14 of Emutex Ltd., or as expressly provided by the license agreement.
kevin1990 28:4eb837cd71df 15 Reverse engineering is prohibited, and reproduction,
kevin1990 28:4eb837cd71df 16 disclosure or use without specific written authorization
kevin1990 28:4eb837cd71df 17 of Emutex Ltd. is strictly forbidden.
kevin1990 28:4eb837cd71df 18 */
kevin1990 28:4eb837cd71df 19
kevin1990 28:4eb837cd71df 20 /******************************************************************************
kevin1990 28:4eb837cd71df 21 Copyright 2017 (c) Analog Devices, Inc.
kevin1990 28:4eb837cd71df 22
kevin1990 28:4eb837cd71df 23 All rights reserved.
kevin1990 28:4eb837cd71df 24
kevin1990 28:4eb837cd71df 25 Redistribution and use in source and binary forms, with or without
kevin1990 28:4eb837cd71df 26 modification, are permitted provided that the following conditions are met:
kevin1990 28:4eb837cd71df 27 - Redistributions of source code must retain the above copyright
kevin1990 28:4eb837cd71df 28 notice, this list of conditions and the following disclaimer.
kevin1990 28:4eb837cd71df 29 - Redistributions in binary form must reproduce the above copyright
kevin1990 28:4eb837cd71df 30 notice, this list of conditions and the following disclaimer in
kevin1990 28:4eb837cd71df 31 the documentation and/or other materials provided with the
kevin1990 28:4eb837cd71df 32 distribution.
kevin1990 28:4eb837cd71df 33 - Neither the name of Analog Devices, Inc. nor the names of its
kevin1990 28:4eb837cd71df 34 contributors may be used to endorse or promote products derived
kevin1990 28:4eb837cd71df 35 from this software without specific prior written permission.
kevin1990 28:4eb837cd71df 36 - The use of this software may or may not infringe the patent rights
kevin1990 28:4eb837cd71df 37 of one or more patent holders. This license does not release you
kevin1990 28:4eb837cd71df 38 from the requirement that you obtain separate licenses from these
kevin1990 28:4eb837cd71df 39 patent holders to use this software.
kevin1990 28:4eb837cd71df 40 - Use of the software either in source or binary form, must be run
kevin1990 28:4eb837cd71df 41 on or directly connected to an Analog Devices Inc. component.
kevin1990 28:4eb837cd71df 42
kevin1990 28:4eb837cd71df 43 THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
kevin1990 28:4eb837cd71df 44 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
kevin1990 28:4eb837cd71df 45 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
kevin1990 28:4eb837cd71df 46 IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
kevin1990 28:4eb837cd71df 47 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
kevin1990 28:4eb837cd71df 48 LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF SUBSTITUTE GOODS OR
kevin1990 28:4eb837cd71df 49 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
kevin1990 28:4eb837cd71df 50 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
kevin1990 28:4eb837cd71df 51 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
kevin1990 28:4eb837cd71df 52 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
kevin1990 28:4eb837cd71df 53 *
kevin1990 28:4eb837cd71df 54 *****************************************************************************/
kevin1990 28:4eb837cd71df 55
kevin1990 28:4eb837cd71df 56 /*!
kevin1990 28:4eb837cd71df 57 ******************************************************************************
kevin1990 28:4eb837cd71df 58 * @file:
kevin1990 28:4eb837cd71df 59 * @brief: ADISENSE API implementation for ADSNS1000
kevin1990 28:4eb837cd71df 60 *-----------------------------------------------------------------------------
kevin1990 28:4eb837cd71df 61 */
kevin1990 28:4eb837cd71df 62
kevin1990 28:4eb837cd71df 63 #include <float.h>
kevin1990 28:4eb837cd71df 64 #include <math.h>
kevin1990 28:4eb837cd71df 65 #include <string.h>
ADIJake 33:ea9e60457591 66 #include <stdlib.h>
kevin1990 28:4eb837cd71df 67
kevin1990 28:4eb837cd71df 68 #include "inc/adi_sense_platform.h"
kevin1990 28:4eb837cd71df 69 #include "inc/adi_sense_api.h"
kevin1990 28:4eb837cd71df 70 #include "inc/adi_sense_1000/adi_sense_1000_api.h"
kevin1990 28:4eb837cd71df 71
kevin1990 28:4eb837cd71df 72 #include "adi_sense_1000/ADISENSE1000_REGISTERS_typedefs.h"
kevin1990 28:4eb837cd71df 73 #include "adi_sense_1000/ADISENSE1000_REGISTERS.h"
kevin1990 28:4eb837cd71df 74 #include "adi_sense_1000/adi_sense_1000_lut_data.h"
kevin1990 28:4eb837cd71df 75 #include "adi_sense_1000/adi_sense_1000_host_comms.h"
kevin1990 28:4eb837cd71df 76
kevin1990 28:4eb837cd71df 77 #include "crc16.h"
kevin1990 28:4eb837cd71df 78
kevin1990 28:4eb837cd71df 79 /*
kevin1990 28:4eb837cd71df 80 * The following macros are used to encapsulate the register access code
kevin1990 28:4eb837cd71df 81 * to improve readability in the functions further below in this file
kevin1990 28:4eb837cd71df 82 */
kevin1990 28:4eb837cd71df 83 #define STRINGIFY(name) #name
kevin1990 28:4eb837cd71df 84
kevin1990 28:4eb837cd71df 85 /* Expand the full name of the reset value macro for the specified register */
kevin1990 28:4eb837cd71df 86 #define REG_RESET_VAL(_name) REG_ADISENSE_##_name##_RESET
kevin1990 28:4eb837cd71df 87
kevin1990 28:4eb837cd71df 88 /* Checks if a value is outside the bounds of the specified register field */
kevin1990 28:4eb837cd71df 89 #define CHECK_REG_FIELD_VAL(_field, _val) \
kevin1990 28:4eb837cd71df 90 do { \
kevin1990 28:4eb837cd71df 91 uint32_t _mask = BITM_ADISENSE_##_field; \
kevin1990 28:4eb837cd71df 92 uint32_t _shift = BITP_ADISENSE_##_field; \
kevin1990 28:4eb837cd71df 93 if ((((_val) << _shift) & ~(_mask)) != 0) { \
kevin1990 28:4eb837cd71df 94 ADI_SENSE_LOG_ERROR("Value 0x%08X invalid for register field %s", \
kevin1990 28:4eb837cd71df 95 (uint32_t)(_val), \
kevin1990 28:4eb837cd71df 96 STRINGIFY(ADISENSE_##_field)); \
kevin1990 28:4eb837cd71df 97 return ADI_SENSE_INVALID_PARAM; \
kevin1990 28:4eb837cd71df 98 } \
kevin1990 28:4eb837cd71df 99 } while(false)
kevin1990 28:4eb837cd71df 100
kevin1990 28:4eb837cd71df 101 /*
kevin1990 28:4eb837cd71df 102 * Encapsulates the write to a specified register
kevin1990 28:4eb837cd71df 103 * NOTE - this will cause the calling function to return on error
kevin1990 28:4eb837cd71df 104 */
kevin1990 28:4eb837cd71df 105 #define WRITE_REG(_hdev, _val, _name, _type) \
kevin1990 28:4eb837cd71df 106 do { \
kevin1990 28:4eb837cd71df 107 ADI_SENSE_RESULT _res; \
kevin1990 28:4eb837cd71df 108 _type _regval = _val; \
kevin1990 28:4eb837cd71df 109 _res = adi_sense_1000_WriteRegister((_hdev), \
kevin1990 28:4eb837cd71df 110 REG_ADISENSE_##_name, \
kevin1990 28:4eb837cd71df 111 &_regval, sizeof(_regval)); \
kevin1990 28:4eb837cd71df 112 if (_res != ADI_SENSE_SUCCESS) \
kevin1990 28:4eb837cd71df 113 return _res; \
kevin1990 28:4eb837cd71df 114 } while(false)
kevin1990 28:4eb837cd71df 115
kevin1990 28:4eb837cd71df 116 /* Wrapper macro to write a value to a uint32_t register */
kevin1990 28:4eb837cd71df 117 #define WRITE_REG_U32(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 118 WRITE_REG(_hdev, _val, _name, uint32_t)
kevin1990 28:4eb837cd71df 119 /* Wrapper macro to write a value to a uint16_t register */
kevin1990 28:4eb837cd71df 120 #define WRITE_REG_U16(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 121 WRITE_REG(_hdev, _val, _name, uint16_t)
kevin1990 28:4eb837cd71df 122 /* Wrapper macro to write a value to a uint8_t register */
kevin1990 28:4eb837cd71df 123 #define WRITE_REG_U8(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 124 WRITE_REG(_hdev, _val, _name, uint8_t)
kevin1990 28:4eb837cd71df 125 /* Wrapper macro to write a value to a float32_t register */
kevin1990 28:4eb837cd71df 126 #define WRITE_REG_FLOAT(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 127 WRITE_REG(_hdev, _val, _name, float32_t)
kevin1990 28:4eb837cd71df 128
kevin1990 28:4eb837cd71df 129 /*
kevin1990 28:4eb837cd71df 130 * Encapsulates the read from a specified register
kevin1990 28:4eb837cd71df 131 * NOTE - this will cause the calling function to return on error
kevin1990 28:4eb837cd71df 132 */
kevin1990 28:4eb837cd71df 133 #define READ_REG(_hdev, _val, _name, _type) \
kevin1990 28:4eb837cd71df 134 do { \
kevin1990 28:4eb837cd71df 135 ADI_SENSE_RESULT _res; \
kevin1990 28:4eb837cd71df 136 _type _regval; \
kevin1990 28:4eb837cd71df 137 _res = adi_sense_1000_ReadRegister((_hdev), \
kevin1990 28:4eb837cd71df 138 REG_ADISENSE_##_name, \
kevin1990 28:4eb837cd71df 139 &_regval, sizeof(_regval)); \
kevin1990 28:4eb837cd71df 140 if (_res != ADI_SENSE_SUCCESS) \
kevin1990 28:4eb837cd71df 141 return _res; \
kevin1990 28:4eb837cd71df 142 _val = _regval; \
kevin1990 28:4eb837cd71df 143 } while(false)
kevin1990 28:4eb837cd71df 144
kevin1990 28:4eb837cd71df 145 /* Wrapper macro to read a value from a uint32_t register */
kevin1990 28:4eb837cd71df 146 #define READ_REG_U32(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 147 READ_REG(_hdev, _val, _name, uint32_t)
kevin1990 28:4eb837cd71df 148 /* Wrapper macro to read a value from a uint16_t register */
kevin1990 28:4eb837cd71df 149 #define READ_REG_U16(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 150 READ_REG(_hdev, _val, _name, uint16_t)
kevin1990 28:4eb837cd71df 151 /* Wrapper macro to read a value from a uint8_t register */
kevin1990 28:4eb837cd71df 152 #define READ_REG_U8(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 153 READ_REG(_hdev, _val, _name, uint8_t)
kevin1990 28:4eb837cd71df 154 /* Wrapper macro to read a value from a float32_t register */
kevin1990 28:4eb837cd71df 155 #define READ_REG_FLOAT(_hdev, _val, _name) \
kevin1990 28:4eb837cd71df 156 READ_REG(_hdev, _val, _name, float32_t)
kevin1990 28:4eb837cd71df 157
kevin1990 28:4eb837cd71df 158 /*
kevin1990 28:4eb837cd71df 159 * Wrapper macro to write an array of values to a uint8_t register
kevin1990 28:4eb837cd71df 160 * NOTE - this is intended only for writing to a keyhole data register
kevin1990 28:4eb837cd71df 161 */
kevin1990 28:4eb837cd71df 162 #define WRITE_REG_U8_ARRAY(_hdev, _arr, _len, _name) \
kevin1990 28:4eb837cd71df 163 do { \
kevin1990 28:4eb837cd71df 164 ADI_SENSE_RESULT _res; \
kevin1990 28:4eb837cd71df 165 _res = adi_sense_1000_WriteRegister(_hdev, \
kevin1990 28:4eb837cd71df 166 REG_ADISENSE_##_name, \
kevin1990 28:4eb837cd71df 167 _arr, _len); \
kevin1990 28:4eb837cd71df 168 if (_res != ADI_SENSE_SUCCESS) \
kevin1990 28:4eb837cd71df 169 return _res; \
kevin1990 28:4eb837cd71df 170 } while(false)
kevin1990 28:4eb837cd71df 171
kevin1990 28:4eb837cd71df 172 /*
kevin1990 28:4eb837cd71df 173 * Wrapper macro to read an array of values from a uint8_t register
kevin1990 28:4eb837cd71df 174 * NOTE - this is intended only for reading from a keyhole data register
kevin1990 28:4eb837cd71df 175 */
kevin1990 28:4eb837cd71df 176 #define READ_REG_U8_ARRAY(_hdev, _arr, _len, _name) \
kevin1990 28:4eb837cd71df 177 do { \
kevin1990 28:4eb837cd71df 178 ADI_SENSE_RESULT _res; \
kevin1990 28:4eb837cd71df 179 _res = adi_sense_1000_ReadRegister((_hdev), \
kevin1990 28:4eb837cd71df 180 REG_ADISENSE_##_name, \
kevin1990 28:4eb837cd71df 181 _arr, _len); \
kevin1990 28:4eb837cd71df 182 if (_res != ADI_SENSE_SUCCESS) \
kevin1990 28:4eb837cd71df 183 return _res; \
kevin1990 28:4eb837cd71df 184 } while(false)
kevin1990 28:4eb837cd71df 185
kevin1990 28:4eb837cd71df 186 #define ADI_SENSE_1000_CHANNEL_IS_ADC(c) \
kevin1990 28:4eb837cd71df 187 ((c) >= ADI_SENSE_1000_CHANNEL_ID_CJC_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_CURRENT_0)
kevin1990 28:4eb837cd71df 188
kevin1990 28:4eb837cd71df 189 #define ADI_SENSE_1000_CHANNEL_IS_ADC_CJC(c) \
kevin1990 28:4eb837cd71df 190 ((c) >= ADI_SENSE_1000_CHANNEL_ID_CJC_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_CJC_1)
kevin1990 28:4eb837cd71df 191
kevin1990 28:4eb837cd71df 192 #define ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(c) \
kevin1990 28:4eb837cd71df 193 ((c) >= ADI_SENSE_1000_CHANNEL_ID_SENSOR_0 && (c) <= ADI_SENSE_1000_CHANNEL_ID_SENSOR_3)
kevin1990 28:4eb837cd71df 194
kevin1990 28:4eb837cd71df 195 #define ADI_SENSE_1000_CHANNEL_IS_ADC_VOLTAGE(c) \
kevin1990 28:4eb837cd71df 196 ((c) == ADI_SENSE_1000_CHANNEL_ID_VOLTAGE_0)
kevin1990 28:4eb837cd71df 197
kevin1990 28:4eb837cd71df 198 #define ADI_SENSE_1000_CHANNEL_IS_ADC_CURRENT(c) \
kevin1990 28:4eb837cd71df 199 ((c) == ADI_SENSE_1000_CHANNEL_ID_CURRENT_0)
kevin1990 28:4eb837cd71df 200
kevin1990 28:4eb837cd71df 201 #define ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(c) \
kevin1990 28:4eb837cd71df 202 ((c) == ADI_SENSE_1000_CHANNEL_ID_SPI_1 || (c) == ADI_SENSE_1000_CHANNEL_ID_SPI_2)
kevin1990 28:4eb837cd71df 203
ADIJake 33:ea9e60457591 204 typedef struct {
kevin1990 28:4eb837cd71df 205 unsigned nDeviceIndex;
kevin1990 28:4eb837cd71df 206 ADI_SENSE_SPI_HANDLE hSpi;
kevin1990 28:4eb837cd71df 207 ADI_SENSE_GPIO_HANDLE hGpio;
kevin1990 28:4eb837cd71df 208 } ADI_SENSE_DEVICE_CONTEXT;
kevin1990 28:4eb837cd71df 209
kevin1990 28:4eb837cd71df 210 static ADI_SENSE_DEVICE_CONTEXT gDeviceCtx[ADI_SENSE_PLATFORM_MAX_DEVICES];
kevin1990 28:4eb837cd71df 211
kevin1990 28:4eb837cd71df 212 /*
kevin1990 28:4eb837cd71df 213 * Open an ADISENSE device instance.
kevin1990 28:4eb837cd71df 214 */
kevin1990 28:4eb837cd71df 215 ADI_SENSE_RESULT adi_sense_Open(
kevin1990 28:4eb837cd71df 216 unsigned const nDeviceIndex,
kevin1990 28:4eb837cd71df 217 ADI_SENSE_CONNECTION * const pConnectionInfo,
kevin1990 28:4eb837cd71df 218 ADI_SENSE_DEVICE_HANDLE * const phDevice)
kevin1990 28:4eb837cd71df 219 {
kevin1990 28:4eb837cd71df 220 ADI_SENSE_DEVICE_CONTEXT *pCtx;
kevin1990 28:4eb837cd71df 221 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 222
kevin1990 28:4eb837cd71df 223 if (nDeviceIndex >= ADI_SENSE_PLATFORM_MAX_DEVICES)
kevin1990 28:4eb837cd71df 224 return ADI_SENSE_INVALID_DEVICE_NUM;
kevin1990 28:4eb837cd71df 225
kevin1990 28:4eb837cd71df 226 pCtx = &gDeviceCtx[nDeviceIndex];
kevin1990 28:4eb837cd71df 227 pCtx->nDeviceIndex = nDeviceIndex;
kevin1990 28:4eb837cd71df 228
kevin1990 28:4eb837cd71df 229 eRet = adi_sense_LogOpen(&pConnectionInfo->log);
kevin1990 28:4eb837cd71df 230 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 231 return eRet;
kevin1990 28:4eb837cd71df 232
kevin1990 28:4eb837cd71df 233 eRet = adi_sense_GpioOpen(&pConnectionInfo->gpio, &pCtx->hGpio);
kevin1990 28:4eb837cd71df 234 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 235 return eRet;
kevin1990 28:4eb837cd71df 236
kevin1990 28:4eb837cd71df 237 eRet = adi_sense_SpiOpen(&pConnectionInfo->spi, &pCtx->hSpi);
kevin1990 28:4eb837cd71df 238 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 239 return eRet;
kevin1990 28:4eb837cd71df 240
kevin1990 28:4eb837cd71df 241 *phDevice = pCtx;
kevin1990 28:4eb837cd71df 242 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 243 }
kevin1990 28:4eb837cd71df 244
kevin1990 28:4eb837cd71df 245 /*
kevin1990 28:4eb837cd71df 246 * Get the current state of the specified GPIO input signal.
kevin1990 28:4eb837cd71df 247 */
kevin1990 28:4eb837cd71df 248 ADI_SENSE_RESULT adi_sense_GetGpioState(
kevin1990 28:4eb837cd71df 249 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 250 ADI_SENSE_GPIO_PIN const ePinId,
kevin1990 28:4eb837cd71df 251 bool_t * const pbAsserted)
kevin1990 28:4eb837cd71df 252 {
kevin1990 28:4eb837cd71df 253 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 254
kevin1990 28:4eb837cd71df 255 return adi_sense_GpioGet(pCtx->hGpio, ePinId, pbAsserted);
kevin1990 28:4eb837cd71df 256 }
kevin1990 28:4eb837cd71df 257
kevin1990 28:4eb837cd71df 258 /*
kevin1990 28:4eb837cd71df 259 * Register an application-defined callback function for GPIO interrupts.
kevin1990 28:4eb837cd71df 260 */
kevin1990 28:4eb837cd71df 261 ADI_SENSE_RESULT adi_sense_RegisterGpioCallback(
kevin1990 28:4eb837cd71df 262 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 263 ADI_SENSE_GPIO_PIN const ePinId,
kevin1990 28:4eb837cd71df 264 ADI_SENSE_GPIO_CALLBACK const callbackFunction,
kevin1990 28:4eb837cd71df 265 void * const pCallbackParam)
kevin1990 28:4eb837cd71df 266 {
kevin1990 28:4eb837cd71df 267 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 268
ADIJake 33:ea9e60457591 269 if (callbackFunction) {
kevin1990 28:4eb837cd71df 270 return adi_sense_GpioIrqEnable(pCtx->hGpio, ePinId, callbackFunction,
kevin1990 28:4eb837cd71df 271 pCallbackParam);
ADIJake 33:ea9e60457591 272 } else {
kevin1990 28:4eb837cd71df 273 return adi_sense_GpioIrqDisable(pCtx->hGpio, ePinId);
kevin1990 28:4eb837cd71df 274 }
kevin1990 28:4eb837cd71df 275 }
kevin1990 28:4eb837cd71df 276
kevin1990 28:4eb837cd71df 277 /*
kevin1990 28:4eb837cd71df 278 * Reset the specified ADISENSE device.
kevin1990 28:4eb837cd71df 279 */
kevin1990 28:4eb837cd71df 280 ADI_SENSE_RESULT adi_sense_Reset(
kevin1990 28:4eb837cd71df 281 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 282 {
kevin1990 28:4eb837cd71df 283 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 284 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 285
kevin1990 28:4eb837cd71df 286 /* Pulse the Reset GPIO pin low for a minimum of 4 microseconds */
kevin1990 28:4eb837cd71df 287 eRet = adi_sense_GpioSet(pCtx->hGpio, ADI_SENSE_GPIO_PIN_RESET, false);
kevin1990 28:4eb837cd71df 288 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 289 return eRet;
kevin1990 28:4eb837cd71df 290
kevin1990 28:4eb837cd71df 291 adi_sense_TimeDelayUsec(4);
kevin1990 28:4eb837cd71df 292
kevin1990 28:4eb837cd71df 293 eRet = adi_sense_GpioSet(pCtx->hGpio, ADI_SENSE_GPIO_PIN_RESET, true);
kevin1990 28:4eb837cd71df 294 if (eRet != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 295 return eRet;
kevin1990 28:4eb837cd71df 296
kevin1990 28:4eb837cd71df 297 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 298 }
kevin1990 28:4eb837cd71df 299
kevin1990 28:4eb837cd71df 300
kevin1990 28:4eb837cd71df 301 /*!
kevin1990 28:4eb837cd71df 302 * @brief Get general status of ADISense module.
kevin1990 28:4eb837cd71df 303 *
kevin1990 28:4eb837cd71df 304 * @param[in]
kevin1990 28:4eb837cd71df 305 * @param[out] pStatus : Pointer to CORE Status struct.
kevin1990 28:4eb837cd71df 306 *
kevin1990 28:4eb837cd71df 307 * @return Status
kevin1990 28:4eb837cd71df 308 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 28:4eb837cd71df 309 * - #ADI_SENSE_FAILURE If status register read fails.
kevin1990 28:4eb837cd71df 310 *
kevin1990 28:4eb837cd71df 311 * @details Read the general status register for the ADISense
kevin1990 28:4eb837cd71df 312 * module. Indicates Error, Alert conditions, data ready
kevin1990 28:4eb837cd71df 313 * and command running.
kevin1990 28:4eb837cd71df 314 *
kevin1990 28:4eb837cd71df 315 */
kevin1990 28:4eb837cd71df 316 ADI_SENSE_RESULT adi_sense_GetStatus(
kevin1990 28:4eb837cd71df 317 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 318 ADI_SENSE_STATUS * const pStatus)
kevin1990 28:4eb837cd71df 319 {
kevin1990 28:4eb837cd71df 320 ADI_ADISENSE_CORE_Status_t statusReg;
kevin1990 28:4eb837cd71df 321 READ_REG_U8(hDevice, statusReg.VALUE8, CORE_STATUS);
kevin1990 28:4eb837cd71df 322
kevin1990 28:4eb837cd71df 323 ADI_ADISENSE_CORE_Alert_Status_2_t alert2Reg;
kevin1990 28:4eb837cd71df 324 READ_REG_U16(hDevice, alert2Reg.VALUE16, CORE_ALERT_STATUS_2);
kevin1990 28:4eb837cd71df 325
kevin1990 28:4eb837cd71df 326 memset(pStatus, 0, sizeof(*pStatus));
kevin1990 28:4eb837cd71df 327
kevin1990 28:4eb837cd71df 328 if (!statusReg.Cmd_Running) /* Active-low, so invert it */
kevin1990 28:4eb837cd71df 329 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_BUSY;
kevin1990 28:4eb837cd71df 330 if (statusReg.Drdy)
kevin1990 28:4eb837cd71df 331 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_DATAREADY;
kevin1990 28:4eb837cd71df 332 if (statusReg.FIFO_Error)
kevin1990 28:4eb837cd71df 333 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_FIFO_ERROR;
kevin1990 28:4eb837cd71df 334 if (alert2Reg.Ext_Flash_Error)
kevin1990 28:4eb837cd71df 335 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_EXT_FLASH_ERROR;
ADIJake 33:ea9e60457591 336 if (statusReg.Alert_Active) {
kevin1990 28:4eb837cd71df 337 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_ALERT;
kevin1990 28:4eb837cd71df 338
kevin1990 28:4eb837cd71df 339 ADI_ADISENSE_CORE_Alert_Code_t alertCodeReg;
kevin1990 28:4eb837cd71df 340 READ_REG_U16(hDevice, alertCodeReg.VALUE16, CORE_ALERT_CODE);
kevin1990 28:4eb837cd71df 341 pStatus->alertCode = alertCodeReg.Alert_Code;
kevin1990 28:4eb837cd71df 342
kevin1990 28:4eb837cd71df 343 ADI_ADISENSE_CORE_Channel_Alert_Status_t channelAlertStatusReg;
kevin1990 28:4eb837cd71df 344 READ_REG_U16(hDevice, channelAlertStatusReg.VALUE16,
kevin1990 28:4eb837cd71df 345 CORE_CHANNEL_ALERT_STATUS);
kevin1990 28:4eb837cd71df 346
ADIJake 33:ea9e60457591 347 for (unsigned i = 0; i < ADI_SENSE_1000_MAX_CHANNELS; i++) {
ADIJake 33:ea9e60457591 348 if (channelAlertStatusReg.VALUE16 & (1 << i)) {
kevin1990 28:4eb837cd71df 349 ADI_ADISENSE_CORE_Alert_Code_Ch_t channelAlertCodeReg;
kevin1990 28:4eb837cd71df 350 READ_REG_U16(hDevice, channelAlertCodeReg.VALUE16, CORE_ALERT_CODE_CHn(i));
kevin1990 28:4eb837cd71df 351 pStatus->channelAlertCodes[i] = channelAlertCodeReg.Alert_Code_Ch;
kevin1990 28:4eb837cd71df 352
kevin1990 28:4eb837cd71df 353 ADI_ADISENSE_CORE_Alert_Detail_Ch_t alertDetailReg;
kevin1990 28:4eb837cd71df 354 READ_REG_U16(hDevice, alertDetailReg.VALUE16,
kevin1990 28:4eb837cd71df 355 CORE_ALERT_DETAIL_CHn(i));
kevin1990 28:4eb837cd71df 356
kevin1990 28:4eb837cd71df 357 if (alertDetailReg.Time_Out)
kevin1990 28:4eb837cd71df 358 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_TIMEOUT;
kevin1990 28:4eb837cd71df 359 if (alertDetailReg.Under_Range)
kevin1990 28:4eb837cd71df 360 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_UNDER_RANGE;
kevin1990 28:4eb837cd71df 361 if (alertDetailReg.Over_Range)
kevin1990 28:4eb837cd71df 362 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_OVER_RANGE;
kevin1990 28:4eb837cd71df 363 if (alertDetailReg.Low_Limit)
kevin1990 28:4eb837cd71df 364 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LOW_LIMIT;
kevin1990 28:4eb837cd71df 365 if (alertDetailReg.High_Limit)
kevin1990 28:4eb837cd71df 366 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_HIGH_LIMIT;
kevin1990 28:4eb837cd71df 367 if (alertDetailReg.Sensor_Open)
kevin1990 28:4eb837cd71df 368 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_SENSOR_OPEN;
kevin1990 28:4eb837cd71df 369 if (alertDetailReg.Ref_Detect)
kevin1990 28:4eb837cd71df 370 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_REF_DETECT;
kevin1990 28:4eb837cd71df 371 if (alertDetailReg.Config_Err)
kevin1990 28:4eb837cd71df 372 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_CONFIG_ERR;
kevin1990 28:4eb837cd71df 373 if (alertDetailReg.LUT_Error_Ch)
kevin1990 28:4eb837cd71df 374 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_ERR;
kevin1990 28:4eb837cd71df 375 if (alertDetailReg.Sensor_Not_Ready)
kevin1990 28:4eb837cd71df 376 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_SENSOR_NOT_READY;
kevin1990 28:4eb837cd71df 377 if (alertDetailReg.Comp_Not_Ready)
kevin1990 28:4eb837cd71df 378 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_COMP_NOT_READY;
kevin1990 28:4eb837cd71df 379 if (alertDetailReg.Correction_UnderRange)
kevin1990 28:4eb837cd71df 380 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_UNDER_RANGE;
kevin1990 28:4eb837cd71df 381 if (alertDetailReg.Correction_OverRange)
kevin1990 28:4eb837cd71df 382 pStatus->channelAlerts[i] |= ADI_SENSE_CHANNEL_ALERT_LUT_OVER_RANGE;
kevin1990 28:4eb837cd71df 383 }
kevin1990 28:4eb837cd71df 384 }
kevin1990 28:4eb837cd71df 385
kevin1990 28:4eb837cd71df 386 if (alert2Reg.Configuration_Error)
kevin1990 28:4eb837cd71df 387 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_CONFIG_ERROR;
kevin1990 28:4eb837cd71df 388 if (alert2Reg.LUT_Error)
kevin1990 28:4eb837cd71df 389 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_LUT_ERROR;
kevin1990 28:4eb837cd71df 390 }
kevin1990 28:4eb837cd71df 391
ADIJake 33:ea9e60457591 392 if (statusReg.Error) {
kevin1990 28:4eb837cd71df 393 pStatus->deviceStatus |= ADI_SENSE_DEVICE_STATUS_ERROR;
kevin1990 28:4eb837cd71df 394
kevin1990 28:4eb837cd71df 395 ADI_ADISENSE_CORE_Error_Code_t errorCodeReg;
kevin1990 28:4eb837cd71df 396 READ_REG_U16(hDevice, errorCodeReg.VALUE16, CORE_ERROR_CODE);
kevin1990 28:4eb837cd71df 397 pStatus->errorCode = errorCodeReg.Error_Code;
kevin1990 28:4eb837cd71df 398
kevin1990 28:4eb837cd71df 399 ADI_ADISENSE_CORE_Diagnostics_Status_t diagStatusReg;
kevin1990 28:4eb837cd71df 400 READ_REG_U16(hDevice, diagStatusReg.VALUE16, CORE_DIAGNOSTICS_STATUS);
kevin1990 28:4eb837cd71df 401
kevin1990 28:4eb837cd71df 402 if (diagStatusReg.Diag_Checksum_Error)
kevin1990 28:4eb837cd71df 403 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CHECKSUM_ERROR;
kevin1990 28:4eb837cd71df 404 if (diagStatusReg.Diag_Comms_Error)
kevin1990 28:4eb837cd71df 405 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_COMMS_ERROR;
kevin1990 28:4eb837cd71df 406 if (diagStatusReg.Diag_Supply_Monitor_Error)
kevin1990 28:4eb837cd71df 407 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_MONITOR_ERROR;
kevin1990 28:4eb837cd71df 408 if (diagStatusReg.Diag_Supply_Cap_Error)
kevin1990 28:4eb837cd71df 409 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_SUPPLY_CAP_ERROR;
kevin1990 28:4eb837cd71df 410 if (diagStatusReg.Diag_Conversion_Error)
kevin1990 28:4eb837cd71df 411 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CONVERSION_ERROR;
kevin1990 28:4eb837cd71df 412 if (diagStatusReg.Diag_Calibration_Error)
kevin1990 28:4eb837cd71df 413 pStatus->diagnosticsStatus |= ADI_SENSE_DIAGNOSTICS_STATUS_CALIBRATION_ERROR;
kevin1990 28:4eb837cd71df 414 }
kevin1990 28:4eb837cd71df 415
kevin1990 28:4eb837cd71df 416 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 417 }
kevin1990 28:4eb837cd71df 418
kevin1990 28:4eb837cd71df 419 ADI_SENSE_RESULT adi_sense_GetCommandRunningState(
kevin1990 28:4eb837cd71df 420 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 421 bool_t *pbCommandRunning)
kevin1990 28:4eb837cd71df 422 {
kevin1990 28:4eb837cd71df 423 ADI_ADISENSE_CORE_Status_t statusReg;
kevin1990 28:4eb837cd71df 424
kevin1990 28:4eb837cd71df 425 READ_REG_U8(hDevice, statusReg.VALUE8, CORE_STATUS);
kevin1990 28:4eb837cd71df 426
kevin1990 28:4eb837cd71df 427 /* We should never normally see 0xFF here if the module is operational */
kevin1990 28:4eb837cd71df 428 if (statusReg.VALUE8 == 0xFF)
kevin1990 28:4eb837cd71df 429 return ADI_SENSE_ERR_NOT_INITIALIZED;
kevin1990 28:4eb837cd71df 430
kevin1990 28:4eb837cd71df 431 *pbCommandRunning = !statusReg.Cmd_Running; /* Active-low, so invert it */
kevin1990 28:4eb837cd71df 432
kevin1990 28:4eb837cd71df 433 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 434 }
kevin1990 28:4eb837cd71df 435
kevin1990 28:4eb837cd71df 436 static ADI_SENSE_RESULT executeCommand(
kevin1990 28:4eb837cd71df 437 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 438 ADI_ADISENSE_CORE_Command_Special_Command const command,
kevin1990 28:4eb837cd71df 439 bool_t const bWaitForCompletion)
kevin1990 28:4eb837cd71df 440 {
kevin1990 28:4eb837cd71df 441 ADI_ADISENSE_CORE_Command_t commandReg;
kevin1990 28:4eb837cd71df 442 bool_t bCommandRunning;
kevin1990 28:4eb837cd71df 443 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 444
kevin1990 28:4eb837cd71df 445 /*
kevin1990 28:4eb837cd71df 446 * Don't allow another command to be issued if one is already running, but
kevin1990 28:4eb837cd71df 447 * make an exception for ADISENSE_CORE_COMMAND_NOP which can be used to
kevin1990 28:4eb837cd71df 448 * request a running command to be stopped (e.g. continuous measurement)
kevin1990 28:4eb837cd71df 449 */
ADIJake 33:ea9e60457591 450 if (command != ADISENSE_CORE_COMMAND_NOP) {
kevin1990 28:4eb837cd71df 451 eRet = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
kevin1990 28:4eb837cd71df 452 if (eRet)
kevin1990 28:4eb837cd71df 453 return eRet;
kevin1990 28:4eb837cd71df 454
kevin1990 28:4eb837cd71df 455 if (bCommandRunning)
kevin1990 28:4eb837cd71df 456 return ADI_SENSE_IN_USE;
kevin1990 28:4eb837cd71df 457 }
kevin1990 28:4eb837cd71df 458
kevin1990 28:4eb837cd71df 459 commandReg.Special_Command = command;
kevin1990 28:4eb837cd71df 460 WRITE_REG_U8(hDevice, commandReg.VALUE8, CORE_COMMAND);
kevin1990 28:4eb837cd71df 461
ADIJake 33:ea9e60457591 462 if (bWaitForCompletion) {
kevin1990 28:4eb837cd71df 463 do {
kevin1990 28:4eb837cd71df 464 /* Allow a minimum 50usec delay for status update before checking */
kevin1990 28:4eb837cd71df 465 adi_sense_TimeDelayUsec(50);
kevin1990 28:4eb837cd71df 466
kevin1990 28:4eb837cd71df 467 eRet = adi_sense_GetCommandRunningState(hDevice, &bCommandRunning);
kevin1990 28:4eb837cd71df 468 if (eRet)
kevin1990 28:4eb837cd71df 469 return eRet;
kevin1990 28:4eb837cd71df 470 } while (bCommandRunning);
kevin1990 28:4eb837cd71df 471 }
kevin1990 28:4eb837cd71df 472
kevin1990 28:4eb837cd71df 473 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 474 }
kevin1990 28:4eb837cd71df 475
kevin1990 28:4eb837cd71df 476 ADI_SENSE_RESULT adi_sense_Shutdown(
kevin1990 28:4eb837cd71df 477 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 478 {
kevin1990 28:4eb837cd71df 479 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_POWER_DOWN, false);
kevin1990 28:4eb837cd71df 480 }
kevin1990 28:4eb837cd71df 481
kevin1990 28:4eb837cd71df 482
kevin1990 28:4eb837cd71df 483 ADI_SENSE_RESULT adi_sense_ApplyConfigUpdates(
kevin1990 28:4eb837cd71df 484 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 485 {
kevin1990 28:4eb837cd71df 486 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LATCH_CONFIG, true);
kevin1990 28:4eb837cd71df 487 }
kevin1990 28:4eb837cd71df 488
kevin1990 28:4eb837cd71df 489 /*!
kevin1990 28:4eb837cd71df 490 * @brief Start a measurement cycle.
kevin1990 28:4eb837cd71df 491 *
kevin1990 28:4eb837cd71df 492 * @param[out]
kevin1990 28:4eb837cd71df 493 *
kevin1990 28:4eb837cd71df 494 * @return Status
kevin1990 28:4eb837cd71df 495 * - #ADI_SENSE_SUCCESS Call completed successfully.
kevin1990 28:4eb837cd71df 496 * - #ADI_SENSE_FAILURE
kevin1990 28:4eb837cd71df 497 *
kevin1990 28:4eb837cd71df 498 * @details Sends the latch config command. Configuration for channels in
kevin1990 28:4eb837cd71df 499 * conversion cycle should be completed before this function.
kevin1990 28:4eb837cd71df 500 * Channel enabled bit should be set before this function.
kevin1990 28:4eb837cd71df 501 * Starts a conversion and configures the format of the sample.
kevin1990 28:4eb837cd71df 502 *
kevin1990 28:4eb837cd71df 503 */
kevin1990 28:4eb837cd71df 504 ADI_SENSE_RESULT adi_sense_StartMeasurement(
kevin1990 28:4eb837cd71df 505 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 506 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode)
kevin1990 28:4eb837cd71df 507 {
ADIJake 33:ea9e60457591 508 switch (eMeasurementMode) {
ADIJake 33:ea9e60457591 509 case ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK:
ADIJake 33:ea9e60457591 510 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SYSTEM_CHECK, false);
ADIJake 33:ea9e60457591 511 case ADI_SENSE_MEASUREMENT_MODE_NORMAL:
ADIJake 33:ea9e60457591 512 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CONVERT_WITH_RAW, false);
ADIJake 33:ea9e60457591 513 case ADI_SENSE_MEASUREMENT_MODE_OMIT_RAW:
ADIJake 33:ea9e60457591 514 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CONVERT, false);
ADIJake 33:ea9e60457591 515 case ADI_SENSE_MEASUREMENT_MODE_FFT:
ADIJake 33:ea9e60457591 516 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CONVERT_FFT, false);
ADIJake 33:ea9e60457591 517 default:
ADIJake 33:ea9e60457591 518 ADI_SENSE_LOG_ERROR("Invalid measurement mode %d specified",
ADIJake 33:ea9e60457591 519 eMeasurementMode);
ADIJake 33:ea9e60457591 520 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 521 }
kevin1990 28:4eb837cd71df 522 }
kevin1990 28:4eb837cd71df 523
kevin1990 28:4eb837cd71df 524 /*
kevin1990 28:4eb837cd71df 525 * Store the configuration settings to persistent memory on the device.
kevin1990 28:4eb837cd71df 526 * The settings can be saved to 4 different flash memory areas (slots).
kevin1990 28:4eb837cd71df 527 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 528 * Do not power down the device while this command is running.
kevin1990 28:4eb837cd71df 529 */
kevin1990 28:4eb837cd71df 530 ADI_SENSE_RESULT adi_sense_SaveConfig(
kevin1990 28:4eb837cd71df 531 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 532 ADI_SENSE_USER_CONFIG_SLOT const eSlotId)
kevin1990 28:4eb837cd71df 533 {
ADIJake 33:ea9e60457591 534 switch (eSlotId) {
kevin1990 28:4eb837cd71df 535 case ADI_SENSE_FLASH_CONFIG_1:
kevin1990 28:4eb837cd71df 536 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_CONFIG_1, true);
kevin1990 28:4eb837cd71df 537 case ADI_SENSE_FLASH_CONFIG_2:
kevin1990 28:4eb837cd71df 538 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_CONFIG_2, true);
kevin1990 28:4eb837cd71df 539 case ADI_SENSE_FLASH_CONFIG_3:
kevin1990 28:4eb837cd71df 540 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_CONFIG_3, true);
kevin1990 28:4eb837cd71df 541 case ADI_SENSE_FLASH_CONFIG_4:
kevin1990 28:4eb837cd71df 542 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_CONFIG_4, true);
kevin1990 28:4eb837cd71df 543 default:
kevin1990 28:4eb837cd71df 544 ADI_SENSE_LOG_ERROR("Invalid user config target slot %d specified",
kevin1990 28:4eb837cd71df 545 eSlotId);
kevin1990 28:4eb837cd71df 546 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 547 }
kevin1990 28:4eb837cd71df 548 }
kevin1990 28:4eb837cd71df 549
kevin1990 28:4eb837cd71df 550 /*
kevin1990 28:4eb837cd71df 551 * Restore the configuration settings from persistent memory on the device.
kevin1990 28:4eb837cd71df 552 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 553 */
kevin1990 28:4eb837cd71df 554 ADI_SENSE_RESULT adi_sense_RestoreConfig(
kevin1990 28:4eb837cd71df 555 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 556 ADI_SENSE_USER_CONFIG_SLOT const eSlotId)
kevin1990 28:4eb837cd71df 557 {
ADIJake 33:ea9e60457591 558 switch (eSlotId) {
kevin1990 28:4eb837cd71df 559 case ADI_SENSE_FLASH_CONFIG_1:
kevin1990 28:4eb837cd71df 560 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_CONFIG_1, true);
kevin1990 28:4eb837cd71df 561 case ADI_SENSE_FLASH_CONFIG_2:
kevin1990 28:4eb837cd71df 562 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_CONFIG_2, true);
kevin1990 28:4eb837cd71df 563 case ADI_SENSE_FLASH_CONFIG_3:
kevin1990 28:4eb837cd71df 564 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_CONFIG_3, true);
kevin1990 28:4eb837cd71df 565 case ADI_SENSE_FLASH_CONFIG_4:
kevin1990 28:4eb837cd71df 566 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_CONFIG_4, true);
kevin1990 28:4eb837cd71df 567 default:
kevin1990 28:4eb837cd71df 568 ADI_SENSE_LOG_ERROR("Invalid user config source slot %d specified",
kevin1990 28:4eb837cd71df 569 eSlotId);
kevin1990 28:4eb837cd71df 570 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 571 }
kevin1990 28:4eb837cd71df 572 }
kevin1990 28:4eb837cd71df 573
kevin1990 28:4eb837cd71df 574 /*
kevin1990 28:4eb837cd71df 575 * Erase the entire external flash memory.
kevin1990 28:4eb837cd71df 576 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 577 */
kevin1990 28:4eb837cd71df 578 ADI_SENSE_RESULT adi_sense_EraseExternalFlash(
kevin1990 28:4eb837cd71df 579 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 580 {
kevin1990 28:4eb837cd71df 581 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_ERASE_EXTERNAL_FLASH, true);
kevin1990 28:4eb837cd71df 582 }
kevin1990 28:4eb837cd71df 583
kevin1990 28:4eb837cd71df 584 /*
kevin1990 28:4eb837cd71df 585 * Read the number of samples stored in external flash memory.
kevin1990 28:4eb837cd71df 586 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 587 */
kevin1990 28:4eb837cd71df 588 ADI_SENSE_RESULT adi_sense_GetExternalFlashSampleCount(
kevin1990 28:4eb837cd71df 589 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 590 uint32_t * nSampleCount)
kevin1990 28:4eb837cd71df 591 {
kevin1990 28:4eb837cd71df 592 ADI_ADISENSE_CORE_Ext_Flash_Sample_Count_t nCount;
kevin1990 28:4eb837cd71df 593
kevin1990 28:4eb837cd71df 594 READ_REG_U32(hDevice, nCount.VALUE32, CORE_EXT_FLASH_SAMPLE_COUNT);
kevin1990 28:4eb837cd71df 595
kevin1990 28:4eb837cd71df 596 *nSampleCount = nCount.VALUE32;
kevin1990 28:4eb837cd71df 597
kevin1990 28:4eb837cd71df 598 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 599 }
kevin1990 28:4eb837cd71df 600
kevin1990 28:4eb837cd71df 601 // DEBUG - TO BE DELETED
kevin1990 28:4eb837cd71df 602 ADI_SENSE_RESULT adi_sense_SetExternalFlashIndex(
kevin1990 28:4eb837cd71df 603 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 604 uint32_t nStartIndex)
kevin1990 28:4eb837cd71df 605 {
kevin1990 28:4eb837cd71df 606 WRITE_REG_U32(hDevice, nStartIndex, CORE_EXT_FLASH_INDEX);
kevin1990 28:4eb837cd71df 607
kevin1990 28:4eb837cd71df 608 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 609 }
kevin1990 28:4eb837cd71df 610
kevin1990 28:4eb837cd71df 611 /*
kevin1990 28:4eb837cd71df 612 * Read a set of data samples stored in the device external flash memory.
kevin1990 28:4eb837cd71df 613 * This may be called at any time.
kevin1990 28:4eb837cd71df 614 */
kevin1990 28:4eb837cd71df 615 ADI_SENSE_RESULT adi_sense_GetExternalFlashData(
kevin1990 28:4eb837cd71df 616 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 617 ADI_SENSE_DATA_SAMPLE * const pSamples,
kevin1990 28:4eb837cd71df 618 uint32_t const nStartIndex,
kevin1990 28:4eb837cd71df 619 uint32_t const nRequested,
kevin1990 28:4eb837cd71df 620 uint32_t * const pnReturned)
kevin1990 28:4eb837cd71df 621 {
kevin1990 28:4eb837cd71df 622 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 623 uint16_t command = ADI_SENSE_1000_HOST_COMMS_READ_CMD |
ADIJake 33:ea9e60457591 624 (REG_ADISENSE_CORE_EXT_FLASH_DATA & ADI_SENSE_1000_HOST_COMMS_ADR_MASK);
kevin1990 28:4eb837cd71df 625 uint8_t commandData[2] = {
kevin1990 28:4eb837cd71df 626 command >> 8,
kevin1990 28:4eb837cd71df 627 command & 0xFF
kevin1990 28:4eb837cd71df 628 };
kevin1990 28:4eb837cd71df 629 uint8_t commandResponse[2];
kevin1990 28:4eb837cd71df 630 unsigned nValidSamples = 0;
kevin1990 28:4eb837cd71df 631 ADI_SENSE_RESULT eRet = ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 632
kevin1990 28:4eb837cd71df 633 /* Setup initial sample */
kevin1990 28:4eb837cd71df 634 WRITE_REG_U32(hDevice, nStartIndex, CORE_EXT_FLASH_INDEX);
kevin1990 28:4eb837cd71df 635
kevin1990 28:4eb837cd71df 636 /* Send flash read command */
kevin1990 28:4eb837cd71df 637 do {
kevin1990 28:4eb837cd71df 638 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
kevin1990 28:4eb837cd71df 639 sizeof(command), false);
ADIJake 33:ea9e60457591 640 if (eRet) {
kevin1990 28:4eb837cd71df 641 ADI_SENSE_LOG_ERROR("Failed to send read command for external flash");
kevin1990 28:4eb837cd71df 642 return eRet;
kevin1990 28:4eb837cd71df 643 }
kevin1990 28:4eb837cd71df 644
kevin1990 28:4eb837cd71df 645 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 646 } while ((commandResponse[0] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_0) ||
kevin1990 28:4eb837cd71df 647 (commandResponse[1] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_1));
kevin1990 28:4eb837cd71df 648
kevin1990 28:4eb837cd71df 649 /* Read samples from external flash memory */
ADIJake 33:ea9e60457591 650 for (unsigned i = 0; i < nRequested; i++) {
kevin1990 28:4eb837cd71df 651 ADI_SENSE_1000_Sensor_Result_t sensorResult;
kevin1990 28:4eb837cd71df 652 bool_t bHoldCs = true;
kevin1990 28:4eb837cd71df 653
kevin1990 28:4eb837cd71df 654 /* Keep the CS signal asserted for all but the last sample */
kevin1990 28:4eb837cd71df 655 if ((i + 1) == nRequested)
kevin1990 28:4eb837cd71df 656 bHoldCs = false;
kevin1990 28:4eb837cd71df 657
ADIJake 33:ea9e60457591 658 // Some supported devices on MBed require a pointer to be provided even if
ADIJake 33:ea9e60457591 659 // the data will not be used. This pointer is used in replace of the null.
ADIJake 33:ea9e60457591 660 uint8_t *blankBytes;
ADIJake 33:ea9e60457591 661 blankBytes = (uint8_t *)malloc(8);
ADIJake 33:ea9e60457591 662 for(unsigned i = 0; i < 8; i++) {
ADIJake 33:ea9e60457591 663 blankBytes[i] = 0x00;
ADIJake 33:ea9e60457591 664 }
ADIJake 33:ea9e60457591 665
ADIJake 33:ea9e60457591 666 eRet = adi_sense_SpiTransfer(pCtx->hSpi, blankBytes, (uint8_t *) (&sensorResult),
kevin1990 28:4eb837cd71df 667 8, bHoldCs);
ADIJake 33:ea9e60457591 668 free(blankBytes);
ADIJake 33:ea9e60457591 669 if (eRet) {
kevin1990 28:4eb837cd71df 670 ADI_SENSE_LOG_ERROR("Failed to read data from external flash");
kevin1990 28:4eb837cd71df 671 return eRet;
kevin1990 28:4eb837cd71df 672 }
kevin1990 28:4eb837cd71df 673
kevin1990 28:4eb837cd71df 674 ADI_SENSE_DATA_SAMPLE *pSample = &pSamples[nValidSamples];
kevin1990 28:4eb837cd71df 675
kevin1990 28:4eb837cd71df 676 pSample->status = (ADI_SENSE_DEVICE_STATUS_FLAGS)0;
kevin1990 28:4eb837cd71df 677 if (sensorResult.Ch_Error)
kevin1990 28:4eb837cd71df 678 pSample->status |= ADI_SENSE_DEVICE_STATUS_ERROR;
kevin1990 28:4eb837cd71df 679 if (sensorResult.Ch_Alert)
kevin1990 28:4eb837cd71df 680 pSample->status |= ADI_SENSE_DEVICE_STATUS_ALERT;
kevin1990 28:4eb837cd71df 681
kevin1990 28:4eb837cd71df 682 if (sensorResult.Ch_Raw)
kevin1990 28:4eb837cd71df 683 pSample->rawValue = sensorResult.Raw_Sample;
kevin1990 28:4eb837cd71df 684 else
kevin1990 28:4eb837cd71df 685 pSample->rawValue = 0;
kevin1990 28:4eb837cd71df 686
kevin1990 28:4eb837cd71df 687 pSample->channelId = sensorResult.Channel_ID;
kevin1990 28:4eb837cd71df 688 pSample->processedValue = sensorResult.Sensor_Result;
kevin1990 28:4eb837cd71df 689
kevin1990 28:4eb837cd71df 690 nValidSamples++;
kevin1990 28:4eb837cd71df 691 }
kevin1990 28:4eb837cd71df 692 *pnReturned = nValidSamples;
kevin1990 28:4eb837cd71df 693
kevin1990 28:4eb837cd71df 694 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 695
kevin1990 28:4eb837cd71df 696 return eRet;
kevin1990 28:4eb837cd71df 697 }
kevin1990 28:4eb837cd71df 698
kevin1990 28:4eb837cd71df 699
kevin1990 28:4eb837cd71df 700 /*
kevin1990 28:4eb837cd71df 701 * Store the LUT data to persistent memory on the device.
kevin1990 28:4eb837cd71df 702 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 703 * Do not power down the device while this command is running.
kevin1990 28:4eb837cd71df 704 */
kevin1990 28:4eb837cd71df 705 ADI_SENSE_RESULT adi_sense_SaveLutData(
kevin1990 28:4eb837cd71df 706 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 707 {
kevin1990 28:4eb837cd71df 708 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SAVE_LUT, true);
kevin1990 28:4eb837cd71df 709 }
kevin1990 28:4eb837cd71df 710
kevin1990 28:4eb837cd71df 711 /*
kevin1990 28:4eb837cd71df 712 * Restore the LUT data from persistent memory on the device.
kevin1990 28:4eb837cd71df 713 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 714 */
kevin1990 28:4eb837cd71df 715 ADI_SENSE_RESULT adi_sense_RestoreLutData(
kevin1990 28:4eb837cd71df 716 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 717 {
kevin1990 28:4eb837cd71df 718 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_LOAD_LUT, true);
kevin1990 28:4eb837cd71df 719 }
kevin1990 28:4eb837cd71df 720
kevin1990 28:4eb837cd71df 721 /*
kevin1990 28:4eb837cd71df 722 * Stop the measurement cycles on the device.
kevin1990 28:4eb837cd71df 723 * To be used only if a measurement command is currently running.
kevin1990 28:4eb837cd71df 724 */
kevin1990 28:4eb837cd71df 725 ADI_SENSE_RESULT adi_sense_StopMeasurement(
kevin1990 28:4eb837cd71df 726 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 727 {
kevin1990 28:4eb837cd71df 728 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_NOP, true);
kevin1990 28:4eb837cd71df 729 }
kevin1990 28:4eb837cd71df 730
kevin1990 28:4eb837cd71df 731 /*
kevin1990 28:4eb837cd71df 732 * Run built-in diagnostic checks on the device.
kevin1990 28:4eb837cd71df 733 * Diagnostics are executed according to the current applied settings.
kevin1990 28:4eb837cd71df 734 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 735 */
kevin1990 28:4eb837cd71df 736 ADI_SENSE_RESULT adi_sense_RunDiagnostics(
kevin1990 28:4eb837cd71df 737 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 738 {
kevin1990 28:4eb837cd71df 739 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_RUN_DIAGNOSTICS, true);
kevin1990 28:4eb837cd71df 740 }
kevin1990 28:4eb837cd71df 741
kevin1990 28:4eb837cd71df 742 /*
kevin1990 28:4eb837cd71df 743 * Run self-calibration routines on the device.
kevin1990 28:4eb837cd71df 744 * Calibration is executed according to the current applied settings.
kevin1990 28:4eb837cd71df 745 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 746 */
kevin1990 28:4eb837cd71df 747 ADI_SENSE_RESULT adi_sense_RunCalibration(
kevin1990 28:4eb837cd71df 748 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 749 {
kevin1990 28:4eb837cd71df 750 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_SELF_CALIBRATION, true);
kevin1990 28:4eb837cd71df 751 }
kevin1990 28:4eb837cd71df 752
kevin1990 28:4eb837cd71df 753 /*
kevin1990 28:4eb837cd71df 754 * Run digital calibration routines on the device.
kevin1990 28:4eb837cd71df 755 * Calibration is executed according to the current applied settings.
kevin1990 28:4eb837cd71df 756 * No other command must be running when this is called.
kevin1990 28:4eb837cd71df 757 */
kevin1990 28:4eb837cd71df 758 ADI_SENSE_RESULT adi_sense_RunDigitalCalibration(
kevin1990 28:4eb837cd71df 759 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 760 {
kevin1990 28:4eb837cd71df 761 return executeCommand(hDevice, ADISENSE_CORE_COMMAND_CALIBRATE_DIGITAL, true);
kevin1990 28:4eb837cd71df 762 }
kevin1990 28:4eb837cd71df 763
kevin1990 28:4eb837cd71df 764 /*
kevin1990 28:4eb837cd71df 765 * Read a set of data samples from the device.
kevin1990 28:4eb837cd71df 766 * This may be called at any time.
kevin1990 28:4eb837cd71df 767 */
kevin1990 28:4eb837cd71df 768 ADI_SENSE_RESULT adi_sense_GetData(
kevin1990 28:4eb837cd71df 769 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 770 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode,
kevin1990 28:4eb837cd71df 771 ADI_SENSE_DATA_SAMPLE * const pSamples,
kevin1990 28:4eb837cd71df 772 uint8_t const nBytesPerSample,
kevin1990 28:4eb837cd71df 773 uint32_t const nRequested,
kevin1990 28:4eb837cd71df 774 uint32_t * const pnReturned)
kevin1990 28:4eb837cd71df 775 {
kevin1990 28:4eb837cd71df 776 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 777 uint16_t command = ADI_SENSE_1000_HOST_COMMS_READ_CMD |
ADIJake 33:ea9e60457591 778 (REG_ADISENSE_CORE_DATA_FIFO & ADI_SENSE_1000_HOST_COMMS_ADR_MASK);
kevin1990 28:4eb837cd71df 779 uint8_t commandData[2] = {
kevin1990 28:4eb837cd71df 780 command >> 8,
kevin1990 28:4eb837cd71df 781 command & 0xFF
kevin1990 28:4eb837cd71df 782 };
kevin1990 28:4eb837cd71df 783 uint8_t commandResponse[2];
kevin1990 28:4eb837cd71df 784 unsigned nValidSamples = 0;
kevin1990 28:4eb837cd71df 785 ADI_SENSE_RESULT eRet = ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 786
ADIJake 33:ea9e60457591 787
kevin1990 28:4eb837cd71df 788 do {
kevin1990 28:4eb837cd71df 789 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
kevin1990 28:4eb837cd71df 790 sizeof(command), false);
ADIJake 33:ea9e60457591 791 if (eRet) {
kevin1990 28:4eb837cd71df 792 ADI_SENSE_LOG_ERROR("Failed to send read command for FIFO register");
kevin1990 28:4eb837cd71df 793 return eRet;
kevin1990 28:4eb837cd71df 794 }
kevin1990 28:4eb837cd71df 795 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 796 } while ((commandResponse[0] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_0) ||
kevin1990 28:4eb837cd71df 797 (commandResponse[1] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_1));
kevin1990 28:4eb837cd71df 798
ADIJake 33:ea9e60457591 799 for (unsigned i = 0; i < nRequested; i++) {
kevin1990 28:4eb837cd71df 800 ADI_SENSE_1000_Sensor_Result_t sensorResult;
kevin1990 28:4eb837cd71df 801 bool_t bHoldCs = true;
kevin1990 28:4eb837cd71df 802
kevin1990 28:4eb837cd71df 803 /* Keep the CS signal asserted for all but the last sample */
kevin1990 28:4eb837cd71df 804 if ((i + 1) == nRequested)
kevin1990 28:4eb837cd71df 805 bHoldCs = false;
kevin1990 28:4eb837cd71df 806
ADIJake 33:ea9e60457591 807 // Some supported devices on MBed require a pointer to be provided even if
ADIJake 33:ea9e60457591 808 // the data will not be used. This pointer is used in replace of the null.
ADIJake 33:ea9e60457591 809 uint8_t *blankBytes;
ADIJake 33:ea9e60457591 810 blankBytes = (uint8_t *)malloc(nBytesPerSample);
ADIJake 33:ea9e60457591 811 for(unsigned i = 0; i < nBytesPerSample; i++) {
ADIJake 33:ea9e60457591 812 blankBytes[i] = 0x00;
ADIJake 33:ea9e60457591 813 }
ADIJake 33:ea9e60457591 814
ADIJake 33:ea9e60457591 815 eRet = adi_sense_SpiTransfer(pCtx->hSpi, blankBytes, &sensorResult,
kevin1990 28:4eb837cd71df 816 nBytesPerSample, bHoldCs);
ADIJake 33:ea9e60457591 817 free(blankBytes);
ADIJake 33:ea9e60457591 818 if (eRet) {
kevin1990 28:4eb837cd71df 819 ADI_SENSE_LOG_ERROR("Failed to read data from FIFO register");
kevin1990 28:4eb837cd71df 820 return eRet;
kevin1990 28:4eb837cd71df 821 }
kevin1990 28:4eb837cd71df 822
ADIJake 33:ea9e60457591 823 if (! sensorResult.Ch_Valid) {
kevin1990 28:4eb837cd71df 824 /*
kevin1990 28:4eb837cd71df 825 * Reading an invalid sample indicates that there are no
kevin1990 28:4eb837cd71df 826 * more samples available or we've lost sync with the device.
kevin1990 28:4eb837cd71df 827 * In the latter case, it might be recoverable, but return here
kevin1990 28:4eb837cd71df 828 * to let the application check the device status and decide itself.
kevin1990 28:4eb837cd71df 829 */
kevin1990 28:4eb837cd71df 830 eRet = ADI_SENSE_INCOMPLETE;
kevin1990 28:4eb837cd71df 831 break;
kevin1990 28:4eb837cd71df 832 }
kevin1990 28:4eb837cd71df 833
kevin1990 28:4eb837cd71df 834 ADI_SENSE_DATA_SAMPLE *pSample = &pSamples[nValidSamples];
kevin1990 28:4eb837cd71df 835
kevin1990 28:4eb837cd71df 836 pSample->status = (ADI_SENSE_DEVICE_STATUS_FLAGS)0;
kevin1990 28:4eb837cd71df 837 if (sensorResult.Ch_Error)
kevin1990 28:4eb837cd71df 838 pSample->status |= ADI_SENSE_DEVICE_STATUS_ERROR;
kevin1990 28:4eb837cd71df 839 if (sensorResult.Ch_Alert)
kevin1990 28:4eb837cd71df 840 pSample->status |= ADI_SENSE_DEVICE_STATUS_ALERT;
kevin1990 28:4eb837cd71df 841
kevin1990 28:4eb837cd71df 842 if (sensorResult.Ch_Raw)
kevin1990 28:4eb837cd71df 843 pSample->rawValue = sensorResult.Raw_Sample;
kevin1990 28:4eb837cd71df 844 else
kevin1990 28:4eb837cd71df 845 pSample->rawValue = 0;
kevin1990 28:4eb837cd71df 846
kevin1990 28:4eb837cd71df 847 pSample->channelId = sensorResult.Channel_ID;
kevin1990 28:4eb837cd71df 848 pSample->processedValue = sensorResult.Sensor_Result;
kevin1990 28:4eb837cd71df 849
kevin1990 28:4eb837cd71df 850 nValidSamples++;
kevin1990 28:4eb837cd71df 851 }
kevin1990 28:4eb837cd71df 852 *pnReturned = nValidSamples;
kevin1990 28:4eb837cd71df 853
kevin1990 28:4eb837cd71df 854 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 855
kevin1990 28:4eb837cd71df 856 return eRet;
kevin1990 28:4eb837cd71df 857 }
kevin1990 28:4eb837cd71df 858
kevin1990 28:4eb837cd71df 859 /*
kevin1990 28:4eb837cd71df 860 * Close the given ADISENSE device.
kevin1990 28:4eb837cd71df 861 */
kevin1990 28:4eb837cd71df 862 ADI_SENSE_RESULT adi_sense_Close(
kevin1990 28:4eb837cd71df 863 ADI_SENSE_DEVICE_HANDLE const hDevice)
kevin1990 28:4eb837cd71df 864 {
kevin1990 28:4eb837cd71df 865 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 866
kevin1990 28:4eb837cd71df 867 adi_sense_GpioClose(pCtx->hGpio);
kevin1990 28:4eb837cd71df 868 adi_sense_SpiClose(pCtx->hSpi);
kevin1990 28:4eb837cd71df 869 adi_sense_LogClose();
kevin1990 28:4eb837cd71df 870
kevin1990 28:4eb837cd71df 871 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 872 }
kevin1990 28:4eb837cd71df 873
kevin1990 28:4eb837cd71df 874 ADI_SENSE_RESULT adi_sense_1000_WriteRegister(
kevin1990 28:4eb837cd71df 875 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 876 uint16_t nAddress,
kevin1990 28:4eb837cd71df 877 void *pData,
kevin1990 28:4eb837cd71df 878 unsigned nLength)
kevin1990 28:4eb837cd71df 879 {
kevin1990 28:4eb837cd71df 880 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 881 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 882 uint16_t command = ADI_SENSE_1000_HOST_COMMS_WRITE_CMD |
ADIJake 33:ea9e60457591 883 (nAddress & ADI_SENSE_1000_HOST_COMMS_ADR_MASK);
kevin1990 28:4eb837cd71df 884 uint8_t commandData[2] = {
kevin1990 28:4eb837cd71df 885 command >> 8,
kevin1990 28:4eb837cd71df 886 command & 0xFF
kevin1990 28:4eb837cd71df 887 };
kevin1990 28:4eb837cd71df 888 uint8_t commandResponse[2];
kevin1990 28:4eb837cd71df 889
kevin1990 28:4eb837cd71df 890 do {
kevin1990 28:4eb837cd71df 891 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
kevin1990 28:4eb837cd71df 892 sizeof(command), false);
ADIJake 33:ea9e60457591 893 if (eRet) {
kevin1990 28:4eb837cd71df 894 ADI_SENSE_LOG_ERROR("Failed to send write command for register %u",
kevin1990 28:4eb837cd71df 895 nAddress);
kevin1990 28:4eb837cd71df 896 return eRet;
kevin1990 28:4eb837cd71df 897 }
kevin1990 28:4eb837cd71df 898
kevin1990 28:4eb837cd71df 899 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 900 } while ((commandResponse[0] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_0) ||
kevin1990 28:4eb837cd71df 901 (commandResponse[1] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_1));
kevin1990 28:4eb837cd71df 902
ADIJake 33:ea9e60457591 903 // Some supported devices on MBed require a pointer to be provided even if
ADIJake 33:ea9e60457591 904 // the data will not be used. This pointer is used in replace of the null.
ADIJake 33:ea9e60457591 905 uint8_t *blankBytes;
ADIJake 33:ea9e60457591 906 blankBytes = (uint8_t *)malloc(nLength);
ADIJake 33:ea9e60457591 907
ADIJake 33:ea9e60457591 908 eRet = adi_sense_SpiTransfer(pCtx->hSpi, pData, blankBytes, nLength, false);
ADIJake 33:ea9e60457591 909 free(blankBytes);
ADIJake 33:ea9e60457591 910 if (eRet) {
kevin1990 28:4eb837cd71df 911 ADI_SENSE_LOG_ERROR("Failed to write data (%dB) to register %u",
kevin1990 28:4eb837cd71df 912 nLength, nAddress);
kevin1990 28:4eb837cd71df 913 return eRet;
kevin1990 28:4eb837cd71df 914 }
kevin1990 28:4eb837cd71df 915
kevin1990 28:4eb837cd71df 916 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 917
kevin1990 28:4eb837cd71df 918 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 919 }
kevin1990 28:4eb837cd71df 920
kevin1990 28:4eb837cd71df 921 ADI_SENSE_RESULT adi_sense_1000_ReadRegister(
kevin1990 28:4eb837cd71df 922 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 923 uint16_t nAddress,
kevin1990 28:4eb837cd71df 924 void *pData,
kevin1990 28:4eb837cd71df 925 unsigned nLength)
kevin1990 28:4eb837cd71df 926 {
kevin1990 28:4eb837cd71df 927 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 928 ADI_SENSE_DEVICE_CONTEXT *pCtx = hDevice;
kevin1990 28:4eb837cd71df 929 uint16_t command = ADI_SENSE_1000_HOST_COMMS_READ_CMD |
ADIJake 33:ea9e60457591 930 (nAddress & ADI_SENSE_1000_HOST_COMMS_ADR_MASK);
kevin1990 28:4eb837cd71df 931 uint8_t commandData[2] = {
kevin1990 28:4eb837cd71df 932 command >> 8,
kevin1990 28:4eb837cd71df 933 command & 0xFF
kevin1990 28:4eb837cd71df 934 };
kevin1990 28:4eb837cd71df 935 uint8_t commandResponse[2];
kevin1990 28:4eb837cd71df 936
kevin1990 28:4eb837cd71df 937 do {
kevin1990 28:4eb837cd71df 938 eRet = adi_sense_SpiTransfer(pCtx->hSpi, commandData, commandResponse,
kevin1990 28:4eb837cd71df 939 sizeof(command), false);
ADIJake 33:ea9e60457591 940 if (eRet) {
kevin1990 28:4eb837cd71df 941 ADI_SENSE_LOG_ERROR("Failed to send read command for register %u",
kevin1990 28:4eb837cd71df 942 nAddress);
kevin1990 28:4eb837cd71df 943 return eRet;
kevin1990 28:4eb837cd71df 944 }
kevin1990 28:4eb837cd71df 945
kevin1990 28:4eb837cd71df 946 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 947 } while ((commandResponse[0] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_0) ||
kevin1990 28:4eb837cd71df 948 (commandResponse[1] != ADI_SENSE_1000_HOST_COMMS_CMD_RESP_1));
ADIJake 33:ea9e60457591 949
ADIJake 33:ea9e60457591 950 // Some supported devices on MBed require a pointer to be provided even if
ADIJake 33:ea9e60457591 951 // the data will not be used. This pointer is used in replace of the null.
ADIJake 33:ea9e60457591 952 uint8_t *blankBytes;
ADIJake 33:ea9e60457591 953 blankBytes = (uint8_t *)malloc(nLength);
ADIJake 33:ea9e60457591 954 for(unsigned i = 0; i < nLength; i++) {
ADIJake 33:ea9e60457591 955 blankBytes[i] = 0x00;
ADIJake 33:ea9e60457591 956 }
ADIJake 33:ea9e60457591 957
ADIJake 33:ea9e60457591 958 eRet = adi_sense_SpiTransfer(pCtx->hSpi, blankBytes, pData, nLength, false);
ADIJake 33:ea9e60457591 959 free(blankBytes);
ADIJake 33:ea9e60457591 960 if (eRet) {
kevin1990 28:4eb837cd71df 961 ADI_SENSE_LOG_ERROR("Failed to read data (%uB) from register %u",
kevin1990 28:4eb837cd71df 962 nLength, nAddress);
kevin1990 28:4eb837cd71df 963 return eRet;
kevin1990 28:4eb837cd71df 964 }
kevin1990 28:4eb837cd71df 965
kevin1990 28:4eb837cd71df 966 adi_sense_TimeDelayUsec(ADI_SENSE_1000_HOST_COMMS_XFER_DELAY);
kevin1990 28:4eb837cd71df 967
kevin1990 28:4eb837cd71df 968 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 969 }
kevin1990 28:4eb837cd71df 970
kevin1990 28:4eb837cd71df 971 ADI_SENSE_RESULT adi_sense_GetDeviceReadyState(
kevin1990 28:4eb837cd71df 972 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 973 bool_t * const bReady)
kevin1990 28:4eb837cd71df 974 {
kevin1990 28:4eb837cd71df 975 ADI_ADISENSE_SPI_Chip_Type_t chipTypeReg;
kevin1990 28:4eb837cd71df 976
kevin1990 28:4eb837cd71df 977 READ_REG_U8(hDevice, chipTypeReg.VALUE8, SPI_CHIP_TYPE);
kevin1990 28:4eb837cd71df 978 /* If we read this register successfully, assume the device is ready */
kevin1990 28:4eb837cd71df 979 *bReady = (chipTypeReg.VALUE8 == REG_ADISENSE_SPI_CHIP_TYPE_RESET);
kevin1990 28:4eb837cd71df 980
kevin1990 28:4eb837cd71df 981 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 982 }
kevin1990 28:4eb837cd71df 983
kevin1990 28:4eb837cd71df 984 ADI_SENSE_RESULT adi_sense_1000_GetDataReadyModeInfo(
kevin1990 28:4eb837cd71df 985 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 986 ADI_SENSE_MEASUREMENT_MODE const eMeasurementMode,
kevin1990 28:4eb837cd71df 987 ADI_SENSE_1000_OPERATING_MODE * const peOperatingMode,
kevin1990 28:4eb837cd71df 988 ADI_SENSE_1000_DATAREADY_MODE * const peDataReadyMode,
kevin1990 28:4eb837cd71df 989 uint32_t * const pnSamplesPerDataready,
kevin1990 28:4eb837cd71df 990 uint32_t * const pnSamplesPerCycle,
kevin1990 28:4eb837cd71df 991 uint8_t * const pnBytesPerSample)
kevin1990 28:4eb837cd71df 992 {
kevin1990 28:4eb837cd71df 993 unsigned nChannelsEnabled = 0;
kevin1990 28:4eb837cd71df 994 unsigned nSamplesPerCycle = 0;
kevin1990 28:4eb837cd71df 995
kevin1990 28:4eb837cd71df 996 ADI_ADISENSE_CORE_Mode_t modeReg;
kevin1990 28:4eb837cd71df 997 READ_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
kevin1990 28:4eb837cd71df 998
kevin1990 28:4eb837cd71df 999 if ((eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK) ||
ADIJake 33:ea9e60457591 1000 (modeReg.Conversion_Mode == ADISENSE_CORE_MODE_SINGLECYCLE))
kevin1990 28:4eb837cd71df 1001 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE;
kevin1990 28:4eb837cd71df 1002 else if (modeReg.Conversion_Mode == ADISENSE_CORE_MODE_MULTICYCLE)
kevin1990 28:4eb837cd71df 1003 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE;
kevin1990 28:4eb837cd71df 1004 else
kevin1990 28:4eb837cd71df 1005 *peOperatingMode = ADI_SENSE_1000_OPERATING_MODE_CONTINUOUS;
kevin1990 28:4eb837cd71df 1006
kevin1990 28:4eb837cd71df 1007
kevin1990 28:4eb837cd71df 1008 /* FFT mode is quite different to the other modes:
kevin1990 28:4eb837cd71df 1009 * - Each FFT result produces a batch of samples
kevin1990 28:4eb837cd71df 1010 * - The size of the batch depends on selected FFT size and output config options
kevin1990 28:4eb837cd71df 1011 * - DATAREADY will fire for each FFT result (once per channel)
kevin1990 28:4eb837cd71df 1012 * - The size of the cycle depends on the number of channels enabled for FFT
kevin1990 28:4eb837cd71df 1013 */
ADIJake 33:ea9e60457591 1014 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_FFT) {
kevin1990 28:4eb837cd71df 1015 ADI_ADISENSE_CORE_FFT_Config_t fftConfigReg;
kevin1990 28:4eb837cd71df 1016
kevin1990 28:4eb837cd71df 1017 unsigned nFftChannels;
kevin1990 28:4eb837cd71df 1018 unsigned nSamplesPerChannel;
kevin1990 28:4eb837cd71df 1019
kevin1990 28:4eb837cd71df 1020 READ_REG_U32(hDevice, fftConfigReg.VALUE32, CORE_FFT_CONFIG);
kevin1990 28:4eb837cd71df 1021
kevin1990 28:4eb837cd71df 1022 nFftChannels = fftConfigReg.FFT_Num_Channels + 1;
kevin1990 28:4eb837cd71df 1023
ADIJake 33:ea9e60457591 1024 if (fftConfigReg.FFT_Output == ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_MAX16) {
kevin1990 28:4eb837cd71df 1025 nSamplesPerChannel = 16;
kevin1990 28:4eb837cd71df 1026 *pnBytesPerSample = 8;
ADIJake 33:ea9e60457591 1027 } else if (fftConfigReg.FFT_Output == ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_FULL) {
kevin1990 28:4eb837cd71df 1028 nSamplesPerChannel = (256 << fftConfigReg.FFT_Num_Bins) >> 1;
kevin1990 28:4eb837cd71df 1029 *pnBytesPerSample = 5;
ADIJake 33:ea9e60457591 1030 } else if (fftConfigReg.FFT_Output == ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_FULL_WITH_RAW) {
kevin1990 28:4eb837cd71df 1031 nSamplesPerChannel = (256 << fftConfigReg.FFT_Num_Bins);
kevin1990 28:4eb837cd71df 1032 *pnBytesPerSample = 8;
ADIJake 33:ea9e60457591 1033 } else {
kevin1990 28:4eb837cd71df 1034 ADI_SENSE_LOG_ERROR("Invalid FFT output format option %d configured",
kevin1990 28:4eb837cd71df 1035 fftConfigReg.FFT_Output);
kevin1990 28:4eb837cd71df 1036 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1037 }
kevin1990 28:4eb837cd71df 1038
kevin1990 28:4eb837cd71df 1039 *pnSamplesPerDataready = nSamplesPerChannel;
kevin1990 28:4eb837cd71df 1040 *pnSamplesPerCycle = nSamplesPerChannel * nFftChannels;
kevin1990 28:4eb837cd71df 1041
kevin1990 28:4eb837cd71df 1042 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CYCLE;
ADIJake 33:ea9e60457591 1043 } else {
ADIJake 33:ea9e60457591 1044 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_OMIT_RAW) {
kevin1990 28:4eb837cd71df 1045 *pnBytesPerSample = 5;
ADIJake 33:ea9e60457591 1046 } else {
kevin1990 28:4eb837cd71df 1047 *pnBytesPerSample = 8;
kevin1990 28:4eb837cd71df 1048 }
kevin1990 28:4eb837cd71df 1049
kevin1990 28:4eb837cd71df 1050 for (ADI_SENSE_1000_CHANNEL_ID chId = ADI_SENSE_1000_CHANNEL_ID_CJC_0;
ADIJake 33:ea9e60457591 1051 chId < ADI_SENSE_1000_MAX_CHANNELS;
ADIJake 33:ea9e60457591 1052 chId++) {
kevin1990 28:4eb837cd71df 1053 ADI_ADISENSE_CORE_Sensor_Details_t sensorDetailsReg;
kevin1990 28:4eb837cd71df 1054 ADI_ADISENSE_CORE_Channel_Count_t channelCountReg;
kevin1990 28:4eb837cd71df 1055
kevin1990 28:4eb837cd71df 1056 if (ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(chId))
kevin1990 28:4eb837cd71df 1057 continue;
kevin1990 28:4eb837cd71df 1058
kevin1990 28:4eb837cd71df 1059 READ_REG_U8(hDevice, channelCountReg.VALUE8, CORE_CHANNEL_COUNTn(chId));
kevin1990 28:4eb837cd71df 1060 READ_REG_U32(hDevice, sensorDetailsReg.VALUE32, CORE_SENSOR_DETAILSn(chId));
kevin1990 28:4eb837cd71df 1061
ADIJake 33:ea9e60457591 1062 if (channelCountReg.Channel_Enable && !sensorDetailsReg.Do_Not_Publish) {
kevin1990 28:4eb837cd71df 1063 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
kevin1990 28:4eb837cd71df 1064 unsigned nActualChannels = 1;
kevin1990 28:4eb837cd71df 1065
kevin1990 28:4eb837cd71df 1066 READ_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(chId));
kevin1990 28:4eb837cd71df 1067
ADIJake 33:ea9e60457591 1068 if (chId == ADI_SENSE_1000_CHANNEL_ID_SPI_0) {
kevin1990 28:4eb837cd71df 1069 /* Some sensors automatically generate samples on additional "virtual" channels
kevin1990 28:4eb837cd71df 1070 * so these channels must be counted as active when those sensors are selected
kevin1990 28:4eb837cd71df 1071 * and we use the count from the corresponding "physical" channel */
kevin1990 28:4eb837cd71df 1072 if ((sensorTypeReg.Sensor_Type >=
ADIJake 33:ea9e60457591 1073 ADISENSE_CORE_SENSOR_TYPE_SENSOR_SPI_ACCELEROMETER_A_DEF_L1) &&
ADIJake 33:ea9e60457591 1074 (sensorTypeReg.Sensor_Type <=
ADIJake 33:ea9e60457591 1075 ADISENSE_CORE_SENSOR_TYPE_SENSOR_SPI_ACCELEROMETER_B_ADV_L2))
kevin1990 28:4eb837cd71df 1076 nActualChannels += 2;
kevin1990 28:4eb837cd71df 1077 }
kevin1990 28:4eb837cd71df 1078
kevin1990 28:4eb837cd71df 1079 nChannelsEnabled += nActualChannels;
kevin1990 28:4eb837cd71df 1080 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK)
kevin1990 28:4eb837cd71df 1081 /* Assume a single sample per channel in test mode */
kevin1990 28:4eb837cd71df 1082 nSamplesPerCycle += nActualChannels;
kevin1990 28:4eb837cd71df 1083 else
kevin1990 28:4eb837cd71df 1084 nSamplesPerCycle += nActualChannels *
ADIJake 33:ea9e60457591 1085 (channelCountReg.Channel_Count + 1);
kevin1990 28:4eb837cd71df 1086 }
kevin1990 28:4eb837cd71df 1087 }
kevin1990 28:4eb837cd71df 1088
ADIJake 33:ea9e60457591 1089 if (nChannelsEnabled == 0) {
kevin1990 28:4eb837cd71df 1090 *pnSamplesPerDataready = 0;
kevin1990 28:4eb837cd71df 1091 *pnSamplesPerCycle = 0;
kevin1990 28:4eb837cd71df 1092 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1093 }
kevin1990 28:4eb837cd71df 1094
kevin1990 28:4eb837cd71df 1095 *pnSamplesPerCycle = nSamplesPerCycle;
kevin1990 28:4eb837cd71df 1096
ADIJake 33:ea9e60457591 1097 if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CONVERSION) {
kevin1990 28:4eb837cd71df 1098 *pnSamplesPerDataready = 1;
ADIJake 33:ea9e60457591 1099 } else if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CYCLE) {
kevin1990 28:4eb837cd71df 1100 *pnSamplesPerDataready = nSamplesPerCycle;
ADIJake 33:ea9e60457591 1101 } else {
kevin1990 28:4eb837cd71df 1102 /* Assume DRDY will be asserted after max. 1 cycle in test mode */
ADIJake 33:ea9e60457591 1103 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK) {
kevin1990 28:4eb837cd71df 1104 *pnSamplesPerDataready = nSamplesPerCycle;
ADIJake 33:ea9e60457591 1105 } else {
kevin1990 28:4eb837cd71df 1106 ADI_ADISENSE_CORE_Fifo_Num_Cycles_t fifoNumCyclesReg;
kevin1990 28:4eb837cd71df 1107 READ_REG_U8(hDevice, fifoNumCyclesReg.VALUE8, CORE_FIFO_NUM_CYCLES);
kevin1990 28:4eb837cd71df 1108
kevin1990 28:4eb837cd71df 1109 *pnSamplesPerDataready =
ADIJake 33:ea9e60457591 1110 nSamplesPerCycle * fifoNumCyclesReg.Fifo_Num_Cycles;
kevin1990 28:4eb837cd71df 1111 }
kevin1990 28:4eb837cd71df 1112 }
kevin1990 28:4eb837cd71df 1113
kevin1990 28:4eb837cd71df 1114 if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CONVERSION)
kevin1990 28:4eb837cd71df 1115 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CONVERSION;
kevin1990 28:4eb837cd71df 1116 else if (modeReg.Drdy_Mode == ADISENSE_CORE_MODE_DRDY_PER_CYCLE)
kevin1990 28:4eb837cd71df 1117 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CYCLE;
ADIJake 33:ea9e60457591 1118 else {
kevin1990 28:4eb837cd71df 1119 /* Assume DRDY will be asserted after max. 1 cycle in test mode */
kevin1990 28:4eb837cd71df 1120 if (eMeasurementMode == ADI_SENSE_MEASUREMENT_MODE_HEALTHCHECK)
kevin1990 28:4eb837cd71df 1121 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_CYCLE;
kevin1990 28:4eb837cd71df 1122 else
kevin1990 28:4eb837cd71df 1123 *peDataReadyMode = ADI_SENSE_1000_DATAREADY_PER_MULTICYCLE_BURST;
kevin1990 28:4eb837cd71df 1124 }
kevin1990 28:4eb837cd71df 1125 }
kevin1990 28:4eb837cd71df 1126
kevin1990 28:4eb837cd71df 1127 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1128 }
kevin1990 28:4eb837cd71df 1129
kevin1990 28:4eb837cd71df 1130 ADI_SENSE_RESULT adi_sense_GetProductID(
kevin1990 28:4eb837cd71df 1131 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1132 ADI_SENSE_PRODUCT_ID *pProductId)
kevin1990 28:4eb837cd71df 1133 {
kevin1990 28:4eb837cd71df 1134 ADI_ADISENSE_SPI_Product_ID_L_t productIdLoReg;
kevin1990 28:4eb837cd71df 1135 ADI_ADISENSE_SPI_Product_ID_H_t productIdHiReg;
kevin1990 28:4eb837cd71df 1136
kevin1990 28:4eb837cd71df 1137 READ_REG_U8(hDevice, productIdLoReg.VALUE8, SPI_PRODUCT_ID_L);
kevin1990 28:4eb837cd71df 1138 READ_REG_U8(hDevice, productIdHiReg.VALUE8, SPI_PRODUCT_ID_H);
kevin1990 28:4eb837cd71df 1139
kevin1990 28:4eb837cd71df 1140 *pProductId = (ADI_SENSE_PRODUCT_ID)((productIdHiReg.VALUE8 << 8)
kevin1990 28:4eb837cd71df 1141 | productIdLoReg.VALUE8);
kevin1990 28:4eb837cd71df 1142 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1143 }
kevin1990 28:4eb837cd71df 1144
kevin1990 28:4eb837cd71df 1145 static ADI_SENSE_RESULT adi_sense_SetPowerMode(
kevin1990 28:4eb837cd71df 1146 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1147 ADI_SENSE_1000_POWER_MODE powerMode)
kevin1990 28:4eb837cd71df 1148 {
kevin1990 28:4eb837cd71df 1149 ADI_ADISENSE_CORE_Power_Config_t powerConfigReg;
kevin1990 28:4eb837cd71df 1150
ADIJake 33:ea9e60457591 1151 if (powerMode == ADI_SENSE_1000_POWER_MODE_LOW) {
kevin1990 28:4eb837cd71df 1152 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_LOW_POWER;
ADIJake 33:ea9e60457591 1153 } else if (powerMode == ADI_SENSE_1000_POWER_MODE_MID) {
kevin1990 28:4eb837cd71df 1154 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_MID_POWER;
ADIJake 33:ea9e60457591 1155 } else if (powerMode == ADI_SENSE_1000_POWER_MODE_FULL) {
kevin1990 28:4eb837cd71df 1156 powerConfigReg.Power_Mode_ADC = ADISENSE_CORE_POWER_CONFIG_ADC_FULL_POWER;
ADIJake 33:ea9e60457591 1157 } else {
kevin1990 28:4eb837cd71df 1158 ADI_SENSE_LOG_ERROR("Invalid power mode %d specified", powerMode);
kevin1990 28:4eb837cd71df 1159 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1160 }
kevin1990 28:4eb837cd71df 1161
kevin1990 28:4eb837cd71df 1162 WRITE_REG_U8(hDevice, powerConfigReg.VALUE8, CORE_POWER_CONFIG);
kevin1990 28:4eb837cd71df 1163
kevin1990 28:4eb837cd71df 1164 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1165 }
kevin1990 28:4eb837cd71df 1166
kevin1990 28:4eb837cd71df 1167 ADI_SENSE_RESULT adi_sense_1000_SetPowerConfig(
kevin1990 28:4eb837cd71df 1168 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1169 ADI_SENSE_1000_POWER_CONFIG *pPowerConfig)
kevin1990 28:4eb837cd71df 1170 {
kevin1990 28:4eb837cd71df 1171 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 1172
kevin1990 28:4eb837cd71df 1173 eRet = adi_sense_SetPowerMode(hDevice, pPowerConfig->powerMode);
ADIJake 33:ea9e60457591 1174 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1175 ADI_SENSE_LOG_ERROR("Failed to set power mode");
kevin1990 28:4eb837cd71df 1176 return eRet;
kevin1990 28:4eb837cd71df 1177 }
kevin1990 28:4eb837cd71df 1178
kevin1990 28:4eb837cd71df 1179 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1180 }
kevin1990 28:4eb837cd71df 1181
kevin1990 28:4eb837cd71df 1182 static ADI_SENSE_RESULT adi_sense_SetMode(
kevin1990 28:4eb837cd71df 1183 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1184 ADI_SENSE_1000_OPERATING_MODE eOperatingMode,
kevin1990 28:4eb837cd71df 1185 ADI_SENSE_1000_DATAREADY_MODE eDataReadyMode,
kevin1990 28:4eb837cd71df 1186 ADI_SENSE_1000_CALIBRATION_MODE eCalibrationMode,
kevin1990 28:4eb837cd71df 1187 bool bEnableExtFlash)
kevin1990 28:4eb837cd71df 1188 {
kevin1990 28:4eb837cd71df 1189 ADI_ADISENSE_CORE_Mode_t modeReg;
kevin1990 28:4eb837cd71df 1190
kevin1990 28:4eb837cd71df 1191 modeReg.VALUE8 = REG_RESET_VAL(CORE_MODE);
kevin1990 28:4eb837cd71df 1192
ADIJake 33:ea9e60457591 1193 if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_SINGLECYCLE) {
kevin1990 28:4eb837cd71df 1194 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_SINGLECYCLE;
ADIJake 33:ea9e60457591 1195 } else if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_CONTINUOUS) {
kevin1990 28:4eb837cd71df 1196 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_CONTINUOUS;
ADIJake 33:ea9e60457591 1197 } else if (eOperatingMode == ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE) {
kevin1990 28:4eb837cd71df 1198 modeReg.Conversion_Mode = ADISENSE_CORE_MODE_MULTICYCLE;
ADIJake 33:ea9e60457591 1199 } else {
kevin1990 28:4eb837cd71df 1200 ADI_SENSE_LOG_ERROR("Invalid operating mode %d specified",
kevin1990 28:4eb837cd71df 1201 eOperatingMode);
kevin1990 28:4eb837cd71df 1202 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1203 }
kevin1990 28:4eb837cd71df 1204
ADIJake 33:ea9e60457591 1205 if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_CONVERSION) {
kevin1990 28:4eb837cd71df 1206 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_CONVERSION;
ADIJake 33:ea9e60457591 1207 } else if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_CYCLE) {
kevin1990 28:4eb837cd71df 1208 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_CYCLE;
ADIJake 33:ea9e60457591 1209 } else if (eDataReadyMode == ADI_SENSE_1000_DATAREADY_PER_MULTICYCLE_BURST) {
ADIJake 33:ea9e60457591 1210 if (eOperatingMode != ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE) {
kevin1990 28:4eb837cd71df 1211 ADI_SENSE_LOG_ERROR(
kevin1990 28:4eb837cd71df 1212 "Data-ready mode %d cannot be used with operating mode %d",
kevin1990 28:4eb837cd71df 1213 eDataReadyMode, eOperatingMode);
kevin1990 28:4eb837cd71df 1214 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 1215 } else {
kevin1990 28:4eb837cd71df 1216 modeReg.Drdy_Mode = ADISENSE_CORE_MODE_DRDY_PER_FIFO_FILL;
kevin1990 28:4eb837cd71df 1217 }
ADIJake 33:ea9e60457591 1218 } else {
kevin1990 28:4eb837cd71df 1219 ADI_SENSE_LOG_ERROR("Invalid data-ready mode %d specified", eDataReadyMode);
kevin1990 28:4eb837cd71df 1220 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1221 }
kevin1990 28:4eb837cd71df 1222
ADIJake 33:ea9e60457591 1223 if (eCalibrationMode == ADI_SENSE_1000_NO_CALIBRATION) {
kevin1990 28:4eb837cd71df 1224 modeReg.Calibration_Method = ADISENSE_CORE_MODE_NO_CAL;
ADIJake 33:ea9e60457591 1225 } else if (eCalibrationMode == ADI_SENSE_1000_DO_CALIBRATION) {
kevin1990 28:4eb837cd71df 1226 modeReg.Calibration_Method = ADISENSE_CORE_MODE_DO_CAL;
ADIJake 33:ea9e60457591 1227 } else {
kevin1990 28:4eb837cd71df 1228 ADI_SENSE_LOG_ERROR("Invalid calibration mode %d specified",
kevin1990 28:4eb837cd71df 1229 eCalibrationMode);
kevin1990 28:4eb837cd71df 1230 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1231 }
kevin1990 28:4eb837cd71df 1232
kevin1990 28:4eb837cd71df 1233 modeReg.Ext_Flash_Store = (bEnableExtFlash ?
ADIJake 33:ea9e60457591 1234 ADISENSE_CORE_MODE_EXT_FLASH_USED :
ADIJake 33:ea9e60457591 1235 ADISENSE_CORE_MODE_EXT_FLASH_NOT_USED);
kevin1990 28:4eb837cd71df 1236
kevin1990 28:4eb837cd71df 1237 WRITE_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
kevin1990 28:4eb837cd71df 1238
kevin1990 28:4eb837cd71df 1239 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1240 }
kevin1990 28:4eb837cd71df 1241
kevin1990 28:4eb837cd71df 1242 ADI_SENSE_RESULT adi_sense_SetCycleControl(
kevin1990 28:4eb837cd71df 1243 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1244 uint32_t nCycleInterval,
kevin1990 28:4eb837cd71df 1245 ADI_SENSE_1000_CYCLE_TYPE eCycleType)
kevin1990 28:4eb837cd71df 1246 {
kevin1990 28:4eb837cd71df 1247 ADI_ADISENSE_CORE_Cycle_Control_t cycleControlReg;
kevin1990 28:4eb837cd71df 1248
kevin1990 28:4eb837cd71df 1249 cycleControlReg.VALUE16 = REG_RESET_VAL(CORE_CYCLE_CONTROL);
kevin1990 28:4eb837cd71df 1250
ADIJake 33:ea9e60457591 1251 if (nCycleInterval < (1 << 12)) {
kevin1990 28:4eb837cd71df 1252 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_MICROSECONDS;
ADIJake 33:ea9e60457591 1253 } else if (nCycleInterval < (1000 * (1 << 12))) {
kevin1990 28:4eb837cd71df 1254 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_MILLISECONDS;
kevin1990 28:4eb837cd71df 1255 nCycleInterval /= 1000;
ADIJake 33:ea9e60457591 1256 } else {
kevin1990 28:4eb837cd71df 1257 cycleControlReg.Cycle_Time_Units = ADISENSE_CORE_CYCLE_CONTROL_SECONDS;
kevin1990 28:4eb837cd71df 1258 nCycleInterval /= 1000000;
kevin1990 28:4eb837cd71df 1259 }
kevin1990 28:4eb837cd71df 1260
kevin1990 28:4eb837cd71df 1261 CHECK_REG_FIELD_VAL(CORE_CYCLE_CONTROL_CYCLE_TIME, nCycleInterval);
kevin1990 28:4eb837cd71df 1262 cycleControlReg.Cycle_Time = nCycleInterval;
kevin1990 28:4eb837cd71df 1263
ADIJake 33:ea9e60457591 1264 if (eCycleType == ADI_SENSE_1000_CYCLE_TYPE_SWITCH) {
kevin1990 28:4eb837cd71df 1265 cycleControlReg.Cycle_Type = ADISENSE_CORE_CYCLE_CONTROL_CYCLE_TYPE_SWITCH;
ADIJake 33:ea9e60457591 1266 } else if (eCycleType == ADI_SENSE_1000_CYCLE_TYPE_FULL) {
kevin1990 28:4eb837cd71df 1267 cycleControlReg.Cycle_Type = ADISENSE_CORE_CYCLE_CONTROL_CYCLE_TYPE_FULL;
ADIJake 33:ea9e60457591 1268 } else {
kevin1990 28:4eb837cd71df 1269 ADI_SENSE_LOG_ERROR("Invalid cycle type %d specified", eCycleType);
kevin1990 28:4eb837cd71df 1270 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1271 }
kevin1990 28:4eb837cd71df 1272
kevin1990 28:4eb837cd71df 1273 WRITE_REG_U16(hDevice, cycleControlReg.VALUE16, CORE_CYCLE_CONTROL);
kevin1990 28:4eb837cd71df 1274
kevin1990 28:4eb837cd71df 1275 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1276 }
kevin1990 28:4eb837cd71df 1277
kevin1990 28:4eb837cd71df 1278 static ADI_SENSE_RESULT adi_sense_SetMultiCycleConfig(
kevin1990 28:4eb837cd71df 1279 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1280 ADI_SENSE_1000_MULTICYCLE_CONFIG *pMultiCycleConfig)
kevin1990 28:4eb837cd71df 1281 {
kevin1990 28:4eb837cd71df 1282 CHECK_REG_FIELD_VAL(CORE_FIFO_NUM_CYCLES_FIFO_NUM_CYCLES,
kevin1990 28:4eb837cd71df 1283 pMultiCycleConfig->cyclesPerBurst);
kevin1990 28:4eb837cd71df 1284
kevin1990 28:4eb837cd71df 1285 WRITE_REG_U8(hDevice, pMultiCycleConfig->cyclesPerBurst,
kevin1990 28:4eb837cd71df 1286 CORE_FIFO_NUM_CYCLES);
kevin1990 28:4eb837cd71df 1287
kevin1990 28:4eb837cd71df 1288 WRITE_REG_U32(hDevice, pMultiCycleConfig->burstInterval,
kevin1990 28:4eb837cd71df 1289 CORE_MULTI_CYCLE_REPEAT_INTERVAL);
kevin1990 28:4eb837cd71df 1290
kevin1990 28:4eb837cd71df 1291 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1292 }
kevin1990 28:4eb837cd71df 1293
kevin1990 28:4eb837cd71df 1294 static ADI_SENSE_RESULT adi_sense_SetExternalReferenceValues(
kevin1990 28:4eb837cd71df 1295 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1296 float32_t externalRef1Value,
kevin1990 28:4eb837cd71df 1297 float32_t externalRef2Value)
kevin1990 28:4eb837cd71df 1298 {
kevin1990 28:4eb837cd71df 1299 WRITE_REG_FLOAT(hDevice, externalRef1Value, CORE_EXTERNAL_REFERENCE1);
kevin1990 28:4eb837cd71df 1300 WRITE_REG_FLOAT(hDevice, externalRef2Value, CORE_EXTERNAL_REFERENCE2);
kevin1990 28:4eb837cd71df 1301
kevin1990 28:4eb837cd71df 1302 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1303 }
kevin1990 28:4eb837cd71df 1304
kevin1990 28:4eb837cd71df 1305 ADI_SENSE_RESULT adi_sense_1000_SetMeasurementConfig(
kevin1990 28:4eb837cd71df 1306 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1307 ADI_SENSE_1000_MEASUREMENT_CONFIG *pMeasConfig)
kevin1990 28:4eb837cd71df 1308 {
kevin1990 28:4eb837cd71df 1309 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 1310
kevin1990 28:4eb837cd71df 1311 eRet = adi_sense_SetMode(hDevice,
kevin1990 28:4eb837cd71df 1312 pMeasConfig->operatingMode,
kevin1990 28:4eb837cd71df 1313 pMeasConfig->dataReadyMode,
kevin1990 28:4eb837cd71df 1314 pMeasConfig->calibrationMode,
kevin1990 28:4eb837cd71df 1315 pMeasConfig->enableExternalFlash);
ADIJake 33:ea9e60457591 1316 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1317 ADI_SENSE_LOG_ERROR("Failed to set operating mode");
kevin1990 28:4eb837cd71df 1318 return eRet;
kevin1990 28:4eb837cd71df 1319 }
kevin1990 28:4eb837cd71df 1320
kevin1990 28:4eb837cd71df 1321 eRet = adi_sense_SetCycleControl(hDevice,
kevin1990 28:4eb837cd71df 1322 pMeasConfig->cycleInterval,
kevin1990 28:4eb837cd71df 1323 pMeasConfig->cycleType);
ADIJake 33:ea9e60457591 1324 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1325 ADI_SENSE_LOG_ERROR("Failed to set cycle control");
kevin1990 28:4eb837cd71df 1326 return eRet;
kevin1990 28:4eb837cd71df 1327 }
kevin1990 28:4eb837cd71df 1328
ADIJake 33:ea9e60457591 1329 if (pMeasConfig->operatingMode == ADI_SENSE_1000_OPERATING_MODE_MULTICYCLE) {
kevin1990 28:4eb837cd71df 1330 eRet = adi_sense_SetMultiCycleConfig(hDevice,
ADIJake 33:ea9e60457591 1331 &pMeasConfig->multiCycleConfig);
ADIJake 33:ea9e60457591 1332 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1333 ADI_SENSE_LOG_ERROR("Failed to set multi-cycle configuration");
kevin1990 28:4eb837cd71df 1334 return eRet;
kevin1990 28:4eb837cd71df 1335 }
kevin1990 28:4eb837cd71df 1336 }
kevin1990 28:4eb837cd71df 1337
kevin1990 28:4eb837cd71df 1338 eRet = adi_sense_SetExternalReferenceValues(hDevice,
ADIJake 33:ea9e60457591 1339 pMeasConfig->externalRef1Value,
ADIJake 33:ea9e60457591 1340 pMeasConfig->externalRef2Value);
ADIJake 33:ea9e60457591 1341 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1342 ADI_SENSE_LOG_ERROR("Failed to set external reference values");
kevin1990 28:4eb837cd71df 1343 return eRet;
kevin1990 28:4eb837cd71df 1344 }
kevin1990 28:4eb837cd71df 1345
kevin1990 28:4eb837cd71df 1346 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1347 }
kevin1990 28:4eb837cd71df 1348
kevin1990 28:4eb837cd71df 1349 ADI_SENSE_RESULT adi_sense_1000_SetDiagnosticsConfig(
kevin1990 28:4eb837cd71df 1350 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1351 ADI_SENSE_1000_DIAGNOSTICS_CONFIG *pDiagnosticsConfig)
kevin1990 28:4eb837cd71df 1352 {
kevin1990 28:4eb837cd71df 1353 ADI_ADISENSE_CORE_Diagnostics_Control_t diagnosticsControlReg;
kevin1990 28:4eb837cd71df 1354
kevin1990 28:4eb837cd71df 1355 diagnosticsControlReg.VALUE16 = REG_RESET_VAL(CORE_DIAGNOSTICS_CONTROL);
kevin1990 28:4eb837cd71df 1356
kevin1990 28:4eb837cd71df 1357 if (pDiagnosticsConfig->disableGlobalDiag)
kevin1990 28:4eb837cd71df 1358 diagnosticsControlReg.Diag_Global_En = 0;
kevin1990 28:4eb837cd71df 1359 else
kevin1990 28:4eb837cd71df 1360 diagnosticsControlReg.Diag_Global_En = 1;
kevin1990 28:4eb837cd71df 1361
kevin1990 28:4eb837cd71df 1362 if (pDiagnosticsConfig->disableMeasurementDiag)
kevin1990 28:4eb837cd71df 1363 diagnosticsControlReg.Diag_Meas_En = 0;
kevin1990 28:4eb837cd71df 1364 else
kevin1990 28:4eb837cd71df 1365 diagnosticsControlReg.Diag_Meas_En = 1;
kevin1990 28:4eb837cd71df 1366
ADIJake 33:ea9e60457591 1367 switch (pDiagnosticsConfig->osdFrequency) {
ADIJake 33:ea9e60457591 1368 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_DISABLED:
ADIJake 33:ea9e60457591 1369 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_OFF;
ADIJake 33:ea9e60457591 1370 break;
ADIJake 33:ea9e60457591 1371 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_CYCLE:
ADIJake 33:ea9e60457591 1372 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_1_CYCLE;
ADIJake 33:ea9e60457591 1373 break;
ADIJake 33:ea9e60457591 1374 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_100_CYCLES:
ADIJake 33:ea9e60457591 1375 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_100_CYCLES;
ADIJake 33:ea9e60457591 1376 break;
ADIJake 33:ea9e60457591 1377 case ADI_SENSE_1000_OPEN_SENSOR_DIAGNOSTICS_PER_1000_CYCLES:
ADIJake 33:ea9e60457591 1378 diagnosticsControlReg.Diag_OSD_Freq = ADISENSE_CORE_DIAGNOSTICS_CONTROL_OCD_PER_1000_CYCLES;
ADIJake 33:ea9e60457591 1379 break;
ADIJake 33:ea9e60457591 1380 default:
ADIJake 33:ea9e60457591 1381 ADI_SENSE_LOG_ERROR("Invalid open-sensor diagnostic frequency %d specified",
ADIJake 33:ea9e60457591 1382 pDiagnosticsConfig->osdFrequency);
ADIJake 33:ea9e60457591 1383 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1384 }
kevin1990 28:4eb837cd71df 1385
kevin1990 28:4eb837cd71df 1386 WRITE_REG_U16(hDevice, diagnosticsControlReg.VALUE16, CORE_DIAGNOSTICS_CONTROL);
kevin1990 28:4eb837cd71df 1387
kevin1990 28:4eb837cd71df 1388 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1389 }
kevin1990 28:4eb837cd71df 1390
kevin1990 28:4eb837cd71df 1391 ADI_SENSE_RESULT adi_sense_1000_SetFftConfig(
kevin1990 28:4eb837cd71df 1392 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1393 ADI_SENSE_1000_FFT_CONFIG *pFftConfig,
kevin1990 28:4eb837cd71df 1394 ADI_SENSE_1000_CHANNEL_CONFIG *pChannels)
kevin1990 28:4eb837cd71df 1395 {
kevin1990 28:4eb837cd71df 1396 ADI_ADISENSE_CORE_FFT_Config_t fftConfigReg;
kevin1990 28:4eb837cd71df 1397 ADI_ADISENSE_CORE_Mode_t modeReg;
kevin1990 28:4eb837cd71df 1398 uint32_t numFftChannels = 0;
kevin1990 28:4eb837cd71df 1399
kevin1990 28:4eb837cd71df 1400 fftConfigReg.VALUE32 = REG_RESET_VAL(CORE_FFT_CONFIG);
kevin1990 28:4eb837cd71df 1401
kevin1990 28:4eb837cd71df 1402 for (ADI_SENSE_1000_CHANNEL_ID id = ADI_SENSE_1000_CHANNEL_ID_CJC_0;
ADIJake 33:ea9e60457591 1403 id < ADI_SENSE_1000_MAX_CHANNELS;
ADIJake 33:ea9e60457591 1404 id++) {
ADIJake 33:ea9e60457591 1405 if (pChannels[id].enableFFT) {
ADIJake 33:ea9e60457591 1406 if (numFftChannels >= 4) { /* TODO - temporary limit */
kevin1990 28:4eb837cd71df 1407 ADI_SENSE_LOG_ERROR("Maximum limit of 4 FFT channels exceeded");
kevin1990 28:4eb837cd71df 1408 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1409 }
kevin1990 28:4eb837cd71df 1410
kevin1990 28:4eb837cd71df 1411 numFftChannels++;
kevin1990 28:4eb837cd71df 1412 }
kevin1990 28:4eb837cd71df 1413 }
kevin1990 28:4eb837cd71df 1414
ADIJake 33:ea9e60457591 1415 if (numFftChannels > 0) {
kevin1990 28:4eb837cd71df 1416 fftConfigReg.FFT_Num_Channels = numFftChannels - 1;
kevin1990 28:4eb837cd71df 1417
ADIJake 33:ea9e60457591 1418 switch (pFftConfig->size) {
ADIJake 33:ea9e60457591 1419 case ADI_SENSE_1000_FFT_SIZE_256:
ADIJake 33:ea9e60457591 1420 fftConfigReg.FFT_Num_Bins = ADISENSE_CORE_FFT_CONFIG_FFT_BINS_256;
ADIJake 33:ea9e60457591 1421 break;
ADIJake 33:ea9e60457591 1422 case ADI_SENSE_1000_FFT_SIZE_512:
ADIJake 33:ea9e60457591 1423 fftConfigReg.FFT_Num_Bins = ADISENSE_CORE_FFT_CONFIG_FFT_BINS_512;
ADIJake 33:ea9e60457591 1424 break;
ADIJake 33:ea9e60457591 1425 case ADI_SENSE_1000_FFT_SIZE_1024:
ADIJake 33:ea9e60457591 1426 fftConfigReg.FFT_Num_Bins = ADISENSE_CORE_FFT_CONFIG_FFT_BINS_1024;
ADIJake 33:ea9e60457591 1427 break;
ADIJake 33:ea9e60457591 1428 case ADI_SENSE_1000_FFT_SIZE_2048:
ADIJake 33:ea9e60457591 1429 fftConfigReg.FFT_Num_Bins = ADISENSE_CORE_FFT_CONFIG_FFT_BINS_2048;
ADIJake 33:ea9e60457591 1430 break;
ADIJake 33:ea9e60457591 1431 default:
ADIJake 33:ea9e60457591 1432 ADI_SENSE_LOG_ERROR("Invalid FFT size option %d specified",
ADIJake 33:ea9e60457591 1433 pFftConfig->size);
ADIJake 33:ea9e60457591 1434 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1435 }
kevin1990 28:4eb837cd71df 1436
ADIJake 33:ea9e60457591 1437 switch (pFftConfig->window) {
ADIJake 33:ea9e60457591 1438 case ADI_SENSE_1000_FFT_WINDOW_NONE:
ADIJake 33:ea9e60457591 1439 fftConfigReg.FFT_Window = ADISENSE_CORE_FFT_CONFIG_FFT_WINDOW_NONE;
ADIJake 33:ea9e60457591 1440 break;
ADIJake 33:ea9e60457591 1441 case ADI_SENSE_1000_FFT_WINDOW_HANN:
ADIJake 33:ea9e60457591 1442 fftConfigReg.FFT_Window = ADISENSE_CORE_FFT_CONFIG_FFT_WINDOW_HANN;
ADIJake 33:ea9e60457591 1443 break;
ADIJake 33:ea9e60457591 1444 case ADI_SENSE_1000_FFT_WINDOW_BLACKMAN_HARRIS:
ADIJake 33:ea9e60457591 1445 fftConfigReg.FFT_Window = ADISENSE_CORE_FFT_CONFIG_FFT_WINDOW_BLACKMANN_HARRIS;
ADIJake 33:ea9e60457591 1446 break;
ADIJake 33:ea9e60457591 1447 default:
ADIJake 33:ea9e60457591 1448 ADI_SENSE_LOG_ERROR("Invalid FFT window option %d specified",
ADIJake 33:ea9e60457591 1449 pFftConfig->window);
ADIJake 33:ea9e60457591 1450 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1451 }
kevin1990 28:4eb837cd71df 1452
ADIJake 33:ea9e60457591 1453 switch (pFftConfig->output) {
ADIJake 33:ea9e60457591 1454 case ADI_SENSE_1000_FFT_OUTPUT_FULL:
ADIJake 33:ea9e60457591 1455 fftConfigReg.FFT_Output = ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_FULL;
ADIJake 33:ea9e60457591 1456 break;
ADIJake 33:ea9e60457591 1457 case ADI_SENSE_1000_FFT_OUTPUT_MAX16:
ADIJake 33:ea9e60457591 1458 fftConfigReg.FFT_Output = ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_MAX16;
ADIJake 33:ea9e60457591 1459 break;
ADIJake 33:ea9e60457591 1460 case ADI_SENSE_1000_FFT_OUTPUT_FULL_WITH_RAW:
ADIJake 33:ea9e60457591 1461 fftConfigReg.FFT_Output = ADISENSE_CORE_FFT_CONFIG_FFT_OUTPUT_FULL_WITH_RAW;
ADIJake 33:ea9e60457591 1462 break;
ADIJake 33:ea9e60457591 1463 default:
ADIJake 33:ea9e60457591 1464 ADI_SENSE_LOG_ERROR("Invalid FFT output format option %d specified",
ADIJake 33:ea9e60457591 1465 pFftConfig->output);
ADIJake 33:ea9e60457591 1466 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1467 }
kevin1990 28:4eb837cd71df 1468 }
kevin1990 28:4eb837cd71df 1469 WRITE_REG_U32(hDevice, fftConfigReg.VALUE32, CORE_FFT_CONFIG);
kevin1990 28:4eb837cd71df 1470
ADIJake 33:ea9e60457591 1471 if (numFftChannels > 0) {
kevin1990 28:4eb837cd71df 1472 READ_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
kevin1990 28:4eb837cd71df 1473
ADIJake 33:ea9e60457591 1474 if (pFftConfig->mode == ADI_SENSE_1000_FFT_MODE_SINGLE) {
kevin1990 28:4eb837cd71df 1475 modeReg.FFT_Mode = ADISENSE_CORE_MODE_FFT_MODE_SINGLE;
ADIJake 33:ea9e60457591 1476 } else if (pFftConfig->mode == ADI_SENSE_1000_FFT_MODE_CONTINUOUS) {
kevin1990 28:4eb837cd71df 1477 modeReg.FFT_Mode = ADISENSE_CORE_MODE_FFT_MODE_CONTINUOUS;
ADIJake 33:ea9e60457591 1478 } else {
kevin1990 28:4eb837cd71df 1479 ADI_SENSE_LOG_ERROR("Invalid FFT mode %d specified",
kevin1990 28:4eb837cd71df 1480 pFftConfig->mode);
kevin1990 28:4eb837cd71df 1481 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1482 }
kevin1990 28:4eb837cd71df 1483
kevin1990 28:4eb837cd71df 1484 WRITE_REG_U8(hDevice, modeReg.VALUE8, CORE_MODE);
kevin1990 28:4eb837cd71df 1485 }
kevin1990 28:4eb837cd71df 1486
kevin1990 28:4eb837cd71df 1487 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1488 }
kevin1990 28:4eb837cd71df 1489
kevin1990 28:4eb837cd71df 1490 ADI_SENSE_RESULT adi_sense_1000_SetChannelCount(
kevin1990 28:4eb837cd71df 1491 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1492 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1493 uint32_t nMeasurementsPerCycle)
kevin1990 28:4eb837cd71df 1494 {
kevin1990 28:4eb837cd71df 1495 ADI_ADISENSE_CORE_Channel_Count_t channelCountReg;
kevin1990 28:4eb837cd71df 1496
kevin1990 28:4eb837cd71df 1497 channelCountReg.VALUE8 = REG_RESET_VAL(CORE_CHANNEL_COUNTn);
kevin1990 28:4eb837cd71df 1498
ADIJake 33:ea9e60457591 1499 if (nMeasurementsPerCycle > 0) {
kevin1990 28:4eb837cd71df 1500 nMeasurementsPerCycle -= 1;
kevin1990 28:4eb837cd71df 1501
kevin1990 28:4eb837cd71df 1502 CHECK_REG_FIELD_VAL(CORE_CHANNEL_COUNT_CHANNEL_COUNT,
kevin1990 28:4eb837cd71df 1503 nMeasurementsPerCycle);
kevin1990 28:4eb837cd71df 1504
kevin1990 28:4eb837cd71df 1505 channelCountReg.Channel_Enable = 1;
kevin1990 28:4eb837cd71df 1506 channelCountReg.Channel_Count = nMeasurementsPerCycle;
ADIJake 33:ea9e60457591 1507 } else {
kevin1990 28:4eb837cd71df 1508 channelCountReg.Channel_Enable = 0;
kevin1990 28:4eb837cd71df 1509 }
kevin1990 28:4eb837cd71df 1510
kevin1990 28:4eb837cd71df 1511 WRITE_REG_U8(hDevice, channelCountReg.VALUE8, CORE_CHANNEL_COUNTn(eChannelId));
kevin1990 28:4eb837cd71df 1512
kevin1990 28:4eb837cd71df 1513 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1514 }
kevin1990 28:4eb837cd71df 1515
kevin1990 28:4eb837cd71df 1516 ADI_SENSE_RESULT adi_sense_1000_SetChannelOptions(
kevin1990 28:4eb837cd71df 1517 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1518 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1519 ADI_SENSE_1000_CHANNEL_PRIORITY ePriority,
kevin1990 28:4eb837cd71df 1520 bool bEnableFft)
kevin1990 28:4eb837cd71df 1521 {
kevin1990 28:4eb837cd71df 1522 ADI_ADISENSE_CORE_Channel_Options_t channelOptionsReg;
kevin1990 28:4eb837cd71df 1523
kevin1990 28:4eb837cd71df 1524 channelOptionsReg.VALUE8 = REG_RESET_VAL(CORE_CHANNEL_OPTIONSn);
kevin1990 28:4eb837cd71df 1525
kevin1990 28:4eb837cd71df 1526 CHECK_REG_FIELD_VAL(CORE_CHANNEL_OPTIONS_CHANNEL_PRIORITY, ePriority);
kevin1990 28:4eb837cd71df 1527 channelOptionsReg.Channel_Priority = ePriority;
kevin1990 28:4eb837cd71df 1528 channelOptionsReg.FFT_Enable_Ch = bEnableFft ? 1 : 0;
kevin1990 28:4eb837cd71df 1529
kevin1990 28:4eb837cd71df 1530 WRITE_REG_U8(hDevice, channelOptionsReg.VALUE8, CORE_CHANNEL_OPTIONSn(eChannelId));
kevin1990 28:4eb837cd71df 1531
kevin1990 28:4eb837cd71df 1532 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1533 }
kevin1990 28:4eb837cd71df 1534
kevin1990 28:4eb837cd71df 1535 ADI_SENSE_RESULT adi_sense_1000_SetChannelSkipCount(
kevin1990 28:4eb837cd71df 1536 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1537 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1538 uint32_t nCycleSkipCount)
kevin1990 28:4eb837cd71df 1539 {
kevin1990 28:4eb837cd71df 1540 ADI_ADISENSE_CORE_Channel_Skip_t channelSkipReg;
kevin1990 28:4eb837cd71df 1541
kevin1990 28:4eb837cd71df 1542 channelSkipReg.VALUE16 = REG_RESET_VAL(CORE_CHANNEL_SKIPn);
kevin1990 28:4eb837cd71df 1543
kevin1990 28:4eb837cd71df 1544 CHECK_REG_FIELD_VAL(CORE_CHANNEL_SKIP_CHANNEL_SKIP, nCycleSkipCount);
kevin1990 28:4eb837cd71df 1545
kevin1990 28:4eb837cd71df 1546 channelSkipReg.Channel_Skip = nCycleSkipCount;
kevin1990 28:4eb837cd71df 1547
kevin1990 28:4eb837cd71df 1548 WRITE_REG_U16(hDevice, channelSkipReg.VALUE16, CORE_CHANNEL_SKIPn(eChannelId));
kevin1990 28:4eb837cd71df 1549
kevin1990 28:4eb837cd71df 1550 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1551 }
kevin1990 28:4eb837cd71df 1552
kevin1990 28:4eb837cd71df 1553 static ADI_SENSE_RESULT adi_sense_SetChannelAdcSensorType(
kevin1990 28:4eb837cd71df 1554 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1555 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1556 ADI_SENSE_1000_ADC_SENSOR_TYPE sensorType)
kevin1990 28:4eb837cd71df 1557 {
kevin1990 28:4eb837cd71df 1558 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
kevin1990 28:4eb837cd71df 1559
kevin1990 28:4eb837cd71df 1560 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
kevin1990 28:4eb837cd71df 1561
kevin1990 28:4eb837cd71df 1562 /* Ensure that the sensor type is valid for this channel */
ADIJake 33:ea9e60457591 1563 switch(sensorType) {
ADIJake 33:ea9e60457591 1564 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_J_DEF_L1:
ADIJake 33:ea9e60457591 1565 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_K_DEF_L1:
ADIJake 33:ea9e60457591 1566 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_T_DEF_L1:
ADIJake 33:ea9e60457591 1567 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_1_DEF_L2:
ADIJake 33:ea9e60457591 1568 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_2_DEF_L2:
ADIJake 33:ea9e60457591 1569 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_3_DEF_L2:
ADIJake 33:ea9e60457591 1570 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_4_DEF_L2:
ADIJake 33:ea9e60457591 1571 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_J_ADV_L1:
ADIJake 33:ea9e60457591 1572 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_K_ADV_L1:
ADIJake 33:ea9e60457591 1573 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_T_ADV_L1:
ADIJake 33:ea9e60457591 1574 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_1_ADV_L2:
ADIJake 33:ea9e60457591 1575 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_2_ADV_L2:
ADIJake 33:ea9e60457591 1576 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_3_ADV_L2:
ADIJake 33:ea9e60457591 1577 case ADI_SENSE_1000_ADC_SENSOR_THERMOCOUPLE_4_ADV_L2:
ADIJake 33:ea9e60457591 1578 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT100_DEF_L1:
ADIJake 33:ea9e60457591 1579 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT1000_DEF_L1:
ADIJake 33:ea9e60457591 1580 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_1_DEF_L2:
ADIJake 33:ea9e60457591 1581 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_2_DEF_L2:
ADIJake 33:ea9e60457591 1582 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_3_DEF_L2:
ADIJake 33:ea9e60457591 1583 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_4_DEF_L2:
ADIJake 33:ea9e60457591 1584 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT100_ADV_L1:
ADIJake 33:ea9e60457591 1585 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_PT1000_ADV_L1:
ADIJake 33:ea9e60457591 1586 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_1_ADV_L2:
ADIJake 33:ea9e60457591 1587 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_2_ADV_L2:
ADIJake 33:ea9e60457591 1588 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_3_ADV_L2:
ADIJake 33:ea9e60457591 1589 case ADI_SENSE_1000_ADC_SENSOR_RTD_3WIRE_4_ADV_L2:
ADIJake 33:ea9e60457591 1590 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT100_DEF_L1:
ADIJake 33:ea9e60457591 1591 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT1000_DEF_L1:
ADIJake 33:ea9e60457591 1592 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_1_DEF_L2:
ADIJake 33:ea9e60457591 1593 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_2_DEF_L2:
ADIJake 33:ea9e60457591 1594 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_3_DEF_L2:
ADIJake 33:ea9e60457591 1595 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_4_DEF_L2:
ADIJake 33:ea9e60457591 1596 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT100_ADV_L1:
ADIJake 33:ea9e60457591 1597 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_PT1000_ADV_L1:
ADIJake 33:ea9e60457591 1598 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_1_ADV_L2:
ADIJake 33:ea9e60457591 1599 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_2_ADV_L2:
ADIJake 33:ea9e60457591 1600 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_3_ADV_L2:
ADIJake 33:ea9e60457591 1601 case ADI_SENSE_1000_ADC_SENSOR_RTD_4WIRE_4_ADV_L2:
ADIJake 33:ea9e60457591 1602 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_1_DEF_L2:
ADIJake 33:ea9e60457591 1603 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_2_DEF_L2:
ADIJake 33:ea9e60457591 1604 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_3_DEF_L2:
ADIJake 33:ea9e60457591 1605 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_4_DEF_L2:
ADIJake 33:ea9e60457591 1606 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_1_ADV_L2:
ADIJake 33:ea9e60457591 1607 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_2_ADV_L2:
ADIJake 33:ea9e60457591 1608 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_3_ADV_L2:
ADIJake 33:ea9e60457591 1609 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_4WIRE_4_ADV_L2:
ADIJake 33:ea9e60457591 1610 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_1_DEF_L2:
ADIJake 33:ea9e60457591 1611 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_2_DEF_L2:
ADIJake 33:ea9e60457591 1612 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_3_DEF_L2:
ADIJake 33:ea9e60457591 1613 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_4_DEF_L2:
ADIJake 33:ea9e60457591 1614 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_1_ADV_L2:
ADIJake 33:ea9e60457591 1615 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_2_ADV_L2:
ADIJake 33:ea9e60457591 1616 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_3_ADV_L2:
ADIJake 33:ea9e60457591 1617 case ADI_SENSE_1000_ADC_SENSOR_BRIDGE_6WIRE_4_ADV_L2:
ADIJake 33:ea9e60457591 1618 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_A_DEF_L1:
ADIJake 33:ea9e60457591 1619 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_B_DEF_L1:
ADIJake 33:ea9e60457591 1620 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_1_DEF_L2:
ADIJake 33:ea9e60457591 1621 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_2_DEF_L2:
ADIJake 33:ea9e60457591 1622 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_A_ADV_L1:
ADIJake 33:ea9e60457591 1623 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_B_ADV_L1:
ADIJake 33:ea9e60457591 1624 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_1_ADV_L2:
ADIJake 33:ea9e60457591 1625 case ADI_SENSE_1000_ADC_SENSOR_MICROPHONE_2_ADV_L2:
ADIJake 33:ea9e60457591 1626 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(eChannelId)) {
ADIJake 33:ea9e60457591 1627 ADI_SENSE_LOG_ERROR(
ADIJake 33:ea9e60457591 1628 "Invalid ADC sensor type %d specified for channel %d",
ADIJake 33:ea9e60457591 1629 sensorType, eChannelId);
ADIJake 33:ea9e60457591 1630 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 1631 }
ADIJake 33:ea9e60457591 1632 break;
ADIJake 33:ea9e60457591 1633 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT100_DEF_L1:
ADIJake 33:ea9e60457591 1634 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT1000_DEF_L1:
ADIJake 33:ea9e60457591 1635 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_1_DEF_L2:
ADIJake 33:ea9e60457591 1636 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_2_DEF_L2:
ADIJake 33:ea9e60457591 1637 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_3_DEF_L2:
ADIJake 33:ea9e60457591 1638 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_4_DEF_L2:
ADIJake 33:ea9e60457591 1639 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT100_ADV_L1:
ADIJake 33:ea9e60457591 1640 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_PT1000_ADV_L1:
ADIJake 33:ea9e60457591 1641 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_1_ADV_L2:
ADIJake 33:ea9e60457591 1642 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_2_ADV_L2:
ADIJake 33:ea9e60457591 1643 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_3_ADV_L2:
ADIJake 33:ea9e60457591 1644 case ADI_SENSE_1000_ADC_SENSOR_RTD_2WIRE_4_ADV_L2:
ADIJake 33:ea9e60457591 1645 case ADI_SENSE_1000_ADC_SENSOR_DIODE_2C_TYPEA_DEF_L1:
ADIJake 33:ea9e60457591 1646 case ADI_SENSE_1000_ADC_SENSOR_DIODE_3C_TYPEA_DEF_L1:
ADIJake 33:ea9e60457591 1647 case ADI_SENSE_1000_ADC_SENSOR_DIODE_2C_1_DEF_L2:
ADIJake 33:ea9e60457591 1648 case ADI_SENSE_1000_ADC_SENSOR_DIODE_3C_1_DEF_L2:
ADIJake 33:ea9e60457591 1649 case ADI_SENSE_1000_ADC_SENSOR_DIODE_2C_TYPEA_ADV_L1:
ADIJake 33:ea9e60457591 1650 case ADI_SENSE_1000_ADC_SENSOR_DIODE_3C_TYPEA_ADV_L1:
ADIJake 33:ea9e60457591 1651 case ADI_SENSE_1000_ADC_SENSOR_DIODE_2C_1_ADV_L2:
ADIJake 33:ea9e60457591 1652 case ADI_SENSE_1000_ADC_SENSOR_DIODE_3C_1_ADV_L2:
ADIJake 33:ea9e60457591 1653 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_A_10K_DEF_L1:
ADIJake 33:ea9e60457591 1654 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_B_10K_DEF_L1:
ADIJake 33:ea9e60457591 1655 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_1_DEF_L2:
ADIJake 33:ea9e60457591 1656 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_2_DEF_L2:
ADIJake 33:ea9e60457591 1657 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_3_DEF_L2:
ADIJake 33:ea9e60457591 1658 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_4_DEF_L2:
ADIJake 33:ea9e60457591 1659 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_A_10K_ADV_L1:
ADIJake 33:ea9e60457591 1660 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_B_10K_ADV_L1:
ADIJake 33:ea9e60457591 1661 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_1_ADV_L2:
ADIJake 33:ea9e60457591 1662 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_2_ADV_L2:
ADIJake 33:ea9e60457591 1663 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_3_ADV_L2:
ADIJake 33:ea9e60457591 1664 case ADI_SENSE_1000_ADC_SENSOR_THERMISTOR_4_ADV_L2:
ADIJake 33:ea9e60457591 1665 if (! (ADI_SENSE_1000_CHANNEL_IS_ADC_SENSOR(eChannelId) ||
ADIJake 33:ea9e60457591 1666 ADI_SENSE_1000_CHANNEL_IS_ADC_CJC(eChannelId))) {
ADIJake 33:ea9e60457591 1667 ADI_SENSE_LOG_ERROR(
ADIJake 33:ea9e60457591 1668 "Invalid ADC sensor type %d specified for channel %d",
ADIJake 33:ea9e60457591 1669 sensorType, eChannelId);
ADIJake 33:ea9e60457591 1670 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 1671 }
ADIJake 33:ea9e60457591 1672 break;
ADIJake 33:ea9e60457591 1673 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE:
ADIJake 33:ea9e60457591 1674 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_A_DEF_L1:
ADIJake 33:ea9e60457591 1675 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_B_DEF_L1:
ADIJake 33:ea9e60457591 1676 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_1_DEF_L2:
ADIJake 33:ea9e60457591 1677 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_2_DEF_L2:
ADIJake 33:ea9e60457591 1678 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_A_ADV_L1:
ADIJake 33:ea9e60457591 1679 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_B_ADV_L1:
ADIJake 33:ea9e60457591 1680 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_1_ADV_L2:
ADIJake 33:ea9e60457591 1681 case ADI_SENSE_1000_ADC_SENSOR_VOLTAGE_PRESSURE_2_ADV_L2:
ADIJake 33:ea9e60457591 1682 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_VOLTAGE(eChannelId)) {
ADIJake 33:ea9e60457591 1683 ADI_SENSE_LOG_ERROR(
ADIJake 33:ea9e60457591 1684 "Invalid ADC sensor type %d specified for channel %d",
ADIJake 33:ea9e60457591 1685 sensorType, eChannelId);
ADIJake 33:ea9e60457591 1686 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 1687 }
ADIJake 33:ea9e60457591 1688 break;
ADIJake 33:ea9e60457591 1689 case ADI_SENSE_1000_ADC_SENSOR_CURRENT:
ADIJake 33:ea9e60457591 1690 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_A_DEF_L1:
ADIJake 33:ea9e60457591 1691 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_1_DEF_L2:
ADIJake 33:ea9e60457591 1692 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_2_DEF_L2:
ADIJake 33:ea9e60457591 1693 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_A_ADV_L1:
ADIJake 33:ea9e60457591 1694 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_1_ADV_L2:
ADIJake 33:ea9e60457591 1695 case ADI_SENSE_1000_ADC_SENSOR_CURRENT_PRESSURE_2_ADV_L2:
ADIJake 33:ea9e60457591 1696 if (! ADI_SENSE_1000_CHANNEL_IS_ADC_CURRENT(eChannelId)) {
ADIJake 33:ea9e60457591 1697 ADI_SENSE_LOG_ERROR(
ADIJake 33:ea9e60457591 1698 "Invalid ADC sensor type %d specified for channel %d",
ADIJake 33:ea9e60457591 1699 sensorType, eChannelId);
ADIJake 33:ea9e60457591 1700 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 1701 }
ADIJake 33:ea9e60457591 1702 break;
ADIJake 33:ea9e60457591 1703 default:
ADIJake 33:ea9e60457591 1704 ADI_SENSE_LOG_ERROR("Invalid/unsupported ADC sensor type %d specified",
ADIJake 33:ea9e60457591 1705 sensorType);
kevin1990 28:4eb837cd71df 1706 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1707 }
kevin1990 28:4eb837cd71df 1708
kevin1990 28:4eb837cd71df 1709 sensorTypeReg.Sensor_Type = sensorType;
kevin1990 28:4eb837cd71df 1710
kevin1990 28:4eb837cd71df 1711 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
kevin1990 28:4eb837cd71df 1712
kevin1990 28:4eb837cd71df 1713 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1714 }
kevin1990 28:4eb837cd71df 1715
kevin1990 28:4eb837cd71df 1716 static ADI_SENSE_RESULT adi_sense_SetChannelAdcSensorDetails(
kevin1990 28:4eb837cd71df 1717 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1718 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1719 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 1720 /*
kevin1990 28:4eb837cd71df 1721 * TODO - it would be nice if the general- vs. ADC-specific sensor details could be split into separate registers
kevin1990 28:4eb837cd71df 1722 * General details:
kevin1990 28:4eb837cd71df 1723 * - Measurement_Units
kevin1990 28:4eb837cd71df 1724 * - Compensation_Channel
kevin1990 28:4eb837cd71df 1725 * - CJC_Publish (if "CJC" was removed from the name)
kevin1990 28:4eb837cd71df 1726 * ADC-specific details:
kevin1990 28:4eb837cd71df 1727 * - PGA_Gain
kevin1990 28:4eb837cd71df 1728 * - Reference_Select
kevin1990 28:4eb837cd71df 1729 * - Reference_Buffer_Disable
kevin1990 28:4eb837cd71df 1730 * - Vbias
kevin1990 28:4eb837cd71df 1731 */
kevin1990 28:4eb837cd71df 1732 {
kevin1990 28:4eb837cd71df 1733 ADI_SENSE_1000_ADC_CHANNEL_CONFIG *pAdcChannelConfig = &pChannelConfig->adcChannelConfig;
kevin1990 28:4eb837cd71df 1734 ADI_SENSE_1000_ADC_REFERENCE_CONFIG *pRefConfig = &pAdcChannelConfig->reference;
kevin1990 28:4eb837cd71df 1735 ADI_ADISENSE_CORE_Sensor_Details_t sensorDetailsReg;
kevin1990 28:4eb837cd71df 1736
kevin1990 28:4eb837cd71df 1737 sensorDetailsReg.VALUE32 = REG_RESET_VAL(CORE_SENSOR_DETAILSn);
kevin1990 28:4eb837cd71df 1738
ADIJake 33:ea9e60457591 1739 switch(pChannelConfig->measurementUnit) {
ADIJake 33:ea9e60457591 1740 case ADI_SENSE_1000_MEASUREMENT_UNIT_FAHRENHEIT:
ADIJake 33:ea9e60457591 1741 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_DEGF;
ADIJake 33:ea9e60457591 1742 break;
ADIJake 33:ea9e60457591 1743 case ADI_SENSE_1000_MEASUREMENT_UNIT_CELSIUS:
ADIJake 33:ea9e60457591 1744 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_DEGC;
ADIJake 33:ea9e60457591 1745 break;
ADIJake 33:ea9e60457591 1746 case ADI_SENSE_1000_MEASUREMENT_UNIT_UNSPECIFIED:
ADIJake 33:ea9e60457591 1747 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_UNSPECIFIED;
ADIJake 33:ea9e60457591 1748 break;
ADIJake 33:ea9e60457591 1749 default:
ADIJake 33:ea9e60457591 1750 ADI_SENSE_LOG_ERROR("Invalid measurement unit %d specified",
ADIJake 33:ea9e60457591 1751 pChannelConfig->measurementUnit);
ADIJake 33:ea9e60457591 1752 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1753 }
kevin1990 28:4eb837cd71df 1754
ADIJake 33:ea9e60457591 1755 if (pChannelConfig->compensationChannel == ADI_SENSE_1000_CHANNEL_ID_NONE) {
kevin1990 28:4eb837cd71df 1756 sensorDetailsReg.Compensation_Disable = 1;
kevin1990 28:4eb837cd71df 1757 sensorDetailsReg.Compensation_Channel = 0;
ADIJake 33:ea9e60457591 1758 } else {
kevin1990 28:4eb837cd71df 1759 sensorDetailsReg.Compensation_Disable = 0;
kevin1990 28:4eb837cd71df 1760 sensorDetailsReg.Compensation_Channel = pChannelConfig->compensationChannel;
kevin1990 28:4eb837cd71df 1761 }
kevin1990 28:4eb837cd71df 1762
ADIJake 33:ea9e60457591 1763 switch(pRefConfig->type) {
ADIJake 33:ea9e60457591 1764 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_INTERNAL_1:
ADIJake 33:ea9e60457591 1765 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_RINT1;
ADIJake 33:ea9e60457591 1766 break;
ADIJake 33:ea9e60457591 1767 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_INTERNAL_2:
ADIJake 33:ea9e60457591 1768 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_RINT2;
ADIJake 33:ea9e60457591 1769 break;
ADIJake 33:ea9e60457591 1770 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_INTERNAL:
ADIJake 33:ea9e60457591 1771 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_INT;
ADIJake 33:ea9e60457591 1772 break;
ADIJake 33:ea9e60457591 1773 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_AVDD:
ADIJake 33:ea9e60457591 1774 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_AVDD;
ADIJake 33:ea9e60457591 1775 break;
ADIJake 33:ea9e60457591 1776 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_EXTERNAL_1:
ADIJake 33:ea9e60457591 1777 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_REXT1;
ADIJake 33:ea9e60457591 1778 break;
ADIJake 33:ea9e60457591 1779 case ADI_SENSE_1000_ADC_REFERENCE_RESISTOR_EXTERNAL_2:
ADIJake 33:ea9e60457591 1780 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_REXT2;
ADIJake 33:ea9e60457591 1781 break;
ADIJake 33:ea9e60457591 1782 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_EXTERNAL_1:
ADIJake 33:ea9e60457591 1783 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_VEXT1;
ADIJake 33:ea9e60457591 1784 break;
ADIJake 33:ea9e60457591 1785 case ADI_SENSE_1000_ADC_REFERENCE_VOLTAGE_EXTERNAL_2:
ADIJake 33:ea9e60457591 1786 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_VEXT2;
ADIJake 33:ea9e60457591 1787 break;
ADIJake 33:ea9e60457591 1788 case ADI_SENSE_1000_ADC_REFERENCE_BRIDGE_EXCITATION:
ADIJake 33:ea9e60457591 1789 sensorDetailsReg.Reference_Select = ADISENSE_CORE_SENSOR_DETAILS_REF_EXC;
ADIJake 33:ea9e60457591 1790 break;
ADIJake 33:ea9e60457591 1791 default:
ADIJake 33:ea9e60457591 1792 ADI_SENSE_LOG_ERROR("Invalid ADC reference type %d specified",
ADIJake 33:ea9e60457591 1793 pRefConfig->type);
ADIJake 33:ea9e60457591 1794 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1795 }
kevin1990 28:4eb837cd71df 1796
ADIJake 33:ea9e60457591 1797 switch(pAdcChannelConfig->gain) {
ADIJake 33:ea9e60457591 1798 case ADI_SENSE_1000_ADC_GAIN_1X:
ADIJake 33:ea9e60457591 1799 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_1;
ADIJake 33:ea9e60457591 1800 break;
ADIJake 33:ea9e60457591 1801 case ADI_SENSE_1000_ADC_GAIN_2X:
ADIJake 33:ea9e60457591 1802 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_2;
ADIJake 33:ea9e60457591 1803 break;
ADIJake 33:ea9e60457591 1804 case ADI_SENSE_1000_ADC_GAIN_4X:
ADIJake 33:ea9e60457591 1805 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_4;
ADIJake 33:ea9e60457591 1806 break;
ADIJake 33:ea9e60457591 1807 case ADI_SENSE_1000_ADC_GAIN_8X:
ADIJake 33:ea9e60457591 1808 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_8;
ADIJake 33:ea9e60457591 1809 break;
ADIJake 33:ea9e60457591 1810 case ADI_SENSE_1000_ADC_GAIN_16X:
ADIJake 33:ea9e60457591 1811 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_16;
ADIJake 33:ea9e60457591 1812 break;
ADIJake 33:ea9e60457591 1813 case ADI_SENSE_1000_ADC_GAIN_32X:
ADIJake 33:ea9e60457591 1814 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_32;
ADIJake 33:ea9e60457591 1815 break;
ADIJake 33:ea9e60457591 1816 case ADI_SENSE_1000_ADC_GAIN_64X:
ADIJake 33:ea9e60457591 1817 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_64;
ADIJake 33:ea9e60457591 1818 break;
ADIJake 33:ea9e60457591 1819 case ADI_SENSE_1000_ADC_GAIN_128X:
ADIJake 33:ea9e60457591 1820 sensorDetailsReg.PGA_Gain = ADISENSE_CORE_SENSOR_DETAILS_PGA_GAIN_128;
ADIJake 33:ea9e60457591 1821 break;
ADIJake 33:ea9e60457591 1822 default:
ADIJake 33:ea9e60457591 1823 ADI_SENSE_LOG_ERROR("Invalid ADC gain %d specified",
ADIJake 33:ea9e60457591 1824 pAdcChannelConfig->gain);
ADIJake 33:ea9e60457591 1825 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1826 }
kevin1990 28:4eb837cd71df 1827
kevin1990 28:4eb837cd71df 1828 if (pAdcChannelConfig->enableVbias)
kevin1990 28:4eb837cd71df 1829 sensorDetailsReg.Vbias = 1;
kevin1990 28:4eb837cd71df 1830 else
kevin1990 28:4eb837cd71df 1831 sensorDetailsReg.Vbias = 0;
kevin1990 28:4eb837cd71df 1832
kevin1990 28:4eb837cd71df 1833 if (pAdcChannelConfig->reference.disableBuffer)
kevin1990 28:4eb837cd71df 1834 sensorDetailsReg.Reference_Buffer_Disable = 1;
kevin1990 28:4eb837cd71df 1835 else
kevin1990 28:4eb837cd71df 1836 sensorDetailsReg.Reference_Buffer_Disable = 0;
kevin1990 28:4eb837cd71df 1837
kevin1990 28:4eb837cd71df 1838 if (pChannelConfig->disablePublishing)
kevin1990 28:4eb837cd71df 1839 sensorDetailsReg.Do_Not_Publish = 1;
kevin1990 28:4eb837cd71df 1840 else
kevin1990 28:4eb837cd71df 1841 sensorDetailsReg.Do_Not_Publish = 0;
kevin1990 28:4eb837cd71df 1842
kevin1990 28:4eb837cd71df 1843 if (pChannelConfig->enableUnityLut)
kevin1990 28:4eb837cd71df 1844 sensorDetailsReg.Unity_LUT_Select = 1;
kevin1990 28:4eb837cd71df 1845 else
kevin1990 28:4eb837cd71df 1846 sensorDetailsReg.Unity_LUT_Select = 0;
kevin1990 28:4eb837cd71df 1847
kevin1990 28:4eb837cd71df 1848 WRITE_REG_U32(hDevice, sensorDetailsReg.VALUE32, CORE_SENSOR_DETAILSn(eChannelId));
kevin1990 28:4eb837cd71df 1849
kevin1990 28:4eb837cd71df 1850 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1851 }
kevin1990 28:4eb837cd71df 1852
kevin1990 28:4eb837cd71df 1853 static ADI_SENSE_RESULT adi_sense_SetChannelAdcFilter(
kevin1990 28:4eb837cd71df 1854 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1855 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1856 ADI_SENSE_1000_ADC_FILTER_CONFIG *pFilterConfig)
kevin1990 28:4eb837cd71df 1857 {
kevin1990 28:4eb837cd71df 1858 ADI_ADISENSE_CORE_Filter_Select_t filterSelectReg;
kevin1990 28:4eb837cd71df 1859
kevin1990 28:4eb837cd71df 1860 filterSelectReg.VALUE32 = REG_RESET_VAL(CORE_FILTER_SELECTn);
kevin1990 28:4eb837cd71df 1861
ADIJake 33:ea9e60457591 1862 if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_SINC4) {
kevin1990 28:4eb837cd71df 1863 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_SINC4;
kevin1990 28:4eb837cd71df 1864 filterSelectReg.ADC_FS = pFilterConfig->fs;
ADIJake 33:ea9e60457591 1865 } else if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_FIR_20SPS) {
kevin1990 28:4eb837cd71df 1866 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_FIR_20SPS;
ADIJake 33:ea9e60457591 1867 } else if (pFilterConfig->type == ADI_SENSE_1000_ADC_FILTER_FIR_25SPS) {
kevin1990 28:4eb837cd71df 1868 filterSelectReg.ADC_Filter_Type = ADISENSE_CORE_FILTER_SELECT_FILTER_FIR_25SPS;
ADIJake 33:ea9e60457591 1869 } else {
kevin1990 28:4eb837cd71df 1870 ADI_SENSE_LOG_ERROR("Invalid ADC filter type %d specified",
kevin1990 28:4eb837cd71df 1871 pFilterConfig->type);
kevin1990 28:4eb837cd71df 1872 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1873 }
kevin1990 28:4eb837cd71df 1874
kevin1990 28:4eb837cd71df 1875 WRITE_REG_U32(hDevice, filterSelectReg.VALUE32, CORE_FILTER_SELECTn(eChannelId));
kevin1990 28:4eb837cd71df 1876
kevin1990 28:4eb837cd71df 1877 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1878 }
kevin1990 28:4eb837cd71df 1879
kevin1990 28:4eb837cd71df 1880 static ADI_SENSE_RESULT adi_sense_SetChannelAdcCurrentConfig(
kevin1990 28:4eb837cd71df 1881 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1882 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1883 ADI_SENSE_1000_ADC_EXC_CURRENT_CONFIG *pCurrentConfig)
kevin1990 28:4eb837cd71df 1884 {
kevin1990 28:4eb837cd71df 1885 ADI_ADISENSE_CORE_Channel_Excitation_t channelExcitationReg;
kevin1990 28:4eb837cd71df 1886
kevin1990 28:4eb837cd71df 1887 channelExcitationReg.VALUE8 = REG_RESET_VAL(CORE_CHANNEL_EXCITATIONn);
kevin1990 28:4eb837cd71df 1888
ADIJake 33:ea9e60457591 1889 if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_NONE) {
kevin1990 28:4eb837cd71df 1890 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_OFF;
ADIJake 33:ea9e60457591 1891 } else {
kevin1990 28:4eb837cd71df 1892 if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_50uA)
kevin1990 28:4eb837cd71df 1893 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_50UA;
kevin1990 28:4eb837cd71df 1894 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_100uA)
kevin1990 28:4eb837cd71df 1895 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_100UA;
kevin1990 28:4eb837cd71df 1896 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_250uA)
kevin1990 28:4eb837cd71df 1897 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_250UA;
kevin1990 28:4eb837cd71df 1898 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_500uA)
kevin1990 28:4eb837cd71df 1899 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_500UA;
kevin1990 28:4eb837cd71df 1900 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_750uA)
kevin1990 28:4eb837cd71df 1901 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_750UA;
kevin1990 28:4eb837cd71df 1902 else if (pCurrentConfig->outputLevel == ADI_SENSE_1000_ADC_EXC_CURRENT_1000uA)
kevin1990 28:4eb837cd71df 1903 channelExcitationReg.IOUT_Excitation_Current = ADISENSE_CORE_CHANNEL_EXCITATION_IEXC_1000UA;
ADIJake 33:ea9e60457591 1904 else {
kevin1990 28:4eb837cd71df 1905 ADI_SENSE_LOG_ERROR("Invalid ADC excitation current %d specified",
kevin1990 28:4eb837cd71df 1906 pCurrentConfig->outputLevel);
kevin1990 28:4eb837cd71df 1907 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1908 }
kevin1990 28:4eb837cd71df 1909 }
kevin1990 28:4eb837cd71df 1910
ADIJake 33:ea9e60457591 1911 if (pCurrentConfig->diodeRatio == ADI_SENSE_1000_ADC_EXC_CURRENT_IOUT_DIODE_DEFAULT) {
kevin1990 28:4eb837cd71df 1912 channelExcitationReg.IOUT_Diode_Ratio = 0;
ADIJake 33:ea9e60457591 1913 } else {
kevin1990 28:4eb837cd71df 1914 channelExcitationReg.IOUT_Diode_Ratio = 1;
kevin1990 28:4eb837cd71df 1915 }
kevin1990 28:4eb837cd71df 1916
kevin1990 28:4eb837cd71df 1917 WRITE_REG_U8(hDevice, channelExcitationReg.VALUE8, CORE_CHANNEL_EXCITATIONn(eChannelId));
kevin1990 28:4eb837cd71df 1918
kevin1990 28:4eb837cd71df 1919 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1920 }
kevin1990 28:4eb837cd71df 1921
kevin1990 28:4eb837cd71df 1922 ADI_SENSE_RESULT adi_sense_SetAdcChannelConfig(
kevin1990 28:4eb837cd71df 1923 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1924 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1925 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 1926 {
kevin1990 28:4eb837cd71df 1927 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 1928 ADI_SENSE_1000_ADC_CHANNEL_CONFIG *pAdcChannelConfig =
kevin1990 28:4eb837cd71df 1929 &pChannelConfig->adcChannelConfig;
kevin1990 28:4eb837cd71df 1930
kevin1990 28:4eb837cd71df 1931 eRet = adi_sense_SetChannelAdcSensorType(hDevice, eChannelId,
ADIJake 33:ea9e60457591 1932 pAdcChannelConfig->sensor);
ADIJake 33:ea9e60457591 1933 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1934 ADI_SENSE_LOG_ERROR("Failed to set ADC sensor type for channel %d",
kevin1990 28:4eb837cd71df 1935 eChannelId);
kevin1990 28:4eb837cd71df 1936 return eRet;
kevin1990 28:4eb837cd71df 1937 }
kevin1990 28:4eb837cd71df 1938
kevin1990 28:4eb837cd71df 1939 eRet = adi_sense_SetChannelAdcSensorDetails(hDevice, eChannelId,
ADIJake 33:ea9e60457591 1940 pChannelConfig);
ADIJake 33:ea9e60457591 1941 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1942 ADI_SENSE_LOG_ERROR("Failed to set ADC sensor details for channel %d",
kevin1990 28:4eb837cd71df 1943 eChannelId);
kevin1990 28:4eb837cd71df 1944 return eRet;
kevin1990 28:4eb837cd71df 1945 }
kevin1990 28:4eb837cd71df 1946
kevin1990 28:4eb837cd71df 1947 eRet = adi_sense_SetChannelAdcFilter(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 1948 &pAdcChannelConfig->filter);
ADIJake 33:ea9e60457591 1949 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1950 ADI_SENSE_LOG_ERROR("Failed to set ADC filter for channel %d",
kevin1990 28:4eb837cd71df 1951 eChannelId);
kevin1990 28:4eb837cd71df 1952 return eRet;
kevin1990 28:4eb837cd71df 1953 }
kevin1990 28:4eb837cd71df 1954
kevin1990 28:4eb837cd71df 1955 eRet = adi_sense_SetChannelAdcCurrentConfig(hDevice, eChannelId,
ADIJake 33:ea9e60457591 1956 &pAdcChannelConfig->current);
ADIJake 33:ea9e60457591 1957 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 1958 ADI_SENSE_LOG_ERROR("Failed to set ADC current for channel %d",
kevin1990 28:4eb837cd71df 1959 eChannelId);
kevin1990 28:4eb837cd71df 1960 return eRet;
kevin1990 28:4eb837cd71df 1961 }
kevin1990 28:4eb837cd71df 1962
kevin1990 28:4eb837cd71df 1963 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 1964 }
kevin1990 28:4eb837cd71df 1965
kevin1990 28:4eb837cd71df 1966 static ADI_SENSE_RESULT adi_sense_SetChannelDigitalSensorDetails(
kevin1990 28:4eb837cd71df 1967 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 1968 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 1969 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 1970 {
kevin1990 28:4eb837cd71df 1971 ADI_ADISENSE_CORE_Sensor_Details_t sensorDetailsReg;
kevin1990 28:4eb837cd71df 1972
kevin1990 28:4eb837cd71df 1973 sensorDetailsReg.VALUE32 = REG_RESET_VAL(CORE_SENSOR_DETAILSn);
kevin1990 28:4eb837cd71df 1974
ADIJake 33:ea9e60457591 1975 if (pChannelConfig->compensationChannel == ADI_SENSE_1000_CHANNEL_ID_NONE) {
kevin1990 28:4eb837cd71df 1976 sensorDetailsReg.Compensation_Disable = 1;
kevin1990 28:4eb837cd71df 1977 sensorDetailsReg.Compensation_Channel = 0;
ADIJake 33:ea9e60457591 1978 } else {
kevin1990 28:4eb837cd71df 1979 ADI_SENSE_LOG_ERROR("Invalid compensation channel specified for digital sensor");
kevin1990 28:4eb837cd71df 1980 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1981 }
kevin1990 28:4eb837cd71df 1982
ADIJake 33:ea9e60457591 1983 if (pChannelConfig->measurementUnit == ADI_SENSE_1000_MEASUREMENT_UNIT_UNSPECIFIED) {
kevin1990 28:4eb837cd71df 1984 sensorDetailsReg.Measurement_Units = ADISENSE_CORE_SENSOR_DETAILS_UNITS_UNSPECIFIED;
ADIJake 33:ea9e60457591 1985 } else {
kevin1990 28:4eb837cd71df 1986 ADI_SENSE_LOG_ERROR("Invalid measurement unit specified for digital channel");
kevin1990 28:4eb837cd71df 1987 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 1988 }
kevin1990 28:4eb837cd71df 1989
kevin1990 28:4eb837cd71df 1990 if (pChannelConfig->disablePublishing)
kevin1990 28:4eb837cd71df 1991 sensorDetailsReg.Do_Not_Publish = 1;
kevin1990 28:4eb837cd71df 1992 else
kevin1990 28:4eb837cd71df 1993 sensorDetailsReg.Do_Not_Publish = 0;
kevin1990 28:4eb837cd71df 1994
kevin1990 28:4eb837cd71df 1995 if (pChannelConfig->enableUnityLut)
kevin1990 28:4eb837cd71df 1996 sensorDetailsReg.Unity_LUT_Select = 1;
kevin1990 28:4eb837cd71df 1997 else
kevin1990 28:4eb837cd71df 1998 sensorDetailsReg.Unity_LUT_Select = 0;
kevin1990 28:4eb837cd71df 1999
kevin1990 28:4eb837cd71df 2000 sensorDetailsReg.Vbias = 0;
kevin1990 28:4eb837cd71df 2001 sensorDetailsReg.Reference_Buffer_Disable = 1;
kevin1990 28:4eb837cd71df 2002
kevin1990 28:4eb837cd71df 2003 WRITE_REG_U32(hDevice, sensorDetailsReg.VALUE32, CORE_SENSOR_DETAILSn(eChannelId));
kevin1990 28:4eb837cd71df 2004
kevin1990 28:4eb837cd71df 2005 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2006 }
kevin1990 28:4eb837cd71df 2007
kevin1990 28:4eb837cd71df 2008 static ADI_SENSE_RESULT adi_sense_SetDigitalSensorCommands(
kevin1990 28:4eb837cd71df 2009 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2010 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2011 ADI_SENSE_1000_DIGITAL_SENSOR_COMMAND *pConfigCommand,
kevin1990 28:4eb837cd71df 2012 ADI_SENSE_1000_DIGITAL_SENSOR_COMMAND *pDataRequestCommand)
kevin1990 28:4eb837cd71df 2013 {
kevin1990 28:4eb837cd71df 2014 ADI_ADISENSE_CORE_Digital_Sensor_Num_Cmds_t numCmdsReg;
kevin1990 28:4eb837cd71df 2015
kevin1990 28:4eb837cd71df 2016 numCmdsReg.VALUE8 = REG_RESET_VAL(CORE_DIGITAL_SENSOR_NUM_CMDSn);
kevin1990 28:4eb837cd71df 2017
kevin1990 28:4eb837cd71df 2018 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_NUM_CMDS_DIGITAL_SENSOR_NUM_CFG_CMDS,
kevin1990 28:4eb837cd71df 2019 pConfigCommand->commandLength);
kevin1990 28:4eb837cd71df 2020 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_NUM_CMDS_DIGITAL_SENSOR_NUM_READ_CMDS,
kevin1990 28:4eb837cd71df 2021 pDataRequestCommand->commandLength);
kevin1990 28:4eb837cd71df 2022
kevin1990 28:4eb837cd71df 2023 numCmdsReg.Digital_Sensor_Num_Cfg_Cmds = pConfigCommand->commandLength;
kevin1990 28:4eb837cd71df 2024 numCmdsReg.Digital_Sensor_Num_Read_Cmds = pDataRequestCommand->commandLength;
kevin1990 28:4eb837cd71df 2025
kevin1990 28:4eb837cd71df 2026 WRITE_REG_U8(hDevice, numCmdsReg.VALUE8,
kevin1990 28:4eb837cd71df 2027 CORE_DIGITAL_SENSOR_NUM_CMDSn(eChannelId));
kevin1990 28:4eb837cd71df 2028
kevin1990 28:4eb837cd71df 2029 /*
kevin1990 28:4eb837cd71df 2030 * NOTE - the fall-through cases in the switch statement below are
kevin1990 28:4eb837cd71df 2031 * intentional, so temporarily disable related compiler warnings which may
kevin1990 28:4eb837cd71df 2032 * be produced here by GCC
kevin1990 28:4eb837cd71df 2033 */
kevin1990 28:4eb837cd71df 2034 #ifndef __CC_ARM
kevin1990 28:4eb837cd71df 2035 #pragma GCC diagnostic push
kevin1990 28:4eb837cd71df 2036 #pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
kevin1990 28:4eb837cd71df 2037 #endif
kevin1990 28:4eb837cd71df 2038
ADIJake 33:ea9e60457591 2039 switch (pConfigCommand->commandLength) {
ADIJake 33:ea9e60457591 2040 case 7:
ADIJake 33:ea9e60457591 2041 WRITE_REG_U8(hDevice, pConfigCommand->command[6],
ADIJake 33:ea9e60457591 2042 CORE_DIGITAL_SENSOR_COMMAND7n(eChannelId));
ADIJake 33:ea9e60457591 2043 case 6:
ADIJake 33:ea9e60457591 2044 WRITE_REG_U8(hDevice, pConfigCommand->command[5],
ADIJake 33:ea9e60457591 2045 CORE_DIGITAL_SENSOR_COMMAND6n(eChannelId));
ADIJake 33:ea9e60457591 2046 case 5:
ADIJake 33:ea9e60457591 2047 WRITE_REG_U8(hDevice, pConfigCommand->command[4],
ADIJake 33:ea9e60457591 2048 CORE_DIGITAL_SENSOR_COMMAND5n(eChannelId));
ADIJake 33:ea9e60457591 2049 case 4:
ADIJake 33:ea9e60457591 2050 WRITE_REG_U8(hDevice, pConfigCommand->command[3],
ADIJake 33:ea9e60457591 2051 CORE_DIGITAL_SENSOR_COMMAND4n(eChannelId));
ADIJake 33:ea9e60457591 2052 case 3:
ADIJake 33:ea9e60457591 2053 WRITE_REG_U8(hDevice, pConfigCommand->command[2],
ADIJake 33:ea9e60457591 2054 CORE_DIGITAL_SENSOR_COMMAND3n(eChannelId));
ADIJake 33:ea9e60457591 2055 case 2:
ADIJake 33:ea9e60457591 2056 WRITE_REG_U8(hDevice, pConfigCommand->command[1],
ADIJake 33:ea9e60457591 2057 CORE_DIGITAL_SENSOR_COMMAND2n(eChannelId));
ADIJake 33:ea9e60457591 2058 case 1:
ADIJake 33:ea9e60457591 2059 WRITE_REG_U8(hDevice, pConfigCommand->command[0],
ADIJake 33:ea9e60457591 2060 CORE_DIGITAL_SENSOR_COMMAND1n(eChannelId));
ADIJake 33:ea9e60457591 2061 case 0:
ADIJake 33:ea9e60457591 2062 default:
ADIJake 33:ea9e60457591 2063 break;
kevin1990 28:4eb837cd71df 2064 };
kevin1990 28:4eb837cd71df 2065
ADIJake 33:ea9e60457591 2066 switch (pDataRequestCommand->commandLength) {
ADIJake 33:ea9e60457591 2067 case 7:
ADIJake 33:ea9e60457591 2068 WRITE_REG_U8(hDevice, pDataRequestCommand->command[6],
ADIJake 33:ea9e60457591 2069 CORE_DIGITAL_SENSOR_READ_CMD7n(eChannelId));
ADIJake 33:ea9e60457591 2070 case 6:
ADIJake 33:ea9e60457591 2071 WRITE_REG_U8(hDevice, pDataRequestCommand->command[5],
ADIJake 33:ea9e60457591 2072 CORE_DIGITAL_SENSOR_READ_CMD6n(eChannelId));
ADIJake 33:ea9e60457591 2073 case 5:
ADIJake 33:ea9e60457591 2074 WRITE_REG_U8(hDevice, pDataRequestCommand->command[4],
ADIJake 33:ea9e60457591 2075 CORE_DIGITAL_SENSOR_READ_CMD5n(eChannelId));
ADIJake 33:ea9e60457591 2076 case 4:
ADIJake 33:ea9e60457591 2077 WRITE_REG_U8(hDevice, pDataRequestCommand->command[3],
ADIJake 33:ea9e60457591 2078 CORE_DIGITAL_SENSOR_READ_CMD4n(eChannelId));
ADIJake 33:ea9e60457591 2079 case 3:
ADIJake 33:ea9e60457591 2080 WRITE_REG_U8(hDevice, pDataRequestCommand->command[2],
ADIJake 33:ea9e60457591 2081 CORE_DIGITAL_SENSOR_READ_CMD3n(eChannelId));
ADIJake 33:ea9e60457591 2082 case 2:
ADIJake 33:ea9e60457591 2083 WRITE_REG_U8(hDevice, pDataRequestCommand->command[1],
ADIJake 33:ea9e60457591 2084 CORE_DIGITAL_SENSOR_READ_CMD2n(eChannelId));
ADIJake 33:ea9e60457591 2085 case 1:
ADIJake 33:ea9e60457591 2086 WRITE_REG_U8(hDevice, pDataRequestCommand->command[0],
ADIJake 33:ea9e60457591 2087 CORE_DIGITAL_SENSOR_READ_CMD1n(eChannelId));
ADIJake 33:ea9e60457591 2088 case 0:
ADIJake 33:ea9e60457591 2089 default:
ADIJake 33:ea9e60457591 2090 break;
kevin1990 28:4eb837cd71df 2091 };
kevin1990 28:4eb837cd71df 2092
kevin1990 28:4eb837cd71df 2093 /* Re-enable the implicit-fallthrough warning */
kevin1990 28:4eb837cd71df 2094 #ifndef __CC_ARM
kevin1990 28:4eb837cd71df 2095 #pragma GCC diagnostic pop
kevin1990 28:4eb837cd71df 2096 #endif
kevin1990 28:4eb837cd71df 2097
kevin1990 28:4eb837cd71df 2098 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2099 }
kevin1990 28:4eb837cd71df 2100
kevin1990 28:4eb837cd71df 2101 static ADI_SENSE_RESULT adi_sense_SetDigitalSensorFormat(
kevin1990 28:4eb837cd71df 2102 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2103 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2104 ADI_SENSE_1000_DIGITAL_SENSOR_DATA_FORMAT *pDataFormat)
kevin1990 28:4eb837cd71df 2105 {
kevin1990 28:4eb837cd71df 2106 ADI_ADISENSE_CORE_Digital_Sensor_Config_t sensorConfigReg;
kevin1990 28:4eb837cd71df 2107
kevin1990 28:4eb837cd71df 2108 sensorConfigReg.VALUE16 = REG_RESET_VAL(CORE_DIGITAL_SENSOR_CONFIGn);
kevin1990 28:4eb837cd71df 2109
ADIJake 33:ea9e60457591 2110 if (pDataFormat->coding != ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_NONE) {
ADIJake 33:ea9e60457591 2111 if (pDataFormat->frameLength == 0) {
kevin1990 28:4eb837cd71df 2112 ADI_SENSE_LOG_ERROR("Invalid frame length specified for digital sensor data format");
kevin1990 28:4eb837cd71df 2113 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2114 }
ADIJake 33:ea9e60457591 2115 if (pDataFormat->numDataBits == 0) {
kevin1990 28:4eb837cd71df 2116 ADI_SENSE_LOG_ERROR("Invalid frame length specified for digital sensor data format");
kevin1990 28:4eb837cd71df 2117 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2118 }
kevin1990 28:4eb837cd71df 2119
kevin1990 28:4eb837cd71df 2120 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_READ_BYTES,
kevin1990 28:4eb837cd71df 2121 pDataFormat->frameLength - 1);
kevin1990 28:4eb837cd71df 2122 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_DATA_BITS,
kevin1990 28:4eb837cd71df 2123 pDataFormat->numDataBits - 1);
kevin1990 28:4eb837cd71df 2124 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_CONFIG_DIGITAL_SENSOR_BIT_OFFSET,
kevin1990 28:4eb837cd71df 2125 pDataFormat->bitOffset);
kevin1990 28:4eb837cd71df 2126
kevin1990 28:4eb837cd71df 2127 sensorConfigReg.Digital_Sensor_Read_Bytes = pDataFormat->frameLength - 1;
kevin1990 28:4eb837cd71df 2128 sensorConfigReg.Digital_Sensor_Data_Bits = pDataFormat->numDataBits - 1;
kevin1990 28:4eb837cd71df 2129 sensorConfigReg.Digital_Sensor_Bit_Offset = pDataFormat->bitOffset;
kevin1990 28:4eb837cd71df 2130 sensorConfigReg.Digital_Sensor_Left_Aligned = pDataFormat->leftJustified ? 1 : 0;
kevin1990 28:4eb837cd71df 2131 sensorConfigReg.Digital_Sensor_Little_Endian = pDataFormat->littleEndian ? 1 : 0;
kevin1990 28:4eb837cd71df 2132
ADIJake 33:ea9e60457591 2133 switch (pDataFormat->coding) {
ADIJake 33:ea9e60457591 2134 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_UNIPOLAR:
ADIJake 33:ea9e60457591 2135 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_UNIPOLAR;
ADIJake 33:ea9e60457591 2136 break;
ADIJake 33:ea9e60457591 2137 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_TWOS_COMPLEMENT:
ADIJake 33:ea9e60457591 2138 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_TWOS_COMPL;
ADIJake 33:ea9e60457591 2139 break;
ADIJake 33:ea9e60457591 2140 case ADI_SENSE_1000_DIGITAL_SENSOR_DATA_CODING_OFFSET_BINARY:
ADIJake 33:ea9e60457591 2141 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_OFFSET_BINARY;
ADIJake 33:ea9e60457591 2142 break;
ADIJake 33:ea9e60457591 2143 default:
ADIJake 33:ea9e60457591 2144 ADI_SENSE_LOG_ERROR("Invalid coding specified for digital sensor data format");
ADIJake 33:ea9e60457591 2145 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2146 }
ADIJake 33:ea9e60457591 2147 } else {
kevin1990 28:4eb837cd71df 2148 sensorConfigReg.Digital_Sensor_Coding = ADISENSE_CORE_DIGITAL_SENSOR_CONFIG_CODING_NONE;
kevin1990 28:4eb837cd71df 2149 }
kevin1990 28:4eb837cd71df 2150
kevin1990 28:4eb837cd71df 2151 WRITE_REG_U16(hDevice, sensorConfigReg.VALUE16,
kevin1990 28:4eb837cd71df 2152 CORE_DIGITAL_SENSOR_CONFIGn(eChannelId));
kevin1990 28:4eb837cd71df 2153
kevin1990 28:4eb837cd71df 2154
kevin1990 28:4eb837cd71df 2155 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2156 }
kevin1990 28:4eb837cd71df 2157
kevin1990 28:4eb837cd71df 2158 static ADI_SENSE_RESULT adi_sense_SetDigitalCalibrationParam(
ADIJake 33:ea9e60457591 2159 ADI_SENSE_DEVICE_HANDLE hDevice,
ADIJake 33:ea9e60457591 2160 ADI_SENSE_1000_CHANNEL_ID eChannelId,
ADIJake 33:ea9e60457591 2161 ADI_SENSE_1000_DIGITAL_CALIBRATION_COMMAND *pCalibrationParam)
kevin1990 28:4eb837cd71df 2162 {
kevin1990 28:4eb837cd71df 2163 ADI_ADISENSE_CORE_Calibration_Parameter_t calibrationParamReg;
kevin1990 28:4eb837cd71df 2164
kevin1990 28:4eb837cd71df 2165 calibrationParamReg.VALUE32 = REG_RESET_VAL(CORE_CALIBRATION_PARAMETERn);
kevin1990 28:4eb837cd71df 2166
kevin1990 28:4eb837cd71df 2167 if (pCalibrationParam->enableCalibrationParam == false)
kevin1990 28:4eb837cd71df 2168 calibrationParamReg.Calibration_Parameter_Enable = 0;
kevin1990 28:4eb837cd71df 2169 else
kevin1990 28:4eb837cd71df 2170 calibrationParamReg.Calibration_Parameter_Enable = 1;
kevin1990 28:4eb837cd71df 2171
kevin1990 28:4eb837cd71df 2172 CHECK_REG_FIELD_VAL(CORE_CALIBRATION_PARAMETER_CALIBRATION_PARAMETER,
ADIJake 33:ea9e60457591 2173 pCalibrationParam->calibrationParam);
kevin1990 28:4eb837cd71df 2174
kevin1990 28:4eb837cd71df 2175 calibrationParamReg.Calibration_Parameter = pCalibrationParam->calibrationParam;
kevin1990 28:4eb837cd71df 2176
kevin1990 28:4eb837cd71df 2177 WRITE_REG_U32(hDevice, calibrationParamReg.VALUE32,
kevin1990 28:4eb837cd71df 2178 CORE_CALIBRATION_PARAMETERn(eChannelId));
kevin1990 28:4eb837cd71df 2179
kevin1990 28:4eb837cd71df 2180 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2181 }
kevin1990 28:4eb837cd71df 2182
kevin1990 28:4eb837cd71df 2183 static ADI_SENSE_RESULT adi_sense_SetChannelI2cSensorType(
kevin1990 28:4eb837cd71df 2184 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2185 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2186 ADI_SENSE_1000_I2C_SENSOR_TYPE sensorType)
kevin1990 28:4eb837cd71df 2187 {
kevin1990 28:4eb837cd71df 2188 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
kevin1990 28:4eb837cd71df 2189
kevin1990 28:4eb837cd71df 2190 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
kevin1990 28:4eb837cd71df 2191
kevin1990 28:4eb837cd71df 2192 /* Ensure that the sensor type is valid for this channel */
ADIJake 33:ea9e60457591 2193 switch(sensorType) {
ADIJake 33:ea9e60457591 2194 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_A_DEF_L1:
ADIJake 33:ea9e60457591 2195 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_B_DEF_L1:
ADIJake 33:ea9e60457591 2196 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_A_DEF_L2:
ADIJake 33:ea9e60457591 2197 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_B_DEF_L2:
ADIJake 33:ea9e60457591 2198 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_A_ADV_L1:
ADIJake 33:ea9e60457591 2199 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_B_ADV_L1:
ADIJake 33:ea9e60457591 2200 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_A_ADV_L2:
ADIJake 33:ea9e60457591 2201 case ADI_SENSE_1000_I2C_SENSOR_HUMIDITY_B_ADV_L2:
ADIJake 33:ea9e60457591 2202 case ADI_SENSE_1000_I2C_SENSOR_AMBIENTLIGHT_A_DEF_L1:
ADIJake 33:ea9e60457591 2203 case ADI_SENSE_1000_I2C_SENSOR_AMBIENTLIGHT_A_DEF_L2:
ADIJake 33:ea9e60457591 2204 case ADI_SENSE_1000_I2C_SENSOR_AMBIENTLIGHT_A_ADV_L1:
ADIJake 33:ea9e60457591 2205 case ADI_SENSE_1000_I2C_SENSOR_AMBIENTLIGHT_A_ADV_L2:
ADIJake 33:ea9e60457591 2206 sensorTypeReg.Sensor_Type = sensorType;
ADIJake 33:ea9e60457591 2207 break;
ADIJake 33:ea9e60457591 2208 default:
ADIJake 33:ea9e60457591 2209 ADI_SENSE_LOG_ERROR("Unsupported I2C sensor type %d specified", sensorType);
ADIJake 33:ea9e60457591 2210 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2211 }
kevin1990 28:4eb837cd71df 2212
kevin1990 28:4eb837cd71df 2213 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
kevin1990 28:4eb837cd71df 2214
kevin1990 28:4eb837cd71df 2215 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2216 }
kevin1990 28:4eb837cd71df 2217
kevin1990 28:4eb837cd71df 2218 static ADI_SENSE_RESULT adi_sense_SetChannelI2cSensorAddress(
kevin1990 28:4eb837cd71df 2219 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2220 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2221 uint32_t deviceAddress)
kevin1990 28:4eb837cd71df 2222 {
kevin1990 28:4eb837cd71df 2223 CHECK_REG_FIELD_VAL(CORE_DIGITAL_SENSOR_ADDRESS_DIGITAL_SENSOR_ADDRESS, deviceAddress);
kevin1990 28:4eb837cd71df 2224 WRITE_REG_U8(hDevice, deviceAddress, CORE_DIGITAL_SENSOR_ADDRESSn(eChannelId));
kevin1990 28:4eb837cd71df 2225
kevin1990 28:4eb837cd71df 2226 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2227 }
kevin1990 28:4eb837cd71df 2228
kevin1990 28:4eb837cd71df 2229 static ADI_SENSE_RESULT adi_sense_SetDigitalChannelComms(
kevin1990 28:4eb837cd71df 2230 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2231 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2232 ADI_SENSE_1000_DIGITAL_SENSOR_COMMS *pDigitalComms)
kevin1990 28:4eb837cd71df 2233 {
kevin1990 28:4eb837cd71df 2234 ADI_ADISENSE_CORE_Digital_Sensor_Comms_t digitalSensorComms;
kevin1990 28:4eb837cd71df 2235
kevin1990 28:4eb837cd71df 2236 digitalSensorComms.VALUE16 = REG_RESET_VAL(CORE_DIGITAL_SENSOR_COMMSn);
kevin1990 28:4eb837cd71df 2237
ADIJake 33:ea9e60457591 2238 if(pDigitalComms->useCustomCommsConfig) {
kevin1990 28:4eb837cd71df 2239 digitalSensorComms.Digital_Sensor_Comms_En = 1;
kevin1990 28:4eb837cd71df 2240
ADIJake 33:ea9e60457591 2241 if(pDigitalComms->i2cClockSpeed == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_I2C_CLOCK_SPEED_100K) {
kevin1990 28:4eb837cd71df 2242 digitalSensorComms.I2C_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_I2C_100K;
ADIJake 33:ea9e60457591 2243 } else if(pDigitalComms->i2cClockSpeed == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_I2C_CLOCK_SPEED_400K) {
kevin1990 28:4eb837cd71df 2244 digitalSensorComms.I2C_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_I2C_400K;
ADIJake 33:ea9e60457591 2245 } else {
kevin1990 28:4eb837cd71df 2246 ADI_SENSE_LOG_ERROR("Invalid I2C clock speed %d specified",
kevin1990 28:4eb837cd71df 2247 pDigitalComms->i2cClockSpeed);
kevin1990 28:4eb837cd71df 2248 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2249 }
kevin1990 28:4eb837cd71df 2250
ADIJake 33:ea9e60457591 2251 if(pDigitalComms->spiMode == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_MODE_0) {
kevin1990 28:4eb837cd71df 2252 digitalSensorComms.SPI_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_MODE_0;
ADIJake 33:ea9e60457591 2253 } else if(pDigitalComms->spiMode == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_MODE_1) {
kevin1990 28:4eb837cd71df 2254 digitalSensorComms.SPI_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_MODE_1;
ADIJake 33:ea9e60457591 2255 } else if(pDigitalComms->spiMode == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_MODE_2) {
kevin1990 28:4eb837cd71df 2256 digitalSensorComms.SPI_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_MODE_2;
ADIJake 33:ea9e60457591 2257 } else if(pDigitalComms->spiMode == ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_MODE_3) {
kevin1990 28:4eb837cd71df 2258 digitalSensorComms.SPI_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_MODE_3;
ADIJake 33:ea9e60457591 2259 } else {
kevin1990 28:4eb837cd71df 2260 ADI_SENSE_LOG_ERROR("Invalid SPI mode %d specified",
kevin1990 28:4eb837cd71df 2261 pDigitalComms->spiMode);
kevin1990 28:4eb837cd71df 2262 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2263 }
kevin1990 28:4eb837cd71df 2264
ADIJake 33:ea9e60457591 2265 switch (pDigitalComms->spiClock) {
ADIJake 33:ea9e60457591 2266 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_13MHZ:
ADIJake 33:ea9e60457591 2267 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_13MHZ;
ADIJake 33:ea9e60457591 2268 break;
ADIJake 33:ea9e60457591 2269 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_6_5MHZ:
ADIJake 33:ea9e60457591 2270 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_6_5MHZ;
ADIJake 33:ea9e60457591 2271 break;
ADIJake 33:ea9e60457591 2272 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_3_25MHZ:
ADIJake 33:ea9e60457591 2273 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_3_25MHZ;
ADIJake 33:ea9e60457591 2274 break;
ADIJake 33:ea9e60457591 2275 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_1_625MHZ:
ADIJake 33:ea9e60457591 2276 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_1_625MHZ;
ADIJake 33:ea9e60457591 2277 break;
ADIJake 33:ea9e60457591 2278 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_812KHZ:
ADIJake 33:ea9e60457591 2279 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_812KHZ;
ADIJake 33:ea9e60457591 2280 break;
ADIJake 33:ea9e60457591 2281 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_406KHZ:
ADIJake 33:ea9e60457591 2282 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_406KHZ;
ADIJake 33:ea9e60457591 2283 break;
ADIJake 33:ea9e60457591 2284 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_203KHZ:
ADIJake 33:ea9e60457591 2285 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_203KHZ;
ADIJake 33:ea9e60457591 2286 break;
ADIJake 33:ea9e60457591 2287 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_101KHZ:
ADIJake 33:ea9e60457591 2288 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_101KHZ;
ADIJake 33:ea9e60457591 2289 break;
ADIJake 33:ea9e60457591 2290 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_50KHZ:
ADIJake 33:ea9e60457591 2291 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_50KHZ;
ADIJake 33:ea9e60457591 2292 break;
ADIJake 33:ea9e60457591 2293 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_25KHZ:
ADIJake 33:ea9e60457591 2294 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_25KHZ;
ADIJake 33:ea9e60457591 2295 break;
ADIJake 33:ea9e60457591 2296 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_12KHZ:
ADIJake 33:ea9e60457591 2297 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_12KHZ;
ADIJake 33:ea9e60457591 2298 break;
ADIJake 33:ea9e60457591 2299 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_6KHZ:
ADIJake 33:ea9e60457591 2300 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_6KHZ;
ADIJake 33:ea9e60457591 2301 break;
ADIJake 33:ea9e60457591 2302 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_3KHZ:
ADIJake 33:ea9e60457591 2303 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_3KHZ;
ADIJake 33:ea9e60457591 2304 break;
ADIJake 33:ea9e60457591 2305 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_1_5KHZ:
ADIJake 33:ea9e60457591 2306 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_1_5KHZ;
ADIJake 33:ea9e60457591 2307 break;
ADIJake 33:ea9e60457591 2308 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_793HZ:
ADIJake 33:ea9e60457591 2309 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_793HZ;
ADIJake 33:ea9e60457591 2310 break;
ADIJake 33:ea9e60457591 2311 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_SPI_CLOCK_396HZ:
ADIJake 33:ea9e60457591 2312 digitalSensorComms.SPI_Clock = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_SPI_396HZ;
ADIJake 33:ea9e60457591 2313 break;
ADIJake 33:ea9e60457591 2314 default:
ADIJake 33:ea9e60457591 2315 ADI_SENSE_LOG_ERROR("Invalid SPI clock %d specified",
ADIJake 33:ea9e60457591 2316 pDigitalComms->spiClock);
ADIJake 33:ea9e60457591 2317 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2318 }
kevin1990 28:4eb837cd71df 2319
ADIJake 33:ea9e60457591 2320 switch (pDigitalComms->uartLineConfig) {
ADIJake 33:ea9e60457591 2321 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8N1:
ADIJake 33:ea9e60457591 2322 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8N1;
ADIJake 33:ea9e60457591 2323 break;
ADIJake 33:ea9e60457591 2324 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8N2:
ADIJake 33:ea9e60457591 2325 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8N2;
ADIJake 33:ea9e60457591 2326 break;
ADIJake 33:ea9e60457591 2327 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8N3:
ADIJake 33:ea9e60457591 2328 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8N3;
ADIJake 33:ea9e60457591 2329 break;
ADIJake 33:ea9e60457591 2330 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8E1:
ADIJake 33:ea9e60457591 2331 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8E1;
ADIJake 33:ea9e60457591 2332 break;
ADIJake 33:ea9e60457591 2333 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8E2:
ADIJake 33:ea9e60457591 2334 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8E2;
ADIJake 33:ea9e60457591 2335 break;
ADIJake 33:ea9e60457591 2336 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8E3:
ADIJake 33:ea9e60457591 2337 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8E3;
ADIJake 33:ea9e60457591 2338 break;
ADIJake 33:ea9e60457591 2339 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8O1:
ADIJake 33:ea9e60457591 2340 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8O1;
ADIJake 33:ea9e60457591 2341 break;
ADIJake 33:ea9e60457591 2342 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8O2:
ADIJake 33:ea9e60457591 2343 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8O2;
ADIJake 33:ea9e60457591 2344 break;
ADIJake 33:ea9e60457591 2345 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_LINE_CONFIG_8O3:
ADIJake 33:ea9e60457591 2346 digitalSensorComms.Uart_Mode = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_LINECONTROL_8O3;
ADIJake 33:ea9e60457591 2347 break;
ADIJake 33:ea9e60457591 2348 default:
ADIJake 33:ea9e60457591 2349 ADI_SENSE_LOG_ERROR("Invalid UART mode %d specified",
ADIJake 33:ea9e60457591 2350 pDigitalComms->uartLineConfig);
ADIJake 33:ea9e60457591 2351 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2352 }
kevin1990 28:4eb837cd71df 2353
ADIJake 33:ea9e60457591 2354 switch (pDigitalComms->uartBaudRate) {
ADIJake 33:ea9e60457591 2355 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_115200:
ADIJake 33:ea9e60457591 2356 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_115200;
ADIJake 33:ea9e60457591 2357 break;
ADIJake 33:ea9e60457591 2358 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_57600:
ADIJake 33:ea9e60457591 2359 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_57600;
ADIJake 33:ea9e60457591 2360 break;
ADIJake 33:ea9e60457591 2361 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_38400:
ADIJake 33:ea9e60457591 2362 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_38400;
ADIJake 33:ea9e60457591 2363 break;
ADIJake 33:ea9e60457591 2364 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_19200:
ADIJake 33:ea9e60457591 2365 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_19200;
ADIJake 33:ea9e60457591 2366 break;
ADIJake 33:ea9e60457591 2367 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_9600:
ADIJake 33:ea9e60457591 2368 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_9600;
ADIJake 33:ea9e60457591 2369 break;
ADIJake 33:ea9e60457591 2370 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_4800:
ADIJake 33:ea9e60457591 2371 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_4800;
ADIJake 33:ea9e60457591 2372 break;
ADIJake 33:ea9e60457591 2373 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_2400:
ADIJake 33:ea9e60457591 2374 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_2400;
ADIJake 33:ea9e60457591 2375 break;
ADIJake 33:ea9e60457591 2376 case ADI_SENSE_1000_DIGITAL_SENSOR_COMMS_UART_BAUD_RATE_1200:
ADIJake 33:ea9e60457591 2377 digitalSensorComms.Uart_Baud = ADISENSE_CORE_DIGITAL_SENSOR_COMMS_UART_1200;
ADIJake 33:ea9e60457591 2378 break;
ADIJake 33:ea9e60457591 2379 default:
ADIJake 33:ea9e60457591 2380 ADI_SENSE_LOG_ERROR("Invalid UART baud rate %d specified",
ADIJake 33:ea9e60457591 2381 pDigitalComms->uartBaudRate);
ADIJake 33:ea9e60457591 2382 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2383 }
ADIJake 33:ea9e60457591 2384 } else {
kevin1990 28:4eb837cd71df 2385 digitalSensorComms.Digital_Sensor_Comms_En = 0;
kevin1990 28:4eb837cd71df 2386 }
kevin1990 28:4eb837cd71df 2387
kevin1990 28:4eb837cd71df 2388 WRITE_REG_U16(hDevice, digitalSensorComms.VALUE16, CORE_DIGITAL_SENSOR_COMMSn(eChannelId));
kevin1990 28:4eb837cd71df 2389
kevin1990 28:4eb837cd71df 2390 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2391 }
kevin1990 28:4eb837cd71df 2392
kevin1990 28:4eb837cd71df 2393 ADI_SENSE_RESULT adi_sense_SetI2cChannelConfig(
kevin1990 28:4eb837cd71df 2394 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2395 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2396 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 2397 {
kevin1990 28:4eb837cd71df 2398 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 2399 ADI_SENSE_1000_I2C_CHANNEL_CONFIG *pI2cChannelConfig =
kevin1990 28:4eb837cd71df 2400 &pChannelConfig->i2cChannelConfig;
kevin1990 28:4eb837cd71df 2401
kevin1990 28:4eb837cd71df 2402 eRet = adi_sense_SetChannelI2cSensorType(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2403 pI2cChannelConfig->sensor);
ADIJake 33:ea9e60457591 2404 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2405 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor type for channel %d",
kevin1990 28:4eb837cd71df 2406 eChannelId);
kevin1990 28:4eb837cd71df 2407 return eRet;
kevin1990 28:4eb837cd71df 2408 }
kevin1990 28:4eb837cd71df 2409
kevin1990 28:4eb837cd71df 2410 eRet = adi_sense_SetChannelI2cSensorAddress(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2411 pI2cChannelConfig->deviceAddress);
ADIJake 33:ea9e60457591 2412 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2413 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor address for channel %d",
kevin1990 28:4eb837cd71df 2414 eChannelId);
kevin1990 28:4eb837cd71df 2415 return eRet;
kevin1990 28:4eb837cd71df 2416 }
kevin1990 28:4eb837cd71df 2417
kevin1990 28:4eb837cd71df 2418 eRet = adi_sense_SetChannelDigitalSensorDetails(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2419 pChannelConfig);
ADIJake 33:ea9e60457591 2420 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2421 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor details for channel %d",
kevin1990 28:4eb837cd71df 2422 eChannelId);
kevin1990 28:4eb837cd71df 2423 return eRet;
kevin1990 28:4eb837cd71df 2424 }
kevin1990 28:4eb837cd71df 2425
kevin1990 28:4eb837cd71df 2426 eRet = adi_sense_SetDigitalSensorCommands(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2427 &pI2cChannelConfig->configurationCommand,
ADIJake 33:ea9e60457591 2428 &pI2cChannelConfig->dataRequestCommand);
ADIJake 33:ea9e60457591 2429 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2430 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor commands for channel %d",
kevin1990 28:4eb837cd71df 2431 eChannelId);
kevin1990 28:4eb837cd71df 2432 return eRet;
kevin1990 28:4eb837cd71df 2433 }
kevin1990 28:4eb837cd71df 2434
kevin1990 28:4eb837cd71df 2435 eRet = adi_sense_SetDigitalSensorFormat(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2436 &pI2cChannelConfig->dataFormat);
ADIJake 33:ea9e60457591 2437 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2438 ADI_SENSE_LOG_ERROR("Failed to set I2C sensor data format for channel %d",
kevin1990 28:4eb837cd71df 2439 eChannelId);
kevin1990 28:4eb837cd71df 2440 return eRet;
kevin1990 28:4eb837cd71df 2441 }
kevin1990 28:4eb837cd71df 2442
kevin1990 28:4eb837cd71df 2443 eRet = adi_sense_SetDigitalCalibrationParam(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2444 &pI2cChannelConfig->digitalCalibrationParam);
ADIJake 33:ea9e60457591 2445 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2446 ADI_SENSE_LOG_ERROR("Failed to set I2C digital calibration param for channel %d",
kevin1990 28:4eb837cd71df 2447 eChannelId);
kevin1990 28:4eb837cd71df 2448 return eRet;
kevin1990 28:4eb837cd71df 2449 }
kevin1990 28:4eb837cd71df 2450
kevin1990 28:4eb837cd71df 2451 eRet = adi_sense_SetDigitalChannelComms(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2452 &pI2cChannelConfig->configureComms);
ADIJake 33:ea9e60457591 2453 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2454 ADI_SENSE_LOG_ERROR("Failed to set I2C comms for channel %d",
kevin1990 28:4eb837cd71df 2455 eChannelId);
kevin1990 28:4eb837cd71df 2456 return eRet;
kevin1990 28:4eb837cd71df 2457 }
kevin1990 28:4eb837cd71df 2458
kevin1990 28:4eb837cd71df 2459 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2460 }
kevin1990 28:4eb837cd71df 2461
kevin1990 28:4eb837cd71df 2462 static ADI_SENSE_RESULT adi_sense_SetChannelSpiSensorType(
kevin1990 28:4eb837cd71df 2463 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2464 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2465 ADI_SENSE_1000_SPI_SENSOR_TYPE sensorType)
kevin1990 28:4eb837cd71df 2466 {
kevin1990 28:4eb837cd71df 2467 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
kevin1990 28:4eb837cd71df 2468
kevin1990 28:4eb837cd71df 2469 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
kevin1990 28:4eb837cd71df 2470
kevin1990 28:4eb837cd71df 2471 /* Ensure that the sensor type is valid for this channel */
ADIJake 33:ea9e60457591 2472 switch(sensorType) {
ADIJake 33:ea9e60457591 2473 case ADI_SENSE_1000_SPI_SENSOR_PRESSURE_A_DEF_L1:
ADIJake 33:ea9e60457591 2474 case ADI_SENSE_1000_SPI_SENSOR_PRESSURE_A_DEF_L2:
ADIJake 33:ea9e60457591 2475 case ADI_SENSE_1000_SPI_SENSOR_PRESSURE_A_ADV_L1:
ADIJake 33:ea9e60457591 2476 case ADI_SENSE_1000_SPI_SENSOR_PRESSURE_A_ADV_L2:
ADIJake 33:ea9e60457591 2477 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_A_DEF_L1:
ADIJake 33:ea9e60457591 2478 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_B_DEF_L1:
ADIJake 33:ea9e60457591 2479 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_A_DEF_L2:
ADIJake 33:ea9e60457591 2480 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_B_DEF_L2:
ADIJake 33:ea9e60457591 2481 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_A_ADV_L1:
ADIJake 33:ea9e60457591 2482 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_B_ADV_L1:
ADIJake 33:ea9e60457591 2483 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_A_ADV_L2:
ADIJake 33:ea9e60457591 2484 case ADI_SENSE_1000_SPI_SENSOR_ACCELEROMETER_B_ADV_L2:
ADIJake 33:ea9e60457591 2485 sensorTypeReg.Sensor_Type = sensorType;
ADIJake 33:ea9e60457591 2486 break;
ADIJake 33:ea9e60457591 2487 default:
ADIJake 33:ea9e60457591 2488 ADI_SENSE_LOG_ERROR("Unsupported SPI sensor type %d specified", sensorType);
ADIJake 33:ea9e60457591 2489 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2490 }
kevin1990 28:4eb837cd71df 2491
kevin1990 28:4eb837cd71df 2492 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
kevin1990 28:4eb837cd71df 2493
kevin1990 28:4eb837cd71df 2494 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2495 }
kevin1990 28:4eb837cd71df 2496
kevin1990 28:4eb837cd71df 2497 ADI_SENSE_RESULT adi_sense_SetSpiChannelConfig(
kevin1990 28:4eb837cd71df 2498 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2499 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2500 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 2501 {
kevin1990 28:4eb837cd71df 2502 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 2503 ADI_SENSE_1000_SPI_CHANNEL_CONFIG *pSpiChannelConfig =
kevin1990 28:4eb837cd71df 2504 &pChannelConfig->spiChannelConfig;
kevin1990 28:4eb837cd71df 2505
kevin1990 28:4eb837cd71df 2506 eRet = adi_sense_SetChannelSpiSensorType(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2507 pSpiChannelConfig->sensor);
ADIJake 33:ea9e60457591 2508 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2509 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor type for channel %d",
kevin1990 28:4eb837cd71df 2510 eChannelId);
kevin1990 28:4eb837cd71df 2511 return eRet;
kevin1990 28:4eb837cd71df 2512 }
kevin1990 28:4eb837cd71df 2513
kevin1990 28:4eb837cd71df 2514 eRet = adi_sense_SetChannelDigitalSensorDetails(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2515 pChannelConfig);
ADIJake 33:ea9e60457591 2516 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2517 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor details for channel %d",
kevin1990 28:4eb837cd71df 2518 eChannelId);
kevin1990 28:4eb837cd71df 2519 return eRet;
kevin1990 28:4eb837cd71df 2520 }
kevin1990 28:4eb837cd71df 2521
kevin1990 28:4eb837cd71df 2522 eRet = adi_sense_SetDigitalSensorCommands(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2523 &pSpiChannelConfig->configurationCommand,
ADIJake 33:ea9e60457591 2524 &pSpiChannelConfig->dataRequestCommand);
ADIJake 33:ea9e60457591 2525 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2526 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor commands for channel %d",
kevin1990 28:4eb837cd71df 2527 eChannelId);
kevin1990 28:4eb837cd71df 2528 return eRet;
kevin1990 28:4eb837cd71df 2529 }
kevin1990 28:4eb837cd71df 2530
kevin1990 28:4eb837cd71df 2531 eRet = adi_sense_SetDigitalSensorFormat(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2532 &pSpiChannelConfig->dataFormat);
ADIJake 33:ea9e60457591 2533 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2534 ADI_SENSE_LOG_ERROR("Failed to set SPI sensor data format for channel %d",
kevin1990 28:4eb837cd71df 2535 eChannelId);
kevin1990 28:4eb837cd71df 2536 return eRet;
kevin1990 28:4eb837cd71df 2537 }
kevin1990 28:4eb837cd71df 2538
kevin1990 28:4eb837cd71df 2539 eRet = adi_sense_SetDigitalCalibrationParam(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2540 &pSpiChannelConfig->digitalCalibrationParam);
ADIJake 33:ea9e60457591 2541 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2542 ADI_SENSE_LOG_ERROR("Failed to set SPI digital calibration param for channel %d",
kevin1990 28:4eb837cd71df 2543 eChannelId);
kevin1990 28:4eb837cd71df 2544 return eRet;
kevin1990 28:4eb837cd71df 2545 }
kevin1990 28:4eb837cd71df 2546
kevin1990 28:4eb837cd71df 2547 eRet = adi_sense_SetDigitalChannelComms(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2548 &pSpiChannelConfig->configureComms);
ADIJake 33:ea9e60457591 2549 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2550 ADI_SENSE_LOG_ERROR("Failed to set SPI comms for channel %d",
kevin1990 28:4eb837cd71df 2551 eChannelId);
kevin1990 28:4eb837cd71df 2552 return eRet;
kevin1990 28:4eb837cd71df 2553 }
kevin1990 28:4eb837cd71df 2554
kevin1990 28:4eb837cd71df 2555 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2556 }
kevin1990 28:4eb837cd71df 2557
kevin1990 28:4eb837cd71df 2558 static ADI_SENSE_RESULT adi_sense_SetChannelUartSensorType(
kevin1990 28:4eb837cd71df 2559 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2560 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2561 ADI_SENSE_1000_UART_SENSOR_TYPE sensorType)
kevin1990 28:4eb837cd71df 2562 {
kevin1990 28:4eb837cd71df 2563 ADI_ADISENSE_CORE_Sensor_Type_t sensorTypeReg;
kevin1990 28:4eb837cd71df 2564
kevin1990 28:4eb837cd71df 2565 sensorTypeReg.VALUE16 = REG_RESET_VAL(CORE_SENSOR_TYPEn);
kevin1990 28:4eb837cd71df 2566
kevin1990 28:4eb837cd71df 2567 /* Ensure that the sensor type is valid for this channel */
ADIJake 33:ea9e60457591 2568 switch(sensorType) {
ADIJake 33:ea9e60457591 2569 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_A_DEF_L1:
ADIJake 33:ea9e60457591 2570 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_B_DEF_L1:
ADIJake 33:ea9e60457591 2571 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_A_DEF_L2:
ADIJake 33:ea9e60457591 2572 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_B_DEF_L2:
ADIJake 33:ea9e60457591 2573 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_A_ADV_L1:
ADIJake 33:ea9e60457591 2574 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_B_ADV_L1:
ADIJake 33:ea9e60457591 2575 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_A_ADV_L2:
ADIJake 33:ea9e60457591 2576 case ADI_SENSE_1000_UART_SENSOR_UART_CO2_B_ADV_L2:
ADIJake 33:ea9e60457591 2577 sensorTypeReg.Sensor_Type = sensorType;
ADIJake 33:ea9e60457591 2578 break;
ADIJake 33:ea9e60457591 2579 default:
ADIJake 33:ea9e60457591 2580 ADI_SENSE_LOG_ERROR("Unsupported UART sensor type %d specified", sensorType);
ADIJake 33:ea9e60457591 2581 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2582 }
kevin1990 28:4eb837cd71df 2583
kevin1990 28:4eb837cd71df 2584 WRITE_REG_U16(hDevice, sensorTypeReg.VALUE16, CORE_SENSOR_TYPEn(eChannelId));
kevin1990 28:4eb837cd71df 2585
kevin1990 28:4eb837cd71df 2586 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2587 }
kevin1990 28:4eb837cd71df 2588
kevin1990 28:4eb837cd71df 2589 ADI_SENSE_RESULT adi_sense_SetUartChannelConfig(
kevin1990 28:4eb837cd71df 2590 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2591 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2592 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 2593 {
kevin1990 28:4eb837cd71df 2594 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 2595 ADI_SENSE_1000_UART_CHANNEL_CONFIG *pUartChannelConfig =
kevin1990 28:4eb837cd71df 2596 &pChannelConfig->uartChannelConfig;
kevin1990 28:4eb837cd71df 2597
kevin1990 28:4eb837cd71df 2598 eRet = adi_sense_SetChannelUartSensorType(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2599 pUartChannelConfig->sensor);
ADIJake 33:ea9e60457591 2600 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2601 ADI_SENSE_LOG_ERROR("Failed to set UART sensor type for channel %d",
kevin1990 28:4eb837cd71df 2602 eChannelId);
kevin1990 28:4eb837cd71df 2603 return eRet;
kevin1990 28:4eb837cd71df 2604 }
kevin1990 28:4eb837cd71df 2605
kevin1990 28:4eb837cd71df 2606 eRet = adi_sense_SetChannelDigitalSensorDetails(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2607 pChannelConfig);
ADIJake 33:ea9e60457591 2608 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2609 ADI_SENSE_LOG_ERROR("Failed to set UART sensor details for channel %d",
kevin1990 28:4eb837cd71df 2610 eChannelId);
kevin1990 28:4eb837cd71df 2611 return eRet;
kevin1990 28:4eb837cd71df 2612 }
kevin1990 28:4eb837cd71df 2613
kevin1990 28:4eb837cd71df 2614 eRet = adi_sense_SetDigitalCalibrationParam(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2615 &pUartChannelConfig->digitalCalibrationParam);
ADIJake 33:ea9e60457591 2616 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2617 ADI_SENSE_LOG_ERROR("Failed to set UART digital calibration param for channel %d",
kevin1990 28:4eb837cd71df 2618 eChannelId);
kevin1990 28:4eb837cd71df 2619 return eRet;
kevin1990 28:4eb837cd71df 2620 }
kevin1990 28:4eb837cd71df 2621
kevin1990 28:4eb837cd71df 2622 eRet = adi_sense_SetDigitalChannelComms(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2623 &pUartChannelConfig->configureComms);
ADIJake 33:ea9e60457591 2624 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2625 ADI_SENSE_LOG_ERROR("Failed to set UART comms for channel %d",
kevin1990 28:4eb837cd71df 2626 eChannelId);
kevin1990 28:4eb837cd71df 2627 return eRet;
kevin1990 28:4eb837cd71df 2628 }
kevin1990 28:4eb837cd71df 2629
kevin1990 28:4eb837cd71df 2630
kevin1990 28:4eb837cd71df 2631 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2632 }
kevin1990 28:4eb837cd71df 2633
kevin1990 28:4eb837cd71df 2634 ADI_SENSE_RESULT adi_sense_1000_SetChannelThresholdLimits(
kevin1990 28:4eb837cd71df 2635 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2636 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2637 float32_t fHighThresholdLimit,
kevin1990 28:4eb837cd71df 2638 float32_t fLowThresholdLimit)
kevin1990 28:4eb837cd71df 2639 {
kevin1990 28:4eb837cd71df 2640 /*
kevin1990 28:4eb837cd71df 2641 * If the low/high limits are *both* set to 0 in memory, or NaNs, assume
kevin1990 28:4eb837cd71df 2642 * that they are unset, or not required, and use infinity defaults instead
kevin1990 28:4eb837cd71df 2643 */
ADIJake 33:ea9e60457591 2644 if (fHighThresholdLimit == 0.0f && fLowThresholdLimit == 0.0f) {
kevin1990 28:4eb837cd71df 2645 fHighThresholdLimit = INFINITY;
kevin1990 28:4eb837cd71df 2646 fLowThresholdLimit = -INFINITY;
ADIJake 33:ea9e60457591 2647 } else {
kevin1990 28:4eb837cd71df 2648 if (isnan(fHighThresholdLimit))
kevin1990 28:4eb837cd71df 2649 fHighThresholdLimit = INFINITY;
kevin1990 28:4eb837cd71df 2650 if (isnan(fLowThresholdLimit))
kevin1990 28:4eb837cd71df 2651 fLowThresholdLimit = -INFINITY;
kevin1990 28:4eb837cd71df 2652 }
kevin1990 28:4eb837cd71df 2653
kevin1990 28:4eb837cd71df 2654 WRITE_REG_FLOAT(hDevice, fHighThresholdLimit,
kevin1990 28:4eb837cd71df 2655 CORE_HIGH_THRESHOLD_LIMITn(eChannelId));
kevin1990 28:4eb837cd71df 2656 WRITE_REG_FLOAT(hDevice, fLowThresholdLimit,
kevin1990 28:4eb837cd71df 2657 CORE_LOW_THRESHOLD_LIMITn(eChannelId));
kevin1990 28:4eb837cd71df 2658
kevin1990 28:4eb837cd71df 2659 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2660 }
kevin1990 28:4eb837cd71df 2661
kevin1990 28:4eb837cd71df 2662 ADI_SENSE_RESULT adi_sense_1000_SetOffsetGain(
kevin1990 28:4eb837cd71df 2663 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2664 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2665 float32_t fOffsetAdjustment,
kevin1990 28:4eb837cd71df 2666 float32_t fGainAdjustment)
kevin1990 28:4eb837cd71df 2667 {
kevin1990 28:4eb837cd71df 2668 /* Replace with default values if NaNs are specified (or 0.0 for gain) */
kevin1990 28:4eb837cd71df 2669 if (isnan(fGainAdjustment) || (fGainAdjustment == 0.0f))
kevin1990 28:4eb837cd71df 2670 fGainAdjustment = 1.0f;
kevin1990 28:4eb837cd71df 2671 if (isnan(fOffsetAdjustment))
kevin1990 28:4eb837cd71df 2672 fOffsetAdjustment = 0.0f;
kevin1990 28:4eb837cd71df 2673
kevin1990 28:4eb837cd71df 2674 WRITE_REG_FLOAT(hDevice, fGainAdjustment, CORE_SENSOR_GAINn(eChannelId));
kevin1990 28:4eb837cd71df 2675 WRITE_REG_FLOAT(hDevice, fOffsetAdjustment, CORE_SENSOR_OFFSETn(eChannelId));
kevin1990 28:4eb837cd71df 2676
kevin1990 28:4eb837cd71df 2677 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2678 }
kevin1990 28:4eb837cd71df 2679
kevin1990 28:4eb837cd71df 2680 ADI_SENSE_RESULT adi_sense_1000_SetSensorParameter(
kevin1990 28:4eb837cd71df 2681 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2682 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2683 float32_t fSensorParam)
kevin1990 28:4eb837cd71df 2684 {
kevin1990 28:4eb837cd71df 2685 if (fSensorParam == 0.0)
kevin1990 28:4eb837cd71df 2686 fSensorParam = NAN;
kevin1990 28:4eb837cd71df 2687
kevin1990 28:4eb837cd71df 2688 WRITE_REG_FLOAT(hDevice, fSensorParam, CORE_SENSOR_PARAMETERn(eChannelId));
kevin1990 28:4eb837cd71df 2689
kevin1990 28:4eb837cd71df 2690 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2691 }
kevin1990 28:4eb837cd71df 2692
kevin1990 28:4eb837cd71df 2693 ADI_SENSE_RESULT adi_sense_1000_SetChannelSettlingTime(
kevin1990 28:4eb837cd71df 2694 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2695 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2696 uint32_t nSettlingTime)
kevin1990 28:4eb837cd71df 2697 {
kevin1990 28:4eb837cd71df 2698 ADI_ADISENSE_CORE_Settling_Time_t settlingTimeReg;
kevin1990 28:4eb837cd71df 2699
ADIJake 33:ea9e60457591 2700 if (nSettlingTime < (1 << 12)) {
kevin1990 28:4eb837cd71df 2701 settlingTimeReg.Settling_Time_Units = ADISENSE_CORE_SETTLING_TIME_MICROSECONDS;
ADIJake 33:ea9e60457591 2702 } else if (nSettlingTime < (1000 * (1 << 12))) {
kevin1990 28:4eb837cd71df 2703 settlingTimeReg.Settling_Time_Units = ADISENSE_CORE_SETTLING_TIME_MILLISECONDS;
kevin1990 28:4eb837cd71df 2704 nSettlingTime /= 1000;
ADIJake 33:ea9e60457591 2705 } else {
kevin1990 28:4eb837cd71df 2706 settlingTimeReg.Settling_Time_Units = ADISENSE_CORE_SETTLING_TIME_SECONDS;
kevin1990 28:4eb837cd71df 2707 nSettlingTime /= 1000000;
kevin1990 28:4eb837cd71df 2708 }
kevin1990 28:4eb837cd71df 2709
kevin1990 28:4eb837cd71df 2710 CHECK_REG_FIELD_VAL(CORE_SETTLING_TIME_SETTLING_TIME, nSettlingTime);
kevin1990 28:4eb837cd71df 2711 settlingTimeReg.Settling_Time = nSettlingTime;
kevin1990 28:4eb837cd71df 2712
kevin1990 28:4eb837cd71df 2713 WRITE_REG_U16(hDevice, settlingTimeReg.VALUE16, CORE_SETTLING_TIMEn(eChannelId));
kevin1990 28:4eb837cd71df 2714
kevin1990 28:4eb837cd71df 2715 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2716 }
kevin1990 28:4eb837cd71df 2717
kevin1990 28:4eb837cd71df 2718 ADI_SENSE_RESULT adi_sense_1000_SetChannelConfig(
kevin1990 28:4eb837cd71df 2719 ADI_SENSE_DEVICE_HANDLE hDevice,
kevin1990 28:4eb837cd71df 2720 ADI_SENSE_1000_CHANNEL_ID eChannelId,
kevin1990 28:4eb837cd71df 2721 ADI_SENSE_1000_CHANNEL_CONFIG *pChannelConfig)
kevin1990 28:4eb837cd71df 2722 {
kevin1990 28:4eb837cd71df 2723 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 2724
ADIJake 33:ea9e60457591 2725 if (! ADI_SENSE_1000_CHANNEL_IS_VIRTUAL(eChannelId)) {
kevin1990 28:4eb837cd71df 2726 /* If the channel is not enabled, disable it and return */
kevin1990 28:4eb837cd71df 2727 if (! pChannelConfig->enableChannel)
kevin1990 28:4eb837cd71df 2728 return adi_sense_1000_SetChannelCount(hDevice, eChannelId, 0);
kevin1990 28:4eb837cd71df 2729
kevin1990 28:4eb837cd71df 2730 eRet = adi_sense_1000_SetChannelCount(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2731 pChannelConfig->measurementsPerCycle);
ADIJake 33:ea9e60457591 2732 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2733 ADI_SENSE_LOG_ERROR("Failed to set measurement count for channel %d",
kevin1990 28:4eb837cd71df 2734 eChannelId);
kevin1990 28:4eb837cd71df 2735 return eRet;
kevin1990 28:4eb837cd71df 2736 }
kevin1990 28:4eb837cd71df 2737
kevin1990 28:4eb837cd71df 2738 eRet = adi_sense_1000_SetChannelOptions(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2739 pChannelConfig->priority,
kevin1990 28:4eb837cd71df 2740 pChannelConfig->enableFFT);
ADIJake 33:ea9e60457591 2741 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2742 ADI_SENSE_LOG_ERROR("Failed to set priority for channel %d",
kevin1990 28:4eb837cd71df 2743 eChannelId);
kevin1990 28:4eb837cd71df 2744 return eRet;
kevin1990 28:4eb837cd71df 2745 }
kevin1990 28:4eb837cd71df 2746
kevin1990 28:4eb837cd71df 2747 eRet = adi_sense_1000_SetChannelSkipCount(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2748 pChannelConfig->cycleSkipCount);
ADIJake 33:ea9e60457591 2749 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2750 ADI_SENSE_LOG_ERROR("Failed to set cycle skip count for channel %d",
kevin1990 28:4eb837cd71df 2751 eChannelId);
kevin1990 28:4eb837cd71df 2752 return eRet;
kevin1990 28:4eb837cd71df 2753 }
kevin1990 28:4eb837cd71df 2754
ADIJake 33:ea9e60457591 2755 switch (eChannelId) {
ADIJake 33:ea9e60457591 2756 case ADI_SENSE_1000_CHANNEL_ID_CJC_0:
ADIJake 33:ea9e60457591 2757 case ADI_SENSE_1000_CHANNEL_ID_CJC_1:
ADIJake 33:ea9e60457591 2758 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_0:
ADIJake 33:ea9e60457591 2759 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_1:
ADIJake 33:ea9e60457591 2760 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_2:
ADIJake 33:ea9e60457591 2761 case ADI_SENSE_1000_CHANNEL_ID_SENSOR_3:
ADIJake 33:ea9e60457591 2762 case ADI_SENSE_1000_CHANNEL_ID_VOLTAGE_0:
ADIJake 33:ea9e60457591 2763 case ADI_SENSE_1000_CHANNEL_ID_CURRENT_0:
ADIJake 33:ea9e60457591 2764 eRet = adi_sense_SetAdcChannelConfig(hDevice, eChannelId, pChannelConfig);
ADIJake 33:ea9e60457591 2765 break;
ADIJake 33:ea9e60457591 2766 case ADI_SENSE_1000_CHANNEL_ID_I2C_0:
ADIJake 33:ea9e60457591 2767 case ADI_SENSE_1000_CHANNEL_ID_I2C_1:
ADIJake 33:ea9e60457591 2768 eRet = adi_sense_SetI2cChannelConfig(hDevice, eChannelId, pChannelConfig);
ADIJake 33:ea9e60457591 2769 break;
ADIJake 33:ea9e60457591 2770 case ADI_SENSE_1000_CHANNEL_ID_SPI_0:
ADIJake 33:ea9e60457591 2771 eRet = adi_sense_SetSpiChannelConfig(hDevice, eChannelId, pChannelConfig);
ADIJake 33:ea9e60457591 2772 break;
ADIJake 33:ea9e60457591 2773 case ADI_SENSE_1000_CHANNEL_ID_UART:
ADIJake 33:ea9e60457591 2774 eRet = adi_sense_SetUartChannelConfig(hDevice, eChannelId, pChannelConfig);
ADIJake 33:ea9e60457591 2775 break;
ADIJake 33:ea9e60457591 2776 default:
ADIJake 33:ea9e60457591 2777 ADI_SENSE_LOG_ERROR("Invalid channel ID %d specified", eChannelId);
ADIJake 33:ea9e60457591 2778 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2779 }
kevin1990 28:4eb837cd71df 2780
kevin1990 28:4eb837cd71df 2781 eRet = adi_sense_1000_SetChannelSettlingTime(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2782 pChannelConfig->extraSettlingTime);
ADIJake 33:ea9e60457591 2783 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2784 ADI_SENSE_LOG_ERROR("Failed to set settling time for channel %d",
kevin1990 28:4eb837cd71df 2785 eChannelId);
kevin1990 28:4eb837cd71df 2786 return eRet;
kevin1990 28:4eb837cd71df 2787 }
kevin1990 28:4eb837cd71df 2788 }
kevin1990 28:4eb837cd71df 2789
ADIJake 33:ea9e60457591 2790 if (pChannelConfig->enableChannel) {
kevin1990 28:4eb837cd71df 2791 /* Threshold limits can be configured individually for virtual channels */
kevin1990 28:4eb837cd71df 2792 eRet = adi_sense_1000_SetChannelThresholdLimits(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2793 pChannelConfig->highThreshold,
ADIJake 33:ea9e60457591 2794 pChannelConfig->lowThreshold);
ADIJake 33:ea9e60457591 2795 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2796 ADI_SENSE_LOG_ERROR("Failed to set threshold limits for channel %d",
kevin1990 28:4eb837cd71df 2797 eChannelId);
kevin1990 28:4eb837cd71df 2798 return eRet;
kevin1990 28:4eb837cd71df 2799 }
kevin1990 28:4eb837cd71df 2800
kevin1990 28:4eb837cd71df 2801 /* Offset and gain can be configured individually for virtual channels */
kevin1990 28:4eb837cd71df 2802 eRet = adi_sense_1000_SetOffsetGain(hDevice, eChannelId,
kevin1990 28:4eb837cd71df 2803 pChannelConfig->offsetAdjustment,
kevin1990 28:4eb837cd71df 2804 pChannelConfig->gainAdjustment);
ADIJake 33:ea9e60457591 2805 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2806 ADI_SENSE_LOG_ERROR("Failed to set offset/gain for channel %d",
kevin1990 28:4eb837cd71df 2807 eChannelId);
kevin1990 28:4eb837cd71df 2808 return eRet;
kevin1990 28:4eb837cd71df 2809 }
kevin1990 28:4eb837cd71df 2810
kevin1990 28:4eb837cd71df 2811 /* Set sensor specific parameter */
kevin1990 28:4eb837cd71df 2812 eRet = adi_sense_1000_SetSensorParameter(hDevice, eChannelId,
ADIJake 33:ea9e60457591 2813 pChannelConfig->sensorParameter);
ADIJake 33:ea9e60457591 2814 if (eRet != ADI_SENSE_SUCCESS) {
kevin1990 28:4eb837cd71df 2815 ADI_SENSE_LOG_ERROR("Failed to set sensor parameter for channel %d",
kevin1990 28:4eb837cd71df 2816 eChannelId);
kevin1990 28:4eb837cd71df 2817 return eRet;
kevin1990 28:4eb837cd71df 2818 }
kevin1990 28:4eb837cd71df 2819 }
kevin1990 28:4eb837cd71df 2820
kevin1990 28:4eb837cd71df 2821 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2822 }
kevin1990 28:4eb837cd71df 2823
kevin1990 28:4eb837cd71df 2824 ADI_SENSE_RESULT adi_sense_SetConfig(
kevin1990 28:4eb837cd71df 2825 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 2826 ADI_SENSE_CONFIG * const pConfig)
kevin1990 28:4eb837cd71df 2827 {
kevin1990 28:4eb837cd71df 2828 ADI_SENSE_1000_CONFIG *pDeviceConfig;
kevin1990 28:4eb837cd71df 2829 ADI_SENSE_PRODUCT_ID productId;
kevin1990 28:4eb837cd71df 2830 ADI_SENSE_RESULT eRet;
kevin1990 28:4eb837cd71df 2831
ADIJake 33:ea9e60457591 2832 if (pConfig->productId != ADI_SENSE_PRODUCT_ID_ADSNS1000) {
kevin1990 28:4eb837cd71df 2833 ADI_SENSE_LOG_ERROR("Configuration Product ID (0x%X) is not supported (0x%0X)",
kevin1990 28:4eb837cd71df 2834 pConfig->productId, ADI_SENSE_PRODUCT_ID_ADSNS1000);
kevin1990 28:4eb837cd71df 2835 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2836 }
kevin1990 28:4eb837cd71df 2837
kevin1990 28:4eb837cd71df 2838 /* Check that the actual Product ID is a match? */
kevin1990 28:4eb837cd71df 2839 eRet = adi_sense_GetProductID(hDevice, &productId);
ADIJake 33:ea9e60457591 2840 if (eRet) {
kevin1990 28:4eb837cd71df 2841 ADI_SENSE_LOG_ERROR("Failed to read device Product ID register");
kevin1990 28:4eb837cd71df 2842 return eRet;
kevin1990 28:4eb837cd71df 2843 }
ADIJake 33:ea9e60457591 2844 if (pConfig->productId != productId) {
kevin1990 28:4eb837cd71df 2845 ADI_SENSE_LOG_ERROR("Configuration Product ID (0x%X) does not match device (0x%0X)",
kevin1990 28:4eb837cd71df 2846 pConfig->productId, productId);
kevin1990 28:4eb837cd71df 2847 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2848 }
kevin1990 28:4eb837cd71df 2849
kevin1990 28:4eb837cd71df 2850 pDeviceConfig = &pConfig->adisense1000;
kevin1990 28:4eb837cd71df 2851
kevin1990 28:4eb837cd71df 2852 eRet = adi_sense_1000_SetPowerConfig(hDevice, &pDeviceConfig->power);
ADIJake 33:ea9e60457591 2853 if (eRet) {
kevin1990 28:4eb837cd71df 2854 ADI_SENSE_LOG_ERROR("Failed to set power configuration");
kevin1990 28:4eb837cd71df 2855 return eRet;
kevin1990 28:4eb837cd71df 2856 }
kevin1990 28:4eb837cd71df 2857
kevin1990 28:4eb837cd71df 2858 eRet = adi_sense_1000_SetMeasurementConfig(hDevice, &pDeviceConfig->measurement);
ADIJake 33:ea9e60457591 2859 if (eRet) {
kevin1990 28:4eb837cd71df 2860 ADI_SENSE_LOG_ERROR("Failed to set measurement configuration");
kevin1990 28:4eb837cd71df 2861 return eRet;
kevin1990 28:4eb837cd71df 2862 }
kevin1990 28:4eb837cd71df 2863
kevin1990 28:4eb837cd71df 2864 eRet = adi_sense_1000_SetDiagnosticsConfig(hDevice, &pDeviceConfig->diagnostics);
ADIJake 33:ea9e60457591 2865 if (eRet) {
kevin1990 28:4eb837cd71df 2866 ADI_SENSE_LOG_ERROR("Failed to set diagnostics configuration");
kevin1990 28:4eb837cd71df 2867 return eRet;
kevin1990 28:4eb837cd71df 2868 }
kevin1990 28:4eb837cd71df 2869
kevin1990 28:4eb837cd71df 2870 for (ADI_SENSE_1000_CHANNEL_ID id = ADI_SENSE_1000_CHANNEL_ID_CJC_0;
ADIJake 33:ea9e60457591 2871 id < ADI_SENSE_1000_MAX_CHANNELS;
ADIJake 33:ea9e60457591 2872 id++) {
kevin1990 28:4eb837cd71df 2873 eRet = adi_sense_1000_SetChannelConfig(hDevice, id,
kevin1990 28:4eb837cd71df 2874 &pDeviceConfig->channels[id]);
ADIJake 33:ea9e60457591 2875 if (eRet) {
kevin1990 28:4eb837cd71df 2876 ADI_SENSE_LOG_ERROR("Failed to set channel %d configuration", id);
kevin1990 28:4eb837cd71df 2877 return eRet;
kevin1990 28:4eb837cd71df 2878 }
kevin1990 28:4eb837cd71df 2879 }
kevin1990 28:4eb837cd71df 2880
kevin1990 28:4eb837cd71df 2881 eRet = adi_sense_1000_SetFftConfig(hDevice, &pDeviceConfig->fft,
kevin1990 28:4eb837cd71df 2882 pDeviceConfig->channels);
ADIJake 33:ea9e60457591 2883 if (eRet) {
kevin1990 28:4eb837cd71df 2884 ADI_SENSE_LOG_ERROR("Failed to set FFT configuration");
kevin1990 28:4eb837cd71df 2885 return eRet;
kevin1990 28:4eb837cd71df 2886 }
kevin1990 28:4eb837cd71df 2887
kevin1990 28:4eb837cd71df 2888 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2889 }
kevin1990 28:4eb837cd71df 2890
kevin1990 28:4eb837cd71df 2891 ADI_SENSE_RESULT adi_sense_1000_SetLutData(
kevin1990 28:4eb837cd71df 2892 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 2893 ADI_SENSE_1000_LUT * const pLutData)
kevin1990 28:4eb837cd71df 2894 {
kevin1990 28:4eb837cd71df 2895 ADI_SENSE_1000_LUT_HEADER *pLutHeader = &pLutData->header;
kevin1990 28:4eb837cd71df 2896 ADI_SENSE_1000_LUT_TABLE *pLutTable = pLutData->tables;
kevin1990 28:4eb837cd71df 2897 unsigned actualLength = 0;
kevin1990 28:4eb837cd71df 2898
ADIJake 33:ea9e60457591 2899 if (pLutData->header.signature != ADI_SENSE_LUT_SIGNATURE) {
kevin1990 28:4eb837cd71df 2900 ADI_SENSE_LOG_ERROR("LUT signature incorrect (expected 0x%X, actual 0x%X)",
kevin1990 28:4eb837cd71df 2901 ADI_SENSE_LUT_SIGNATURE, pLutHeader->signature);
kevin1990 28:4eb837cd71df 2902 return ADI_SENSE_INVALID_SIGNATURE;
kevin1990 28:4eb837cd71df 2903 }
kevin1990 28:4eb837cd71df 2904
ADIJake 33:ea9e60457591 2905 for (unsigned i = 0; i < pLutHeader->numTables; i++) {
kevin1990 28:4eb837cd71df 2906 ADI_SENSE_1000_LUT_DESCRIPTOR *pDesc = &pLutTable->descriptor;
kevin1990 28:4eb837cd71df 2907 ADI_SENSE_1000_LUT_TABLE_DATA *pData = &pLutTable->data;
kevin1990 28:4eb837cd71df 2908 unsigned short calculatedCrc;
kevin1990 28:4eb837cd71df 2909
ADIJake 33:ea9e60457591 2910 switch (pDesc->geometry) {
ADIJake 33:ea9e60457591 2911 case ADI_SENSE_1000_LUT_GEOMETRY_COEFFS:
ADIJake 33:ea9e60457591 2912 switch (pDesc->equation) {
ADIJake 33:ea9e60457591 2913 case ADI_SENSE_1000_LUT_EQUATION_POLYN:
ADIJake 33:ea9e60457591 2914 case ADI_SENSE_1000_LUT_EQUATION_POLYNEXP:
ADIJake 33:ea9e60457591 2915 case ADI_SENSE_1000_LUT_EQUATION_QUADRATIC:
ADIJake 33:ea9e60457591 2916 case ADI_SENSE_1000_LUT_EQUATION_STEINHART:
ADIJake 33:ea9e60457591 2917 case ADI_SENSE_1000_LUT_EQUATION_LOGARITHMIC:
ADIJake 33:ea9e60457591 2918 case ADI_SENSE_1000_LUT_EQUATION_EXPONENTIAL:
ADIJake 33:ea9e60457591 2919 case ADI_SENSE_1000_LUT_EQUATION_BIVARIATE_POLYN:
ADIJake 33:ea9e60457591 2920 break;
ADIJake 33:ea9e60457591 2921 default:
ADIJake 33:ea9e60457591 2922 ADI_SENSE_LOG_ERROR("Invalid equation %u specified for LUT table %u",
ADIJake 33:ea9e60457591 2923 pDesc->equation, i);
ADIJake 33:ea9e60457591 2924 return ADI_SENSE_INVALID_PARAM;
ADIJake 33:ea9e60457591 2925 }
kevin1990 28:4eb837cd71df 2926 break;
ADIJake 33:ea9e60457591 2927 case ADI_SENSE_1000_LUT_GEOMETRY_NES_1D:
ADIJake 33:ea9e60457591 2928 case ADI_SENSE_1000_LUT_GEOMETRY_NES_2D:
ADIJake 33:ea9e60457591 2929 case ADI_SENSE_1000_LUT_GEOMETRY_ES_1D:
ADIJake 33:ea9e60457591 2930 case ADI_SENSE_1000_LUT_GEOMETRY_ES_2D:
kevin1990 28:4eb837cd71df 2931 if (pDesc->equation != ADI_SENSE_1000_LUT_EQUATION_LUT) {
kevin1990 28:4eb837cd71df 2932 ADI_SENSE_LOG_ERROR("Invalid equation %u specified for LUT table %u",
kevin1990 28:4eb837cd71df 2933 pDesc->equation, i);
kevin1990 28:4eb837cd71df 2934 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2935 }
ADIJake 33:ea9e60457591 2936 break;
ADIJake 33:ea9e60457591 2937 default:
ADIJake 33:ea9e60457591 2938 ADI_SENSE_LOG_ERROR("Invalid geometry %u specified for LUT table %u",
ADIJake 33:ea9e60457591 2939 pDesc->geometry, i);
ADIJake 33:ea9e60457591 2940 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2941 }
kevin1990 28:4eb837cd71df 2942
ADIJake 33:ea9e60457591 2943 switch (pDesc->dataType) {
ADIJake 33:ea9e60457591 2944 case ADI_SENSE_1000_LUT_DATA_TYPE_FLOAT32:
ADIJake 33:ea9e60457591 2945 case ADI_SENSE_1000_LUT_DATA_TYPE_FLOAT64:
ADIJake 33:ea9e60457591 2946 break;
ADIJake 33:ea9e60457591 2947 default:
ADIJake 33:ea9e60457591 2948 ADI_SENSE_LOG_ERROR("Invalid vector format %u specified for LUT table %u",
ADIJake 33:ea9e60457591 2949 pDesc->dataType, i);
ADIJake 33:ea9e60457591 2950 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 2951 }
kevin1990 28:4eb837cd71df 2952
kevin1990 28:4eb837cd71df 2953 calculatedCrc = adi_sense_crc16_ccitt(pData, pDesc->length);
ADIJake 33:ea9e60457591 2954 if (calculatedCrc != pDesc->crc16) {
kevin1990 28:4eb837cd71df 2955 ADI_SENSE_LOG_ERROR("CRC validation failed on LUT table %u (expected 0x%04X, actual 0x%04X)",
kevin1990 28:4eb837cd71df 2956 i, pDesc->crc16, calculatedCrc);
kevin1990 28:4eb837cd71df 2957 return ADI_SENSE_CRC_ERROR;
kevin1990 28:4eb837cd71df 2958 }
kevin1990 28:4eb837cd71df 2959
kevin1990 28:4eb837cd71df 2960 actualLength += sizeof(*pDesc) + pDesc->length;
kevin1990 28:4eb837cd71df 2961
kevin1990 28:4eb837cd71df 2962 /* Move to the next look-up table */
kevin1990 28:4eb837cd71df 2963 pLutTable = (ADI_SENSE_1000_LUT_TABLE *)((uint8_t *)pLutTable + sizeof(*pDesc) + pDesc->length);
kevin1990 28:4eb837cd71df 2964 }
kevin1990 28:4eb837cd71df 2965
ADIJake 33:ea9e60457591 2966 if (actualLength != pLutHeader->totalLength) {
kevin1990 28:4eb837cd71df 2967 ADI_SENSE_LOG_ERROR("LUT table length mismatch (expected %u, actual %u)",
kevin1990 28:4eb837cd71df 2968 pLutHeader->totalLength, actualLength);
kevin1990 28:4eb837cd71df 2969 return ADI_SENSE_WRONG_SIZE;
kevin1990 28:4eb837cd71df 2970 }
kevin1990 28:4eb837cd71df 2971
ADIJake 33:ea9e60457591 2972 if (sizeof(*pLutHeader) + pLutHeader->totalLength > ADI_SENSE_LUT_MAX_SIZE) {
kevin1990 28:4eb837cd71df 2973 ADI_SENSE_LOG_ERROR("Maximum LUT table length (%u bytes) exceeded",
kevin1990 28:4eb837cd71df 2974 ADI_SENSE_LUT_MAX_SIZE);
kevin1990 28:4eb837cd71df 2975 return ADI_SENSE_WRONG_SIZE;
kevin1990 28:4eb837cd71df 2976 }
kevin1990 28:4eb837cd71df 2977
kevin1990 28:4eb837cd71df 2978 /* Write the LUT data to the device */
kevin1990 28:4eb837cd71df 2979 unsigned lutSize = sizeof(*pLutHeader) + pLutHeader->totalLength;
kevin1990 28:4eb837cd71df 2980 WRITE_REG_U16(hDevice, 0, CORE_LUT_OFFSET);
kevin1990 28:4eb837cd71df 2981 WRITE_REG_U8_ARRAY(hDevice, (uint8_t *)pLutData, lutSize, CORE_LUT_DATA);
kevin1990 28:4eb837cd71df 2982
kevin1990 28:4eb837cd71df 2983 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 2984 }
kevin1990 28:4eb837cd71df 2985
kevin1990 28:4eb837cd71df 2986 ADI_SENSE_RESULT adi_sense_1000_SetLutDataRaw(
kevin1990 28:4eb837cd71df 2987 ADI_SENSE_DEVICE_HANDLE const hDevice,
kevin1990 28:4eb837cd71df 2988 ADI_SENSE_1000_LUT_RAW * const pLutData)
kevin1990 28:4eb837cd71df 2989 {
kevin1990 28:4eb837cd71df 2990 return adi_sense_1000_SetLutData(hDevice,
kevin1990 28:4eb837cd71df 2991 (ADI_SENSE_1000_LUT *)pLutData);
kevin1990 28:4eb837cd71df 2992 }
kevin1990 28:4eb837cd71df 2993
kevin1990 28:4eb837cd71df 2994 static ADI_SENSE_RESULT getLutTableSize(
kevin1990 28:4eb837cd71df 2995 ADI_SENSE_1000_LUT_DESCRIPTOR * const pDesc,
kevin1990 28:4eb837cd71df 2996 ADI_SENSE_1000_LUT_TABLE_DATA * const pData,
kevin1990 28:4eb837cd71df 2997 unsigned *pLength)
kevin1990 28:4eb837cd71df 2998 {
ADIJake 33:ea9e60457591 2999 switch (pDesc->geometry) {
ADIJake 33:ea9e60457591 3000 case ADI_SENSE_1000_LUT_GEOMETRY_COEFFS:
ADIJake 33:ea9e60457591 3001 if (pDesc->equation == ADI_SENSE_1000_LUT_EQUATION_BIVARIATE_POLYN)
ADIJake 33:ea9e60457591 3002 *pLength = ADI_SENSE_1000_LUT_2D_POLYN_COEFF_LIST_SIZE(pData->coeffList2d);
ADIJake 33:ea9e60457591 3003 else
ADIJake 33:ea9e60457591 3004 *pLength = ADI_SENSE_1000_LUT_COEFF_LIST_SIZE(pData->coeffList);
ADIJake 33:ea9e60457591 3005 break;
ADIJake 33:ea9e60457591 3006 case ADI_SENSE_1000_LUT_GEOMETRY_NES_1D:
ADIJake 33:ea9e60457591 3007 *pLength = ADI_SENSE_1000_LUT_1D_NES_SIZE(pData->lut1dNes);
ADIJake 33:ea9e60457591 3008 break;
ADIJake 33:ea9e60457591 3009 case ADI_SENSE_1000_LUT_GEOMETRY_NES_2D:
ADIJake 33:ea9e60457591 3010 *pLength = ADI_SENSE_1000_LUT_2D_NES_SIZE(pData->lut2dNes);
ADIJake 33:ea9e60457591 3011 break;
ADIJake 33:ea9e60457591 3012 case ADI_SENSE_1000_LUT_GEOMETRY_ES_1D:
ADIJake 33:ea9e60457591 3013 *pLength = ADI_SENSE_1000_LUT_1D_ES_SIZE(pData->lut1dEs);
ADIJake 33:ea9e60457591 3014 break;
ADIJake 33:ea9e60457591 3015 case ADI_SENSE_1000_LUT_GEOMETRY_ES_2D:
ADIJake 33:ea9e60457591 3016 *pLength = ADI_SENSE_1000_LUT_2D_ES_SIZE(pData->lut2dEs);
ADIJake 33:ea9e60457591 3017 break;
ADIJake 33:ea9e60457591 3018 default:
ADIJake 33:ea9e60457591 3019 ADI_SENSE_LOG_ERROR("Invalid LUT table geometry %d specified\r\n",
ADIJake 33:ea9e60457591 3020 pDesc->geometry);
ADIJake 33:ea9e60457591 3021 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 3022 }
kevin1990 28:4eb837cd71df 3023
kevin1990 28:4eb837cd71df 3024 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 3025 }
kevin1990 28:4eb837cd71df 3026
kevin1990 28:4eb837cd71df 3027 ADI_SENSE_RESULT adi_sense_1000_AssembleLutData(
kevin1990 28:4eb837cd71df 3028 ADI_SENSE_1000_LUT * pLutBuffer,
kevin1990 28:4eb837cd71df 3029 unsigned nLutBufferSize,
kevin1990 28:4eb837cd71df 3030 unsigned const nNumTables,
kevin1990 28:4eb837cd71df 3031 ADI_SENSE_1000_LUT_DESCRIPTOR * const ppDesc[],
kevin1990 28:4eb837cd71df 3032 ADI_SENSE_1000_LUT_TABLE_DATA * const ppData[])
kevin1990 28:4eb837cd71df 3033 {
kevin1990 28:4eb837cd71df 3034 ADI_SENSE_1000_LUT_HEADER *pHdr = &pLutBuffer->header;
kevin1990 28:4eb837cd71df 3035 uint8_t *pLutTableData = (uint8_t *)pLutBuffer + sizeof(*pHdr);
kevin1990 28:4eb837cd71df 3036
ADIJake 33:ea9e60457591 3037 if (sizeof(*pHdr) > nLutBufferSize) {
kevin1990 28:4eb837cd71df 3038 ADI_SENSE_LOG_ERROR("Insufficient LUT buffer size provided");
kevin1990 28:4eb837cd71df 3039 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 3040 }
kevin1990 28:4eb837cd71df 3041
kevin1990 28:4eb837cd71df 3042 /* First initialise the top-level header */
kevin1990 28:4eb837cd71df 3043 pHdr->signature = ADI_SENSE_LUT_SIGNATURE;
kevin1990 28:4eb837cd71df 3044 pHdr->version.major = 1;
kevin1990 28:4eb837cd71df 3045 pHdr->version.minor = 0;
kevin1990 28:4eb837cd71df 3046 pHdr->numTables = 0;
kevin1990 28:4eb837cd71df 3047 pHdr->totalLength = 0;
kevin1990 28:4eb837cd71df 3048
kevin1990 28:4eb837cd71df 3049 /*
kevin1990 28:4eb837cd71df 3050 * Walk through the list of table pointers provided, appending the table
kevin1990 28:4eb837cd71df 3051 * descriptor+data from each one to the provided LUT buffer
kevin1990 28:4eb837cd71df 3052 */
ADIJake 33:ea9e60457591 3053 for (unsigned i = 0; i < nNumTables; i++) {
kevin1990 28:4eb837cd71df 3054 ADI_SENSE_1000_LUT_DESCRIPTOR * const pDesc = ppDesc[i];
kevin1990 28:4eb837cd71df 3055 ADI_SENSE_1000_LUT_TABLE_DATA * const pData = ppData[i];
kevin1990 28:4eb837cd71df 3056 ADI_SENSE_RESULT res;
kevin1990 28:4eb837cd71df 3057 unsigned dataLength = 0;
kevin1990 28:4eb837cd71df 3058
kevin1990 28:4eb837cd71df 3059 /* Calculate the length of the table data */
kevin1990 28:4eb837cd71df 3060 res = getLutTableSize(pDesc, pData, &dataLength);
kevin1990 28:4eb837cd71df 3061 if (res != ADI_SENSE_SUCCESS)
kevin1990 28:4eb837cd71df 3062 return res;
kevin1990 28:4eb837cd71df 3063
kevin1990 28:4eb837cd71df 3064 /* Fill in the table descriptor length and CRC fields */
kevin1990 28:4eb837cd71df 3065 pDesc->length = dataLength;
kevin1990 28:4eb837cd71df 3066 pDesc->crc16 = adi_sense_crc16_ccitt(pData, dataLength);
kevin1990 28:4eb837cd71df 3067
ADIJake 33:ea9e60457591 3068 if ((sizeof(*pHdr) + pHdr->totalLength + sizeof(*pDesc) + dataLength) > nLutBufferSize) {
kevin1990 28:4eb837cd71df 3069 ADI_SENSE_LOG_ERROR("Insufficient LUT buffer size provided");
kevin1990 28:4eb837cd71df 3070 return ADI_SENSE_INVALID_PARAM;
kevin1990 28:4eb837cd71df 3071 }
kevin1990 28:4eb837cd71df 3072
kevin1990 28:4eb837cd71df 3073 /* Append the table to the LUT buffer (desc + data) */
kevin1990 28:4eb837cd71df 3074 memcpy(pLutTableData + pHdr->totalLength, pDesc, sizeof(*pDesc));
kevin1990 28:4eb837cd71df 3075 pHdr->totalLength += sizeof(*pDesc);
kevin1990 28:4eb837cd71df 3076 memcpy(pLutTableData + pHdr->totalLength, pData, dataLength);
kevin1990 28:4eb837cd71df 3077 pHdr->totalLength += dataLength;
kevin1990 28:4eb837cd71df 3078
kevin1990 28:4eb837cd71df 3079 pHdr->numTables++;
kevin1990 28:4eb837cd71df 3080 }
kevin1990 28:4eb837cd71df 3081
kevin1990 28:4eb837cd71df 3082 return ADI_SENSE_SUCCESS;
kevin1990 28:4eb837cd71df 3083 }