initial commit, reads dev id

Committer:
phonemacro
Date:
Fri Sep 02 22:34:45 2022 +0000
Revision:
7:ffa35f46725e
Parent:
5:1f7b8cb07e26
remove clock enable/disable in MAX8614X::read_fifo_data (that was only needed for Rev A)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
phonemacro 0:77ee0ceb503a 1 /*******************************************************************************
phonemacro 0:77ee0ceb503a 2 * Author: Ihsan Mert Ozcelik, Ihsan.Ozcelik@maximintegrated.com
phonemacro 0:77ee0ceb503a 3 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
phonemacro 0:77ee0ceb503a 4 *
phonemacro 0:77ee0ceb503a 5 * Permission is hereby granted, free of charge, to any person obtaining a
phonemacro 0:77ee0ceb503a 6 * copy of this software and associated documentation files (the "Software"),
phonemacro 0:77ee0ceb503a 7 * to deal in the Software without restriction, including without limitation
phonemacro 0:77ee0ceb503a 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
phonemacro 0:77ee0ceb503a 9 * and/or sell copies of the Software, and to permit persons to whom the
phonemacro 0:77ee0ceb503a 10 * Software is furnished to do so, subject to the following conditions:
phonemacro 0:77ee0ceb503a 11 *
phonemacro 0:77ee0ceb503a 12 * The above copyright notice and this permission notice shall be included
phonemacro 0:77ee0ceb503a 13 * in all copies or substantial portions of the Software.
phonemacro 0:77ee0ceb503a 14 *
phonemacro 0:77ee0ceb503a 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
phonemacro 0:77ee0ceb503a 16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
phonemacro 0:77ee0ceb503a 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
phonemacro 0:77ee0ceb503a 18 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
phonemacro 0:77ee0ceb503a 19 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
phonemacro 0:77ee0ceb503a 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
phonemacro 0:77ee0ceb503a 21 * OTHER DEALINGS IN THE SOFTWARE.
phonemacro 0:77ee0ceb503a 22 *
phonemacro 0:77ee0ceb503a 23 * Except as contained in this notice, the name of Maxim Integrated
phonemacro 0:77ee0ceb503a 24 * Products, Inc. shall not be used except as stated in the Maxim Integrated
phonemacro 0:77ee0ceb503a 25 * Products, Inc. Branding Policy.
phonemacro 0:77ee0ceb503a 26 *
phonemacro 0:77ee0ceb503a 27 * The mere transfer of this software does not imply any licenses
phonemacro 0:77ee0ceb503a 28 * of trade secrets, proprietary technology, copyrights, patents,
phonemacro 0:77ee0ceb503a 29 * trademarks, maskwork rights, or any other form of intellectual
phonemacro 0:77ee0ceb503a 30 * property whatsoever. Maxim Integrated Products, Inc. retains all
phonemacro 0:77ee0ceb503a 31 * ownership rights.
phonemacro 0:77ee0ceb503a 32 *******************************************************************************
phonemacro 0:77ee0ceb503a 33 */
phonemacro 0:77ee0ceb503a 34
phonemacro 0:77ee0ceb503a 35 #ifndef _MAX8614X_H_
phonemacro 0:77ee0ceb503a 36 #define _MAX8614X_H_
phonemacro 0:77ee0ceb503a 37
phonemacro 0:77ee0ceb503a 38 #include "mbed.h"
phonemacro 5:1f7b8cb07e26 39 #include "queue.h"
phonemacro 5:1f7b8cb07e26 40 #include "MaximSensor.h"
phonemacro 0:77ee0ceb503a 41
phonemacro 0:77ee0ceb503a 42 /**
phonemacro 0:77ee0ceb503a 43 @brief The MAX8614X
phonemacro 0:77ee0ceb503a 44 */
phonemacro 0:77ee0ceb503a 45
phonemacro 0:77ee0ceb503a 46 /**
phonemacro 0:77ee0ceb503a 47 @brief MAX8614X - supports MAX8614X object with SPI interface
phonemacro 0:77ee0ceb503a 48 */
phonemacro 5:1f7b8cb07e26 49 class MAX8614X: public MaximSensor
phonemacro 0:77ee0ceb503a 50 {
phonemacro 0:77ee0ceb503a 51 public:
phonemacro 0:77ee0ceb503a 52 /* PUBLIC CONST VARIABLES */
phonemacro 0:77ee0ceb503a 53
phonemacro 0:77ee0ceb503a 54 /* Return codes */
phonemacro 0:77ee0ceb503a 55 static const int8_t RTN_NO_ERROR = 0;
phonemacro 0:77ee0ceb503a 56 static const int8_t RTN_ERR_UNSOPPORTED_PART = -1;
phonemacro 0:77ee0ceb503a 57 static const int8_t RTN_ERR_WRONG_DATA_TYPE = -2;
phonemacro 0:77ee0ceb503a 58 static const int8_t RTN_ERR_NOT_8614x = -3;
phonemacro 0:77ee0ceb503a 59 static const int8_t RTN_ERR_MEM_ALLOC_FAIL = -4;
phonemacro 0:77ee0ceb503a 60 static const int8_t RTN_ERR_QUEUE_INIT = -5;
phonemacro 0:77ee0ceb503a 61 static const int8_t RTN_ERR_QUEUE_EMPTY = -6;
phonemacro 0:77ee0ceb503a 62
phonemacro 0:77ee0ceb503a 63 /* MAX8614X Registers */
phonemacro 0:77ee0ceb503a 64 enum Registers
phonemacro 0:77ee0ceb503a 65 {
phonemacro 0:77ee0ceb503a 66 MAX8614X_INT_STATUS1_REG = 0x00,
phonemacro 0:77ee0ceb503a 67 MAX8614X_INT_STATUS2_REG,
phonemacro 0:77ee0ceb503a 68 MAX8614X_INT_ENABLE1_REG,
phonemacro 0:77ee0ceb503a 69 MAX8614X_INT_ENABLE2_REG,
phonemacro 0:77ee0ceb503a 70 MAX8614X_FIFO_WR_PTR_REG,
phonemacro 0:77ee0ceb503a 71 MAX8614X_FIFO_RD_PTR_REG,
phonemacro 0:77ee0ceb503a 72 MAX8614X_OVF_CNT_REG,
phonemacro 0:77ee0ceb503a 73 MAX8614X_FIFO_DATA_CNT_REG,
phonemacro 0:77ee0ceb503a 74 MAX8614X_FIFO_DATA_REG,
phonemacro 0:77ee0ceb503a 75 MAX8614X_FIFO_CFG1_REG,
phonemacro 0:77ee0ceb503a 76 MAX8614X_FIFO_CFG2_REG, //0x0A
phonemacro 0:77ee0ceb503a 77 MAX8614X_SYSTEM_CTRL_REG = 0x0D,
phonemacro 0:77ee0ceb503a 78 MAX8614X_PPG_SYNC_CTRL_REG = 0x10,
phonemacro 0:77ee0ceb503a 79 MAX8614X_PPG_CFG1_REG,
phonemacro 0:77ee0ceb503a 80 MAX8614X_PPG_CFG2_REG,
phonemacro 0:77ee0ceb503a 81 MAX8614X_PPG_CFG3_REG,
phonemacro 0:77ee0ceb503a 82 MAX8614X_PROX_INT_THRES_REG,
phonemacro 0:77ee0ceb503a 83 MAX8614X_PHOTO_DIODE_BIAS_REG,
phonemacro 0:77ee0ceb503a 84 MAX8614X_FICKET_FENCE_REG, //0x16
phonemacro 0:77ee0ceb503a 85 MAX8614X_LED_SEQ1_REG = 0x20,
phonemacro 0:77ee0ceb503a 86 MAX8614X_LED_SEQ2_REG,
phonemacro 0:77ee0ceb503a 87 MAX8614X_LED_SEQ3_REG,
phonemacro 0:77ee0ceb503a 88 MAX8614X_LED1_PA_REG,
phonemacro 0:77ee0ceb503a 89 MAX8614X_LED2_PA_REG,
phonemacro 0:77ee0ceb503a 90 MAX8614X_LED3_PA_REG,
phonemacro 0:77ee0ceb503a 91 MAX8614X_LED4_PA_REG,
phonemacro 0:77ee0ceb503a 92 MAX8614X_LED5_PA_REG,
phonemacro 0:77ee0ceb503a 93 MAX8614X_LED6_PA_REG,
phonemacro 0:77ee0ceb503a 94 MAX8614X_LED_PILOT_PA_REG,
phonemacro 0:77ee0ceb503a 95 MAX8614X_LED_RANGE1_REG,
phonemacro 0:77ee0ceb503a 96 MAX8614X_LED_RANGE2_REG, //0x2B
phonemacro 0:77ee0ceb503a 97 MAX8614X_DIE_TEMP_CFG_REG = 0x40,
phonemacro 0:77ee0ceb503a 98 MAX8614X_DIE_TEMP_INT_REG,
phonemacro 0:77ee0ceb503a 99 MAX8614X_DIE_TEMP_FRAC_REG,
phonemacro 0:77ee0ceb503a 100 MAX8614X_SHA_CMD_REG = 0xF0,
phonemacro 0:77ee0ceb503a 101 MAX8614X_SHA_CFG_REG,
phonemacro 0:77ee0ceb503a 102 MAX8614X_MEMORY_CONTROL_REG,
phonemacro 0:77ee0ceb503a 103 MAX8614X_MEMORY_INDEX_REG,
phonemacro 0:77ee0ceb503a 104 MAX8614X_MEMORY_DATA_REG,
phonemacro 0:77ee0ceb503a 105 MAX8614X_REV_ID_REG = 0xFE,
phonemacro 0:77ee0ceb503a 106 MAX8614X_PART_ID_REG,
phonemacro 0:77ee0ceb503a 107
phonemacro 0:77ee0ceb503a 108 };
phonemacro 0:77ee0ceb503a 109
phonemacro 0:77ee0ceb503a 110 /*System Control*/
phonemacro 0:77ee0ceb503a 111 static const uint8_t MAX8614X_SYSTEM_RESET_MASK = (0x01 << 0);
phonemacro 0:77ee0ceb503a 112 static const uint8_t MAX8614X_SYSTEM_SHDN_MASK = (0x01 << 1);
phonemacro 0:77ee0ceb503a 113 static const uint8_t MAX8614X_SYSTEM_LP_BOOST = (0x01 << 2);
phonemacro 0:77ee0ceb503a 114
phonemacro 0:77ee0ceb503a 115 /* Die Temperature */
phonemacro 0:77ee0ceb503a 116 static const uint8_t MAX8614X_DIE_TEMP_EN = (0x1 << 0);
phonemacro 0:77ee0ceb503a 117 static const uint8_t MAX8614X_DIE_TEMP_FRAC_MASK = (0xF << 0);
phonemacro 0:77ee0ceb503a 118
phonemacro 0:77ee0ceb503a 119 /* Sample rates */
phonemacro 0:77ee0ceb503a 120 static const uint8_t MAX8614X_PPG_SR_25_SPS = (0x00 << 3);
phonemacro 0:77ee0ceb503a 121 static const uint8_t MAX8614X_PPG_SR_50_SPS = (0x01 << 3);
phonemacro 0:77ee0ceb503a 122 static const uint8_t MAX8614X_PPG_SR_84_SPS = (0x02 << 3);
phonemacro 0:77ee0ceb503a 123 static const uint8_t MAX8614X_PPG_SR_100_SPS = (0x03 << 3);
phonemacro 0:77ee0ceb503a 124 static const uint8_t MAX8614X_PPG_SR_200_SPS = (0x04 << 3);
phonemacro 0:77ee0ceb503a 125 static const uint8_t MAX8614X_PPG_SR_400_SPS = (0x05 << 3);
phonemacro 0:77ee0ceb503a 126
phonemacro 0:77ee0ceb503a 127 /* LED Pulse Amplitude */
phonemacro 0:77ee0ceb503a 128 static const uint8_t MAX8614X_LED1_RGE_MASK = (0x3 << 0);
phonemacro 0:77ee0ceb503a 129 static const uint8_t MAX8614X_LED2_RGE_MASK = (0x3 << 2);
phonemacro 0:77ee0ceb503a 130 static const uint8_t MAX8614X_LED3_RGE_MASK = (0x3 << 4);
phonemacro 0:77ee0ceb503a 131
phonemacro 0:77ee0ceb503a 132 static const uint8_t MAX8614X_LED4_RGE_MASK = (0x3 << 0);
phonemacro 0:77ee0ceb503a 133 static const uint8_t MAX8614X_LED5_RGE_MASK = (0x3 << 2);
phonemacro 0:77ee0ceb503a 134 static const uint8_t MAX8614X_LED6_RGE_MASK = (0x3 << 4);
phonemacro 0:77ee0ceb503a 135
phonemacro 0:77ee0ceb503a 136 static const uint8_t MAX8614X_LED1_RGE_25mA_MASK = (0x0 << 0);
phonemacro 0:77ee0ceb503a 137 static const uint8_t MAX8614X_LED1_RGE_50mA_MASK = (0x1 << 0);
phonemacro 0:77ee0ceb503a 138 static const uint8_t MAX8614X_LED1_RGE_75mA_MASK = (0x2 << 0);
phonemacro 0:77ee0ceb503a 139 static const uint8_t MAX8614X_LED1_RGE_100mA_MASK = (0x3 << 0);
phonemacro 0:77ee0ceb503a 140
phonemacro 0:77ee0ceb503a 141 static const uint8_t MAX8614X_LED2_RGE_25mA_MASK = (0x0 << 2);
phonemacro 0:77ee0ceb503a 142 static const uint8_t MAX8614X_LED2_RGE_50mA_MASK = (0x1 << 2);
phonemacro 0:77ee0ceb503a 143 static const uint8_t MAX8614X_LED2_RGE_75mA_MASK = (0x2 << 2);
phonemacro 0:77ee0ceb503a 144 static const uint8_t MAX8614X_LED2_RGE_100mA_MASK = (0x3 << 2);
phonemacro 0:77ee0ceb503a 145
phonemacro 0:77ee0ceb503a 146 static const uint8_t MAX8614X_LED3_RGE_25mA_MASK = (0x0 << 4);
phonemacro 0:77ee0ceb503a 147 static const uint8_t MAX8614X_LED3_RGE_50mA_MASK = (0x1 << 4);
phonemacro 0:77ee0ceb503a 148 static const uint8_t MAX8614X_LED3_RGE_75mA_MASK = (0x2 << 4);
phonemacro 0:77ee0ceb503a 149 static const uint8_t MAX8614X_LED3_RGE_100mA_MASK = (0x3 << 4);
phonemacro 0:77ee0ceb503a 150
phonemacro 0:77ee0ceb503a 151 /* PPG PW */
phonemacro 0:77ee0ceb503a 152 static const uint8_t MAX8614X_PPG_LED_PW_14_4_US_MASK = (0 << 0);
phonemacro 0:77ee0ceb503a 153 static const uint8_t MAX8614X_PPG_LED_PW_28_8_US_MASK = (1 << 0);
phonemacro 0:77ee0ceb503a 154 static const uint8_t MAX8614X_PPG_LED_PW_57_6_US_MASK = (2 << 0);
phonemacro 0:77ee0ceb503a 155 static const uint8_t MAX8614X_PPG_LED_PW_115_2_US_MASK = (3 << 0);
phonemacro 0:77ee0ceb503a 156
phonemacro 0:77ee0ceb503a 157 /* PPG Range */
phonemacro 0:77ee0ceb503a 158 static const uint8_t MAX8614X_PPG1_ADC_RGE_4096_MASK = (0 << 2);
phonemacro 0:77ee0ceb503a 159 static const uint8_t MAX8614X_PPG1_ADC_RGE_8192_MASK = (1 << 2);
phonemacro 0:77ee0ceb503a 160 static const uint8_t MAX8614X_PPG1_ADC_RGE_16384_MASK = (2 << 2);
phonemacro 0:77ee0ceb503a 161 static const uint8_t MAX8614X_PPG1_ADC_RGE_32768_MASK = (3 << 2);
phonemacro 0:77ee0ceb503a 162
phonemacro 0:77ee0ceb503a 163 static const uint8_t MAX8614X_PPG2_ADC_RGE_4096_MASK = (0 << 4);
phonemacro 0:77ee0ceb503a 164 static const uint8_t MAX8614X_PPG2_ADC_RGE_8192_MASK = (1 << 4);
phonemacro 0:77ee0ceb503a 165 static const uint8_t MAX8614X_PPG2_ADC_RGE_16384_MASK = (2 << 4);
phonemacro 0:77ee0ceb503a 166 static const uint8_t MAX8614X_PPG2_ADC_RGE_32768_MASK = (3 << 4);
phonemacro 0:77ee0ceb503a 167
phonemacro 0:77ee0ceb503a 168 /* FIFO */
phonemacro 0:77ee0ceb503a 169 static const uint8_t MAX8614X_FIFO_WR_PTR_MASK = (0x7F << 0);
phonemacro 0:77ee0ceb503a 170 static const uint8_t MAX8614X_FIFO_RD_PTR_MASK = (0x7F << 0);
phonemacro 0:77ee0ceb503a 171 static const uint8_t MAX8614X_OVF_CNT_MASK = (0x7F << 0);
phonemacro 0:77ee0ceb503a 172 static const uint8_t MAX8614X_FIFO_A_FULL_MASK = (0x7F << 0);
phonemacro 0:77ee0ceb503a 173 static const uint8_t MAX8614X_FIFO_EN_MASK = (0x01 << 0);
phonemacro 0:77ee0ceb503a 174 static const uint8_t MAX8614X_FIFO_RO_MASK = (0x01 << 1);
phonemacro 0:77ee0ceb503a 175 static const uint8_t MAX8614X_A_FULL_TYPE_MASK = (0x01 << 2);
phonemacro 0:77ee0ceb503a 176 static const uint8_t MAX8614X_A_FULL_RPT = (0x00 << 2);
phonemacro 0:77ee0ceb503a 177 static const uint8_t MAX8614X_A_FULL_ONCE = (0x01 << 2);
phonemacro 0:77ee0ceb503a 178 static const uint8_t MAX8614X_FIFO_STAT_CLR_MASK = (0x01 << 3);
phonemacro 0:77ee0ceb503a 179 static const uint8_t MAX8614X_FLUSH_FIFO_MASK = (0x01 << 4);
phonemacro 0:77ee0ceb503a 180
phonemacro 0:77ee0ceb503a 181 /* Status */
phonemacro 0:77ee0ceb503a 182 static const uint8_t MAX8614X_INT1_EN_A_FULL_MASK = (0x1 << 7);
phonemacro 0:77ee0ceb503a 183 static const uint8_t MAX8614X_INT1_EN_DATA_RDY_MASK = (0x1 << 6);
phonemacro 0:77ee0ceb503a 184 static const uint8_t MAX8614X_INT1_EN_DIE_TEMP_MASK = (0x1 << 2);
phonemacro 0:77ee0ceb503a 185 static const uint8_t MAX8614X_INT1_EN_VDD_OOR_MASK = (0x1 << 1);
phonemacro 0:77ee0ceb503a 186
phonemacro 2:11e0b5b86e1e 187 /*SHA256 Control*/
phonemacro 2:11e0b5b86e1e 188 static const uint8_t MAX8614X_IE_SHA_DONE_EN = (0x01 << 0);
phonemacro 3:ad8f1059a0c5 189 static const uint8_t MAX8614X_SHACFG_SHA_START = (0x01 << 0);
phonemacro 3:ad8f1059a0c5 190 static const uint8_t MAX8614X_SHACFG_SHA_EN = (0x01 << 1);
phonemacro 2:11e0b5b86e1e 191 static const uint8_t MAX8614X_MEMCNTRL_BANK0_MASK = (0);
phonemacro 2:11e0b5b86e1e 192 static const uint8_t MAX8614X_MEMCNTRL_BANK1_MASK = (1);
phonemacro 2:11e0b5b86e1e 193 static const uint8_t MAX8614X_MEMCNTRL_WR_DIS_MASK = (0x01 << 0);
phonemacro 2:11e0b5b86e1e 194 static const uint8_t MAX8614X_MEMCNTRL_WR_EN_MASK = (0x01 << 1);
phonemacro 3:ad8f1059a0c5 195 static const uint8_t MAX8614X_SHACMD_MAC_ROM_ID = (0x35);
phonemacro 3:ad8f1059a0c5 196 static const uint8_t MAX8614X_SHACMD_MAC_NO_ROM_ID = (0x36);
phonemacro 5:1f7b8cb07e26 197
phonemacro 0:77ee0ceb503a 198 /* PUBLIC TYPE DEFINITIONS */
phonemacro 0:77ee0ceb503a 199 typedef struct RegisterMap {
phonemacro 0:77ee0ceb503a 200 uint8_t addr;
phonemacro 0:77ee0ceb503a 201 uint8_t val;
phonemacro 0:77ee0ceb503a 202 } RegisterMap_t;
phonemacro 5:1f7b8cb07e26 203
phonemacro 5:1f7b8cb07e26 204 /* PUBLIC FUNCTION DECLARATIONS */
phonemacro 5:1f7b8cb07e26 205
phonemacro 5:1f7b8cb07e26 206 MAX8614X(SPI &spiBus, DigitalOut &cs, PinName intPin);
phonemacro 5:1f7b8cb07e26 207
phonemacro 5:1f7b8cb07e26 208 int readRegister(uint8_t reg, uint8_t *data, int len);
phonemacro 5:1f7b8cb07e26 209
phonemacro 5:1f7b8cb07e26 210 int writeRegister(uint8_t reg, const uint8_t data);
phonemacro 5:1f7b8cb07e26 211
phonemacro 5:1f7b8cb07e26 212 int writeBlock(const RegisterMap reg_block[], unsigned int size);
phonemacro 5:1f7b8cb07e26 213
phonemacro 5:1f7b8cb07e26 214 int dequeue_from_fifo_queue(uint32_t *ir, uint32_t *red, uint32_t *green);
phonemacro 5:1f7b8cb07e26 215
phonemacro 5:1f7b8cb07e26 216 int get_part_info(uint8_t *part_id, uint8_t *rev_id);
phonemacro 5:1f7b8cb07e26 217
phonemacro 5:1f7b8cb07e26 218 int init();
phonemacro 5:1f7b8cb07e26 219
phonemacro 5:1f7b8cb07e26 220 const char *get_sensor_part_name();
phonemacro 5:1f7b8cb07e26 221
phonemacro 5:1f7b8cb07e26 222 const char *get_sensor_name();
phonemacro 5:1f7b8cb07e26 223
phonemacro 5:1f7b8cb07e26 224 int sensor_enable(int enable);
phonemacro 5:1f7b8cb07e26 225
phonemacro 5:1f7b8cb07e26 226 int agc_enable(int agc_enable);
phonemacro 5:1f7b8cb07e26 227
phonemacro 5:1f7b8cb07e26 228 int dump_registers();
phonemacro 5:1f7b8cb07e26 229 bool isShaComplete(void);
phonemacro 5:1f7b8cb07e26 230 void clearShaComplete(void);
phonemacro 5:1f7b8cb07e26 231
phonemacro 5:1f7b8cb07e26 232 /* PUBLIC VARIABLES */
phonemacro 5:1f7b8cb07e26 233 InterruptIn m_ir;
phonemacro 5:1f7b8cb07e26 234
phonemacro 5:1f7b8cb07e26 235 private:
phonemacro 5:1f7b8cb07e26 236 /* PRIVATE CONST VARIABLES */
phonemacro 5:1f7b8cb07e26 237 static const uint32_t MAX8614X_DATA_WORD_SIZE = 3;
phonemacro 5:1f7b8cb07e26 238 static const uint32_t MAX8614X_MAX_FIFO_DEPTH = 128;
phonemacro 5:1f7b8cb07e26 239 static const uint32_t MAX8614X_DATA_TYPE_MASK = (0x1F << 19);
phonemacro 5:1f7b8cb07e26 240 static const uint32_t MAX8614X_DRIVER_FIFO_SZ = (MAX8614X_MAX_FIFO_DEPTH * 4);
phonemacro 5:1f7b8cb07e26 241
phonemacro 5:1f7b8cb07e26 242 /* PRIVATE TYPE DEFINITIONS */
phonemacro 5:1f7b8cb07e26 243 enum LedSequence
phonemacro 5:1f7b8cb07e26 244 {
phonemacro 5:1f7b8cb07e26 245 DATA_SEQ_NONE,
phonemacro 5:1f7b8cb07e26 246 DATA_SEQ_LED1,
phonemacro 5:1f7b8cb07e26 247 DATA_SEQ_LED2,
phonemacro 5:1f7b8cb07e26 248 DATA_SEQ_LED3,
phonemacro 5:1f7b8cb07e26 249 DATA_SEQ_LED1_LED2,
phonemacro 5:1f7b8cb07e26 250 DATA_SEQ_LED1_LED3,
phonemacro 5:1f7b8cb07e26 251 DATA_SEQ_LED2_LED3,
phonemacro 5:1f7b8cb07e26 252 DATA_SEQ_LED1_LED2_LED3,
phonemacro 5:1f7b8cb07e26 253 DATA_SEQ_PILOT_LED1,
phonemacro 5:1f7b8cb07e26 254 DATA_SEQ_AMBIENT,
phonemacro 5:1f7b8cb07e26 255 DATA_SEQ_LED4_EXT_MUX,
phonemacro 5:1f7b8cb07e26 256 DATA_SEQ_LED5_EXT_MUX,
phonemacro 5:1f7b8cb07e26 257 DATA_SEQ_LED6_EXT_MUX,
phonemacro 5:1f7b8cb07e26 258 };
phonemacro 5:1f7b8cb07e26 259
phonemacro 5:1f7b8cb07e26 260 enum DataTypes
phonemacro 5:1f7b8cb07e26 261 {
phonemacro 5:1f7b8cb07e26 262 DATA_TYPE_PPG1_LEDC1 = 0x01,
phonemacro 5:1f7b8cb07e26 263 DATA_TYPE_PPG1_LEDC2,
phonemacro 5:1f7b8cb07e26 264 DATA_TYPE_PPG1_LEDC3,
phonemacro 5:1f7b8cb07e26 265 DATA_TYPE_PPG1_LEDC4,
phonemacro 5:1f7b8cb07e26 266 DATA_TYPE_PPG1_LEDC5,
phonemacro 5:1f7b8cb07e26 267 DATA_TYPE_PPG1_LEDC6,
phonemacro 5:1f7b8cb07e26 268 DATA_TYPE_PPG2_LEDC1,
phonemacro 5:1f7b8cb07e26 269 DATA_TYPE_PPG2_LEDC2,
phonemacro 5:1f7b8cb07e26 270 DATA_TYPE_PPG2_LEDC3,
phonemacro 5:1f7b8cb07e26 271 DATA_TYPE_PPG2_LEDC4,
phonemacro 5:1f7b8cb07e26 272 DATA_TYPE_PPG2_LEDC5,
phonemacro 5:1f7b8cb07e26 273 DATA_TYPE_PPG2_LEDC6,
phonemacro 5:1f7b8cb07e26 274 DATA_TYPE_PPF1_LEDC1,
phonemacro 5:1f7b8cb07e26 275 DATA_TYPE_PPF1_LEDC2,
phonemacro 5:1f7b8cb07e26 276 DATA_TYPE_PPF1_LEDC3,
phonemacro 5:1f7b8cb07e26 277 DATA_TYPE_PPF2_LEDC1 = 0x13,
phonemacro 5:1f7b8cb07e26 278 DATA_TYPE_PPF3_LEDC2,
phonemacro 5:1f7b8cb07e26 279 DATA_TYPE_PPF3_LEDC3,
phonemacro 5:1f7b8cb07e26 280 DATA_TYPE_PROX1 = 0x19,
phonemacro 5:1f7b8cb07e26 281 DATA_TYPE_PROX2,
phonemacro 5:1f7b8cb07e26 282 DATA_TYPE_INVALID_DATA = 0x1E,
phonemacro 5:1f7b8cb07e26 283 DATA_TYPE_TIME_STAMP,
phonemacro 5:1f7b8cb07e26 284 };
phonemacro 5:1f7b8cb07e26 285
phonemacro 5:1f7b8cb07e26 286 enum PartIDs
phonemacro 5:1f7b8cb07e26 287 {
phonemacro 5:1f7b8cb07e26 288 MAX86140_PART_ID_VAL = 0x24,
phonemacro 5:1f7b8cb07e26 289 MAX86141_PART_ID_VAL,
phonemacro 5:1f7b8cb07e26 290 MAX86142_PART_ID_VAL,
phonemacro 5:1f7b8cb07e26 291 MAX86143_PART_ID_VAL,
phonemacro 5:1f7b8cb07e26 292 };
phonemacro 5:1f7b8cb07e26 293
phonemacro 5:1f7b8cb07e26 294 enum LedRanges
phonemacro 5:1f7b8cb07e26 295 {
phonemacro 5:1f7b8cb07e26 296 LED_RANGE_0_50,
phonemacro 5:1f7b8cb07e26 297 LED_RANGE_50_100,
phonemacro 5:1f7b8cb07e26 298 LED_RANGE_100_150,
phonemacro 5:1f7b8cb07e26 299 LED_RANGE_150_200,
phonemacro 5:1f7b8cb07e26 300 };
phonemacro 5:1f7b8cb07e26 301
phonemacro 5:1f7b8cb07e26 302 enum LedRangeSteps
phonemacro 5:1f7b8cb07e26 303 {
phonemacro 5:1f7b8cb07e26 304 LED_RANGE_STEP_25uA = 120,
phonemacro 5:1f7b8cb07e26 305 LED_RANGE_STEP_50uA = 240,
phonemacro 5:1f7b8cb07e26 306 LED_RANGE_STEP_75uA = 360,
phonemacro 5:1f7b8cb07e26 307 LED_RANGE_STEP_100uA = 480,
phonemacro 5:1f7b8cb07e26 308 };
phonemacro 5:1f7b8cb07e26 309
phonemacro 5:1f7b8cb07e26 310 typedef enum {
phonemacro 5:1f7b8cb07e26 311 LED_1 = 0,
phonemacro 5:1f7b8cb07e26 312 LED_2,
phonemacro 5:1f7b8cb07e26 313 LED_3,
phonemacro 5:1f7b8cb07e26 314 LED_4,
phonemacro 5:1f7b8cb07e26 315 LED_5,
phonemacro 5:1f7b8cb07e26 316 LED_6,
phonemacro 5:1f7b8cb07e26 317 NUM_OF_LED,
phonemacro 5:1f7b8cb07e26 318 } max8614x_led_t;
phonemacro 5:1f7b8cb07e26 319
phonemacro 5:1f7b8cb07e26 320 enum LED_CTRL_SM {
phonemacro 5:1f7b8cb07e26 321 LED_PROX = 1,
phonemacro 5:1f7b8cb07e26 322 LED_DATA_ACQ,
phonemacro 5:1f7b8cb07e26 323 };
phonemacro 5:1f7b8cb07e26 324
phonemacro 5:1f7b8cb07e26 325 typedef union {
phonemacro 5:1f7b8cb07e26 326 struct {
phonemacro 5:1f7b8cb07e26 327 uint32_t val:19;
phonemacro 5:1f7b8cb07e26 328 uint32_t type:5;
phonemacro 5:1f7b8cb07e26 329 uint32_t:8;
phonemacro 5:1f7b8cb07e26 330 };
phonemacro 5:1f7b8cb07e26 331 uint32_t raw;
phonemacro 5:1f7b8cb07e26 332 } fifo_data_t;
phonemacro 5:1f7b8cb07e26 333
phonemacro 5:1f7b8cb07e26 334 typedef union {
phonemacro 5:1f7b8cb07e26 335 uint16_t val;
phonemacro 5:1f7b8cb07e26 336 struct {
phonemacro 5:1f7b8cb07e26 337 uint8_t tint;
phonemacro 5:1f7b8cb07e26 338 uint8_t frac:4;
phonemacro 5:1f7b8cb07e26 339 uint8_t:4;
phonemacro 5:1f7b8cb07e26 340 };
phonemacro 5:1f7b8cb07e26 341 } die_temp_t;
phonemacro 5:1f7b8cb07e26 342
phonemacro 5:1f7b8cb07e26 343 typedef union {
phonemacro 1:7ae9b934ee55 344 struct {
phonemacro 1:7ae9b934ee55 345 struct {
phonemacro 1:7ae9b934ee55 346 unsigned char pwr_rdy:1;
phonemacro 1:7ae9b934ee55 347 unsigned char vdd_oor:1;
phonemacro 1:7ae9b934ee55 348 unsigned char die_temp_rdy:1;
phonemacro 1:7ae9b934ee55 349 unsigned char led_compb:1;
phonemacro 1:7ae9b934ee55 350 unsigned char prox_int:1;
phonemacro 1:7ae9b934ee55 351 unsigned char alc_ovf:1;
phonemacro 1:7ae9b934ee55 352 unsigned char data_rdy:1;
phonemacro 1:7ae9b934ee55 353 unsigned char a_full:1;
phonemacro 1:7ae9b934ee55 354 };
phonemacro 1:7ae9b934ee55 355 struct {
phonemacro 1:7ae9b934ee55 356 unsigned char:7;
phonemacro 1:7ae9b934ee55 357 unsigned char sha_done:1;
phonemacro 1:7ae9b934ee55 358 };
phonemacro 1:7ae9b934ee55 359 };
phonemacro 1:7ae9b934ee55 360 uint8_t val[2];
phonemacro 1:7ae9b934ee55 361 } int_status_t;
phonemacro 1:7ae9b934ee55 362
phonemacro 5:1f7b8cb07e26 363 union led_range {
phonemacro 5:1f7b8cb07e26 364 struct {
phonemacro 5:1f7b8cb07e26 365 uint8_t led1:2;
phonemacro 5:1f7b8cb07e26 366 uint8_t led2:2;
phonemacro 5:1f7b8cb07e26 367 uint8_t led3:2;
phonemacro 5:1f7b8cb07e26 368 uint8_t:2;
phonemacro 5:1f7b8cb07e26 369 uint8_t led4:2;
phonemacro 5:1f7b8cb07e26 370 uint8_t led5:2;
phonemacro 5:1f7b8cb07e26 371 uint8_t led6:2;
phonemacro 5:1f7b8cb07e26 372 uint8_t:2;
phonemacro 5:1f7b8cb07e26 373 };
phonemacro 5:1f7b8cb07e26 374 uint8_t val[2];
phonemacro 5:1f7b8cb07e26 375 };
phonemacro 0:77ee0ceb503a 376
phonemacro 5:1f7b8cb07e26 377 typedef struct {
phonemacro 5:1f7b8cb07e26 378 uint32_t green;
phonemacro 5:1f7b8cb07e26 379 uint32_t ir;
phonemacro 5:1f7b8cb07e26 380 uint32_t red;
phonemacro 5:1f7b8cb07e26 381 } ppg_data_t;
phonemacro 0:77ee0ceb503a 382
phonemacro 5:1f7b8cb07e26 383 struct led_control {
phonemacro 5:1f7b8cb07e26 384 uint32_t diode_sum[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 385 uint32_t state;
phonemacro 5:1f7b8cb07e26 386 uint32_t prox_sum;
phonemacro 5:1f7b8cb07e26 387 uint32_t prox_sample_cnt;
phonemacro 5:1f7b8cb07e26 388 int32_t led_current[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 389 uint32_t default_current[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 390 int32_t agc_led_out_percent;
phonemacro 5:1f7b8cb07e26 391 int32_t agc_corr_coeff;
phonemacro 5:1f7b8cb07e26 392 int32_t agc_min_num_samples;
phonemacro 5:1f7b8cb07e26 393 int32_t agc_sensitivity_percent;
phonemacro 5:1f7b8cb07e26 394 int32_t change_by_percent_of_range[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 395 int32_t change_by_percent_of_current_setting[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 396 int32_t change_led_by_absolute_count[NUM_OF_LED];
phonemacro 5:1f7b8cb07e26 397 uint32_t sample_cnt;
phonemacro 5:1f7b8cb07e26 398 union led_range led_range_settings;
phonemacro 5:1f7b8cb07e26 399 uint8_t led_ranges;
phonemacro 5:1f7b8cb07e26 400 uint8_t agc_is_enabled;
phonemacro 5:1f7b8cb07e26 401 uint8_t lpm_is_enabled;
phonemacro 5:1f7b8cb07e26 402 };
phonemacro 0:77ee0ceb503a 403
phonemacro 0:77ee0ceb503a 404 /* PRIVATE VARIABLES */
phonemacro 5:1f7b8cb07e26 405 SPI m_spiBus;
phonemacro 5:1f7b8cb07e26 406 DigitalOut m_cs;
phonemacro 5:1f7b8cb07e26 407 struct queue_t queue;
phonemacro 5:1f7b8cb07e26 408 struct led_control led_ctrl;
phonemacro 5:1f7b8cb07e26 409 int vdd_oor_cnt;
phonemacro 5:1f7b8cb07e26 410 die_temp_t die_temp;
phonemacro 2:11e0b5b86e1e 411 bool shaComplete;
phonemacro 0:77ee0ceb503a 412
phonemacro 0:77ee0ceb503a 413 /* PRIVATE FUNCTION DECLARATIONS */
phonemacro 5:1f7b8cb07e26 414 int reset();
phonemacro 5:1f7b8cb07e26 415
phonemacro 5:1f7b8cb07e26 416 int poweroff();
phonemacro 5:1f7b8cb07e26 417
phonemacro 5:1f7b8cb07e26 418 void irq_handler();
phonemacro 5:1f7b8cb07e26 419
phonemacro 5:1f7b8cb07e26 420 int enable_die_temp();
phonemacro 5:1f7b8cb07e26 421
phonemacro 5:1f7b8cb07e26 422 int read_die_temp();
phonemacro 5:1f7b8cb07e26 423
phonemacro 5:1f7b8cb07e26 424 int get_num_samples_in_fifo();
phonemacro 5:1f7b8cb07e26 425
phonemacro 5:1f7b8cb07e26 426 void fifo_irq_handler();
phonemacro 5:1f7b8cb07e26 427
phonemacro 5:1f7b8cb07e26 428 int read_fifo_data(uint8_t *fifo_data, int num_samples);
phonemacro 5:1f7b8cb07e26 429
phonemacro 5:1f7b8cb07e26 430 /* AGC functions */
phonemacro 5:1f7b8cb07e26 431 int max8614x_update_led_range(int new_range, uint8_t led_num,
phonemacro 5:1f7b8cb07e26 432 union led_range *led_range_settings);
phonemacro 5:1f7b8cb07e26 433
phonemacro 5:1f7b8cb07e26 434 int max8614x_update_led_current(union led_range *led_range_settings,
phonemacro 5:1f7b8cb07e26 435 int led_new_val, max8614x_led_t led_num);
phonemacro 5:1f7b8cb07e26 436
phonemacro 5:1f7b8cb07e26 437 void ppg_auto_gain_ctrl(struct led_control *led_ctrl,
phonemacro 5:1f7b8cb07e26 438 uint32_t sample_cnt, int diode_data, max8614x_led_t led_num);
phonemacro 5:1f7b8cb07e26 439
phonemacro 5:1f7b8cb07e26 440 void max8614x_agc_handler(struct led_control *led_ctrl,
phonemacro 5:1f7b8cb07e26 441 int *samples);
phonemacro 5:1f7b8cb07e26 442
phonemacro 5:1f7b8cb07e26 443 int led_control_sm(struct led_control *led_ctrl,
phonemacro 5:1f7b8cb07e26 444 int diode_data, char lpm);
phonemacro 5:1f7b8cb07e26 445
phonemacro 5:1f7b8cb07e26 446 void led_control_reset(struct led_control *led_ctrl);
phonemacro 5:1f7b8cb07e26 447
phonemacro 5:1f7b8cb07e26 448 int led_prox_init(struct led_control *led_ctrl, char lpm);
phonemacro 5:1f7b8cb07e26 449
phonemacro 5:1f7b8cb07e26 450 int led_daq_init(struct led_control *led_ctrl, char lpm);
phonemacro 5:1f7b8cb07e26 451
phonemacro 5:1f7b8cb07e26 452 void led_control_init(struct led_control *led_ctrl);
phonemacro 0:77ee0ceb503a 453 };
phonemacro 0:77ee0ceb503a 454
phonemacro 0:77ee0ceb503a 455 #endif /* _MAX8614X_H_ */