Source code for Maxim Sensor Hub Communications. Mostly C library for MAX32664 sensor hub communications.

Committer:
gmehmet
Date:
Mon Dec 17 07:56:04 2018 +0000
Revision:
0:23dade9a66bf
as Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gmehmet 0:23dade9a66bf 1 /*******************************************************************************
gmehmet 0:23dade9a66bf 2 * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved.
gmehmet 0:23dade9a66bf 3 *
gmehmet 0:23dade9a66bf 4 * Permission is hereby granted, free of charge, to any person obtaining a
gmehmet 0:23dade9a66bf 5 * copy of this software and associated documentation files (the "Software"),
gmehmet 0:23dade9a66bf 6 * to deal in the Software without restriction, including without limitation
gmehmet 0:23dade9a66bf 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
gmehmet 0:23dade9a66bf 8 * and/or sell copies of the Software, and to permit persons to whom the
gmehmet 0:23dade9a66bf 9 * Software is furnished to do so, subject to the following conditions:
gmehmet 0:23dade9a66bf 10 *
gmehmet 0:23dade9a66bf 11 * The above copyright notice and this permission notice shall be included
gmehmet 0:23dade9a66bf 12 * in all copies or substantial portions of the Software.
gmehmet 0:23dade9a66bf 13 *
gmehmet 0:23dade9a66bf 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
gmehmet 0:23dade9a66bf 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
gmehmet 0:23dade9a66bf 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
gmehmet 0:23dade9a66bf 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
gmehmet 0:23dade9a66bf 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
gmehmet 0:23dade9a66bf 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
gmehmet 0:23dade9a66bf 20 * OTHER DEALINGS IN THE SOFTWARE.
gmehmet 0:23dade9a66bf 21 *
gmehmet 0:23dade9a66bf 22 * Except as contained in this notice, the name of Maxim Integrated
gmehmet 0:23dade9a66bf 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
gmehmet 0:23dade9a66bf 24 * Products, Inc. Branding Policy.
gmehmet 0:23dade9a66bf 25 *
gmehmet 0:23dade9a66bf 26 * The mere transfer of this software does not imply any licenses
gmehmet 0:23dade9a66bf 27 * of trade secrets, proprietary technology, copyrights, patents,
gmehmet 0:23dade9a66bf 28 * trademarks, maskwork rights, or any other form of intellectual
gmehmet 0:23dade9a66bf 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
gmehmet 0:23dade9a66bf 30 * ownership rights.
gmehmet 0:23dade9a66bf 31 *******************************************************************************
gmehmet 0:23dade9a66bf 32 */
gmehmet 0:23dade9a66bf 33
gmehmet 0:23dade9a66bf 34 /*
gmehmet 0:23dade9a66bf 35 #ifdef __cplusplus
gmehmet 0:23dade9a66bf 36 extern "C" {
gmehmet 0:23dade9a66bf 37 #endif
gmehmet 0:23dade9a66bf 38 */
gmehmet 0:23dade9a66bf 39
gmehmet 0:23dade9a66bf 40 #include <events/mbed_events.h>
gmehmet 0:23dade9a66bf 41 #include <mbed.h>
gmehmet 0:23dade9a66bf 42 #include "mbed.h"
gmehmet 0:23dade9a66bf 43
gmehmet 0:23dade9a66bf 44 #include "SHComm.h"
gmehmet 0:23dade9a66bf 45
gmehmet 0:23dade9a66bf 46
gmehmet 0:23dade9a66bf 47 #define SS_I2C_8BIT_SLAVE_ADDR 0xAA
gmehmet 0:23dade9a66bf 48 #define SENSORHUB_I2C_ADRESS SS_I2C_8BIT_SLAVE_ADDR
gmehmet 0:23dade9a66bf 49
gmehmet 0:23dade9a66bf 50 #define ENABLED ((int)(1))
gmehmet 0:23dade9a66bf 51 #define DISABLED ((int)(0))
gmehmet 0:23dade9a66bf 52
gmehmet 0:23dade9a66bf 53 #define SS_DUMP_REG_SLEEP_MS (100)
gmehmet 0:23dade9a66bf 54 #define SS_ENABLE_SENSOR_SLEEP_MS (20)
gmehmet 0:23dade9a66bf 55 #define SS_DEFAULT_CMD_SLEEP_MS (2)
gmehmet 0:23dade9a66bf 56 #define SS_WAIT_BETWEEN_TRIES_MS (2)
gmehmet 0:23dade9a66bf 57 #define SS_CMD_WAIT_PULLTRANS_MS (5)
gmehmet 0:23dade9a66bf 58 #define SS_FEEDFIFO_CMD_SLEEP_MS (30)
gmehmet 0:23dade9a66bf 59
gmehmet 0:23dade9a66bf 60
gmehmet 0:23dade9a66bf 61 #define SS_DEFAULT_RETRIES ((int) (4))
gmehmet 0:23dade9a66bf 62 #define SS_ZERO_DELAY 0
gmehmet 0:23dade9a66bf 63 #define SS_ZERO_BYTES 0
gmehmet 0:23dade9a66bf 64
gmehmet 0:23dade9a66bf 65
gmehmet 0:23dade9a66bf 66 /*define sample size of algorithm and raw sensor data in bytes*/
gmehmet 0:23dade9a66bf 67 #define SH_ALGO_WHRM_SAMPLE_DATABYTES 4
gmehmet 0:23dade9a66bf 68 #define SH_ALGO_SP02_SAMPLE_DATABYTES 4
gmehmet 0:23dade9a66bf 69
gmehmet 0:23dade9a66bf 70
gmehmet 0:23dade9a66bf 71 /*define command sequences given in Maxim ME32664 user manual*/
gmehmet 0:23dade9a66bf 72 #define SH_GET_HUB_STATUS_CMDSEQ {0x00,0x00}
gmehmet 0:23dade9a66bf 73 #define SH_SET_OPERATING_MODE_CMDSEQ(opMode) {0x01,0x00,opMode}
gmehmet 0:23dade9a66bf 74 #define SH_SET_OPERATING_MODE_BOOTLOADER_CMDSEQ {0x02,0x00,0x08}
gmehmet 0:23dade9a66bf 75 #define SH_SET_OPERATING_MODE_APPLICATION_CMDSEQ {0x02,0x00,0x00}
gmehmet 0:23dade9a66bf 76 #define SH_SET_OPERATING_MODE_RESET_CMDSEQ {0x02,0x00,0x02}
gmehmet 0:23dade9a66bf 77 #define SH_GET_OPERATING_MODE_CMDSEQ {0x02,0x00}
gmehmet 0:23dade9a66bf 78
gmehmet 0:23dade9a66bf 79 #define SH_SET_OUTPUT_MODE_CMDSEQ( outMode) {0x10,0x00, outMode}
gmehmet 0:23dade9a66bf 80 #define SH_SET_OUTMODE_NODATA_CMDSEQ {0x10,0x00,0x00}
gmehmet 0:23dade9a66bf 81 #define SH_SET_OUTMODE_SENSORDATA_CMDSEQ {0x10,0x00,0x01}
gmehmet 0:23dade9a66bf 82 #define SH_SET_OUTMODE_ALGODATA_CMDSEQ {0x10,0x00,0x02}
gmehmet 0:23dade9a66bf 83 #define SH_SET_OUTMODE_PAUSE_CMDSEQ {0x10,0x00,0x04}
gmehmet 0:23dade9a66bf 84 #define SH_SET_OUTMODE_SENSAMPLECNT_CMDSEQ {0x10,0x00,0x05}
gmehmet 0:23dade9a66bf 85 #define SH_SET_OUTMODE_ALGOSAMPLECNT_CMDSEQ {0x10,0x00,0x06}
gmehmet 0:23dade9a66bf 86 #define SH_SET_OUTMODE_ALGOSENSAMPLECNT_CMDSEQ {0x10,0x00,0x07}
gmehmet 0:23dade9a66bf 87
gmehmet 0:23dade9a66bf 88 #define SH_GET_OUTPUT_MODE_CMDSEQ {0x11,0x00}
gmehmet 0:23dade9a66bf 89
gmehmet 0:23dade9a66bf 90 #define SH_DFIFO_SET_INT_THRESHOLD_CMDSEQ( ucThreshold ) {0x10,0x01,ucThreshold}
gmehmet 0:23dade9a66bf 91 #define SH_DFIFO_GET_INT_THRESHOLD_CMDSEQ {0x11,0x01}
gmehmet 0:23dade9a66bf 92
gmehmet 0:23dade9a66bf 93 #define SH_DFIFO_GET_NSAMPLES_CMDSEQ {0x12,0x00}
gmehmet 0:23dade9a66bf 94 #define SH_DFIFO_PULL_SAMPLE_CMDSEQ {0x12,0x01}
gmehmet 0:23dade9a66bf 95 #define SH_GET_EXTINPUT_FIFOSZ_CMDSEQ {0x13,0x01}
gmehmet 0:23dade9a66bf 96 #define SH_GET_SAMPLEBYTECNT_INPUTFIFO_CMDSEQ {0x13,0x04}
gmehmet 0:23dade9a66bf 97 #define SH_FEED_TO_INPUTFIFO_CMDSEQ {0x14,0x00}
gmehmet 0:23dade9a66bf 98
gmehmet 0:23dade9a66bf 99 #define SH_WRITE_SENSORREG_CMDSEQ( sensorIdx , regAddr ) { 0x40, sensorIdx , regAddr}
gmehmet 0:23dade9a66bf 100 #define SH_READ_SENSORREG_CMDSEQ( sensorIdx , regAddr ) { 0x41, sensorIdx , regAddr}
gmehmet 0:23dade9a66bf 101 #define SH_READ_AFE_ATTRIBUTES_CMDSEQ(sensorIdx) { 0x42, sensorIdx}
gmehmet 0:23dade9a66bf 102 #define SH_READ_ALLREGISTERS_CMDSEQ(sensorIdx) { 0x43, sensorIdx}
gmehmet 0:23dade9a66bf 103
gmehmet 0:23dade9a66bf 104 #define SH_ENABLE_SENSOR_CMDSEQ(sensorIdx , extMode) {0x44, sensorIdx, 0x01 , extMode }
gmehmet 0:23dade9a66bf 105 #define SH_DISABLE_SENSOR_CMDSEQ(sensorIdx) {0x44, sensorIdx, 0x00}
gmehmet 0:23dade9a66bf 106
gmehmet 0:23dade9a66bf 107
gmehmet 0:23dade9a66bf 108 #define SH_AGC_SET_ADCRANGE_CMDSEQ( uiPercentage) {0x50, 0x00, 0x00 , uiPercentage}
gmehmet 0:23dade9a66bf 109 #define SH_AGC_SET_STEPSZ_CMDSEQ( uiPercentage) {0x50, 0x00, 0x01 , uiPercentage}
gmehmet 0:23dade9a66bf 110 #define SH_AGC_SET_SENSITIVITY_CMDSEQ( uiPercentage) {0x50, 0x00, 0x02 , uiPercentage}
gmehmet 0:23dade9a66bf 111 #define SH_AGC_SET_NSAMPLESAVRAGING_CMDSEQ( ucNsamples) {0x50, 0x00, 0x03 , uiNsamples}
gmehmet 0:23dade9a66bf 112 #define SH_WHRM_SET_SAMPRATE_CMDSEQ( ucNsamples) {0x50, 0x02, 0x03 , uiNsamples}
gmehmet 0:23dade9a66bf 113
gmehmet 0:23dade9a66bf 114
gmehmet 0:23dade9a66bf 115 #define SH_ENABLE_ALGO_CMDSEQ( algoIdx) { 0x52, algoIdx , 0x01}
gmehmet 0:23dade9a66bf 116 #define SH_DISABLE_ALGO_CMDSEQ( algoIdx) { 0x52, algoIdx , 0x00}
gmehmet 0:23dade9a66bf 117
gmehmet 0:23dade9a66bf 118 #define SH_SET_ALGO_CONFIGURATION_CMDSEQ( algoIdx, cgfIdx) { 0x50 , algoIdx, cgfIdx }
gmehmet 0:23dade9a66bf 119 #define SH_GET_ALGO_CONFIGURATION_CMDSEQ( algoIdx, cgfIdx) { 0x51 , algoIdx, cgfIdx }
gmehmet 0:23dade9a66bf 120
gmehmet 0:23dade9a66bf 121 #define SH_COMM_CHECK_CMDSEQ {0xFF, 0x00}
gmehmet 0:23dade9a66bf 122
gmehmet 0:23dade9a66bf 123 /*
gmehmet 0:23dade9a66bf 124 * define the "platform specific" hardware interface which SSinterface requires:
gmehmet 0:23dade9a66bf 125 * 1. master i2c port
gmehmet 0:23dade9a66bf 126 * 2. interrupt attachable I/O pin (mfio)
gmehmet 0:23dade9a66bf 127 * 3. I/O pin for reset
gmehmet 0:23dade9a66bf 128 * Note: Definitions below are for MAX32630FTR Pagasus board . Modify for your platform.
gmehmet 0:23dade9a66bf 129 **/
gmehmet 0:23dade9a66bf 130 I2C *m_i2cBus; /*i2c bus sensor hub is connected to*/
gmehmet 0:23dade9a66bf 131
gmehmet 0:23dade9a66bf 132 PinName ss_mfio(P5_4); /* platform specific mfio event pin */
gmehmet 0:23dade9a66bf 133 PinName ss_reset(P5_6); /* platform specific sensor hub reset pin */
gmehmet 0:23dade9a66bf 134 DigitalInOut mfio_pin(ss_mfio); /* mfio pin mode be I/O */
gmehmet 0:23dade9a66bf 135 DigitalInOut reset_pin(ss_reset); /* reset pin mode be I/O */
gmehmet 0:23dade9a66bf 136 InterruptIn irq_pin(ss_mfio); /* define mfio pin interrupt attachable*/
gmehmet 0:23dade9a66bf 137
gmehmet 0:23dade9a66bf 138
gmehmet 0:23dade9a66bf 139 /*
gmehmet 0:23dade9a66bf 140 * SSI API funcions
gmehmet 0:23dade9a66bf 141 * NOTE: Generic functions for any platform.
gmehmet 0:23dade9a66bf 142 * exceptions: below needs needs modification according to platform and HAL drivers
gmehmet 0:23dade9a66bf 143 * 1. Hard reset function
gmehmet 0:23dade9a66bf 144 * 2. Enable/disable mfio event interrput
gmehmet 0:23dade9a66bf 145 * 3. mfio pin interrupt routine
gmehmet 0:23dade9a66bf 146 *
gmehmet 0:23dade9a66bf 147 * **/
gmehmet 0:23dade9a66bf 148
gmehmet 0:23dade9a66bf 149 /*global buffer for sensor i2c commands+data*/
gmehmet 0:23dade9a66bf 150 uint8_t sh_write_buf[512];
gmehmet 0:23dade9a66bf 151 static volatile bool m_irq_received_ = false;
gmehmet 0:23dade9a66bf 152 static volatile bool mfio_int_happened = false;
gmehmet 0:23dade9a66bf 153
gmehmet 0:23dade9a66bf 154 /* sensor hub states */
gmehmet 0:23dade9a66bf 155 static bool sc_en = false;
gmehmet 0:23dade9a66bf 156 static int data_type = 0;
gmehmet 0:23dade9a66bf 157 static int is_sensor_enabled[SS_MAX_SUPPORTED_SENSOR_NUM] = {0};
gmehmet 0:23dade9a66bf 158 static int is_algo_enabled[SS_MAX_SUPPORTED_ALGO_NUM] = {0};
gmehmet 0:23dade9a66bf 159 static int sensor_sample_sz[SS_MAX_SUPPORTED_SENSOR_NUM] = {0};
gmehmet 0:23dade9a66bf 160 static int algo_sample_sz[SS_MAX_SUPPORTED_ALGO_NUM] = {0};
gmehmet 0:23dade9a66bf 161
gmehmet 0:23dade9a66bf 162
gmehmet 0:23dade9a66bf 163
gmehmet 0:23dade9a66bf 164 /* desc :
gmehmet 0:23dade9a66bf 165 * Func to init master i2c hardware comm interface with sennor hub
gmehmet 0:23dade9a66bf 166 * init mfio interrupt pin and attach irq to pin
gmehmet 0:23dade9a66bf 167 * init reset pin
gmehmet 0:23dade9a66bf 168 * params:
gmehmet 0:23dade9a66bf 169 * N/A
gmehmet 0:23dade9a66bf 170 */
gmehmet 0:23dade9a66bf 171
gmehmet 0:23dade9a66bf 172
gmehmet 0:23dade9a66bf 173 void sh_irq_handler();
gmehmet 0:23dade9a66bf 174 void sh_init_hwcomm_interface(){
gmehmet 0:23dade9a66bf 175 static I2C ssI2C(P3_4, P3_5); /*set up sensor hub i2c communication at 400 kHz*/
gmehmet 0:23dade9a66bf 176 ssI2C.frequency(400000);
gmehmet 0:23dade9a66bf 177 m_i2cBus = &ssI2C;
gmehmet 0:23dade9a66bf 178
gmehmet 0:23dade9a66bf 179 reset_pin.input();
gmehmet 0:23dade9a66bf 180 reset_pin.mode(PullUp);
gmehmet 0:23dade9a66bf 181 mfio_pin.input(); /*set mfio as input for getting mfio event reporting when sesnor hub is on application mode */
gmehmet 0:23dade9a66bf 182 mfio_pin.mode(PullUp);
gmehmet 0:23dade9a66bf 183
gmehmet 0:23dade9a66bf 184 irq_pin.fall(sh_irq_handler); /*attach falling edge interrupt to mfio pin for mfio event reporting */
gmehmet 0:23dade9a66bf 185
gmehmet 0:23dade9a66bf 186 return;
gmehmet 0:23dade9a66bf 187 }
gmehmet 0:23dade9a66bf 188
gmehmet 0:23dade9a66bf 189 /* mfio pin event reporting related interrupt functions*/
gmehmet 0:23dade9a66bf 190 /*
gmehmet 0:23dade9a66bf 191 * data ready event reporting isr from sensor hub
gmehmet 0:23dade9a66bf 192 *
gmehmet 0:23dade9a66bf 193 * params:
gmehmet 0:23dade9a66bf 194 * N/A
gmehmet 0:23dade9a66bf 195 * */
gmehmet 0:23dade9a66bf 196 void sh_irq_handler()
gmehmet 0:23dade9a66bf 197 {
gmehmet 0:23dade9a66bf 198 m_irq_received_ = true;
gmehmet 0:23dade9a66bf 199 }
gmehmet 0:23dade9a66bf 200 void sh_clear_mfio_event_flag(void){
gmehmet 0:23dade9a66bf 201 m_irq_received_ = false;
gmehmet 0:23dade9a66bf 202 }
gmehmet 0:23dade9a66bf 203
gmehmet 0:23dade9a66bf 204 bool sh_has_mfio_event(void){
gmehmet 0:23dade9a66bf 205 return m_irq_received_;
gmehmet 0:23dade9a66bf 206 }
gmehmet 0:23dade9a66bf 207
gmehmet 0:23dade9a66bf 208 /* desc:
gmehmet 0:23dade9a66bf 209 * func to enable event reporting from sensor hub
gmehmet 0:23dade9a66bf 210 *
gmehmet 0:23dade9a66bf 211 * params:
gmehmet 0:23dade9a66bf 212 * N/A
gmehmet 0:23dade9a66bf 213 * */
gmehmet 0:23dade9a66bf 214 void sh_enable_irq_mfioevent(void)
gmehmet 0:23dade9a66bf 215 {
gmehmet 0:23dade9a66bf 216 irq_pin.enable_irq();
gmehmet 0:23dade9a66bf 217 }
gmehmet 0:23dade9a66bf 218
gmehmet 0:23dade9a66bf 219 /* desc:
gmehmet 0:23dade9a66bf 220 * func to disable event reporting from sensor hub
gmehmet 0:23dade9a66bf 221 *
gmehmet 0:23dade9a66bf 222 * params:
gmehmet 0:23dade9a66bf 223 * N/A
gmehmet 0:23dade9a66bf 224 * */
gmehmet 0:23dade9a66bf 225 void sh_disable_irq_mfioevent(void)
gmehmet 0:23dade9a66bf 226 {
gmehmet 0:23dade9a66bf 227 irq_pin.disable_irq();
gmehmet 0:23dade9a66bf 228 }
gmehmet 0:23dade9a66bf 229
gmehmet 0:23dade9a66bf 230 /* desc:
gmehmet 0:23dade9a66bf 231 * reset event reporting process from sensor hub
gmehmet 0:23dade9a66bf 232 *
gmehmet 0:23dade9a66bf 233 * params:
gmehmet 0:23dade9a66bf 234 * N/A
gmehmet 0:23dade9a66bf 235 **/
gmehmet 0:23dade9a66bf 236 bool sh_reset_mfio_irq(){
gmehmet 0:23dade9a66bf 237 bool ret = mfio_int_happened;
gmehmet 0:23dade9a66bf 238 mfio_int_happened = false;
gmehmet 0:23dade9a66bf 239 sh_disable_irq_mfioevent();
gmehmet 0:23dade9a66bf 240 irq_pin.fall(sh_irq_handler);
gmehmet 0:23dade9a66bf 241 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 242 return ret;
gmehmet 0:23dade9a66bf 243 }
gmehmet 0:23dade9a66bf 244
gmehmet 0:23dade9a66bf 245
gmehmet 0:23dade9a66bf 246 /*
gmehmet 0:23dade9a66bf 247 * desc:
gmehmet 0:23dade9a66bf 248 * function to reset sensor hub and put to application mode after reset interface and get data format.
gmehmet 0:23dade9a66bf 249 *
gmehmet 0:23dade9a66bf 250 * params:
gmehmet 0:23dade9a66bf 251 *
gmehmet 0:23dade9a66bf 252 * __I wakeupMode : 0x00 : application mode
gmehmet 0:23dade9a66bf 253 * 0x08 : bootloader mode
gmehmet 0:23dade9a66bf 254 * */
gmehmet 0:23dade9a66bf 255 int sh_hard_reset(int wakeupMode){
gmehmet 0:23dade9a66bf 256
gmehmet 0:23dade9a66bf 257 int status;
gmehmet 0:23dade9a66bf 258 sh_disable_irq_mfioevent();
gmehmet 0:23dade9a66bf 259 reset_pin.output();
gmehmet 0:23dade9a66bf 260 mfio_pin.output();
gmehmet 0:23dade9a66bf 261
gmehmet 0:23dade9a66bf 262 reset_pin.write(0);
gmehmet 0:23dade9a66bf 263 wait_ms(SS_RESET_TIME);
gmehmet 0:23dade9a66bf 264
gmehmet 0:23dade9a66bf 265 if( (wakeupMode & 0xFF) == 0 ) {
gmehmet 0:23dade9a66bf 266
gmehmet 0:23dade9a66bf 267 mfio_pin.write(1);
gmehmet 0:23dade9a66bf 268 reset_pin.write(1);
gmehmet 0:23dade9a66bf 269 wait_ms(SS_STARTUP_TO_MAIN_APP_TIME);
gmehmet 0:23dade9a66bf 270
gmehmet 0:23dade9a66bf 271 }else {
gmehmet 0:23dade9a66bf 272
gmehmet 0:23dade9a66bf 273 mfio_pin.write(0);
gmehmet 0:23dade9a66bf 274 reset_pin.write(1);
gmehmet 0:23dade9a66bf 275 wait_ms(SS_STARTUP_TO_BTLDR_TIME);
gmehmet 0:23dade9a66bf 276 }
gmehmet 0:23dade9a66bf 277 mfio_pin.input();
gmehmet 0:23dade9a66bf 278 mfio_pin.mode(PullUp);
gmehmet 0:23dade9a66bf 279 reset_pin.input();
gmehmet 0:23dade9a66bf 280 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 281 }
gmehmet 0:23dade9a66bf 282
gmehmet 0:23dade9a66bf 283
gmehmet 0:23dade9a66bf 284 /*
gmehmet 0:23dade9a66bf 285 * desc:
gmehmet 0:23dade9a66bf 286 * function to init sensor comm interface and get data format.
gmehmet 0:23dade9a66bf 287 *
gmehmet 0:23dade9a66bf 288 * */
gmehmet 0:23dade9a66bf 289 void sh_init_hubinterface(void){
gmehmet 0:23dade9a66bf 290
gmehmet 0:23dade9a66bf 291 sh_init_hwcomm_interface();
gmehmet 0:23dade9a66bf 292 //sh_get_data_type(&data_type, &sc_en);
gmehmet 0:23dade9a66bf 293 return;
gmehmet 0:23dade9a66bf 294 }
gmehmet 0:23dade9a66bf 295
gmehmet 0:23dade9a66bf 296
gmehmet 0:23dade9a66bf 297
gmehmet 0:23dade9a66bf 298
gmehmet 0:23dade9a66bf 299
gmehmet 0:23dade9a66bf 300 /*
gmehmet 0:23dade9a66bf 301 *
gmehmet 0:23dade9a66bf 302 * SENSOR HUB COMMUNICATION INTERFACE ( Defined in MAX32664 User Guide ) API FUNCTIONS
gmehmet 0:23dade9a66bf 303 *
gmehmet 0:23dade9a66bf 304 *
gmehmet 0:23dade9a66bf 305 * */
gmehmet 0:23dade9a66bf 306
gmehmet 0:23dade9a66bf 307 int sh_write_cmd( uint8_t *tx_buf,
gmehmet 0:23dade9a66bf 308 int tx_len,
gmehmet 0:23dade9a66bf 309 int sleep_ms)
gmehmet 0:23dade9a66bf 310 {
gmehmet 0:23dade9a66bf 311 int retries = SS_DEFAULT_RETRIES;
gmehmet 0:23dade9a66bf 312 int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
gmehmet 0:23dade9a66bf 313 while (ret != 0 && retries-- > 0) {
gmehmet 0:23dade9a66bf 314
gmehmet 0:23dade9a66bf 315 wait_ms(1);
gmehmet 0:23dade9a66bf 316 ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)tx_buf, tx_len);
gmehmet 0:23dade9a66bf 317 }
gmehmet 0:23dade9a66bf 318 if (ret != 0)
gmehmet 0:23dade9a66bf 319 return SS_ERR_UNAVAILABLE;
gmehmet 0:23dade9a66bf 320
gmehmet 0:23dade9a66bf 321
gmehmet 0:23dade9a66bf 322 wait_ms(sleep_ms);
gmehmet 0:23dade9a66bf 323
gmehmet 0:23dade9a66bf 324 char status_byte;
gmehmet 0:23dade9a66bf 325 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
gmehmet 0:23dade9a66bf 326 bool try_again = (status_byte == SS_ERR_TRY_AGAIN);
gmehmet 0:23dade9a66bf 327 while ((ret != 0 || try_again)
gmehmet 0:23dade9a66bf 328 && retries-- > 0) {
gmehmet 0:23dade9a66bf 329 wait_ms(sleep_ms);
gmehmet 0:23dade9a66bf 330 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, &status_byte, 1);
gmehmet 0:23dade9a66bf 331 try_again = (status_byte == SS_ERR_TRY_AGAIN);
gmehmet 0:23dade9a66bf 332 }
gmehmet 0:23dade9a66bf 333
gmehmet 0:23dade9a66bf 334 if (ret != 0 || try_again)
gmehmet 0:23dade9a66bf 335 return SS_ERR_UNAVAILABLE;
gmehmet 0:23dade9a66bf 336
gmehmet 0:23dade9a66bf 337 return (int) (SS_STATUS)status_byte;
gmehmet 0:23dade9a66bf 338 }
gmehmet 0:23dade9a66bf 339
gmehmet 0:23dade9a66bf 340
gmehmet 0:23dade9a66bf 341 int sh_write_cmd_with_data(uint8_t *cmd_bytes,
gmehmet 0:23dade9a66bf 342 int cmd_bytes_len,
gmehmet 0:23dade9a66bf 343 uint8_t *data,
gmehmet 0:23dade9a66bf 344 int data_len,
gmehmet 0:23dade9a66bf 345 int cmd_delay_ms)
gmehmet 0:23dade9a66bf 346 {
gmehmet 0:23dade9a66bf 347 memcpy(sh_write_buf, cmd_bytes, cmd_bytes_len);
gmehmet 0:23dade9a66bf 348 memcpy(sh_write_buf + cmd_bytes_len, data, data_len);
gmehmet 0:23dade9a66bf 349 int status = sh_write_cmd(sh_write_buf,cmd_bytes_len + data_len, cmd_delay_ms);
gmehmet 0:23dade9a66bf 350 return status;
gmehmet 0:23dade9a66bf 351 }
gmehmet 0:23dade9a66bf 352
gmehmet 0:23dade9a66bf 353
gmehmet 0:23dade9a66bf 354 int sh_read_cmd( uint8_t *cmd_bytes,
gmehmet 0:23dade9a66bf 355 int cmd_bytes_len,
gmehmet 0:23dade9a66bf 356 uint8_t *data,
gmehmet 0:23dade9a66bf 357 int data_len,
gmehmet 0:23dade9a66bf 358 uint8_t *rxbuf,
gmehmet 0:23dade9a66bf 359 int rxbuf_sz,
gmehmet 0:23dade9a66bf 360 int sleep_ms )
gmehmet 0:23dade9a66bf 361 {
gmehmet 0:23dade9a66bf 362
gmehmet 0:23dade9a66bf 363 int retries = SS_DEFAULT_RETRIES;
gmehmet 0:23dade9a66bf 364
gmehmet 0:23dade9a66bf 365 int ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
gmehmet 0:23dade9a66bf 366 if (data_len != 0)
gmehmet 0:23dade9a66bf 367 ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
gmehmet 0:23dade9a66bf 368
gmehmet 0:23dade9a66bf 369
gmehmet 0:23dade9a66bf 370 while (ret != 0 && retries-- > 0) {
gmehmet 0:23dade9a66bf 371 wait_ms(1);
gmehmet 0:23dade9a66bf 372 ret = m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)cmd_bytes, cmd_bytes_len, (data_len != 0));
gmehmet 0:23dade9a66bf 373 if (data_len != 0)
gmehmet 0:23dade9a66bf 374 ret |= m_i2cBus->write(SS_I2C_8BIT_SLAVE_ADDR, (char*)data, data_len, false);
gmehmet 0:23dade9a66bf 375
gmehmet 0:23dade9a66bf 376 }
gmehmet 0:23dade9a66bf 377 if (ret != 0)
gmehmet 0:23dade9a66bf 378 return SS_ERR_UNAVAILABLE;
gmehmet 0:23dade9a66bf 379
gmehmet 0:23dade9a66bf 380
gmehmet 0:23dade9a66bf 381 wait_ms(sleep_ms);
gmehmet 0:23dade9a66bf 382
gmehmet 0:23dade9a66bf 383 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
gmehmet 0:23dade9a66bf 384 bool try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
gmehmet 0:23dade9a66bf 385 while ((ret != 0 || try_again) && retries-- > 0) {
gmehmet 0:23dade9a66bf 386 wait_ms(sleep_ms);
gmehmet 0:23dade9a66bf 387 ret = m_i2cBus->read(SS_I2C_8BIT_SLAVE_ADDR, (char*)rxbuf, rxbuf_sz);
gmehmet 0:23dade9a66bf 388 try_again = (rxbuf[0] == SS_ERR_TRY_AGAIN);
gmehmet 0:23dade9a66bf 389 }
gmehmet 0:23dade9a66bf 390 if (ret != 0 || try_again)
gmehmet 0:23dade9a66bf 391 return SS_ERR_UNAVAILABLE;
gmehmet 0:23dade9a66bf 392
gmehmet 0:23dade9a66bf 393 return (int) ((SS_STATUS)rxbuf[0]);
gmehmet 0:23dade9a66bf 394 }
gmehmet 0:23dade9a66bf 395
gmehmet 0:23dade9a66bf 396
gmehmet 0:23dade9a66bf 397
gmehmet 0:23dade9a66bf 398 int sh_get_sensorhub_status(uint8_t *hubStatus){
gmehmet 0:23dade9a66bf 399
gmehmet 0:23dade9a66bf 400 uint8_t ByteSeq[] = SH_GET_HUB_STATUS_CMDSEQ;
gmehmet 0:23dade9a66bf 401 uint8_t rxbuf[2] = { 0 };
gmehmet 0:23dade9a66bf 402
gmehmet 0:23dade9a66bf 403 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 404 0, 0,
gmehmet 0:23dade9a66bf 405 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 406 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 407
gmehmet 0:23dade9a66bf 408 *hubStatus = rxbuf[1];
gmehmet 0:23dade9a66bf 409 return status;
gmehmet 0:23dade9a66bf 410 }
gmehmet 0:23dade9a66bf 411
gmehmet 0:23dade9a66bf 412
gmehmet 0:23dade9a66bf 413 int sh_get_sensorhub_operating_mode(uint8_t *hubMode){
gmehmet 0:23dade9a66bf 414
gmehmet 0:23dade9a66bf 415 uint8_t ByteSeq[] = SH_GET_OPERATING_MODE_CMDSEQ;
gmehmet 0:23dade9a66bf 416 uint8_t rxbuf[2] = { 0 };
gmehmet 0:23dade9a66bf 417
gmehmet 0:23dade9a66bf 418 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 419 0, 0,
gmehmet 0:23dade9a66bf 420 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 421 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 422
gmehmet 0:23dade9a66bf 423 *hubMode = rxbuf[1];
gmehmet 0:23dade9a66bf 424 return status;
gmehmet 0:23dade9a66bf 425 }
gmehmet 0:23dade9a66bf 426
gmehmet 0:23dade9a66bf 427
gmehmet 0:23dade9a66bf 428 int sh_set_sensorhub_operating_mode(uint8_t hubMode){
gmehmet 0:23dade9a66bf 429
gmehmet 0:23dade9a66bf 430 uint8_t ByteSeq[] = SH_SET_OPERATING_MODE_CMDSEQ(hubMode);
gmehmet 0:23dade9a66bf 431 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 432 return status;
gmehmet 0:23dade9a66bf 433
gmehmet 0:23dade9a66bf 434 }
gmehmet 0:23dade9a66bf 435
gmehmet 0:23dade9a66bf 436
gmehmet 0:23dade9a66bf 437 //int sh_set_data_type( uint8_t outMode)
gmehmet 0:23dade9a66bf 438 int sh_set_data_type(int data_type_, bool sc_en_)
gmehmet 0:23dade9a66bf 439 {
gmehmet 0:23dade9a66bf 440
gmehmet 0:23dade9a66bf 441 #if 0
gmehmet 0:23dade9a66bf 442 uint8_t dataTypeSc = (uint8_t)((sc_en ? SS_MASK_OUTPUTMODE_SC_EN : 0) | ((data_type << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE));
gmehmet 0:23dade9a66bf 443 uint8_t ByteSeq[] = SH_SET_OUTPUT_MODE_CMDSEQ( dataTypeSc);
gmehmet 0:23dade9a66bf 444 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 445 if( status == 0x00){
gmehmet 0:23dade9a66bf 446 data_type = data_type_;
gmehmet 0:23dade9a66bf 447 sc_en = sc_en_;
gmehmet 0:23dade9a66bf 448 }
gmehmet 0:23dade9a66bf 449 #endif
gmehmet 0:23dade9a66bf 450
gmehmet 0:23dade9a66bf 451 uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_OUTPUTMODE };
gmehmet 0:23dade9a66bf 452 uint8_t data_bytes[] = { (uint8_t)((sc_en_ ? SS_MASK_OUTPUTMODE_SC_EN : 0) |
gmehmet 0:23dade9a66bf 453 ((data_type_ << SS_SHIFT_OUTPUTMODE_DATATYPE) & SS_MASK_OUTPUTMODE_DATATYPE)) };
gmehmet 0:23dade9a66bf 454
gmehmet 0:23dade9a66bf 455 int status = sh_write_cmd_with_data(&cmd_bytes[0], sizeof(cmd_bytes),
gmehmet 0:23dade9a66bf 456 &data_bytes[0], sizeof(data_bytes),
gmehmet 0:23dade9a66bf 457 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 458 data_type = data_type_;
gmehmet 0:23dade9a66bf 459 sc_en = sc_en_;
gmehmet 0:23dade9a66bf 460
gmehmet 0:23dade9a66bf 461 return status;
gmehmet 0:23dade9a66bf 462 }
gmehmet 0:23dade9a66bf 463
gmehmet 0:23dade9a66bf 464
gmehmet 0:23dade9a66bf 465 int sh_get_data_type(int *data_type_, bool *sc_en_){
gmehmet 0:23dade9a66bf 466
gmehmet 0:23dade9a66bf 467 uint8_t ByteSeq[] = SH_GET_OUTPUT_MODE_CMDSEQ;
gmehmet 0:23dade9a66bf 468 uint8_t rxbuf[2] = {0};
gmehmet 0:23dade9a66bf 469 int status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 470 0, 0,
gmehmet 0:23dade9a66bf 471 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 472 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 473 if (status == 0x00 /*SS_SUCCESS*/) {
gmehmet 0:23dade9a66bf 474 *data_type_ =
gmehmet 0:23dade9a66bf 475 (rxbuf[1] & SS_MASK_OUTPUTMODE_DATATYPE) >> SS_SHIFT_OUTPUTMODE_DATATYPE;
gmehmet 0:23dade9a66bf 476 *sc_en_ =
gmehmet 0:23dade9a66bf 477 (bool)((rxbuf[1] & SS_MASK_OUTPUTMODE_SC_EN) >> SS_SHIFT_OUTPUTMODE_SC_EN);
gmehmet 0:23dade9a66bf 478
gmehmet 0:23dade9a66bf 479 }
gmehmet 0:23dade9a66bf 480
gmehmet 0:23dade9a66bf 481 return status;
gmehmet 0:23dade9a66bf 482
gmehmet 0:23dade9a66bf 483 }
gmehmet 0:23dade9a66bf 484
gmehmet 0:23dade9a66bf 485
gmehmet 0:23dade9a66bf 486 int sh_set_fifo_thresh( int threshold ){
gmehmet 0:23dade9a66bf 487
gmehmet 0:23dade9a66bf 488 #if 0
gmehmet 0:23dade9a66bf 489 uint8_t ucThresh = (uint8_t) (threshold & 0xFF);
gmehmet 0:23dade9a66bf 490 uint8_t ByteSeq[] = SH_DFIFO_SET_INT_THRESHOLD_CMDSEQ(ucThresh );
gmehmet 0:23dade9a66bf 491 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 492 return status;
gmehmet 0:23dade9a66bf 493 #endif
gmehmet 0:23dade9a66bf 494
gmehmet 0:23dade9a66bf 495 uint8_t cmd_bytes[] = { SS_FAM_W_COMMCHAN, SS_CMDIDX_FIFOAFULL };
gmehmet 0:23dade9a66bf 496 uint8_t data_bytes[] = { (uint8_t)threshold };
gmehmet 0:23dade9a66bf 497
gmehmet 0:23dade9a66bf 498 int status = sh_write_cmd_with_data(&cmd_bytes[0], sizeof(cmd_bytes),
gmehmet 0:23dade9a66bf 499 &data_bytes[0], sizeof(data_bytes),
gmehmet 0:23dade9a66bf 500 SS_DEFAULT_CMD_SLEEP_MS
gmehmet 0:23dade9a66bf 501 );
gmehmet 0:23dade9a66bf 502 return status;
gmehmet 0:23dade9a66bf 503
gmehmet 0:23dade9a66bf 504 }
gmehmet 0:23dade9a66bf 505
gmehmet 0:23dade9a66bf 506
gmehmet 0:23dade9a66bf 507 int sh_get_fifo_thresh(int *thresh){
gmehmet 0:23dade9a66bf 508
gmehmet 0:23dade9a66bf 509 uint8_t ByteSeq[] = SH_DFIFO_GET_INT_THRESHOLD_CMDSEQ;
gmehmet 0:23dade9a66bf 510 uint8_t rxbuf[2] = {0};
gmehmet 0:23dade9a66bf 511 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 512 0, 0,
gmehmet 0:23dade9a66bf 513 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 514 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 515
gmehmet 0:23dade9a66bf 516 *thresh = (int) rxbuf[1];
gmehmet 0:23dade9a66bf 517
gmehmet 0:23dade9a66bf 518 return status;
gmehmet 0:23dade9a66bf 519
gmehmet 0:23dade9a66bf 520 }
gmehmet 0:23dade9a66bf 521
gmehmet 0:23dade9a66bf 522
gmehmet 0:23dade9a66bf 523 int sh_ss_comm_check(void){
gmehmet 0:23dade9a66bf 524
gmehmet 0:23dade9a66bf 525
gmehmet 0:23dade9a66bf 526 uint8_t ByteSeq[] = SH_COMM_CHECK_CMDSEQ;
gmehmet 0:23dade9a66bf 527 uint8_t rxbuf[2];
gmehmet 0:23dade9a66bf 528
gmehmet 0:23dade9a66bf 529 int status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 530 0, 0,
gmehmet 0:23dade9a66bf 531 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 532 SS_DEFAULT_CMD_SLEEP_MS );
gmehmet 0:23dade9a66bf 533
gmehmet 0:23dade9a66bf 534 int tries = 4;
gmehmet 0:23dade9a66bf 535 while (status == SS_ERR_TRY_AGAIN && tries--) {
gmehmet 0:23dade9a66bf 536 wait_ms(1000);
gmehmet 0:23dade9a66bf 537 status = sh_read_cmd( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 538 0, 0,
gmehmet 0:23dade9a66bf 539 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 540 SS_DEFAULT_CMD_SLEEP_MS );
gmehmet 0:23dade9a66bf 541
gmehmet 0:23dade9a66bf 542 }
gmehmet 0:23dade9a66bf 543
gmehmet 0:23dade9a66bf 544 return status;
gmehmet 0:23dade9a66bf 545 }
gmehmet 0:23dade9a66bf 546
gmehmet 0:23dade9a66bf 547
gmehmet 0:23dade9a66bf 548 int sh_num_avail_samples(int *numSamples) {
gmehmet 0:23dade9a66bf 549
gmehmet 0:23dade9a66bf 550 uint8_t ByteSeq[] = SH_DFIFO_GET_NSAMPLES_CMDSEQ;
gmehmet 0:23dade9a66bf 551 uint8_t rxbuf[2] = {0};
gmehmet 0:23dade9a66bf 552
gmehmet 0:23dade9a66bf 553 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 554 0, 0,
gmehmet 0:23dade9a66bf 555 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 556 1);
gmehmet 0:23dade9a66bf 557
gmehmet 0:23dade9a66bf 558 *numSamples = (int) rxbuf[1];
gmehmet 0:23dade9a66bf 559
gmehmet 0:23dade9a66bf 560 return status;
gmehmet 0:23dade9a66bf 561 }
gmehmet 0:23dade9a66bf 562
gmehmet 0:23dade9a66bf 563
gmehmet 0:23dade9a66bf 564 int sh_read_fifo_data( int numSamples,
gmehmet 0:23dade9a66bf 565 int sampleSize,
gmehmet 0:23dade9a66bf 566 uint8_t* databuf,
gmehmet 0:23dade9a66bf 567 int databufSz) {
gmehmet 0:23dade9a66bf 568
gmehmet 0:23dade9a66bf 569 int bytes_to_read = numSamples * sampleSize + 1; //+1 for status byte
gmehmet 0:23dade9a66bf 570
gmehmet 0:23dade9a66bf 571 uint8_t ByteSeq[] = SH_DFIFO_PULL_SAMPLE_CMDSEQ;
gmehmet 0:23dade9a66bf 572 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 573 0, 0,
gmehmet 0:23dade9a66bf 574 databuf, bytes_to_read,
gmehmet 0:23dade9a66bf 575 10);
gmehmet 0:23dade9a66bf 576
gmehmet 0:23dade9a66bf 577 return status;
gmehmet 0:23dade9a66bf 578 }
gmehmet 0:23dade9a66bf 579
gmehmet 0:23dade9a66bf 580
gmehmet 0:23dade9a66bf 581 /*
gmehmet 0:23dade9a66bf 582 * desc:
gmehmet 0:23dade9a66bf 583 * func to read sample size for SmartSensor input FIFO for extrenal accel data
gmehmet 0:23dade9a66bf 584 *
gmehmet 0:23dade9a66bf 585 * params:
gmehmet 0:23dade9a66bf 586 * __O sampSize: size of data sample struct in bytes
gmehmet 0:23dade9a66bf 587 * returns:
gmehmet 0:23dade9a66bf 588 * 1 byte status (SS_STATUS) : 0x00 (SS_SUCCESS) on success
gmehmet 0:23dade9a66bf 589 *
gmehmet 0:23dade9a66bf 590 **/
gmehmet 0:23dade9a66bf 591 int sh_read_input_fifo_samplesz( int *sampSize){
gmehmet 0:23dade9a66bf 592
gmehmet 0:23dade9a66bf 593 /* NOT IMPLEMENTED IN SS INTERFACE */
gmehmet 0:23dade9a66bf 594
gmehmet 0:23dade9a66bf 595 }
gmehmet 0:23dade9a66bf 596
gmehmet 0:23dade9a66bf 597 /*
gmehmet 0:23dade9a66bf 598 * desc:
gmehmet 0:23dade9a66bf 599 * func to write data samples to SmartSensor input FIFO for extrenal accel data
gmehmet 0:23dade9a66bf 600 *
gmehmet 0:23dade9a66bf 601 * params:
gmehmet 0:23dade9a66bf 602 ...
gmehmet 0:23dade9a66bf 603 * returns:
gmehmet 0:23dade9a66bf 604 * 1 byte status (SS_STATUS) : 0x00 (SS_SUCCESS) on success
gmehmet 0:23dade9a66bf 605 */
gmehmet 0:23dade9a66bf 606 int sh_write_input_fifo( void *arg){
gmehmet 0:23dade9a66bf 607
gmehmet 0:23dade9a66bf 608 /* NOT IMPLEMENTED IN SS INTERFACE */
gmehmet 0:23dade9a66bf 609
gmehmet 0:23dade9a66bf 610 }
gmehmet 0:23dade9a66bf 611
gmehmet 0:23dade9a66bf 612
gmehmet 0:23dade9a66bf 613 int sh_set_reg(int idx, uint8_t addr, uint32_t val, int regSz){
gmehmet 0:23dade9a66bf 614
gmehmet 0:23dade9a66bf 615 uint8_t ByteSeq[] = SH_WRITE_SENSORREG_CMDSEQ( ((uint8_t)idx) , addr );
gmehmet 0:23dade9a66bf 616 uint8_t data_bytes[4];
gmehmet 0:23dade9a66bf 617 for (int i = 0; i < regSz; i++) {
gmehmet 0:23dade9a66bf 618 data_bytes[i] = (val >> (8 * (regSz - 1)) & 0xFF);
gmehmet 0:23dade9a66bf 619 }
gmehmet 0:23dade9a66bf 620 int status = sh_write_cmd_with_data( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 621 &data_bytes[0], (uint8_t) regSz,
gmehmet 0:23dade9a66bf 622 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 623
gmehmet 0:23dade9a66bf 624 return status;
gmehmet 0:23dade9a66bf 625 }
gmehmet 0:23dade9a66bf 626
gmehmet 0:23dade9a66bf 627
gmehmet 0:23dade9a66bf 628 int sh_get_reg(int idx, uint8_t addr, uint32_t *val){
gmehmet 0:23dade9a66bf 629
gmehmet 0:23dade9a66bf 630
gmehmet 0:23dade9a66bf 631 uint32_t i32tmp;
gmehmet 0:23dade9a66bf 632 uint8_t ByteSeq[] = SH_READ_AFE_ATTRIBUTES_CMDSEQ(((uint8_t) idx));
gmehmet 0:23dade9a66bf 633 uint8_t rxbuf[3] = {0};
gmehmet 0:23dade9a66bf 634
gmehmet 0:23dade9a66bf 635 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 636 0, 0,
gmehmet 0:23dade9a66bf 637 &rxbuf[0], sizeof(rxbuf),
gmehmet 0:23dade9a66bf 638 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 639
gmehmet 0:23dade9a66bf 640
gmehmet 0:23dade9a66bf 641 if(status == 0x00 /* SS_SUCCESS */) {
gmehmet 0:23dade9a66bf 642
gmehmet 0:23dade9a66bf 643 int reg_width = rxbuf[1];
gmehmet 0:23dade9a66bf 644 uint8_t ByteSeq2[] = SH_READ_SENSORREG_CMDSEQ( ((uint8_t)idx) , addr );
gmehmet 0:23dade9a66bf 645 uint8_t rxbuf2[5] = {0};
gmehmet 0:23dade9a66bf 646 status = sh_read_cmd(&ByteSeq2[0], sizeof(ByteSeq2),
gmehmet 0:23dade9a66bf 647 0, 0,
gmehmet 0:23dade9a66bf 648 &rxbuf2[0], reg_width + 1,
gmehmet 0:23dade9a66bf 649 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 650
gmehmet 0:23dade9a66bf 651 if (status == 0x00 /* SS_SUCCESS */) {
gmehmet 0:23dade9a66bf 652 i32tmp = 0;
gmehmet 0:23dade9a66bf 653 for (int i = 0; i < reg_width; i++) {
gmehmet 0:23dade9a66bf 654 i32tmp = (i32tmp << 8) | rxbuf2[i + 1];
gmehmet 0:23dade9a66bf 655 }
gmehmet 0:23dade9a66bf 656 *val = i32tmp;
gmehmet 0:23dade9a66bf 657 }
gmehmet 0:23dade9a66bf 658 }
gmehmet 0:23dade9a66bf 659
gmehmet 0:23dade9a66bf 660 return status;
gmehmet 0:23dade9a66bf 661
gmehmet 0:23dade9a66bf 662 }
gmehmet 0:23dade9a66bf 663
gmehmet 0:23dade9a66bf 664
gmehmet 0:23dade9a66bf 665 int sh_sensor_enable( int idx , int sensorSampleSz , uint8_t ext_mode ){
gmehmet 0:23dade9a66bf 666
gmehmet 0:23dade9a66bf 667 uint8_t ByteSeq[] = SH_ENABLE_SENSOR_CMDSEQ( ((uint8_t) idx) , ((uint8_t) ext_mode));
gmehmet 0:23dade9a66bf 668 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), 5 * SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:23dade9a66bf 669 if(status == 0x00){
gmehmet 0:23dade9a66bf 670
gmehmet 0:23dade9a66bf 671 is_sensor_enabled[idx] = ENABLED;
gmehmet 0:23dade9a66bf 672 sensor_sample_sz[idx] = sensorSampleSz;
gmehmet 0:23dade9a66bf 673 }
gmehmet 0:23dade9a66bf 674 return status;
gmehmet 0:23dade9a66bf 675
gmehmet 0:23dade9a66bf 676 }
gmehmet 0:23dade9a66bf 677
gmehmet 0:23dade9a66bf 678
gmehmet 0:23dade9a66bf 679 int sh_sensor_disable( int idx ){
gmehmet 0:23dade9a66bf 680
gmehmet 0:23dade9a66bf 681 uint8_t ByteSeq[] = SH_DISABLE_SENSOR_CMDSEQ( ((uint8_t) idx));
gmehmet 0:23dade9a66bf 682 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:23dade9a66bf 683 if(status == 0x00){
gmehmet 0:23dade9a66bf 684
gmehmet 0:23dade9a66bf 685 is_sensor_enabled[idx] = DISABLED;
gmehmet 0:23dade9a66bf 686 }
gmehmet 0:23dade9a66bf 687 return status;
gmehmet 0:23dade9a66bf 688
gmehmet 0:23dade9a66bf 689 }
gmehmet 0:23dade9a66bf 690
gmehmet 0:23dade9a66bf 691
gmehmet 0:23dade9a66bf 692 int sh_get_input_fifo_size(int *fifo_size)
gmehmet 0:23dade9a66bf 693 {
gmehmet 0:23dade9a66bf 694
gmehmet 0:23dade9a66bf 695 uint8_t ByteSeq[] = SH_GET_EXTINPUT_FIFOSZ_CMDSEQ;
gmehmet 0:23dade9a66bf 696 uint8_t rxbuf[3]; /* status + fifo size */
gmehmet 0:23dade9a66bf 697
gmehmet 0:23dade9a66bf 698
gmehmet 0:23dade9a66bf 699 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 700 0, 0,
gmehmet 0:23dade9a66bf 701 rxbuf, sizeof(rxbuf), 2*SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 702
gmehmet 0:23dade9a66bf 703 *fifo_size = rxbuf[1] << 8 | rxbuf[2];
gmehmet 0:23dade9a66bf 704 return status;
gmehmet 0:23dade9a66bf 705 }
gmehmet 0:23dade9a66bf 706
gmehmet 0:23dade9a66bf 707
gmehmet 0:23dade9a66bf 708 int sh_feed_to_input_fifo(uint8_t *tx_buf, int tx_buf_sz, int *nb_written)
gmehmet 0:23dade9a66bf 709 {
gmehmet 0:23dade9a66bf 710 int status;
gmehmet 0:23dade9a66bf 711
gmehmet 0:23dade9a66bf 712 uint8_t ByteSeq[] = SH_FEED_TO_INPUTFIFO_CMDSEQ;
gmehmet 0:23dade9a66bf 713 uint8_t rxbuf[3];
gmehmet 0:23dade9a66bf 714
gmehmet 0:23dade9a66bf 715 tx_buf[0] = 0x14;
gmehmet 0:23dade9a66bf 716 tx_buf[1] = 0x00;
gmehmet 0:23dade9a66bf 717
gmehmet 0:23dade9a66bf 718 status= sh_read_cmd(tx_buf, tx_buf_sz,
gmehmet 0:23dade9a66bf 719 0, 0,
gmehmet 0:23dade9a66bf 720 rxbuf, sizeof(rxbuf), SS_FEEDFIFO_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 721
gmehmet 0:23dade9a66bf 722 *nb_written = rxbuf[1] * 256 + rxbuf[2];
gmehmet 0:23dade9a66bf 723 return status;
gmehmet 0:23dade9a66bf 724 }
gmehmet 0:23dade9a66bf 725
gmehmet 0:23dade9a66bf 726
gmehmet 0:23dade9a66bf 727 int sh_get_num_bytes_in_input_fifo(int *fifo_size)
gmehmet 0:23dade9a66bf 728 {
gmehmet 0:23dade9a66bf 729
gmehmet 0:23dade9a66bf 730 uint8_t ByteSeq[] = SH_GET_SAMPLEBYTECNT_INPUTFIFO_CMDSEQ;
gmehmet 0:23dade9a66bf 731 uint8_t rxbuf[3]; /* status + fifo size */
gmehmet 0:23dade9a66bf 732
gmehmet 0:23dade9a66bf 733
gmehmet 0:23dade9a66bf 734 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 735 0, 0,
gmehmet 0:23dade9a66bf 736 rxbuf, sizeof(rxbuf),
gmehmet 0:23dade9a66bf 737 2*SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 738
gmehmet 0:23dade9a66bf 739 *fifo_size = rxbuf[1] << 8 | rxbuf[2];
gmehmet 0:23dade9a66bf 740 return status;
gmehmet 0:23dade9a66bf 741 }
gmehmet 0:23dade9a66bf 742
gmehmet 0:23dade9a66bf 743
gmehmet 0:23dade9a66bf 744 /*
gmehmet 0:23dade9a66bf 745 * ALGARITIM RELATED FUNCTIONS :)
gmehmet 0:23dade9a66bf 746 *
gmehmet 0:23dade9a66bf 747 *
gmehmet 0:23dade9a66bf 748 *
gmehmet 0:23dade9a66bf 749 *
gmehmet 0:23dade9a66bf 750 *
gmehmet 0:23dade9a66bf 751 * */
gmehmet 0:23dade9a66bf 752
gmehmet 0:23dade9a66bf 753
gmehmet 0:23dade9a66bf 754 int sh_enable_algo(int idx , int algoSampleSz){
gmehmet 0:23dade9a66bf 755
gmehmet 0:23dade9a66bf 756 uint8_t ByteSeq[] = SH_ENABLE_ALGO_CMDSEQ( ((uint8_t) idx) );
gmehmet 0:23dade9a66bf 757 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), 25 * SS_ENABLE_SENSOR_SLEEP_MS);
gmehmet 0:23dade9a66bf 758 if(status == 0x00){
gmehmet 0:23dade9a66bf 759
gmehmet 0:23dade9a66bf 760 is_algo_enabled[idx] = ENABLED;
gmehmet 0:23dade9a66bf 761 algo_sample_sz[idx] = algoSampleSz;
gmehmet 0:23dade9a66bf 762 }
gmehmet 0:23dade9a66bf 763 return status;
gmehmet 0:23dade9a66bf 764
gmehmet 0:23dade9a66bf 765 }
gmehmet 0:23dade9a66bf 766
gmehmet 0:23dade9a66bf 767
gmehmet 0:23dade9a66bf 768 int sh_disable_algo(int idx){
gmehmet 0:23dade9a66bf 769
gmehmet 0:23dade9a66bf 770 uint8_t ByteSeq[] = SH_DISABLE_ALGO_CMDSEQ( ((uint8_t) idx) );
gmehmet 0:23dade9a66bf 771 int status = sh_write_cmd( &ByteSeq[0],sizeof(ByteSeq), SS_ENABLE_SENSOR_SLEEP_MS );
gmehmet 0:23dade9a66bf 772 if(status == 0x00){
gmehmet 0:23dade9a66bf 773
gmehmet 0:23dade9a66bf 774 is_algo_enabled[idx] = DISABLED;
gmehmet 0:23dade9a66bf 775 }
gmehmet 0:23dade9a66bf 776 return status;
gmehmet 0:23dade9a66bf 777
gmehmet 0:23dade9a66bf 778 }
gmehmet 0:23dade9a66bf 779
gmehmet 0:23dade9a66bf 780
gmehmet 0:23dade9a66bf 781 int sh_set_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz){
gmehmet 0:23dade9a66bf 782
gmehmet 0:23dade9a66bf 783 uint8_t ByteSeq[] = SH_SET_ALGO_CONFIGURATION_CMDSEQ( ((uint8_t) algo_idx) , ((uint8_t) cfg_idx) );
gmehmet 0:23dade9a66bf 784 int status = sh_write_cmd_with_data( &ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 785 cfg, cfg_sz,
gmehmet 0:23dade9a66bf 786 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 787
gmehmet 0:23dade9a66bf 788 return status;
gmehmet 0:23dade9a66bf 789
gmehmet 0:23dade9a66bf 790 }
gmehmet 0:23dade9a66bf 791
gmehmet 0:23dade9a66bf 792
gmehmet 0:23dade9a66bf 793 int sh_get_algo_cfg(int algo_idx, int cfg_idx, uint8_t *cfg, int cfg_sz){
gmehmet 0:23dade9a66bf 794
gmehmet 0:23dade9a66bf 795 uint8_t ByteSeq[] = SH_GET_ALGO_CONFIGURATION_CMDSEQ( ((uint8_t) algo_idx) , ((uint8_t) cfg_idx) );
gmehmet 0:23dade9a66bf 796 int status = sh_read_cmd(&ByteSeq[0], sizeof(ByteSeq),
gmehmet 0:23dade9a66bf 797 0, 0,
gmehmet 0:23dade9a66bf 798 cfg, cfg_sz,
gmehmet 0:23dade9a66bf 799 SS_DEFAULT_CMD_SLEEP_MS);
gmehmet 0:23dade9a66bf 800 return status;
gmehmet 0:23dade9a66bf 801
gmehmet 0:23dade9a66bf 802 }
gmehmet 0:23dade9a66bf 803
gmehmet 0:23dade9a66bf 804
gmehmet 0:23dade9a66bf 805 /*
gmehmet 0:23dade9a66bf 806 * desc:
gmehmet 0:23dade9a66bf 807 * func to get active cumulative sample size of sensor hub in order to
gmehmet 0:23dade9a66bf 808 * calculate number of bytes to be read from sensor hub report data buffer
gmehmet 0:23dade9a66bf 809 *
gmehmet 0:23dade9a66bf 810 * params:
gmehmet 0:23dade9a66bf 811 * __I data_type : active data type of sensor hub -> no data :0 (SS_DATATYPE_PAUSE)
gmehmet 0:23dade9a66bf 812 * raw sensor data only :1 (SS_DATATYPE_RAW)
gmehmet 0:23dade9a66bf 813 * algo data only :2 (SS_DATATYPE_ALGO)
gmehmet 0:23dade9a66bf 814 * algo+raw data :3 (SS_DATATYPE_BOTH)
gmehmet 0:23dade9a66bf 815 * __O sample_size : calculated active cumulative sample size
gmehmet 0:23dade9a66bf 816
gmehmet 0:23dade9a66bf 817 * returns:
gmehmet 0:23dade9a66bf 818 * N/A
gmehmet 0:23dade9a66bf 819 *
gmehmet 0:23dade9a66bf 820 **/
gmehmet 0:23dade9a66bf 821 static void fifo_sample_size(int data_type_, int *sample_size)
gmehmet 0:23dade9a66bf 822 {
gmehmet 0:23dade9a66bf 823
gmehmet 0:23dade9a66bf 824 int tmpSz = 0;
gmehmet 0:23dade9a66bf 825 //*sample_size = 0;
gmehmet 0:23dade9a66bf 826
gmehmet 0:23dade9a66bf 827 if (data_type_ == SS_DATATYPE_RAW || data_type_ == SS_DATATYPE_BOTH) {
gmehmet 0:23dade9a66bf 828 for (int i = 0; i < SS_MAX_SUPPORTED_SENSOR_NUM; i++) {
gmehmet 0:23dade9a66bf 829 if (is_sensor_enabled[i]) {
gmehmet 0:23dade9a66bf 830 tmpSz += sensor_sample_sz[i];
gmehmet 0:23dade9a66bf 831 //*sample_size += sensor_data_reqs[i]->data_size;
gmehmet 0:23dade9a66bf 832 }
gmehmet 0:23dade9a66bf 833 }
gmehmet 0:23dade9a66bf 834 }
gmehmet 0:23dade9a66bf 835
gmehmet 0:23dade9a66bf 836 if (data_type_ == SS_DATATYPE_ALGO || data_type_ == SS_DATATYPE_BOTH) {
gmehmet 0:23dade9a66bf 837 for (int i = 0; i < SS_MAX_SUPPORTED_ALGO_NUM; i++) {
gmehmet 0:23dade9a66bf 838 if (is_algo_enabled[i]) {
gmehmet 0:23dade9a66bf 839 tmpSz += algo_sample_sz[i];
gmehmet 0:23dade9a66bf 840 //*sample_size += algo_data_reqs[i]->data_size;
gmehmet 0:23dade9a66bf 841 }
gmehmet 0:23dade9a66bf 842 }
gmehmet 0:23dade9a66bf 843 }
gmehmet 0:23dade9a66bf 844
gmehmet 0:23dade9a66bf 845 *sample_size = tmpSz;
gmehmet 0:23dade9a66bf 846 }
gmehmet 0:23dade9a66bf 847
gmehmet 0:23dade9a66bf 848
gmehmet 0:23dade9a66bf 849 void sh_ss_execute_once( uint8_t *databuf , int databufLen , int *nSamplesRead){
gmehmet 0:23dade9a66bf 850
gmehmet 0:23dade9a66bf 851 if(m_irq_received_ == false) {
gmehmet 0:23dade9a66bf 852 *nSamplesRead = 0;
gmehmet 0:23dade9a66bf 853 return;
gmehmet 0:23dade9a66bf 854 }
gmehmet 0:23dade9a66bf 855
gmehmet 0:23dade9a66bf 856 uint8_t sample_count;
gmehmet 0:23dade9a66bf 857
gmehmet 0:23dade9a66bf 858 sh_disable_irq_mfioevent();
gmehmet 0:23dade9a66bf 859 sh_clear_mfio_event_flag();
gmehmet 0:23dade9a66bf 860
gmehmet 0:23dade9a66bf 861 uint8_t hubStatus = 0;
gmehmet 0:23dade9a66bf 862 int status = sh_get_sensorhub_status(&hubStatus);
gmehmet 0:23dade9a66bf 863 if(status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:23dade9a66bf 864 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 865 return;
gmehmet 0:23dade9a66bf 866 }
gmehmet 0:23dade9a66bf 867
gmehmet 0:23dade9a66bf 868 if (hubStatus & SS_MASK_STATUS_DATA_RDY) {
gmehmet 0:23dade9a66bf 869
gmehmet 0:23dade9a66bf 870 int num_samples = 1;
gmehmet 0:23dade9a66bf 871 status = sh_num_avail_samples(&num_samples);
gmehmet 0:23dade9a66bf 872 if (status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:23dade9a66bf 873 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 874 return;
gmehmet 0:23dade9a66bf 875 }
gmehmet 0:23dade9a66bf 876
gmehmet 0:23dade9a66bf 877
gmehmet 0:23dade9a66bf 878 int sample_size;
gmehmet 0:23dade9a66bf 879 fifo_sample_size(data_type, &sample_size);
gmehmet 0:23dade9a66bf 880 /*DEBUG *///
gmehmet 0:23dade9a66bf 881 //printf("____DATA READY %d %d \n", (int)num_samples, sample_size);
gmehmet 0:23dade9a66bf 882
gmehmet 0:23dade9a66bf 883 int bytes_to_read = num_samples * sample_size + 1; //+1 for status byte
gmehmet 0:23dade9a66bf 884 if ((uint32_t)bytes_to_read > databufLen) {
gmehmet 0:23dade9a66bf 885 //Reduce number of samples to read to fit in buffer
gmehmet 0:23dade9a66bf 886 num_samples = (databufLen - 1) / sample_size;
gmehmet 0:23dade9a66bf 887 }
gmehmet 0:23dade9a66bf 888 wait_ms(5);
gmehmet 0:23dade9a66bf 889 status = sh_read_fifo_data(num_samples, sample_size, &databuf[0], databufLen);
gmehmet 0:23dade9a66bf 890 if(status != 0x00 /*SS_SUCCESS*/){
gmehmet 0:23dade9a66bf 891 *nSamplesRead = 0;
gmehmet 0:23dade9a66bf 892 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 893 return;
gmehmet 0:23dade9a66bf 894 }
gmehmet 0:23dade9a66bf 895 *nSamplesRead = num_samples;
gmehmet 0:23dade9a66bf 896
gmehmet 0:23dade9a66bf 897 }
gmehmet 0:23dade9a66bf 898
gmehmet 0:23dade9a66bf 899 sh_enable_irq_mfioevent();
gmehmet 0:23dade9a66bf 900 return;
gmehmet 0:23dade9a66bf 901 }
gmehmet 0:23dade9a66bf 902
gmehmet 0:23dade9a66bf 903
gmehmet 0:23dade9a66bf 904
gmehmet 0:23dade9a66bf 905
gmehmet 0:23dade9a66bf 906
gmehmet 0:23dade9a66bf 907
gmehmet 0:23dade9a66bf 908 /*
gmehmet 0:23dade9a66bf 909 #ifdef __cplusplus
gmehmet 0:23dade9a66bf 910 }
gmehmet 0:23dade9a66bf 911 #endif
gmehmet 0:23dade9a66bf 912 */
gmehmet 0:23dade9a66bf 913