initial commit, reads dev id
MAX8614X.h@7:ffa35f46725e, 20 months ago (annotated)
- 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?
User | Revision | Line number | New 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_ */ |