1 /*
2  * Copyright (c) 2015 - 2016, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 /**
10  * @file fxas21002_drv.h
11  * @brief The fxas21002_drv.h file describes the fxas21002 driver interface and structures.
12  */
13 
14 #ifndef FXAS21002_DRV_H_
15 #define FXAS21002_DRV_H_
16 
17 /* Standard C Includes */
18 #include <stdint.h>
19 
20 /* ISSDK Includes */
21 #include "fxas21002.h"
22 #include "sensor_io_i2c.h"
23 #include "sensor_io_spi.h"
24 #include "register_io_i2c.h"
25 #include "register_io_spi.h"
26 
27 /*******************************************************************************
28  * Definitions
29  ******************************************************************************/
30 /*!
31  * @brief This defines the sensor specific information for SPI.
32  */
33 typedef struct
34 {
35     registerDeviceInfo_t deviceInfo;      /*!< SPI device context. */
36     ARM_DRIVER_SPI *pCommDrv;             /*!< Pointer to the spi driver. */
37     bool isInitialized;                   /*!< Whether sensor is intialized or not.*/
38     spiSlaveSpecificParams_t slaveParams; /*!< Slave Specific Params.*/
39 } fxas21002_spi_sensorhandle_t;
40 
41 /*!
42  * @brief This defines the sensor specific information for I2C.
43  */
44 typedef struct
45 {
46     registerDeviceInfo_t deviceInfo; /*!< I2C device context. */
47     ARM_DRIVER_I2C *pCommDrv;        /*!< Pointer to the i2c driver. */
48     bool isInitialized;              /*!< whether sensor is intialized or not.*/
49     uint16_t slaveAddress;           /*!< slave address.*/
50 } fxas21002_i2c_sensorhandle_t;
51 
52 /*! @brief This structure defines the fxas21002 raw data buffer.*/
53 typedef struct
54 {
55     uint32_t timestamp; /*! The time, this sample was recorded.  */
56     int16_t gyro[3];    /*!< The gyro data */
57 } fxas21002_gyrodata_t;
58 
59 /*! @def    FXAS21002_GYRO_DATA_SIZE
60  *  @brief  The size of the FXAS21002 gyro data. */
61 #define FXAS21002_GYRO_DATA_SIZE (0x06) /* Size of the accel data*/
62 
63 /*! @def    FXAS21002_SPI_MAX_MSG_SIZE
64  *  @brief  The MAX size of SPI message. */
65 #define FXAS21002_SPI_MAX_MSG_SIZE (64)
66 
67 /*! @def    FXAS21002_SPI_CMD_LEN
68  *  @brief  The size of the Sensor specific SPI Header. */
69 #define FXAS21002_SPI_CMD_LEN (1)
70 
71 /*! @def    FXAS21002_SS_ACTIVE_VALUE
72  *  @brief  Is the Slave Select Pin Active Low or High. */
73 #define FXAS21002_SS_ACTIVE_VALUE SPI_SS_ACTIVE_LOW
74 
75 /*******************************************************************************
76  * APIs
77  ******************************************************************************/
78 /*! @brief       The interface function to initialize the sensor.
79  *  @details     This function initialize the sensor and sensor handle.
80  *  @param[in]   pSensorHandle  handle to the sensor.
81  *  @param[in]   pBus           pointer to the CMSIS API compatible I2C bus object.
82  *  @param[in]   index          the I2C device number.
83  *  @param[in]   sAddress       slave address of the device on the bus.
84  *  @param[in]   whoami         WHO_AM_I value of the device.
85  *  @constraints This should be the first API to be called.
86  *               Application has to ensure that previous instances of these APIs have exited before invocation.
87  *  @reeentrant  No
88  *  @return      ::FXAS21002_I2C_Initialize() returns the status .
89  */
90 int32_t FXAS21002_I2C_Initialize(fxas21002_i2c_sensorhandle_t *pSensorHandle,
91                                  ARM_DRIVER_I2C *pBus,
92                                  uint8_t index,
93                                  uint16_t sAddress,
94                                  uint8_t whoAmi);
95 
96 /*! @brief      :  The interface function to set the I2C Idle Task.
97  *  @param[in]  :  fxas21002_i2c_sensorhandle_t *pSensorHandle, handle to the sensor handle.
98  *  @param[in]  :  registeridlefunction_t idleTask, function pointer to the function to execute on I2C Idle Time.
99  *  @param[in]  :  void *userParam, the pointer to the user idle ftask parameters.
100  *  @return        void.
101  *  @constraints   This can be called any number of times only after FXAS21002_I2C_Initialize().
102  *                 Application has to ensure that previous instances of these APIs have exited before invocation.
103  *  @reeentrant    No
104  */
105 void FXAS21002_I2C_SetIdleTask(fxas21002_i2c_sensorhandle_t *pSensorHandle,
106                                registeridlefunction_t idleTask,
107                                void *userParam);
108 
109 /*! @brief       The interface function to configure he sensor.
110  *  @details     This function configure the sensor with requested ODR, Range and registers in the regsiter pair array.
111  *  @param[in]   pSensorHandle      handle to the sensor.
112  *  @param[in]   pRegWriteList      pointer to the register list.
113  *  @constraints This can be called any number of times only after FXAS21002_I2C_Initialize().
114  *               Application has to ensure that previous instances of these APIs have exited before invocation.
115  *  @reeentrant  No
116  *  @return      ::FXAS21002_I2C_Configure() returns the status .
117  */
118 int32_t FXAS21002_I2C_Configure(fxas21002_i2c_sensorhandle_t *pSensorHandle, const registerwritelist_t *pRegWriteList);
119 
120 /*! @brief       The interface function to read the sensor data.
121  *  @details     This function read the sensor data out from the device and returns raw data in a byte stream.
122  *  @param[in]   pSensorHandle  handle to the sensor.
123  *  @param[in]   pReadList      pointer to the list of device registers and values to read.
124  *  @param[out]  pBuffer        buffer which holds raw sensor data.This buffer may be back to back databuffer based
125  *                              command read in the list.
126  *  @constraints This can be called any number of times only after FXAS21002_I2C_Initialize().
127  *               Application has to ensure that previous instances of these APIs have exited before invocation.
128  *  @reeentrant  No
129  *  @return      ::FXAS21002_I2C_ReadData() returns the status .
130  */
131 int32_t FXAS21002_I2C_ReadData(fxas21002_i2c_sensorhandle_t *pSensorHandle,
132                                const registerreadlist_t *pReadList,
133                                uint8_t *pBuffer);
134 
135 /*! @brief       The interface function to De Initialize sensor..
136  *  @details     This function made sensor in a power safe state and de initialize its handle.
137  *  @param[in]   pSensorHandle      handle to the sensor.
138  *  @constraints This can be called only after FXAS21002_I2C_Initialize().
139  *               Application has to ensure that previous instances of these APIs have exited before invocation.
140  *  @reeentrant  No
141  *  @return      ::FXAS21002_I2C_Deinit() returns the status .
142  */
143 int32_t FXAS21002_I2C_Deinit(fxas21002_i2c_sensorhandle_t *pSensorHandle);
144 
145 /*! @brief       The interface function to initialize the sensor.
146  *  @details     This function initializes the sensor and sensor handle.
147  *  @param[in]   pSensorHandle handle to the sensor.
148  *  @param[in]   pBus          pointer to the CMSIS API compatible SPI bus object.
149  *  @param[in]   index         the I2C device number.
150  *  @param[in]   pSlaveSelect  slave select hndle of the device on the bus.
151  *  @param[in]   whoami        WHO_AM_I value of the device.
152  *  @constraints This should be the first API to be called.
153  *               Application has to ensure that previous instances of these APIs have exited before invocation.
154  *  @reeentrant  No
155  *  @return      ::FXAS21002_SPI_Initialize() returns the status .
156  */
157 int32_t FXAS21002_SPI_Initialize(fxas21002_spi_sensorhandle_t *pSensorHandle,
158                                  ARM_DRIVER_SPI *pBus,
159                                  uint8_t index,
160                                  void *pSlaveSelect,
161                                  uint8_t whoAmi);
162 
163 /*! @brief      :  The interface function to set the SPI Idle Task.
164  *  @param[in]  :  fxas21002_spi_sensorhandle_t *pSensorHandle, handle to the sensor handle.
165  *  @param[in]  :  registeridlefunction_t idleTask, function pointer to the function to execute on SPI Idle Time.
166  *  @param[in]  :  void *userParam, the pointer to the user idle ftask parameters.
167  *  @return        void.
168  *  @constraints   This can be called any number of times only after FXAS21002_SPI_Initialize().
169  *                 Application has to ensure that previous instances of these APIs have exited before invocation.
170  *  @reeentrant    No
171  */
172 void FXAS21002_SPI_SetIdleTask(fxas21002_spi_sensorhandle_t *pSensorHandle,
173                                registeridlefunction_t idleTask,
174                                void *userParam);
175 
176 /*! @brief       The interface function to configure he sensor.
177  *  @details     This function configure the sensor with requested ODR, Range and registers in the regsiter pair array.
178  *  @param[in]   pSensorHandle handle to the sensor.
179  *  @param[in]   pRegWriteList pointer to the register list.
180  *  @constraints This can be called any number of times only after FXAS21002_SPI_Initialize().
181  *               Application has to ensure that previous instances of these APIs have exited before invocation.
182  *  @reeentrant  No
183  *  @return      ::FXAS21002_SPI_Configure() returns the status .
184  */
185 int32_t FXAS21002_SPI_Configure(fxas21002_spi_sensorhandle_t *pSensorHandle, const registerwritelist_t *pRegWriteList);
186 
187 /*! @brief       The interface function to read the sensor data.
188  *  @details     This function read the sensor data out from the device and returns raw data in a byte stream.
189  *  @param[in]   pSensorHandle handle to the sensor.
190  *  @param[in]   pReadList     pointer to the list of device registers and values to read.
191  *  @param[out]  pBuffer       buffer which holds raw sensor data.This buffer may be back to back databuffer based
192  *               command read in the list.
193  *  @constraints This can be called any number of times only after FXAS21002_SPI_Initialize().
194  *               Application has to ensure that previous instances of these APIs have exited before invocation.
195  *  @reeentrant  No
196  *  @return      ::FXAS21002_SPI_ReadData() returns the status .
197  */
198 int32_t FXAS21002_SPI_ReadData(fxas21002_spi_sensorhandle_t *pSensorHandle,
199                                const registerreadlist_t *pReadList,
200                                uint8_t *pBuffer);
201 
202 /*! @brief       The interface function to De Initialize sensor..
203  *  @details     This function made sensor in a power safe state and de initialize its handle.
204  *  @param[in]   pSensorHandle      handle to the sensor.
205  *  @constraints This can be called only after after FXAS21002_SPI_Initialize().
206  *               Application has to ensure that previous instances of these APIs have exited before invocation.
207  *  @reeentrant  No
208  *  @return      ::FXAS21002_SPI_Deinit() returns the status .
209  */
210 int32_t FXAS21002_SPI_Deinit(fxas21002_spi_sensorhandle_t *pSensorHandle);
211 
212 /*! @brief       The SPI Read Pre-Process function to generate Sensor specific SPI Message Header.
213  *  @details     This function prepares the SPI Read Command Header with register address and
214  *               R/W bit encoded as the Sensor.
215  *  @param[out]  pCmdOut  handle to the output buffer.
216  *  @param[in]   offset   the address of the register to start reading from.
217  *  @param[in]   size     number of bytes to read.
218  *  @constraints None
219  *               Application has to ensure that previous instances of these APIs have exited before invocation.
220  *  @reeentrant  No
221  *  @return      :: None.
222  */
223 void FXAS21002_SPI_ReadPreprocess(void *pCmdOut, uint32_t offset, uint32_t size);
224 
225 /*! @brief       The SPI Write Pre-Process function to generate Sensor specific SPI Message Header.
226  *  @details     This function prepares the SPI Write Command Header with register address and
227  *               R/W bit encoded as the Sensor.
228  *  @param[out]  pCmdOut  handle to the output buffer.
229  *  @param[in]   offset   the address of the register to start writing from.
230  *  @param[in]   size     number of bytes to write.
231  *  @constraints None
232  *               Application has to ensure that previous instances of these APIs have exited before invocation.
233  *  @reeentrant  No
234  *  @return      :: None.
235  */
236 void FXAS21002_SPI_WritePreprocess(void *pCmdOut, uint32_t offset, uint32_t size, void *pWritebuffer);
237 
238 #endif // FXAS21002_DRV_H_
239