1895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/*
2895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall $License:
3895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall   Copyright 2011 InvenSense, Inc.
4895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
5895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Licensed under the Apache License, Version 2.0 (the "License");
6895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall you may not use this file except in compliance with the License.
7895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall You may obtain a copy of the License at
8895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
9895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall http://www.apache.org/licenses/LICENSE-2.0
10895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
11895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall Unless required by applicable law or agreed to in writing, software
12895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall distributed under the License is distributed on an "AS IS" BASIS,
13895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall See the License for the specific language governing permissions and
15895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall limitations under the License.
16895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall  $
17895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
18895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
19895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/******************************************************************************
20895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
21895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * $Id: mldmp.c 5629 2011-06-11 03:13:08Z mcaramello $
22895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
23895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *****************************************************************************/
24895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
25895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
26895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @addtogroup MLDMP
27895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
28895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall * @{
29895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @file     mldmp.c
30895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *      @brief    Shared functions between all the different DMP versions
31895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall**/
32895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
33895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include <stdio.h>
34895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
35895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mltypes.h"
36895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlinclude.h"
37895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mltypes.h"
38895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "ml.h"
39895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl_cfg.h"
40895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldl.h"
41895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "compass.h"
42895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlSetGyroBias.h"
43895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlsl.h"
44895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlFIFO.h"
45895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mldmp.h"
46895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlstates.h"
47895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "dmpDefault.h"
48895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlFIFOHW.h"
49895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "mlsupervisor.h"
50895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
51895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#include "log.h"
52895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#undef MPL_LOG_TAG
53895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#define MPL_LOG_TAG "MPL-dmp"
54895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
55895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
56895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Open the default motion sensor engine.
57895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          This function is used to open the default MPL engine,
58895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          featuring, for example, sensor fusion (6 axes and 9 axes),
59895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          sensor calibration, accelerometer data byte swapping, among
60895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          others.
61895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Compare with the other provided engines.
62895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
63895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    inv_serial_start() must have been called to instantiate the serial
64895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          communication.
65895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
66895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  Example:
67895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @code
68895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *    result = inv_dmp_open( );
69895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *    if (INV_SUCCESS != result) {
70895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *        // Handle the error case
71895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *    }
72895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcode
73895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
74895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return Zero on success; Error Code on any failure.
75895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
76895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
77895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_dmp_open(void)
78895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
79895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
80895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
81895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned char state = inv_get_state();
82895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    struct mldl_cfg *mldl_cfg;
83895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    unsigned long requested_sensors;
84895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
85895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /*************************************************************
86895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall     * Common operations before calling DMPOpen
87895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall     ************************************************************/
88895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (state == INV_STATE_DMP_OPENED)
89895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_SUCCESS;
90895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
91895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (state == INV_STATE_DMP_STARTED) {
92895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return inv_dmp_stop();
93895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
94895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
95895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_state_transition(INV_STATE_DMP_OPENED);
96895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
97895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
98895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
99895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
100895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
101895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_dl_open(inv_get_serial_handle());
102895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
103895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
104895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
105895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
106895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#ifdef ML_USE_DMP_SIM
107895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    do {
108895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        void setup_univ();
109895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        setup_univ();           /* hijack the read and write paths
110895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall                                   and re-direct them to the simulator */
111895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    } while (0);
112895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall#endif
113895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
114895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_setup_dmp();
115895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
116895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
117895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
118895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
119895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
120895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    // Init vars.
121895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_init_ml();
122895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
123895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_init_fifo_param();
124895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
125895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
126895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
127895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
128895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_enable_set_bias();
129895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
130895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
131895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
132895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
133895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_init_fifo_hardare();
134895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    mldl_cfg = inv_get_dl_config();
135895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    requested_sensors = INV_THREE_AXIS_GYRO;
136895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->accel && mldl_cfg->accel->resume)
137895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        requested_sensors |= INV_THREE_AXIS_ACCEL;
138895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
139895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->compass && mldl_cfg->compass->resume)
140895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        requested_sensors |= INV_THREE_AXIS_COMPASS;
141895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
142895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (mldl_cfg->pressure && mldl_cfg->pressure->resume)
143895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        requested_sensors |= INV_THREE_AXIS_PRESSURE;
144895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
145895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_init_requested_sensors(requested_sensors);
146895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
147895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
148895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
149895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
150895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_apply_calibration();
151895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
152895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
153895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
154895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
155a45503dc4dc8d9331bbc9e3fce1b1c35cb57c39fRosa Chow    if (NULL != mldl_cfg->accel){
156a45503dc4dc8d9331bbc9e3fce1b1c35cb57c39fRosa Chow        result = inv_apply_endian_accel();
157a45503dc4dc8d9331bbc9e3fce1b1c35cb57c39fRosa Chow    }
158895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
159895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
160895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
161895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
162895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
163895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Start the DMP.
164895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
165895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    inv_dmp_open() must have been called.
166895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
167895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @code
168895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     result = inv_dmp_start();
169895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     if (INV_SUCCESS != result) {
170895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *         // Handle the error case
171895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     }
172895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcode
173895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
174895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS if successful, or Non-zero error code otherwise.
175895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
176895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_dmp_start(void)
177895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
178895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
179895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
180895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
181895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() == INV_STATE_DMP_STARTED)
182895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_SUCCESS;
183895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
184895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_state_transition(INV_STATE_DMP_STARTED);
185895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
186895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
187895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
188895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
189895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_init_sensor_fusion_supervisor();
190895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_dl_start(inv_get_dl_config()->requested_sensors);
191895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
192895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
193895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
194895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
195895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    /* This is done after the start since it will modify DMP memory, which
196895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall     * will cause a full reset is most cases */
197895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_reset_motion();
198895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
199895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
200895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
201895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
202895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
203895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
204895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
205895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
206895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
207895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Stops the DMP and puts it in low power.
208895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
209895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    inv_dmp_start() must have been called.
210895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
211895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS, Non-zero error code otherwise.
212895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
213895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_dmp_stop(void)
214895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
215895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
216895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
217895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
218895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() == INV_STATE_DMP_OPENED)
219895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_SUCCESS;
220895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
221895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_state_transition(INV_STATE_DMP_OPENED);
222895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
223895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
224895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
225895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
226895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_dl_stop(INV_ALL_SENSORS);
227895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (result) {
228895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        LOG_RESULT_LOCATION(result);
229895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return result;
230895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    }
231895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
232895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
233895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
234895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
235895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
236895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @brief  Closes the motion sensor engine.
237895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          Does not close the serial communication. To do that,
238895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          call inv_serial_stop().
239895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          After calling inv_dmp_close() another DMP module can be
240895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          loaded in the MPL with the corresponding necessary
241895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          intialization and configurations, via any of the
242895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *          MLDmpXXXOpen functions.
243895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
244895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @pre    inv_dmp_open() must have been called.
245895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
246895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @code
247895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     result = inv_dmp_close();
248895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     if (INV_SUCCESS != result) {
249895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *         // Handle the error case
250895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *     }
251895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @endcode
252895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *
253895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @return INV_SUCCESS, Non-zero error code otherwise.
254895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
255895401859313187f15a800e62d43e6bcbf48fadaJP Abgrallinv_error_t inv_dmp_close(void)
256895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall{
257895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    INVENSENSE_FUNC_START;
258895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t result;
259895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    inv_error_t firstError = INV_SUCCESS;
260895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
261895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    if (inv_get_state() <= INV_STATE_DMP_CLOSED)
262895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall        return INV_SUCCESS;
263895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
264895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_disable_set_bias();
265895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    ERROR_CHECK_FIRST(firstError, result);
266895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
267895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_dl_stop(INV_ALL_SENSORS);
268895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    ERROR_CHECK_FIRST(firstError, result);
269895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
270895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_close_fifo();
271895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    ERROR_CHECK_FIRST(firstError, result);
272895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
273895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_dl_close();
274895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    ERROR_CHECK_FIRST(firstError, result);
275895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
276895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    result = inv_state_transition(INV_STATE_SERIAL_OPENED);
277895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    ERROR_CHECK_FIRST(firstError, result);
278895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
279895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall    return result;
280895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall}
281895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall
282895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall/**
283895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall *  @}
284895401859313187f15a800e62d43e6bcbf48fadaJP Abgrall */
285