![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
TEST
Dependencies: max32630fthr Adafruit_FeatherOLED USBDevice
Interfaces/SmartSensor/SSInterface.cpp@1:f60eafbf009a, 2019-04-10 (annotated)
- Committer:
- gmehmet
- Date:
- Wed Apr 10 14:56:25 2019 +0300
- Revision:
- 1:f60eafbf009a
upload from local
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gmehmet | 1:f60eafbf009a | 1 | /*************************************************************************** |
gmehmet | 1:f60eafbf009a | 2 | * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved. |
gmehmet | 1:f60eafbf009a | 3 | * |
gmehmet | 1:f60eafbf009a | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
gmehmet | 1:f60eafbf009a | 5 | * copy of this software and associated documentation files (the "Software"), |
gmehmet | 1:f60eafbf009a | 6 | * to deal in the Software without restriction, including without limitation |
gmehmet | 1:f60eafbf009a | 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
gmehmet | 1:f60eafbf009a | 8 | * and/or sell copies of the Software, and to permit persons to whom the |
gmehmet | 1:f60eafbf009a | 9 | * Software is furnished to do so, subject to the following conditions: |
gmehmet | 1:f60eafbf009a | 10 | * |
gmehmet | 1:f60eafbf009a | 11 | * The above copyright notice and this permission notice shall be included |
gmehmet | 1:f60eafbf009a | 12 | * in all copies or substantial portions of the Software. |
gmehmet | 1:f60eafbf009a | 13 | * |
gmehmet | 1:f60eafbf009a | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
gmehmet | 1:f60eafbf009a | 15 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
gmehmet | 1:f60eafbf009a | 16 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
gmehmet | 1:f60eafbf009a | 17 | * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES |
gmehmet | 1:f60eafbf009a | 18 | * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
gmehmet | 1:f60eafbf009a | 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
gmehmet | 1:f60eafbf009a | 20 | * OTHER DEALINGS IN THE SOFTWARE. |
gmehmet | 1:f60eafbf009a | 21 | * |
gmehmet | 1:f60eafbf009a | 22 | * Except as contained in this notice, the name of Maxim Integrated |
gmehmet | 1:f60eafbf009a | 23 | * Products, Inc. shall not be used except as stated in the Maxim Integrated |
gmehmet | 1:f60eafbf009a | 24 | * Products, Inc. Branding Policy. |
gmehmet | 1:f60eafbf009a | 25 | * |
gmehmet | 1:f60eafbf009a | 26 | * The mere transfer of this software does not imply any licenses |
gmehmet | 1:f60eafbf009a | 27 | * of trade secrets, proprietary technology, copyrights, patents, |
gmehmet | 1:f60eafbf009a | 28 | * trademarks, maskwork rights, or any other form of intellectual |
gmehmet | 1:f60eafbf009a | 29 | * property whatsoever. Maxim Integrated Products, Inc. retains all |
gmehmet | 1:f60eafbf009a | 30 | * ownership rights. |
gmehmet | 1:f60eafbf009a | 31 | **************************************************************************** |
gmehmet | 1:f60eafbf009a | 32 | */ |
gmehmet | 1:f60eafbf009a | 33 | |
gmehmet | 1:f60eafbf009a | 34 | #include "SSInterface.h" |
gmehmet | 1:f60eafbf009a | 35 | |
gmehmet | 1:f60eafbf009a | 36 | #include "../../Utilities/mxm_assert.h" |
gmehmet | 1:f60eafbf009a | 37 | #include "Peripherals.h" |
gmehmet | 1:f60eafbf009a | 38 | #include "utils.h" |
gmehmet | 1:f60eafbf009a | 39 | #include "i2cm.h" |
gmehmet | 1:f60eafbf009a | 40 | |
gmehmet | 1:f60eafbf009a | 41 | #include "pwrman_regs.h" |
gmehmet | 1:f60eafbf009a | 42 | #include "ioman.h" |
gmehmet | 1:f60eafbf009a | 43 | |
gmehmet | 1:f60eafbf009a | 44 | |
gmehmet | 1:f60eafbf009a | 45 | |
gmehmet | 1:f60eafbf009a | 46 | SSInterface::SSInterface(I2C &i2cBus, PinName ss_mfio, PinName ss_reset) |
gmehmet | 1:f60eafbf009a | 47 | :m_i2cBus(&i2cBus), m_spiBus(NULL), |
gmehmet | 1:f60eafbf009a | 48 | mfio_pin(ss_mfio), reset_pin(ss_reset), irq_pin(ss_mfio)/*, |
gmehmet | 1:f60eafbf009a | 49 | irq_evt(1000000, "irq")*/ |
gmehmet | 1:f60eafbf009a | 50 | { |
gmehmet | 1:f60eafbf009a | 51 | reset_pin.input(); |
gmehmet | 1:f60eafbf009a | 52 | irq_pin.fall(callback(this, &SSInterface::irq_handler)); |
gmehmet | 1:f60eafbf009a | 53 | |
gmehmet | 1:f60eafbf009a | 54 | //reset_to_main_app(); |
gmehmet | 1:f60eafbf009a | 55 | //get_data_type(&data_type, &sc_en); |
gmehmet | 1:f60eafbf009a | 56 | ebl_mode = EBL_GPIO_TRIGGER_MODE; |
gmehmet | 1:f60eafbf009a | 57 | } |
gmehmet | 1:f60eafbf009a | 58 | |
gmehmet | 1:f60eafbf009a | 59 | SSInterface::SSInterface(SPI &spiBus, PinName ss_mfio, PinName ss_reset) |
gmehmet | 1:f60eafbf009a | 60 | :m_i2cBus(NULL), m_spiBus(&spiBus), |
gmehmet | 1:f60eafbf009a | 61 | mfio_pin(ss_mfio), reset_pin(ss_reset), irq_pin(ss_mfio)/*, |
gmehmet | 1:f60eafbf009a | 62 | irq_evt(1000000, "irq")*/ |
gmehmet | 1:f60eafbf009a | 63 | { |
gmehmet | 1:f60eafbf009a | 64 | reset_pin.input(); |
gmehmet | 1:f60eafbf009a | 65 | irq_pin.fall(callback(this, &SSInterface::irq_handler)); |
gmehmet | 1:f60eafbf009a | 66 | |
gmehmet | 1:f60eafbf009a | 67 | //reset_to_main_app(); |
gmehmet | 1:f60eafbf009a | 68 | //get_data_type(&data_type, &sc_en); |
gmehmet | 1:f60eafbf009a | 69 | ebl_mode = EBL_GPIO_TRIGGER_MODE; |
gmehmet | 1:f60eafbf009a | 70 | } |
gmehmet | 1:f60eafbf009a | 71 | |
gmehmet | 1:f60eafbf009a | 72 | SSInterface::~SSInterface() |
gmehmet | 1:f60eafbf009a | 73 | { |
gmehmet | 1:f60eafbf009a | 74 | } |
gmehmet | 1:f60eafbf009a | 75 | |
gmehmet | 1:f60eafbf009a | 76 | SS_STATUS SSInterface::reset_to_main_app() |
gmehmet | 1:f60eafbf009a | 77 | { |
gmehmet | 1:f60eafbf009a | 78 | SS_STATUS status; |
gmehmet | 1:f60eafbf009a | 79 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 80 | |
gmehmet | 1:f60eafbf009a | 81 | int bootldr = in_bootldr_mode(); |
gmehmet | 1:f60eafbf009a | 82 | if (bootldr > 0) { |
gmehmet | 1:f60eafbf009a | 83 | status = exit_from_bootloader(); |
gmehmet | 1:f60eafbf009a | 84 | } else if (bootldr == 0) { |
gmehmet | 1:f60eafbf009a | 85 | reset_pin.output(); |
gmehmet | 1:f60eafbf009a | 86 | |
gmehmet | 1:f60eafbf009a | 87 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 88 | cfg_mfio(PIN_OUTPUT); |
gmehmet | 1:f60eafbf009a | 89 | |
gmehmet | 1:f60eafbf009a | 90 | reset_pin.write(0); |
gmehmet | 1:f60eafbf009a | 91 | wait_ms(SS_RESET_TIME); |
gmehmet | 1:f60eafbf009a | 92 | |
gmehmet | 1:f60eafbf009a | 93 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 94 | mfio_pin.write(1); |
gmehmet | 1:f60eafbf009a | 95 | |
gmehmet | 1:f60eafbf009a | 96 | reset_pin.write(1); |
gmehmet | 1:f60eafbf009a | 97 | wait_ms(SS_STARTUP_TO_MAIN_APP_TIME); |
gmehmet | 1:f60eafbf009a | 98 | |
gmehmet | 1:f60eafbf009a | 99 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 100 | cfg_mfio(PIN_INPUT); |
gmehmet | 1:f60eafbf009a | 101 | |
gmehmet | 1:f60eafbf009a | 102 | reset_pin.input(); |
gmehmet | 1:f60eafbf009a | 103 | status = SS_SUCCESS; |
gmehmet | 1:f60eafbf009a | 104 | } else |
gmehmet | 1:f60eafbf009a | 105 | status = SS_ERR_UNKNOWN; |
gmehmet | 1:f60eafbf009a | 106 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 107 | return status; |
gmehmet | 1:f60eafbf009a | 108 | } |
gmehmet | 1:f60eafbf009a | 109 | |
gmehmet | 1:f60eafbf009a | 110 | SS_STATUS SSInterface::reset_to_bootloader() |
gmehmet | 1:f60eafbf009a | 111 | { |
gmehmet | 1:f60eafbf009a | 112 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 113 | int bootldr = in_bootldr_mode(); |
gmehmet | 1:f60eafbf009a | 114 | if (bootldr > 0) { |
gmehmet | 1:f60eafbf009a | 115 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 116 | return SS_SUCCESS; |
gmehmet | 1:f60eafbf009a | 117 | } |
gmehmet | 1:f60eafbf009a | 118 | reset_pin.output(); |
gmehmet | 1:f60eafbf009a | 119 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 120 | cfg_mfio(PIN_OUTPUT); |
gmehmet | 1:f60eafbf009a | 121 | |
gmehmet | 1:f60eafbf009a | 122 | reset_pin.write(0); |
gmehmet | 1:f60eafbf009a | 123 | wait_ms(SS_RESET_TIME); |
gmehmet | 1:f60eafbf009a | 124 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 125 | mfio_pin.write(0); |
gmehmet | 1:f60eafbf009a | 126 | |
gmehmet | 1:f60eafbf009a | 127 | reset_pin.write(1); |
gmehmet | 1:f60eafbf009a | 128 | wait_ms(SS_STARTUP_TO_BTLDR_TIME); |
gmehmet | 1:f60eafbf009a | 129 | reset_pin.input(); |
gmehmet | 1:f60eafbf009a | 130 | |
gmehmet | 1:f60eafbf009a | 131 | if (ebl_mode == EBL_CMD_TRIGGER_MODE) |
gmehmet | 1:f60eafbf009a | 132 | stay_in_bootloader(); |
gmehmet | 1:f60eafbf009a | 133 | |
gmehmet | 1:f60eafbf009a | 134 | if (ebl_mode == EBL_GPIO_TRIGGER_MODE) { |
gmehmet | 1:f60eafbf009a | 135 | cfg_mfio(PIN_INPUT); |
gmehmet | 1:f60eafbf009a | 136 | stay_in_bootloader(); |
gmehmet | 1:f60eafbf009a | 137 | } |
gmehmet | 1:f60eafbf009a | 138 | |
gmehmet | 1:f60eafbf009a | 139 | // Verify we entered bootloader mode |
gmehmet | 1:f60eafbf009a | 140 | if (in_bootldr_mode() < 0) { |
gmehmet | 1:f60eafbf009a | 141 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 142 | return SS_ERR_UNKNOWN; |
gmehmet | 1:f60eafbf009a | 143 | } |
gmehmet | 1:f60eafbf009a | 144 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 145 | return SS_SUCCESS; |
gmehmet | 1:f60eafbf009a | 146 | } |
gmehmet | 1:f60eafbf009a | 147 | |
gmehmet | 1:f60eafbf009a | 148 | SS_STATUS SSInterface::exit_from_bootloader() |
gmehmet | 1:f60eafbf009a | 149 | { |
gmehmet | 1:f60eafbf009a | 150 | uint8_t cmd_bytes[] = { SS_FAM_W_MODE, SS_CMDIDX_MODE }; |
gmehmet | 1:f60eafbf009a | 151 | uint8_t data[] = { 0x00 }; |
gmehmet | 1:f60eafbf009a | 152 | |
gmehmet | 1:f60eafbf009a | 153 | SS_STATUS status = write_cmd( |
gmehmet | 1:f60eafbf009a | 154 | &cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 155 | &data[0], ARRAY_SIZE(data)); |
gmehmet | 1:f60eafbf009a | 156 | |
gmehmet | 1:f60eafbf009a | 157 | in_bootldr = (status == SS_SUCCESS) ? true : false; |
gmehmet | 1:f60eafbf009a | 158 | return status; |
gmehmet | 1:f60eafbf009a | 159 | } |
gmehmet | 1:f60eafbf009a | 160 | |
gmehmet | 1:f60eafbf009a | 161 | SS_STATUS SSInterface::stay_in_bootloader() |
gmehmet | 1:f60eafbf009a | 162 | { |
gmehmet | 1:f60eafbf009a | 163 | uint8_t cmd_bytes[] = { SS_FAM_W_MODE, SS_CMDIDX_MODE }; |
gmehmet | 1:f60eafbf009a | 164 | uint8_t data[] = { SS_MASK_MODE_BOOTLDR }; |
gmehmet | 1:f60eafbf009a | 165 | |
gmehmet | 1:f60eafbf009a | 166 | SS_STATUS status = write_cmd( |
gmehmet | 1:f60eafbf009a | 167 | &cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 168 | &data[0], ARRAY_SIZE(data)); |
gmehmet | 1:f60eafbf009a | 169 | |
gmehmet | 1:f60eafbf009a | 170 | in_bootldr = (status == SS_SUCCESS) ? true : false; |
gmehmet | 1:f60eafbf009a | 171 | return status; |
gmehmet | 1:f60eafbf009a | 172 | } |
gmehmet | 1:f60eafbf009a | 173 | |
gmehmet | 1:f60eafbf009a | 174 | int SSInterface::get_ebl_mode() |
gmehmet | 1:f60eafbf009a | 175 | { |
gmehmet | 1:f60eafbf009a | 176 | return ebl_mode; |
gmehmet | 1:f60eafbf009a | 177 | } |
gmehmet | 1:f60eafbf009a | 178 | |
gmehmet | 1:f60eafbf009a | 179 | SS_STATUS SSInterface::set_ebl_mode(uint8_t mode) |
gmehmet | 1:f60eafbf009a | 180 | { |
gmehmet | 1:f60eafbf009a | 181 | if (mode == EBL_CMD_TRIGGER_MODE || mode == EBL_GPIO_TRIGGER_MODE) { |
gmehmet | 1:f60eafbf009a | 182 | ebl_mode = mode; |
gmehmet | 1:f60eafbf009a | 183 | return SS_SUCCESS; |
gmehmet | 1:f60eafbf009a | 184 | } else { |
gmehmet | 1:f60eafbf009a | 185 | return SS_ERR_INPUT_VALUE; |
gmehmet | 1:f60eafbf009a | 186 | } |
gmehmet | 1:f60eafbf009a | 187 | } |
gmehmet | 1:f60eafbf009a | 188 | |
gmehmet | 1:f60eafbf009a | 189 | SS_STATUS SSInterface::reset() |
gmehmet | 1:f60eafbf009a | 190 | { |
gmehmet | 1:f60eafbf009a | 191 | int bootldr = in_bootldr_mode(); |
gmehmet | 1:f60eafbf009a | 192 | if (bootldr > 0) |
gmehmet | 1:f60eafbf009a | 193 | return reset_to_bootloader(); |
gmehmet | 1:f60eafbf009a | 194 | else if (bootldr == 0) |
gmehmet | 1:f60eafbf009a | 195 | return reset_to_main_app(); |
gmehmet | 1:f60eafbf009a | 196 | else |
gmehmet | 1:f60eafbf009a | 197 | return SS_ERR_UNKNOWN; |
gmehmet | 1:f60eafbf009a | 198 | } |
gmehmet | 1:f60eafbf009a | 199 | |
gmehmet | 1:f60eafbf009a | 200 | SS_STATUS SSInterface::self_test(int idx, uint8_t *result, int sleep_ms){ |
gmehmet | 1:f60eafbf009a | 201 | uint8_t cmd_bytes[] = { SS_FAM_R_SELFTEST, (uint8_t)idx }; |
gmehmet | 1:f60eafbf009a | 202 | uint8_t rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 203 | SS_STATUS ret; |
gmehmet | 1:f60eafbf009a | 204 | |
gmehmet | 1:f60eafbf009a | 205 | result[0] = 0xFF; |
gmehmet | 1:f60eafbf009a | 206 | ret = read_cmd(cmd_bytes, 2, (uint8_t *)0, 0, rxbuf, ARRAY_SIZE(rxbuf), sleep_ms); |
gmehmet | 1:f60eafbf009a | 207 | result[0] = rxbuf[1]; |
gmehmet | 1:f60eafbf009a | 208 | return ret; |
gmehmet | 1:f60eafbf009a | 209 | } |
gmehmet | 1:f60eafbf009a | 210 | |
gmehmet | 1:f60eafbf009a | 211 | void SSInterface::cfg_mfio(PinDirection dir) |
gmehmet | 1:f60eafbf009a | 212 | { |
gmehmet | 1:f60eafbf009a | 213 | if (dir == PIN_INPUT) { |
gmehmet | 1:f60eafbf009a | 214 | mfio_pin.input(); |
gmehmet | 1:f60eafbf009a | 215 | mfio_pin.mode(PullUp); |
gmehmet | 1:f60eafbf009a | 216 | } else { |
gmehmet | 1:f60eafbf009a | 217 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 218 | mfio_pin.output(); |
gmehmet | 1:f60eafbf009a | 219 | } |
gmehmet | 1:f60eafbf009a | 220 | } |
gmehmet | 1:f60eafbf009a | 221 | |
gmehmet | 1:f60eafbf009a | 222 | void SSInterface::enable_irq() |
gmehmet | 1:f60eafbf009a | 223 | { |
gmehmet | 1:f60eafbf009a | 224 | irq_pin.enable_irq(); |
gmehmet | 1:f60eafbf009a | 225 | } |
gmehmet | 1:f60eafbf009a | 226 | void SSInterface::disable_irq() |
gmehmet | 1:f60eafbf009a | 227 | { |
gmehmet | 1:f60eafbf009a | 228 | irq_pin.disable_irq(); |
gmehmet | 1:f60eafbf009a | 229 | } |
gmehmet | 1:f60eafbf009a | 230 | |
gmehmet | 1:f60eafbf009a | 231 | void SSInterface::mfio_selftest(){ |
gmehmet | 1:f60eafbf009a | 232 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 233 | irq_pin.fall(callback(this, &SSInterface::irq_handler_selftest)); |
gmehmet | 1:f60eafbf009a | 234 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 235 | } |
gmehmet | 1:f60eafbf009a | 236 | |
gmehmet | 1:f60eafbf009a | 237 | int SSInterface::in_bootldr_mode() |
gmehmet | 1:f60eafbf009a | 238 | { |
gmehmet | 1:f60eafbf009a | 239 | uint8_t cmd_bytes[] = { SS_FAM_R_MODE, SS_CMDIDX_MODE }; |
gmehmet | 1:f60eafbf009a | 240 | uint8_t rxbuf[2] = { 0 }; |
gmehmet | 1:f60eafbf009a | 241 | |
gmehmet | 1:f60eafbf009a | 242 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 243 | 0, 0, |
gmehmet | 1:f60eafbf009a | 244 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 245 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 246 | return -1; |
gmehmet | 1:f60eafbf009a | 247 | |
gmehmet | 1:f60eafbf009a | 248 | return (rxbuf[1] & SS_MASK_MODE_BOOTLDR); |
gmehmet | 1:f60eafbf009a | 249 | } |
gmehmet | 1:f60eafbf009a | 250 | |
gmehmet | 1:f60eafbf009a | 251 | const char* SSInterface::get_ss_fw_version() |
gmehmet | 1:f60eafbf009a | 252 | { |
gmehmet | 1:f60eafbf009a | 253 | uint8_t cmd_bytes[2]; |
gmehmet | 1:f60eafbf009a | 254 | uint8_t rxbuf[4]; |
gmehmet | 1:f60eafbf009a | 255 | |
gmehmet | 1:f60eafbf009a | 256 | int bootldr = in_bootldr_mode(); |
gmehmet | 1:f60eafbf009a | 257 | |
gmehmet | 1:f60eafbf009a | 258 | if (bootldr > 0) { |
gmehmet | 1:f60eafbf009a | 259 | cmd_bytes[0] = SS_FAM_R_BOOTLOADER; |
gmehmet | 1:f60eafbf009a | 260 | cmd_bytes[1] = SS_CMDIDX_BOOTFWVERSION; |
gmehmet | 1:f60eafbf009a | 261 | } else if (bootldr == 0) { |
gmehmet | 1:f60eafbf009a | 262 | cmd_bytes[0] = SS_FAM_R_IDENTITY; |
gmehmet | 1:f60eafbf009a | 263 | cmd_bytes[1] = SS_CMDIDX_FWVERSION; |
gmehmet | 1:f60eafbf009a | 264 | } else { |
gmehmet | 1:f60eafbf009a | 265 | return plat_name; |
gmehmet | 1:f60eafbf009a | 266 | } |
gmehmet | 1:f60eafbf009a | 267 | |
gmehmet | 1:f60eafbf009a | 268 | SS_STATUS status = read_cmd( |
gmehmet | 1:f60eafbf009a | 269 | &cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 270 | 0, 0, |
gmehmet | 1:f60eafbf009a | 271 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 272 | |
gmehmet | 1:f60eafbf009a | 273 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 274 | snprintf(fw_version, sizeof(fw_version), |
gmehmet | 1:f60eafbf009a | 275 | "%d.%d.%d", rxbuf[1], rxbuf[2], rxbuf[3]); |
gmehmet | 1:f60eafbf009a | 276 | pr_info("fw_version:%s\r\n", fw_version); |
gmehmet | 1:f60eafbf009a | 277 | } |
gmehmet | 1:f60eafbf009a | 278 | |
gmehmet | 1:f60eafbf009a | 279 | return &fw_version[0]; |
gmehmet | 1:f60eafbf009a | 280 | } |
gmehmet | 1:f60eafbf009a | 281 | |
gmehmet | 1:f60eafbf009a | 282 | const char* SSInterface::get_ss_algo_version() |
gmehmet | 1:f60eafbf009a | 283 | { |
gmehmet | 1:f60eafbf009a | 284 | uint8_t cmd_bytes[3]; |
gmehmet | 1:f60eafbf009a | 285 | uint8_t rxbuf[4]; |
gmehmet | 1:f60eafbf009a | 286 | |
gmehmet | 1:f60eafbf009a | 287 | int bootldr = in_bootldr_mode(); |
gmehmet | 1:f60eafbf009a | 288 | |
gmehmet | 1:f60eafbf009a | 289 | if (bootldr > 0) { |
gmehmet | 1:f60eafbf009a | 290 | cmd_bytes[0] = SS_FAM_R_BOOTLOADER; |
gmehmet | 1:f60eafbf009a | 291 | cmd_bytes[1] = SS_CMDIDX_BOOTFWVERSION; |
gmehmet | 1:f60eafbf009a | 292 | cmd_bytes[2] = 0; |
gmehmet | 1:f60eafbf009a | 293 | } else if (bootldr == 0) { |
gmehmet | 1:f60eafbf009a | 294 | cmd_bytes[0] = SS_FAM_R_IDENTITY; |
gmehmet | 1:f60eafbf009a | 295 | cmd_bytes[1] = SS_CMDIDX_ALGOVER; |
gmehmet | 1:f60eafbf009a | 296 | cmd_bytes[2] = SS_CMDIDX_AVAILSENSORS; |
gmehmet | 1:f60eafbf009a | 297 | } else { |
gmehmet | 1:f60eafbf009a | 298 | return plat_name; |
gmehmet | 1:f60eafbf009a | 299 | } |
gmehmet | 1:f60eafbf009a | 300 | |
gmehmet | 1:f60eafbf009a | 301 | SS_STATUS status = read_cmd( |
gmehmet | 1:f60eafbf009a | 302 | &cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 303 | 0, 0, |
gmehmet | 1:f60eafbf009a | 304 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 305 | |
gmehmet | 1:f60eafbf009a | 306 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 307 | snprintf(algo_version, sizeof(algo_version), |
gmehmet | 1:f60eafbf009a | 308 | "%d.%d.%d", rxbuf[1], rxbuf[2], rxbuf[3]); |
gmehmet | 1:f60eafbf009a | 309 | pr_info("algo_version:%s\r\n", fw_version); |
gmehmet | 1:f60eafbf009a | 310 | } |
gmehmet | 1:f60eafbf009a | 311 | |
gmehmet | 1:f60eafbf009a | 312 | return &algo_version[0]; |
gmehmet | 1:f60eafbf009a | 313 | } |
gmehmet | 1:f60eafbf009a | 314 | const char* SSInterface::get_ss_platform_name() |
gmehmet | 1:f60eafbf009a | 315 | { |
gmehmet | 1:f60eafbf009a | 316 | uint8_t cmd_bytes[] = { SS_FAM_R_IDENTITY, SS_CMDIDX_PLATTYPE }; |
gmehmet | 1:f60eafbf009a | 317 | uint8_t rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 318 | |
gmehmet | 1:f60eafbf009a | 319 | SS_STATUS status = read_cmd( |
gmehmet | 1:f60eafbf009a | 320 | &cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 321 | 0, 0, |
gmehmet | 1:f60eafbf009a | 322 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 323 | |
gmehmet | 1:f60eafbf009a | 324 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 325 | if (rxbuf[1] == SS_PLAT_MAX3263X) { |
gmehmet | 1:f60eafbf009a | 326 | if (in_bootldr_mode() > 0) { |
gmehmet | 1:f60eafbf009a | 327 | plat_name = SS_BOOTLOADER_PLATFORM_MAX3263X; |
gmehmet | 1:f60eafbf009a | 328 | } else { |
gmehmet | 1:f60eafbf009a | 329 | plat_name = SS_PLATFORM_MAX3263X; |
gmehmet | 1:f60eafbf009a | 330 | } |
gmehmet | 1:f60eafbf009a | 331 | } else if (rxbuf[1] == SS_PLAT_MAX32660) { |
gmehmet | 1:f60eafbf009a | 332 | if (in_bootldr_mode() > 0) { |
gmehmet | 1:f60eafbf009a | 333 | plat_name = SS_BOOTLOADER_PLATFORM_MAX32660; |
gmehmet | 1:f60eafbf009a | 334 | } else { |
gmehmet | 1:f60eafbf009a | 335 | plat_name = SS_PLATFORM_MAX32660; |
gmehmet | 1:f60eafbf009a | 336 | } |
gmehmet | 1:f60eafbf009a | 337 | } |
gmehmet | 1:f60eafbf009a | 338 | } |
gmehmet | 1:f60eafbf009a | 339 | |
gmehmet | 1:f60eafbf009a | 340 | return plat_name; |
gmehmet | 1:f60eafbf009a | 341 | } |
gmehmet | 1:f60eafbf009a | 342 | |
gmehmet | 1:f60eafbf009a | 343 | SS_STATUS SSInterface::write_cmd(uint8_t *cmd_bytes, int cmd_bytes_len, |
gmehmet | 1:f60eafbf009a | 344 | uint8_t *data, int data_len, |
gmehmet | 1:f60eafbf009a | 345 | int sleep_ms) |
gmehmet | 1:f60eafbf009a | 346 | { |
gmehmet | 1:f60eafbf009a | 347 | int total_len = data_len + cmd_bytes_len; |
gmehmet | 1:f60eafbf009a | 348 | |
gmehmet | 1:f60eafbf009a | 349 | if (total_len <= SS_SMALL_BUF_SIZE) { |
gmehmet | 1:f60eafbf009a | 350 | return write_cmd_small(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 351 | } else if (total_len <= SS_MED_BUF_SIZE) { |
gmehmet | 1:f60eafbf009a | 352 | return write_cmd_medium(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 353 | } else if (total_len <= SS_LARGE_BUF_SIZE) { |
gmehmet | 1:f60eafbf009a | 354 | return write_cmd_large(cmd_bytes, cmd_bytes_len, data, data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 355 | } else { |
gmehmet | 1:f60eafbf009a | 356 | mxm_assert_msg(true, "Tried to send I2C tx larger than maximum allowed size\n"); |
gmehmet | 1:f60eafbf009a | 357 | return SS_ERR_DATA_FORMAT; |
gmehmet | 1:f60eafbf009a | 358 | } |
gmehmet | 1:f60eafbf009a | 359 | } |
gmehmet | 1:f60eafbf009a | 360 | |
gmehmet | 1:f60eafbf009a | 361 | #include "i2cm.h" |
gmehmet | 1:f60eafbf009a | 362 | void dump_i2c_regs(int idx) |
gmehmet | 1:f60eafbf009a | 363 | { |
gmehmet | 1:f60eafbf009a | 364 | mxc_i2cm_regs_t *i2cm = MXC_I2CM_GET_I2CM(idx); |
gmehmet | 1:f60eafbf009a | 365 | pr_err("****************************\r\n" |
gmehmet | 1:f60eafbf009a | 366 | "I2CM(%d) registers Dump\r\n" |
gmehmet | 1:f60eafbf009a | 367 | "i2cm: %p\r\n" |
gmehmet | 1:f60eafbf009a | 368 | "fs_clk_div : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 369 | "timeout : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 370 | "ctrl : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 371 | "trans : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 372 | "intfl : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 373 | "inten : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 374 | "bb : 0x%X\r\n" |
gmehmet | 1:f60eafbf009a | 375 | "****************************\r\n", |
gmehmet | 1:f60eafbf009a | 376 | idx, |
gmehmet | 1:f60eafbf009a | 377 | i2cm, |
gmehmet | 1:f60eafbf009a | 378 | i2cm->fs_clk_div, |
gmehmet | 1:f60eafbf009a | 379 | i2cm->timeout, |
gmehmet | 1:f60eafbf009a | 380 | i2cm->ctrl, |
gmehmet | 1:f60eafbf009a | 381 | i2cm->trans, |
gmehmet | 1:f60eafbf009a | 382 | i2cm->intfl, |
gmehmet | 1:f60eafbf009a | 383 | i2cm->inten, |
gmehmet | 1:f60eafbf009a | 384 | i2cm->bb); |
gmehmet | 1:f60eafbf009a | 385 | |
gmehmet | 1:f60eafbf009a | 386 | /* Clean flags */ |
gmehmet | 1:f60eafbf009a | 387 | i2cm->intfl = i2cm->intfl; |
gmehmet | 1:f60eafbf009a | 388 | } |
gmehmet | 1:f60eafbf009a | 389 | |
gmehmet | 1:f60eafbf009a | 390 | SS_STATUS SSInterface::write_cmd(uint8_t *tx_buf, int tx_len, int sleep_ms) |
gmehmet | 1:f60eafbf009a | 391 | { |
gmehmet | 1:f60eafbf009a | 392 | pr_info("write_cmd: "); |
gmehmet | 1:f60eafbf009a | 393 | for (int i = 0; i < tx_len; i++) { |
gmehmet | 1:f60eafbf009a | 394 | pr_info("0x%02X ", tx_buf[i]); |
gmehmet | 1:f60eafbf009a | 395 | } |
gmehmet | 1:f60eafbf009a | 396 | pr_info("\r\n"); |
gmehmet | 1:f60eafbf009a | 397 | |
gmehmet | 1:f60eafbf009a | 398 | int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len); |
gmehmet | 1:f60eafbf009a | 399 | |
gmehmet | 1:f60eafbf009a | 400 | int retries = 4; |
gmehmet | 1:f60eafbf009a | 401 | while (ret != 0 && retries-- > 0) { |
gmehmet | 1:f60eafbf009a | 402 | pr_err("i2c wr retry\r\n"); |
gmehmet | 1:f60eafbf009a | 403 | wait_ms(1); |
gmehmet | 1:f60eafbf009a | 404 | ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len); |
gmehmet | 1:f60eafbf009a | 405 | } |
gmehmet | 1:f60eafbf009a | 406 | |
gmehmet | 1:f60eafbf009a | 407 | if (ret != 0) { |
gmehmet | 1:f60eafbf009a | 408 | pr_err("m_i2cBus->write returned %d\r\n", ret); |
gmehmet | 1:f60eafbf009a | 409 | |
gmehmet | 1:f60eafbf009a | 410 | return SS_ERR_UNAVAILABLE; |
gmehmet | 1:f60eafbf009a | 411 | } |
gmehmet | 1:f60eafbf009a | 412 | |
gmehmet | 1:f60eafbf009a | 413 | wait_ms(sleep_ms); |
gmehmet | 1:f60eafbf009a | 414 | |
gmehmet | 1:f60eafbf009a | 415 | char status_byte; |
gmehmet | 1:f60eafbf009a | 416 | ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1); |
gmehmet | 1:f60eafbf009a | 417 | bool try_again = (status_byte == SS_ERR_TRY_AGAIN); |
gmehmet | 1:f60eafbf009a | 418 | while ((ret != 0 || try_again) |
gmehmet | 1:f60eafbf009a | 419 | && retries-- > 0) { |
gmehmet | 1:f60eafbf009a | 420 | pr_info("i2c rd retry\r\n"); |
gmehmet | 1:f60eafbf009a | 421 | wait_ms(sleep_ms); |
gmehmet | 1:f60eafbf009a | 422 | ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1); |
gmehmet | 1:f60eafbf009a | 423 | try_again = (status_byte == SS_ERR_TRY_AGAIN); |
gmehmet | 1:f60eafbf009a | 424 | } |
gmehmet | 1:f60eafbf009a | 425 | |
gmehmet | 1:f60eafbf009a | 426 | if (ret != 0 || try_again) { |
gmehmet | 1:f60eafbf009a | 427 | |
gmehmet | 1:f60eafbf009a | 428 | pr_err("m_i2cBus->read returned %d, ss status_byte %d\r\n", ret, status_byte); |
gmehmet | 1:f60eafbf009a | 429 | return SS_ERR_UNAVAILABLE; |
gmehmet | 1:f60eafbf009a | 430 | } |
gmehmet | 1:f60eafbf009a | 431 | |
gmehmet | 1:f60eafbf009a | 432 | pr_info("status_byte: %d\r\n", status_byte); |
gmehmet | 1:f60eafbf009a | 433 | |
gmehmet | 1:f60eafbf009a | 434 | return (SS_STATUS)status_byte; |
gmehmet | 1:f60eafbf009a | 435 | } |
gmehmet | 1:f60eafbf009a | 436 | |
gmehmet | 1:f60eafbf009a | 437 | SS_STATUS SSInterface::write_cmd_small(uint8_t *cmd_bytes, int cmd_bytes_len, |
gmehmet | 1:f60eafbf009a | 438 | uint8_t *data, int data_len, |
gmehmet | 1:f60eafbf009a | 439 | int sleep_ms) |
gmehmet | 1:f60eafbf009a | 440 | { |
gmehmet | 1:f60eafbf009a | 441 | uint8_t write_buf[SS_SMALL_BUF_SIZE]; |
gmehmet | 1:f60eafbf009a | 442 | memcpy(write_buf, cmd_bytes, cmd_bytes_len); |
gmehmet | 1:f60eafbf009a | 443 | memcpy(write_buf + cmd_bytes_len, data, data_len); |
gmehmet | 1:f60eafbf009a | 444 | |
gmehmet | 1:f60eafbf009a | 445 | SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 446 | return status; |
gmehmet | 1:f60eafbf009a | 447 | } |
gmehmet | 1:f60eafbf009a | 448 | |
gmehmet | 1:f60eafbf009a | 449 | SS_STATUS SSInterface::write_cmd_medium(uint8_t *cmd_bytes, int cmd_bytes_len, |
gmehmet | 1:f60eafbf009a | 450 | uint8_t *data, int data_len, |
gmehmet | 1:f60eafbf009a | 451 | int sleep_ms) |
gmehmet | 1:f60eafbf009a | 452 | { |
gmehmet | 1:f60eafbf009a | 453 | uint8_t write_buf[SS_MED_BUF_SIZE]; |
gmehmet | 1:f60eafbf009a | 454 | memcpy(write_buf, cmd_bytes, cmd_bytes_len); |
gmehmet | 1:f60eafbf009a | 455 | memcpy(write_buf + cmd_bytes_len, data, data_len); |
gmehmet | 1:f60eafbf009a | 456 | |
gmehmet | 1:f60eafbf009a | 457 | SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 458 | return status; |
gmehmet | 1:f60eafbf009a | 459 | } |
gmehmet | 1:f60eafbf009a | 460 | |
gmehmet | 1:f60eafbf009a | 461 | SS_STATUS SSInterface::write_cmd_large(uint8_t *cmd_bytes, int cmd_bytes_len, |
gmehmet | 1:f60eafbf009a | 462 | uint8_t *data, int data_len, |
gmehmet | 1:f60eafbf009a | 463 | int sleep_ms) |
gmehmet | 1:f60eafbf009a | 464 | { |
gmehmet | 1:f60eafbf009a | 465 | uint8_t write_buf[SS_LARGE_BUF_SIZE]; |
gmehmet | 1:f60eafbf009a | 466 | memcpy(write_buf, cmd_bytes, cmd_bytes_len); |
gmehmet | 1:f60eafbf009a | 467 | memcpy(write_buf + cmd_bytes_len, data, data_len); |
gmehmet | 1:f60eafbf009a | 468 | |
gmehmet | 1:f60eafbf009a | 469 | SS_STATUS status = write_cmd(write_buf, cmd_bytes_len + data_len, sleep_ms); |
gmehmet | 1:f60eafbf009a | 470 | return status; |
gmehmet | 1:f60eafbf009a | 471 | } |
gmehmet | 1:f60eafbf009a | 472 | |
gmehmet | 1:f60eafbf009a | 473 | SS_STATUS SSInterface::read_cmd(uint8_t *cmd_bytes, int cmd_bytes_len, |
gmehmet | 1:f60eafbf009a | 474 | uint8_t *data, int data_len, |
gmehmet | 1:f60eafbf009a | 475 | uint8_t *rxbuf, int rxbuf_sz, |
gmehmet | 1:f60eafbf009a | 476 | int sleep_ms) |
gmehmet | 1:f60eafbf009a | 477 | { |
gmehmet | 1:f60eafbf009a | 478 | #if 0 |
gmehmet | 1:f60eafbf009a | 479 | pr_info("read_cmd: "); |
gmehmet | 1:f60eafbf009a | 480 | for (int i = 0; i < cmd_bytes_len; i++) { |
gmehmet | 1:f60eafbf009a | 481 | pr_info("0x%02X ", cmd_bytes[i]); |
gmehmet | 1:f60eafbf009a | 482 | } |
gmehmet | 1:f60eafbf009a | 483 | pr_info("\r\n"); |
gmehmet | 1:f60eafbf009a | 484 | |
gmehmet | 1:f60eafbf009a | 485 | #endif |
gmehmet | 1:f60eafbf009a | 486 | |
gmehmet | 1:f60eafbf009a | 487 | int retries = 4; |
gmehmet | 1:f60eafbf009a | 488 | |
gmehmet | 1:f60eafbf009a | 489 | int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0)); |
gmehmet | 1:f60eafbf009a | 490 | #ifdef SHOW_I2C_DEBUG_MESSAGES |
gmehmet | 1:f60eafbf009a | 491 | printf("ret1 : %d\rt\n",ret); |
gmehmet | 1:f60eafbf009a | 492 | #endif |
gmehmet | 1:f60eafbf009a | 493 | if (data_len != 0) { |
gmehmet | 1:f60eafbf009a | 494 | ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false); |
gmehmet | 1:f60eafbf009a | 495 | #ifdef SHOW_I2C_DEBUG_MESSAGES |
gmehmet | 1:f60eafbf009a | 496 | printf("ret2 : %d\rt\n",ret); |
gmehmet | 1:f60eafbf009a | 497 | #endif |
gmehmet | 1:f60eafbf009a | 498 | } |
gmehmet | 1:f60eafbf009a | 499 | |
gmehmet | 1:f60eafbf009a | 500 | while (ret != 0 && retries-- > 0) { |
gmehmet | 1:f60eafbf009a | 501 | |
gmehmet | 1:f60eafbf009a | 502 | pr_err("i2c wr retry\r\n"); |
gmehmet | 1:f60eafbf009a | 503 | wait_ms(1); |
gmehmet | 1:f60eafbf009a | 504 | ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0)); |
gmehmet | 1:f60eafbf009a | 505 | #ifdef SHOW_I2C_DEBUG_MESSAGES |
gmehmet | 1:f60eafbf009a | 506 | printf("ret3 : %d\rt\n",ret); |
gmehmet | 1:f60eafbf009a | 507 | #endif |
gmehmet | 1:f60eafbf009a | 508 | if (data_len != 0) { |
gmehmet | 1:f60eafbf009a | 509 | ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false); |
gmehmet | 1:f60eafbf009a | 510 | #ifdef SHOW_I2C_DEBUG_MESSAGES |
gmehmet | 1:f60eafbf009a | 511 | printf("ret4 : %d\rt\n",ret); |
gmehmet | 1:f60eafbf009a | 512 | #endif |
gmehmet | 1:f60eafbf009a | 513 | } |
gmehmet | 1:f60eafbf009a | 514 | } |
gmehmet | 1:f60eafbf009a | 515 | |
gmehmet | 1:f60eafbf009a | 516 | if (ret != 0) { |
gmehmet | 1:f60eafbf009a | 517 | pr_err("m_i2cBus->write returned %d\r\n", ret); |
gmehmet | 1:f60eafbf009a | 518 | |
gmehmet | 1:f60eafbf009a | 519 | return SS_ERR_UNAVAILABLE; |
gmehmet | 1:f60eafbf009a | 520 | } |
gmehmet | 1:f60eafbf009a | 521 | |
gmehmet | 1:f60eafbf009a | 522 | wait_ms(sleep_ms); |
gmehmet | 1:f60eafbf009a | 523 | |
gmehmet | 1:f60eafbf009a | 524 | ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz); |
gmehmet | 1:f60eafbf009a | 525 | bool try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN); |
gmehmet | 1:f60eafbf009a | 526 | while ((ret != 0 || try_again) && retries-- > 0) { |
gmehmet | 1:f60eafbf009a | 527 | pr_info("i2c rd retry\r\n"); |
gmehmet | 1:f60eafbf009a | 528 | wait_ms(sleep_ms); |
gmehmet | 1:f60eafbf009a | 529 | ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz); |
gmehmet | 1:f60eafbf009a | 530 | try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN); |
gmehmet | 1:f60eafbf009a | 531 | } |
gmehmet | 1:f60eafbf009a | 532 | if (ret != 0 || try_again) { |
gmehmet | 1:f60eafbf009a | 533 | pr_err("m_i2cBus->read returned %d, ss status_byte %d\r\n", ret, rxbuf[0]); |
gmehmet | 1:f60eafbf009a | 534 | |
gmehmet | 1:f60eafbf009a | 535 | return SS_ERR_UNAVAILABLE; |
gmehmet | 1:f60eafbf009a | 536 | } |
gmehmet | 1:f60eafbf009a | 537 | |
gmehmet | 1:f60eafbf009a | 538 | pr_info("status_byte: %d\r\n", rxbuf[0]); |
gmehmet | 1:f60eafbf009a | 539 | pr_info("data: "); |
gmehmet | 1:f60eafbf009a | 540 | for (int i = 1; i < rxbuf_sz; i++) { |
gmehmet | 1:f60eafbf009a | 541 | pr_info("0x%02X ", rxbuf[i]); |
gmehmet | 1:f60eafbf009a | 542 | } |
gmehmet | 1:f60eafbf009a | 543 | pr_info("\r\n"); |
gmehmet | 1:f60eafbf009a | 544 | |
gmehmet | 1:f60eafbf009a | 545 | return (SS_STATUS)rxbuf[0]; |
gmehmet | 1:f60eafbf009a | 546 | } |
gmehmet | 1:f60eafbf009a | 547 | |
gmehmet | 1:f60eafbf009a | 548 | SS_STATUS SSInterface::get_reg(int idx, uint8_t addr, uint32_t *val) |
gmehmet | 1:f60eafbf009a | 549 | { |
gmehmet | 1:f60eafbf009a | 550 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 551 | |
gmehmet | 1:f60eafbf009a | 552 | uint8_t cmd_bytes[] = { SS_FAM_R_REGATTRIBS, (uint8_t)idx }; |
gmehmet | 1:f60eafbf009a | 553 | uint8_t rx_reg_attribs[3] = {0}; |
gmehmet | 1:f60eafbf009a | 554 | |
gmehmet | 1:f60eafbf009a | 555 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 556 | 0, 0, |
gmehmet | 1:f60eafbf009a | 557 | &rx_reg_attribs[0], ARRAY_SIZE(rx_reg_attribs)); |
gmehmet | 1:f60eafbf009a | 558 | |
gmehmet | 1:f60eafbf009a | 559 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 560 | return status; |
gmehmet | 1:f60eafbf009a | 561 | |
gmehmet | 1:f60eafbf009a | 562 | int reg_width = rx_reg_attribs[1]; |
gmehmet | 1:f60eafbf009a | 563 | |
gmehmet | 1:f60eafbf009a | 564 | uint8_t cmd_bytes2[] = { SS_FAM_R_READREG, (uint8_t)idx, addr }; |
gmehmet | 1:f60eafbf009a | 565 | uint8_t rxbuf[5] = {0}; |
gmehmet | 1:f60eafbf009a | 566 | |
gmehmet | 1:f60eafbf009a | 567 | status = read_cmd(&cmd_bytes2[0], ARRAY_SIZE(cmd_bytes2), |
gmehmet | 1:f60eafbf009a | 568 | 0, 0, |
gmehmet | 1:f60eafbf009a | 569 | &rxbuf[0], reg_width + 1); |
gmehmet | 1:f60eafbf009a | 570 | |
gmehmet | 1:f60eafbf009a | 571 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 572 | *val = 0; |
gmehmet | 1:f60eafbf009a | 573 | for (int i = 0; i < reg_width; i++) { |
gmehmet | 1:f60eafbf009a | 574 | *val = (*val << 8) | rxbuf[i + 1]; |
gmehmet | 1:f60eafbf009a | 575 | } |
gmehmet | 1:f60eafbf009a | 576 | } |
gmehmet | 1:f60eafbf009a | 577 | |
gmehmet | 1:f60eafbf009a | 578 | return status; |
gmehmet | 1:f60eafbf009a | 579 | } |
gmehmet | 1:f60eafbf009a | 580 | |
gmehmet | 1:f60eafbf009a | 581 | SS_STATUS SSInterface::set_reg(int idx, uint8_t addr, uint32_t val, int byte_size) |
gmehmet | 1:f60eafbf009a | 582 | { |
gmehmet | 1:f60eafbf009a | 583 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 584 | |
gmehmet | 1:f60eafbf009a | 585 | uint8_t cmd_bytes[] = { SS_FAM_W_WRITEREG, (uint8_t)idx, addr }; |
gmehmet | 1:f60eafbf009a | 586 | uint8_t data_bytes[4]; |
gmehmet | 1:f60eafbf009a | 587 | for (int i = 0; i < byte_size; i++) { |
gmehmet | 1:f60eafbf009a | 588 | data_bytes[i] = (val >> (8 * (byte_size - 1)) & 0xFF); |
gmehmet | 1:f60eafbf009a | 589 | } |
gmehmet | 1:f60eafbf009a | 590 | |
gmehmet | 1:f60eafbf009a | 591 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 592 | &data_bytes[0], byte_size, SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 593 | |
gmehmet | 1:f60eafbf009a | 594 | return status; |
gmehmet | 1:f60eafbf009a | 595 | } |
gmehmet | 1:f60eafbf009a | 596 | |
gmehmet | 1:f60eafbf009a | 597 | SS_STATUS SSInterface::dump_reg(int idx, addr_val_pair* reg_vals, int reg_vals_sz, int* num_regs) |
gmehmet | 1:f60eafbf009a | 598 | { |
gmehmet | 1:f60eafbf009a | 599 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 600 | |
gmehmet | 1:f60eafbf009a | 601 | uint8_t cmd_bytes[] = { SS_FAM_R_REGATTRIBS, (uint8_t)idx }; |
gmehmet | 1:f60eafbf009a | 602 | uint8_t rx_reg_attribs[3] = {0}; |
gmehmet | 1:f60eafbf009a | 603 | |
gmehmet | 1:f60eafbf009a | 604 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 605 | 0, 0, |
gmehmet | 1:f60eafbf009a | 606 | &rx_reg_attribs[0], ARRAY_SIZE(rx_reg_attribs)); |
gmehmet | 1:f60eafbf009a | 607 | |
gmehmet | 1:f60eafbf009a | 608 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 609 | return status; |
gmehmet | 1:f60eafbf009a | 610 | |
gmehmet | 1:f60eafbf009a | 611 | int reg_width = rx_reg_attribs[1]; |
gmehmet | 1:f60eafbf009a | 612 | *num_regs = rx_reg_attribs[2]; |
gmehmet | 1:f60eafbf009a | 613 | mxm_assert_msg((*num_regs <= reg_vals_sz), "Need to increase reg_vals array to hold all dump_reg data"); |
gmehmet | 1:f60eafbf009a | 614 | mxm_assert_msg(((size_t)reg_width <= sizeof(uint32_t)), "IC returned register values greater than 4 bytes in width"); |
gmehmet | 1:f60eafbf009a | 615 | |
gmehmet | 1:f60eafbf009a | 616 | int dump_reg_sz = (*num_regs) * (reg_width + 1) + 1; //+1 to reg_width for address, +1 for status byte |
gmehmet | 1:f60eafbf009a | 617 | |
gmehmet | 1:f60eafbf009a | 618 | uint8_t rxbuf[512]; |
gmehmet | 1:f60eafbf009a | 619 | mxm_assert_msg(((size_t)dump_reg_sz <= sizeof(rxbuf)), "Need to increase buffer size to receive dump_reg data"); |
gmehmet | 1:f60eafbf009a | 620 | |
gmehmet | 1:f60eafbf009a | 621 | cmd_bytes[0] = SS_FAM_R_DUMPREG; |
gmehmet | 1:f60eafbf009a | 622 | status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 623 | 0, 0, |
gmehmet | 1:f60eafbf009a | 624 | &rxbuf[0], dump_reg_sz, SS_DUMP_REG_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 625 | |
gmehmet | 1:f60eafbf009a | 626 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 627 | return status; |
gmehmet | 1:f60eafbf009a | 628 | |
gmehmet | 1:f60eafbf009a | 629 | //rxbuf format is [status][addr0](reg_width x [val0])[addr1](reg_width x [val1])... |
gmehmet | 1:f60eafbf009a | 630 | for (int reg = 0; reg < *num_regs; reg++) { |
gmehmet | 1:f60eafbf009a | 631 | reg_vals[reg].addr = rxbuf[(reg * (reg_width + 1)) + 1]; |
gmehmet | 1:f60eafbf009a | 632 | uint32_t *val = &(reg_vals[reg].val); |
gmehmet | 1:f60eafbf009a | 633 | *val = 0; |
gmehmet | 1:f60eafbf009a | 634 | for (int byte = 0; byte < reg_width; byte++) { |
gmehmet | 1:f60eafbf009a | 635 | *val = (*val << 8) | rxbuf[(reg * (reg_width + 1)) + byte + 2]; |
gmehmet | 1:f60eafbf009a | 636 | } |
gmehmet | 1:f60eafbf009a | 637 | } |
gmehmet | 1:f60eafbf009a | 638 | |
gmehmet | 1:f60eafbf009a | 639 | return SS_SUCCESS; |
gmehmet | 1:f60eafbf009a | 640 | } |
gmehmet | 1:f60eafbf009a | 641 | |
gmehmet | 1:f60eafbf009a | 642 | SS_STATUS SSInterface::enable_sensor(int idx, int mode, ss_data_req *data_req, uint8_t ext_mode) |
gmehmet | 1:f60eafbf009a | 643 | { |
gmehmet | 1:f60eafbf009a | 644 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 645 | mxm_assert_msg((mode <= SS_MAX_SUPPORTED_MODE_NUM), "mode must be < SS_MAX_SUPPORTED_MODE_NUM, or update code to handle variable length mode values"); |
gmehmet | 1:f60eafbf009a | 646 | mxm_assert_msg((mode != 0), "Tried to enable sensor to mode 0, but mode 0 is disable"); |
gmehmet | 1:f60eafbf009a | 647 | |
gmehmet | 1:f60eafbf009a | 648 | |
gmehmet | 1:f60eafbf009a | 649 | uint8_t cmd_bytes[] = { SS_FAM_W_SENSORMODE, (uint8_t)idx, (uint8_t)mode, ext_mode }; |
gmehmet | 1:f60eafbf009a | 650 | |
gmehmet | 1:f60eafbf009a | 651 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, 5 * SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 652 | |
gmehmet | 1:f60eafbf009a | 653 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 654 | sensor_enabled_mode[idx] = mode; |
gmehmet | 1:f60eafbf009a | 655 | sensor_data_reqs[idx] = data_req; |
gmehmet | 1:f60eafbf009a | 656 | } |
gmehmet | 1:f60eafbf009a | 657 | return status; |
gmehmet | 1:f60eafbf009a | 658 | } |
gmehmet | 1:f60eafbf009a | 659 | |
gmehmet | 1:f60eafbf009a | 660 | SS_STATUS SSInterface::disable_sensor(int idx) |
gmehmet | 1:f60eafbf009a | 661 | { |
gmehmet | 1:f60eafbf009a | 662 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_SENSOR_NUM), "idx must be < SS_MAX_SUPPORTED_SENSOR_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 663 | uint8_t cmd_bytes[] = { SS_FAM_W_SENSORMODE, (uint8_t)idx, 0 }; |
gmehmet | 1:f60eafbf009a | 664 | |
gmehmet | 1:f60eafbf009a | 665 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 666 | |
gmehmet | 1:f60eafbf009a | 667 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 668 | sensor_enabled_mode[idx] = 0; |
gmehmet | 1:f60eafbf009a | 669 | sensor_data_reqs[idx] = 0; |
gmehmet | 1:f60eafbf009a | 670 | } |
gmehmet | 1:f60eafbf009a | 671 | |
gmehmet | 1:f60eafbf009a | 672 | return status; |
gmehmet | 1:f60eafbf009a | 673 | } |
gmehmet | 1:f60eafbf009a | 674 | |
gmehmet | 1:f60eafbf009a | 675 | SS_STATUS SSInterface::enable_algo(int idx, int mode, ss_data_req *data_req) |
gmehmet | 1:f60eafbf009a | 676 | { |
gmehmet | 1:f60eafbf009a | 677 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 678 | mxm_assert_msg((mode <= SS_MAX_SUPPORTED_MODE_NUM), "mode must be < SS_MAX_SUPPORTED_MODE_NUM, or update code to handle variable length mode values"); |
gmehmet | 1:f60eafbf009a | 679 | mxm_assert_msg((mode != 0), "Tried to enable algo to mode 0, but mode 0 is disable"); |
gmehmet | 1:f60eafbf009a | 680 | |
gmehmet | 1:f60eafbf009a | 681 | uint8_t cmd_bytes[] = { SS_FAM_W_ALGOMODE, (uint8_t)idx, (uint8_t)mode }; |
gmehmet | 1:f60eafbf009a | 682 | |
gmehmet | 1:f60eafbf009a | 683 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, 25 * SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 684 | |
gmehmet | 1:f60eafbf009a | 685 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 686 | algo_enabled_mode[idx] = mode; |
gmehmet | 1:f60eafbf009a | 687 | algo_data_reqs[idx] = data_req; |
gmehmet | 1:f60eafbf009a | 688 | } |
gmehmet | 1:f60eafbf009a | 689 | |
gmehmet | 1:f60eafbf009a | 690 | return status; |
gmehmet | 1:f60eafbf009a | 691 | } |
gmehmet | 1:f60eafbf009a | 692 | |
gmehmet | 1:f60eafbf009a | 693 | SS_STATUS SSInterface::disable_algo(int idx) |
gmehmet | 1:f60eafbf009a | 694 | { |
gmehmet | 1:f60eafbf009a | 695 | mxm_assert_msg((idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 696 | uint8_t cmd_bytes[] = { SS_FAM_W_ALGOMODE, (uint8_t)idx, 0 }; |
gmehmet | 1:f60eafbf009a | 697 | |
gmehmet | 1:f60eafbf009a | 698 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), 0, 0, SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 699 | |
gmehmet | 1:f60eafbf009a | 700 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 701 | algo_enabled_mode[idx] = 0; |
gmehmet | 1:f60eafbf009a | 702 | algo_data_reqs[idx] = 0; |
gmehmet | 1:f60eafbf009a | 703 | } |
gmehmet | 1:f60eafbf009a | 704 | |
gmehmet | 1:f60eafbf009a | 705 | return status; |
gmehmet | 1:f60eafbf009a | 706 | } |
gmehmet | 1:f60eafbf009a | 707 | |
gmehmet | 1:f60eafbf009a | 708 | SS_STATUS SSInterface::set_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz) |
gmehmet | 1:f60eafbf009a | 709 | { |
gmehmet | 1:f60eafbf009a | 710 | mxm_assert_msg((algo_idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 711 | mxm_assert_msg((cfg_idx <= SS_MAX_SUPPORTED_ALGO_CFG_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_CFG_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 712 | |
gmehmet | 1:f60eafbf009a | 713 | uint8_t cmd_bytes[] = { SS_FAM_W_ALGOCONFIG, (uint8_t)algo_idx, (uint8_t)cfg_idx }; |
gmehmet | 1:f60eafbf009a | 714 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 715 | cfg, cfg_sz); |
gmehmet | 1:f60eafbf009a | 716 | |
gmehmet | 1:f60eafbf009a | 717 | return status; |
gmehmet | 1:f60eafbf009a | 718 | } |
gmehmet | 1:f60eafbf009a | 719 | |
gmehmet | 1:f60eafbf009a | 720 | SS_STATUS SSInterface::get_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz) |
gmehmet | 1:f60eafbf009a | 721 | { |
gmehmet | 1:f60eafbf009a | 722 | mxm_assert_msg((algo_idx <= SS_MAX_SUPPORTED_ALGO_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 723 | mxm_assert_msg((cfg_idx <= SS_MAX_SUPPORTED_ALGO_CFG_NUM), "idx must be < SS_MAX_SUPPORTED_ALGO_CFG_NUM, or update code to handle variable length idx values"); |
gmehmet | 1:f60eafbf009a | 724 | |
gmehmet | 1:f60eafbf009a | 725 | uint8_t cmd_bytes[] = { SS_FAM_R_ALGOCONFIG, (uint8_t)algo_idx, (uint8_t)cfg_idx }; |
gmehmet | 1:f60eafbf009a | 726 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 727 | 0, 0, |
gmehmet | 1:f60eafbf009a | 728 | cfg, cfg_sz); |
gmehmet | 1:f60eafbf009a | 729 | |
gmehmet | 1:f60eafbf009a | 730 | return status; |
gmehmet | 1:f60eafbf009a | 731 | } |
gmehmet | 1:f60eafbf009a | 732 | |
gmehmet | 1:f60eafbf009a | 733 | //-------------------------------------------------------------- |
gmehmet | 1:f60eafbf009a | 734 | SS_STATUS SSInterface::send_raw(uint8_t *rawdata, int rawdata_sz) |
gmehmet | 1:f60eafbf009a | 735 | { |
gmehmet | 1:f60eafbf009a | 736 | SS_STATUS status = write_cmd(&rawdata[0], rawdata_sz, 5 * SS_ENABLE_SENSOR_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 737 | return status; |
gmehmet | 1:f60eafbf009a | 738 | } |
gmehmet | 1:f60eafbf009a | 739 | //--------------------------------------------------------------- |
gmehmet | 1:f60eafbf009a | 740 | SS_STATUS SSInterface::set_data_type(int data_type, bool sc_en) |
gmehmet | 1:f60eafbf009a | 741 | { |
gmehmet | 1:f60eafbf009a | 742 | mxm_assert_msg((data_type >= 0) && (data_type <= 3), "Invalid value for data_type"); |
gmehmet | 1:f60eafbf009a | 743 | uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_OUTPUTMODE }; |
gmehmet | 1:f60eafbf009a | 744 | uint8_t data_bytes[] = { (uint8_t)((sc_en ? SS_MASK_OUTPUTMODE_SC_EN : 0) | |
gmehmet | 1:f60eafbf009a | 745 | ((data_type << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE)) }; |
gmehmet | 1:f60eafbf009a | 746 | |
gmehmet | 1:f60eafbf009a | 747 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 748 | &data_bytes[0], ARRAY_SIZE(data_bytes)); |
gmehmet | 1:f60eafbf009a | 749 | |
gmehmet | 1:f60eafbf009a | 750 | this->data_type = data_type; |
gmehmet | 1:f60eafbf009a | 751 | this->sc_en = sc_en; |
gmehmet | 1:f60eafbf009a | 752 | |
gmehmet | 1:f60eafbf009a | 753 | return status; |
gmehmet | 1:f60eafbf009a | 754 | } |
gmehmet | 1:f60eafbf009a | 755 | |
gmehmet | 1:f60eafbf009a | 756 | |
gmehmet | 1:f60eafbf009a | 757 | SS_STATUS SSInterface::get_data_type(int *data_type, bool *sc_en) |
gmehmet | 1:f60eafbf009a | 758 | { |
gmehmet | 1:f60eafbf009a | 759 | uint8_t cmd_bytes[] = { SS_FAM_R_COMMCHAN, SS_CMDIDX_OUTPUTMODE }; |
gmehmet | 1:f60eafbf009a | 760 | uint8_t rxbuf[2] = {0}; |
gmehmet | 1:f60eafbf009a | 761 | |
gmehmet | 1:f60eafbf009a | 762 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 763 | 0, 0, |
gmehmet | 1:f60eafbf009a | 764 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 765 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 766 | *data_type = |
gmehmet | 1:f60eafbf009a | 767 | (rxbuf[1] & SS_MASK_OUTPUTMODE_DATATYPE) >> SS_SHIFT_OUTPUTMODE_DATATYPE; |
gmehmet | 1:f60eafbf009a | 768 | *sc_en = |
gmehmet | 1:f60eafbf009a | 769 | (bool)((rxbuf[1] & SS_MASK_OUTPUTMODE_SC_EN) >> SS_SHIFT_OUTPUTMODE_SC_EN); |
gmehmet | 1:f60eafbf009a | 770 | } |
gmehmet | 1:f60eafbf009a | 771 | |
gmehmet | 1:f60eafbf009a | 772 | return status; |
gmehmet | 1:f60eafbf009a | 773 | } |
gmehmet | 1:f60eafbf009a | 774 | |
gmehmet | 1:f60eafbf009a | 775 | SS_STATUS SSInterface::set_fifo_thresh(int thresh) |
gmehmet | 1:f60eafbf009a | 776 | { |
gmehmet | 1:f60eafbf009a | 777 | mxm_assert_msg((thresh > 0 && thresh <= 255), "Invalid value for fifo a full threshold"); |
gmehmet | 1:f60eafbf009a | 778 | uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_FIFOAFULL }; |
gmehmet | 1:f60eafbf009a | 779 | uint8_t data_bytes[] = { (uint8_t)thresh }; |
gmehmet | 1:f60eafbf009a | 780 | |
gmehmet | 1:f60eafbf009a | 781 | SS_STATUS status = write_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 782 | &data_bytes[0], ARRAY_SIZE(data_bytes)); |
gmehmet | 1:f60eafbf009a | 783 | return status; |
gmehmet | 1:f60eafbf009a | 784 | } |
gmehmet | 1:f60eafbf009a | 785 | |
gmehmet | 1:f60eafbf009a | 786 | SS_STATUS SSInterface::get_fifo_thresh(int *thresh) |
gmehmet | 1:f60eafbf009a | 787 | { |
gmehmet | 1:f60eafbf009a | 788 | uint8_t cmd_bytes[] = { SS_FAM_R_COMMCHAN, SS_CMDIDX_FIFOAFULL }; |
gmehmet | 1:f60eafbf009a | 789 | uint8_t rxbuf[2] = {0}; |
gmehmet | 1:f60eafbf009a | 790 | |
gmehmet | 1:f60eafbf009a | 791 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 792 | 0, 0, |
gmehmet | 1:f60eafbf009a | 793 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 794 | |
gmehmet | 1:f60eafbf009a | 795 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 796 | *thresh = rxbuf[1]; |
gmehmet | 1:f60eafbf009a | 797 | } |
gmehmet | 1:f60eafbf009a | 798 | |
gmehmet | 1:f60eafbf009a | 799 | return status; |
gmehmet | 1:f60eafbf009a | 800 | } |
gmehmet | 1:f60eafbf009a | 801 | |
gmehmet | 1:f60eafbf009a | 802 | SS_STATUS SSInterface::ss_comm_check() |
gmehmet | 1:f60eafbf009a | 803 | { |
gmehmet | 1:f60eafbf009a | 804 | uint8_t cmd_bytes[] = { SS_FAM_R_IDENTITY, SS_CMDIDX_PLATTYPE }; |
gmehmet | 1:f60eafbf009a | 805 | uint8_t rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 806 | |
gmehmet | 1:f60eafbf009a | 807 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 808 | 0, 0, |
gmehmet | 1:f60eafbf009a | 809 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 810 | |
gmehmet | 1:f60eafbf009a | 811 | int tries = 4; |
gmehmet | 1:f60eafbf009a | 812 | while (status == SS_ERR_TRY_AGAIN && tries--) { |
gmehmet | 1:f60eafbf009a | 813 | wait_ms(1000); |
gmehmet | 1:f60eafbf009a | 814 | status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 815 | 0, 0, |
gmehmet | 1:f60eafbf009a | 816 | &rxbuf[0], ARRAY_SIZE(rxbuf)); |
gmehmet | 1:f60eafbf009a | 817 | } |
gmehmet | 1:f60eafbf009a | 818 | |
gmehmet | 1:f60eafbf009a | 819 | return status; |
gmehmet | 1:f60eafbf009a | 820 | } |
gmehmet | 1:f60eafbf009a | 821 | |
gmehmet | 1:f60eafbf009a | 822 | void SSInterface::fifo_sample_size(int data_type, int *sample_size) |
gmehmet | 1:f60eafbf009a | 823 | { |
gmehmet | 1:f60eafbf009a | 824 | *sample_size = 0; |
gmehmet | 1:f60eafbf009a | 825 | |
gmehmet | 1:f60eafbf009a | 826 | if (data_type == SS_DATATYPE_RAW || data_type == SS_DATATYPE_BOTH) { |
gmehmet | 1:f60eafbf009a | 827 | for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) { |
gmehmet | 1:f60eafbf009a | 828 | if (sensor_enabled_mode[i]) { |
gmehmet | 1:f60eafbf009a | 829 | mxm_assert_msg(sensor_data_reqs[i], "no ss_data_req found for enabled sensor"); |
gmehmet | 1:f60eafbf009a | 830 | *sample_size += sensor_data_reqs[i]->data_size; |
gmehmet | 1:f60eafbf009a | 831 | } |
gmehmet | 1:f60eafbf009a | 832 | } |
gmehmet | 1:f60eafbf009a | 833 | } |
gmehmet | 1:f60eafbf009a | 834 | |
gmehmet | 1:f60eafbf009a | 835 | if (data_type == SS_DATATYPE_ALGO || data_type == SS_DATATYPE_BOTH) { |
gmehmet | 1:f60eafbf009a | 836 | for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) { |
gmehmet | 1:f60eafbf009a | 837 | if (algo_enabled_mode[i]) { |
gmehmet | 1:f60eafbf009a | 838 | mxm_assert_msg(algo_data_reqs[i], "no ss_data_req found for enabled algo"); |
gmehmet | 1:f60eafbf009a | 839 | *sample_size += algo_data_reqs[i]->data_size; |
gmehmet | 1:f60eafbf009a | 840 | } |
gmehmet | 1:f60eafbf009a | 841 | } |
gmehmet | 1:f60eafbf009a | 842 | } |
gmehmet | 1:f60eafbf009a | 843 | } |
gmehmet | 1:f60eafbf009a | 844 | |
gmehmet | 1:f60eafbf009a | 845 | |
gmehmet | 1:f60eafbf009a | 846 | SS_STATUS SSInterface::num_avail_samples(int *num_samples) |
gmehmet | 1:f60eafbf009a | 847 | { |
gmehmet | 1:f60eafbf009a | 848 | uint8_t cmd_bytes[] = { SS_FAM_R_OUTPUTFIFO, SS_CMDIDX_OUT_NUMSAMPLES }; |
gmehmet | 1:f60eafbf009a | 849 | uint8_t rxbuf[2] = {0}; |
gmehmet | 1:f60eafbf009a | 850 | |
gmehmet | 1:f60eafbf009a | 851 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 852 | 0, 0, |
gmehmet | 1:f60eafbf009a | 853 | &rxbuf[0], ARRAY_SIZE(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 854 | |
gmehmet | 1:f60eafbf009a | 855 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 856 | *num_samples = rxbuf[1]; |
gmehmet | 1:f60eafbf009a | 857 | } |
gmehmet | 1:f60eafbf009a | 858 | |
gmehmet | 1:f60eafbf009a | 859 | return status; |
gmehmet | 1:f60eafbf009a | 860 | } |
gmehmet | 1:f60eafbf009a | 861 | |
gmehmet | 1:f60eafbf009a | 862 | SS_STATUS SSInterface::get_log_len(int *log_len) |
gmehmet | 1:f60eafbf009a | 863 | { |
gmehmet | 1:f60eafbf009a | 864 | uint8_t cmd_bytes[] = { SS_FAM_R_LOG, SS_CMDIDX_R_LOG_LEN }; |
gmehmet | 1:f60eafbf009a | 865 | uint8_t rxbuf[2] = {0}; |
gmehmet | 1:f60eafbf009a | 866 | |
gmehmet | 1:f60eafbf009a | 867 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 868 | 0, 0, |
gmehmet | 1:f60eafbf009a | 869 | &rxbuf[0], ARRAY_SIZE(rxbuf), 1); |
gmehmet | 1:f60eafbf009a | 870 | |
gmehmet | 1:f60eafbf009a | 871 | if (status == SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 872 | *log_len = (rxbuf[1] << 8) | rxbuf[0]; |
gmehmet | 1:f60eafbf009a | 873 | } |
gmehmet | 1:f60eafbf009a | 874 | |
gmehmet | 1:f60eafbf009a | 875 | return status; |
gmehmet | 1:f60eafbf009a | 876 | } |
gmehmet | 1:f60eafbf009a | 877 | |
gmehmet | 1:f60eafbf009a | 878 | |
gmehmet | 1:f60eafbf009a | 879 | SS_STATUS SSInterface::get_sensor_sample_size(uint8_t sensor_id, uint8_t *sample_size) |
gmehmet | 1:f60eafbf009a | 880 | { |
gmehmet | 1:f60eafbf009a | 881 | uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_SAMPLE_SIZE, sensor_id }; |
gmehmet | 1:f60eafbf009a | 882 | uint8_t rxbuf[2]; /* status + sample size */ |
gmehmet | 1:f60eafbf009a | 883 | |
gmehmet | 1:f60eafbf009a | 884 | pr_info("[Reading external sample size for id: %d\n", sensor_id); |
gmehmet | 1:f60eafbf009a | 885 | SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 886 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 887 | rxbuf, sizeof(rxbuf)); |
gmehmet | 1:f60eafbf009a | 888 | *sample_size = rxbuf[1]; |
gmehmet | 1:f60eafbf009a | 889 | return status; |
gmehmet | 1:f60eafbf009a | 890 | } |
gmehmet | 1:f60eafbf009a | 891 | |
gmehmet | 1:f60eafbf009a | 892 | SS_STATUS SSInterface::get_input_fifo_size(int *fifo_size) |
gmehmet | 1:f60eafbf009a | 893 | { |
gmehmet | 1:f60eafbf009a | 894 | uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_INPUT_FIFO_SIZE}; |
gmehmet | 1:f60eafbf009a | 895 | uint8_t rxbuf[3]; /* status + fifo size */ |
gmehmet | 1:f60eafbf009a | 896 | |
gmehmet | 1:f60eafbf009a | 897 | pr_info("[Reading external Input FIFO size.\n"); |
gmehmet | 1:f60eafbf009a | 898 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 899 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 900 | rxbuf, sizeof(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 901 | *fifo_size = rxbuf[1] << 8 | rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 902 | return status; |
gmehmet | 1:f60eafbf009a | 903 | } |
gmehmet | 1:f60eafbf009a | 904 | |
gmehmet | 1:f60eafbf009a | 905 | SS_STATUS SSInterface::get_sensor_fifo_size(uint8_t sensor_id, int *fifo_size) |
gmehmet | 1:f60eafbf009a | 906 | { |
gmehmet | 1:f60eafbf009a | 907 | uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_SENSOR_FIFO_SIZE, sensor_id}; |
gmehmet | 1:f60eafbf009a | 908 | uint8_t rxbuf[3]; /* status + fifo size */ |
gmehmet | 1:f60eafbf009a | 909 | |
gmehmet | 1:f60eafbf009a | 910 | pr_info("[Reading sensor's FIFO size for id: %d\n", sensor_id); |
gmehmet | 1:f60eafbf009a | 911 | SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 912 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 913 | rxbuf, sizeof(rxbuf)); |
gmehmet | 1:f60eafbf009a | 914 | *fifo_size = rxbuf[1] << 8 | rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 915 | return status; |
gmehmet | 1:f60eafbf009a | 916 | } |
gmehmet | 1:f60eafbf009a | 917 | |
gmehmet | 1:f60eafbf009a | 918 | SS_STATUS SSInterface::get_num_samples_in_sensor_fifo(uint8_t sensor_id, int *fifo_size) |
gmehmet | 1:f60eafbf009a | 919 | { |
gmehmet | 1:f60eafbf009a | 920 | uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_NUM_SAMPLES_SENSOR_FIFO, sensor_id}; |
gmehmet | 1:f60eafbf009a | 921 | uint8_t rxbuf[3]; /* status + fifo size */ |
gmehmet | 1:f60eafbf009a | 922 | |
gmehmet | 1:f60eafbf009a | 923 | pr_info("[Reading sensor's FIFO size for id: %d\n", sensor_id); |
gmehmet | 1:f60eafbf009a | 924 | SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 925 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 926 | rxbuf, sizeof(rxbuf)); |
gmehmet | 1:f60eafbf009a | 927 | *fifo_size = rxbuf[1] << 8 | rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 928 | return status; |
gmehmet | 1:f60eafbf009a | 929 | } |
gmehmet | 1:f60eafbf009a | 930 | |
gmehmet | 1:f60eafbf009a | 931 | SS_STATUS SSInterface::get_num_bytes_in_input_fifo(int *fifo_size) |
gmehmet | 1:f60eafbf009a | 932 | { |
gmehmet | 1:f60eafbf009a | 933 | uint8_t cmd_bytes[] = { SS_FAM_R_INPUTFIFO, SS_CMDIDX_NUM_SAMPLES_INPUT_FIFO}; |
gmehmet | 1:f60eafbf009a | 934 | uint8_t rxbuf[3]; /* status + fifo size */ |
gmehmet | 1:f60eafbf009a | 935 | |
gmehmet | 1:f60eafbf009a | 936 | pr_info("[Reading input FIFO size for id\n"); |
gmehmet | 1:f60eafbf009a | 937 | SS_STATUS status = read_cmd(cmd_bytes, ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 938 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 939 | rxbuf, sizeof(rxbuf), |
gmehmet | 1:f60eafbf009a | 940 | SS_DEFAULT2_CMD_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 941 | *fifo_size = rxbuf[1] << 8 | rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 942 | return status; |
gmehmet | 1:f60eafbf009a | 943 | } |
gmehmet | 1:f60eafbf009a | 944 | |
gmehmet | 1:f60eafbf009a | 945 | SS_STATUS SSInterface::feed_to_input_fifo(uint8_t *tx_buf, int tx_buf_sz, int *nb_written) |
gmehmet | 1:f60eafbf009a | 946 | { |
gmehmet | 1:f60eafbf009a | 947 | int ret; |
gmehmet | 1:f60eafbf009a | 948 | uint8_t rxbuf[3]; |
gmehmet | 1:f60eafbf009a | 949 | |
gmehmet | 1:f60eafbf009a | 950 | tx_buf[0] = SS_FAM_W_INPUTFIFO; |
gmehmet | 1:f60eafbf009a | 951 | tx_buf[1] = SS_CMDIDX_WRITE_FIFO; |
gmehmet | 1:f60eafbf009a | 952 | |
gmehmet | 1:f60eafbf009a | 953 | ret = read_cmd(&tx_buf[0], tx_buf_sz, |
gmehmet | 1:f60eafbf009a | 954 | NULL, 0, |
gmehmet | 1:f60eafbf009a | 955 | rxbuf, sizeof(rxbuf), SS_DEFAULT3_CMD_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 956 | |
gmehmet | 1:f60eafbf009a | 957 | *nb_written = rxbuf[1] * 256 + rxbuf[2]; |
gmehmet | 1:f60eafbf009a | 958 | return (SS_STATUS)ret; |
gmehmet | 1:f60eafbf009a | 959 | } |
gmehmet | 1:f60eafbf009a | 960 | |
gmehmet | 1:f60eafbf009a | 961 | SS_STATUS SSInterface::read_fifo_data(int num_samples, int sample_size, |
gmehmet | 1:f60eafbf009a | 962 | uint8_t* databuf, int databuf_sz) |
gmehmet | 1:f60eafbf009a | 963 | { |
gmehmet | 1:f60eafbf009a | 964 | int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte |
gmehmet | 1:f60eafbf009a | 965 | mxm_assert_msg((bytes_to_read <= databuf_sz), "databuf too small"); |
gmehmet | 1:f60eafbf009a | 966 | |
gmehmet | 1:f60eafbf009a | 967 | uint8_t cmd_bytes[] = { SS_FAM_R_OUTPUTFIFO, SS_CMDIDX_READFIFO }; |
gmehmet | 1:f60eafbf009a | 968 | |
gmehmet | 1:f60eafbf009a | 969 | pr_info("[reading %d bytes (%d samples)\r\n", bytes_to_read, num_samples); |
gmehmet | 1:f60eafbf009a | 970 | |
gmehmet | 1:f60eafbf009a | 971 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 972 | 0, 0, |
gmehmet | 1:f60eafbf009a | 973 | databuf, bytes_to_read, 10); |
gmehmet | 1:f60eafbf009a | 974 | |
gmehmet | 1:f60eafbf009a | 975 | return status; |
gmehmet | 1:f60eafbf009a | 976 | } |
gmehmet | 1:f60eafbf009a | 977 | |
gmehmet | 1:f60eafbf009a | 978 | SS_STATUS SSInterface::read_ss_log(int num_bytes, uint8_t *log_buf, int log_buf_sz) |
gmehmet | 1:f60eafbf009a | 979 | { |
gmehmet | 1:f60eafbf009a | 980 | int bytes_to_read = num_bytes + 1; //+1 for status byte |
gmehmet | 1:f60eafbf009a | 981 | mxm_assert_msg((bytes_to_read <= log_buf_sz), "log_buf too small"); |
gmehmet | 1:f60eafbf009a | 982 | |
gmehmet | 1:f60eafbf009a | 983 | uint8_t cmd_bytes[] = { SS_FAM_R_LOG, SS_CMDIDX_R_LOG_DATA }; |
gmehmet | 1:f60eafbf009a | 984 | |
gmehmet | 1:f60eafbf009a | 985 | pr_info("[reading %d bytes (%d samples)\r\n", bytes_to_read, bytes_to_read); |
gmehmet | 1:f60eafbf009a | 986 | |
gmehmet | 1:f60eafbf009a | 987 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 988 | 0, 0, |
gmehmet | 1:f60eafbf009a | 989 | log_buf, bytes_to_read, 5); |
gmehmet | 1:f60eafbf009a | 990 | |
gmehmet | 1:f60eafbf009a | 991 | return status; |
gmehmet | 1:f60eafbf009a | 992 | } |
gmehmet | 1:f60eafbf009a | 993 | |
gmehmet | 1:f60eafbf009a | 994 | static uint8_t databuf[512]; |
gmehmet | 1:f60eafbf009a | 995 | void SSInterface::ss_execute_once(){ |
gmehmet | 1:f60eafbf009a | 996 | |
gmehmet | 1:f60eafbf009a | 997 | if(m_irq_received_ == false) |
gmehmet | 1:f60eafbf009a | 998 | return; |
gmehmet | 1:f60eafbf009a | 999 | |
gmehmet | 1:f60eafbf009a | 1000 | uint8_t sample_count; |
gmehmet | 1:f60eafbf009a | 1001 | m_irq_received_ = false; |
gmehmet | 1:f60eafbf009a | 1002 | uint8_t cmd_bytes[] = { SS_FAM_R_STATUS, SS_CMDIDX_STATUS }; |
gmehmet | 1:f60eafbf009a | 1003 | uint8_t rxbuf[2] = {0}; |
gmehmet | 1:f60eafbf009a | 1004 | |
gmehmet | 1:f60eafbf009a | 1005 | //irq_evt.start(); |
gmehmet | 1:f60eafbf009a | 1006 | |
gmehmet | 1:f60eafbf009a | 1007 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 1008 | |
gmehmet | 1:f60eafbf009a | 1009 | SS_STATUS status = read_cmd(&cmd_bytes[0], ARRAY_SIZE(cmd_bytes), |
gmehmet | 1:f60eafbf009a | 1010 | 0, 0, |
gmehmet | 1:f60eafbf009a | 1011 | &rxbuf[0], ARRAY_SIZE(rxbuf), SS_DEFAULT2_CMD_SLEEP_MS); |
gmehmet | 1:f60eafbf009a | 1012 | pr_info("ss_int: %2X", rxbuf[1]); |
gmehmet | 1:f60eafbf009a | 1013 | |
gmehmet | 1:f60eafbf009a | 1014 | if (status != SS_SUCCESS) { |
gmehmet | 1:f60eafbf009a | 1015 | pr_err("Couldn't read status byte of SmartSensor!"); |
gmehmet | 1:f60eafbf009a | 1016 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1017 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1018 | return; |
gmehmet | 1:f60eafbf009a | 1019 | } |
gmehmet | 1:f60eafbf009a | 1020 | |
gmehmet | 1:f60eafbf009a | 1021 | if (rxbuf[1] & SS_MASK_STATUS_ERR) { |
gmehmet | 1:f60eafbf009a | 1022 | pr_err("SmartSensor status error: %d", rxbuf[1] & SS_MASK_STATUS_ERR); |
gmehmet | 1:f60eafbf009a | 1023 | } |
gmehmet | 1:f60eafbf009a | 1024 | if (rxbuf[1] & SS_MASK_STATUS_FIFO_OUT_OVR) { |
gmehmet | 1:f60eafbf009a | 1025 | pr_err("SmartSensor Output FIFO overflow!"); |
gmehmet | 1:f60eafbf009a | 1026 | } |
gmehmet | 1:f60eafbf009a | 1027 | if (rxbuf[1] & SS_MASK_STATUS_FIFO_IN_OVR) { |
gmehmet | 1:f60eafbf009a | 1028 | pr_err("SmartSensor Input FIFO overflow!"); |
gmehmet | 1:f60eafbf009a | 1029 | } |
gmehmet | 1:f60eafbf009a | 1030 | |
gmehmet | 1:f60eafbf009a | 1031 | if (rxbuf[1] & SS_MASK_STATUS_LOG_OVR) { |
gmehmet | 1:f60eafbf009a | 1032 | pr_err("SmartSensor log overflow!"); |
gmehmet | 1:f60eafbf009a | 1033 | } |
gmehmet | 1:f60eafbf009a | 1034 | |
gmehmet | 1:f60eafbf009a | 1035 | if (rxbuf[1] & SS_MASK_STATUS_LOG_RDY) { |
gmehmet | 1:f60eafbf009a | 1036 | pr_err("SmartSensor Log ready"); |
gmehmet | 1:f60eafbf009a | 1037 | int log_len; |
gmehmet | 1:f60eafbf009a | 1038 | status = get_log_len(&log_len); |
gmehmet | 1:f60eafbf009a | 1039 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 1040 | { |
gmehmet | 1:f60eafbf009a | 1041 | pr_err("Couldn't read log lenght"); |
gmehmet | 1:f60eafbf009a | 1042 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1043 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1044 | return; |
gmehmet | 1:f60eafbf009a | 1045 | } |
gmehmet | 1:f60eafbf009a | 1046 | |
gmehmet | 1:f60eafbf009a | 1047 | mxm_assert_msg((log_len <= sizeof(databuf)), "log size in SS longer than buffer"); |
gmehmet | 1:f60eafbf009a | 1048 | status = read_ss_log(log_len, &databuf[0], sizeof(databuf)); |
gmehmet | 1:f60eafbf009a | 1049 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 1050 | { |
gmehmet | 1:f60eafbf009a | 1051 | pr_err("Couldn't read from SmartSensor Log"); |
gmehmet | 1:f60eafbf009a | 1052 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1053 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1054 | return; |
gmehmet | 1:f60eafbf009a | 1055 | } |
gmehmet | 1:f60eafbf009a | 1056 | |
gmehmet | 1:f60eafbf009a | 1057 | databuf[log_len] = 0; |
gmehmet | 1:f60eafbf009a | 1058 | Peripherals::usbSerial()->printf("\r\n%s", (char *)databuf); |
gmehmet | 1:f60eafbf009a | 1059 | } |
gmehmet | 1:f60eafbf009a | 1060 | |
gmehmet | 1:f60eafbf009a | 1061 | if (rxbuf[1] & SS_MASK_STATUS_DATA_RDY) { |
gmehmet | 1:f60eafbf009a | 1062 | int num_samples = 1; |
gmehmet | 1:f60eafbf009a | 1063 | status = num_avail_samples(&num_samples); |
gmehmet | 1:f60eafbf009a | 1064 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 1065 | { |
gmehmet | 1:f60eafbf009a | 1066 | pr_err("Couldn't read number of available samples in SmartSensor Output FIFO"); |
gmehmet | 1:f60eafbf009a | 1067 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1068 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1069 | return; |
gmehmet | 1:f60eafbf009a | 1070 | } |
gmehmet | 1:f60eafbf009a | 1071 | |
gmehmet | 1:f60eafbf009a | 1072 | int sample_size; |
gmehmet | 1:f60eafbf009a | 1073 | fifo_sample_size(data_type, &sample_size); |
gmehmet | 1:f60eafbf009a | 1074 | |
gmehmet | 1:f60eafbf009a | 1075 | int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte |
gmehmet | 1:f60eafbf009a | 1076 | if ((uint32_t)bytes_to_read > sizeof(databuf)) { |
gmehmet | 1:f60eafbf009a | 1077 | //Reduce number of samples to read to fit in buffer |
gmehmet | 1:f60eafbf009a | 1078 | num_samples = (sizeof(databuf) - 1) / sample_size; |
gmehmet | 1:f60eafbf009a | 1079 | } |
gmehmet | 1:f60eafbf009a | 1080 | |
gmehmet | 1:f60eafbf009a | 1081 | wait_ms(5); |
gmehmet | 1:f60eafbf009a | 1082 | status = read_fifo_data(num_samples, sample_size, &databuf[0], sizeof(databuf)); |
gmehmet | 1:f60eafbf009a | 1083 | if (status != SS_SUCCESS) |
gmehmet | 1:f60eafbf009a | 1084 | { |
gmehmet | 1:f60eafbf009a | 1085 | pr_err("Couldn't read from SmartSensor Output FIFO"); |
gmehmet | 1:f60eafbf009a | 1086 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1087 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1088 | return; |
gmehmet | 1:f60eafbf009a | 1089 | } |
gmehmet | 1:f60eafbf009a | 1090 | |
gmehmet | 1:f60eafbf009a | 1091 | //Skip status byte |
gmehmet | 1:f60eafbf009a | 1092 | uint8_t *data_ptr = &databuf[1]; |
gmehmet | 1:f60eafbf009a | 1093 | |
gmehmet | 1:f60eafbf009a | 1094 | int i = 0; |
gmehmet | 1:f60eafbf009a | 1095 | for (i = 0; i < num_samples; i++) { |
gmehmet | 1:f60eafbf009a | 1096 | if (sc_en) { |
gmehmet | 1:f60eafbf009a | 1097 | sample_count = *data_ptr++; |
gmehmet | 1:f60eafbf009a | 1098 | pr_info("Received sample #%d", sample_count); |
gmehmet | 1:f60eafbf009a | 1099 | } |
gmehmet | 1:f60eafbf009a | 1100 | |
gmehmet | 1:f60eafbf009a | 1101 | //Chop up data and send to modules with enabled sensors |
gmehmet | 1:f60eafbf009a | 1102 | if (data_type == SS_DATATYPE_RAW || data_type == SS_DATATYPE_BOTH) { |
gmehmet | 1:f60eafbf009a | 1103 | for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) { |
gmehmet | 1:f60eafbf009a | 1104 | if (sensor_enabled_mode[i]) { |
gmehmet | 1:f60eafbf009a | 1105 | mxm_assert_msg(sensor_data_reqs[i], |
gmehmet | 1:f60eafbf009a | 1106 | "no ss_data_req found for enabled sensor"); |
gmehmet | 1:f60eafbf009a | 1107 | sensor_data_reqs[i]->callback(data_ptr); |
gmehmet | 1:f60eafbf009a | 1108 | data_ptr += sensor_data_reqs[i]->data_size; |
gmehmet | 1:f60eafbf009a | 1109 | } |
gmehmet | 1:f60eafbf009a | 1110 | } |
gmehmet | 1:f60eafbf009a | 1111 | } |
gmehmet | 1:f60eafbf009a | 1112 | if (data_type == SS_DATATYPE_ALGO || data_type == SS_DATATYPE_BOTH) { |
gmehmet | 1:f60eafbf009a | 1113 | for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) { |
gmehmet | 1:f60eafbf009a | 1114 | if (algo_enabled_mode[i]) { |
gmehmet | 1:f60eafbf009a | 1115 | mxm_assert_msg(algo_data_reqs[i], |
gmehmet | 1:f60eafbf009a | 1116 | "no ss_data_req found for enabled algo"); |
gmehmet | 1:f60eafbf009a | 1117 | algo_data_reqs[i]->callback(data_ptr); |
gmehmet | 1:f60eafbf009a | 1118 | data_ptr += algo_data_reqs[i]->data_size; |
gmehmet | 1:f60eafbf009a | 1119 | } |
gmehmet | 1:f60eafbf009a | 1120 | } |
gmehmet | 1:f60eafbf009a | 1121 | } |
gmehmet | 1:f60eafbf009a | 1122 | } |
gmehmet | 1:f60eafbf009a | 1123 | } |
gmehmet | 1:f60eafbf009a | 1124 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1125 | //irq_evt.stop(); |
gmehmet | 1:f60eafbf009a | 1126 | } |
gmehmet | 1:f60eafbf009a | 1127 | |
gmehmet | 1:f60eafbf009a | 1128 | void SSInterface::ss_clear_interrupt_flag(){ |
gmehmet | 1:f60eafbf009a | 1129 | m_irq_received_ = false; |
gmehmet | 1:f60eafbf009a | 1130 | } |
gmehmet | 1:f60eafbf009a | 1131 | |
gmehmet | 1:f60eafbf009a | 1132 | void SSInterface::irq_handler() |
gmehmet | 1:f60eafbf009a | 1133 | { |
gmehmet | 1:f60eafbf009a | 1134 | m_irq_received_ = true; |
gmehmet | 1:f60eafbf009a | 1135 | } |
gmehmet | 1:f60eafbf009a | 1136 | |
gmehmet | 1:f60eafbf009a | 1137 | void SSInterface::irq_handler_selftest(){ |
gmehmet | 1:f60eafbf009a | 1138 | mfio_int_happened = true; |
gmehmet | 1:f60eafbf009a | 1139 | } |
gmehmet | 1:f60eafbf009a | 1140 | |
gmehmet | 1:f60eafbf009a | 1141 | bool SSInterface::reset_mfio_irq(){ |
gmehmet | 1:f60eafbf009a | 1142 | bool ret = mfio_int_happened; |
gmehmet | 1:f60eafbf009a | 1143 | mfio_int_happened = false; |
gmehmet | 1:f60eafbf009a | 1144 | disable_irq(); |
gmehmet | 1:f60eafbf009a | 1145 | irq_pin.fall(callback(this, &SSInterface::irq_handler)); |
gmehmet | 1:f60eafbf009a | 1146 | enable_irq(); |
gmehmet | 1:f60eafbf009a | 1147 | return ret; |
gmehmet | 1:f60eafbf009a | 1148 | } |