TEST

Dependencies:   max32630fthr Adafruit_FeatherOLED USBDevice

Committer:
wwwarunraj
Date:
Sun Apr 19 11:19:57 2020 +0000
Revision:
4:291477e8690d
Parent:
1:f60eafbf009a
19/04

Who changed what in which revision?

UserRevisionLine numberNew 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 }