summaryrefslogtreecommitdiff
path: root/include/driver
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2019-09-23 12:53:07 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2019-09-23 12:53:07 +0200
commita5c6adc46d696233bc67e25ac2146173dd6ee8b2 (patch)
treec10354d47bf545bfa0a8de5827088032b58f0198 /include/driver
parent9fbfe1c5dcb12c47e6a408818dc815e3dd856518 (diff)
Add Bosch SensorTec BME680 driver + utilities
Diffstat (limited to 'include/driver')
-rw-r--r--include/driver/bme680.h225
-rw-r--r--include/driver/bme680_defs.h545
-rw-r--r--include/driver/bme680_util.h7
3 files changed, 777 insertions, 0 deletions
diff --git a/include/driver/bme680.h b/include/driver/bme680.h
new file mode 100644
index 0000000..fdecbab
--- /dev/null
+++ b/include/driver/bme680.h
@@ -0,0 +1,225 @@
+/**
+ * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the copyright holder nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
+ * The information provided is believed to be accurate and reliable.
+ * The copyright holder assumes no responsibility
+ * for the consequences of use
+ * of such information nor for any infringement of patents or
+ * other rights of third parties which may result from its use.
+ * No license is granted by implication or otherwise under any patent or
+ * patent rights of the copyright holder.
+ *
+ * @file bme680.h
+ * @date 19 Jun 2018
+ * @version 3.5.9
+ * @brief
+ *
+ */
+/*! @file bme680.h
+ @brief Sensor driver for BME680 sensor */
+/*!
+ * @defgroup BME680 SENSOR API
+ * @{*/
+#ifndef BME680_H_
+#define BME680_H_
+
+/*! CPP guard */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* Header includes */
+#include "driver/bme680_defs.h"
+
+/* function prototype declarations */
+/*!
+ * @brief This API is the entry point.
+ * It reads the chip-id and calibration data from the sensor.
+ *
+ * @param[in,out] dev : Structure instance of bme680_dev
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_init(struct bme680_dev *dev);
+
+/*!
+ * @brief This API writes the given data to the register address
+ * of the sensor.
+ *
+ * @param[in] reg_addr : Register address from where the data to be written.
+ * @param[in] reg_data : Pointer to data buffer which is to be written
+ * in the sensor.
+ * @param[in] len : No of bytes of data to write..
+ * @param[in] dev : Structure instance of bme680_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_set_regs(const uint8_t *reg_addr, const uint8_t *reg_data, uint8_t len, struct bme680_dev *dev);
+
+/*!
+ * @brief This API reads the data from the given register address of the sensor.
+ *
+ * @param[in] reg_addr : Register address from where the data to be read
+ * @param[out] reg_data : Pointer to data buffer to store the read data.
+ * @param[in] len : No of bytes of data to be read.
+ * @param[in] dev : Structure instance of bme680_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_get_regs(uint8_t reg_addr, uint8_t *reg_data, uint16_t len, struct bme680_dev *dev);
+
+/*!
+ * @brief This API performs the soft reset of the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+ */
+int8_t bme680_soft_reset(struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to set the power mode of the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev
+ * @note : Pass the value to bme680_dev.power_mode structure variable.
+ *
+ * value | mode
+ * -------------|------------------
+ * 0x00 | BME680_SLEEP_MODE
+ * 0x01 | BME680_FORCED_MODE
+ *
+ * * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_set_sensor_mode(struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to get the power mode of the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev
+ * @note : bme680_dev.power_mode structure variable hold the power mode.
+ *
+ * value | mode
+ * ---------|------------------
+ * 0x00 | BME680_SLEEP_MODE
+ * 0x01 | BME680_FORCED_MODE
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_get_sensor_mode(struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to set the profile duration of the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev.
+ * @param[in] duration : Duration of the measurement in ms.
+ *
+ * @return Nothing
+ */
+void bme680_set_profile_dur(uint16_t duration, struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to get the profile duration of the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev.
+ * @param[in] duration : Duration of the measurement in ms.
+ *
+ * @return Nothing
+ */
+void bme680_get_profile_dur(uint16_t *duration, const struct bme680_dev *dev);
+
+/*!
+ * @brief This API reads the pressure, temperature and humidity and gas data
+ * from the sensor, compensates the data and store it in the bme680_data
+ * structure instance passed by the user.
+ *
+ * @param[out] data: Structure instance to hold the data.
+ * @param[in] dev : Structure instance of bme680_dev.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error
+ */
+int8_t bme680_get_sensor_data(struct bme680_field_data *data, struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to set the oversampling, filter and T,P,H, gas selection
+ * settings in the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev.
+ * @param[in] desired_settings : Variable used to select the settings which
+ * are to be set in the sensor.
+ *
+ * Macros | Functionality
+ *---------------------------------|----------------------------------------------
+ * BME680_OST_SEL | To set temperature oversampling.
+ * BME680_OSP_SEL | To set pressure oversampling.
+ * BME680_OSH_SEL | To set humidity oversampling.
+ * BME680_GAS_MEAS_SEL | To set gas measurement setting.
+ * BME680_FILTER_SEL | To set filter setting.
+ * BME680_HCNTRL_SEL | To set humidity control setting.
+ * BME680_RUN_GAS_SEL | To set run gas setting.
+ * BME680_NBCONV_SEL | To set NB conversion setting.
+ * BME680_GAS_SENSOR_SEL | To set all gas sensor related settings
+ *
+ * @note : Below are the macros to be used by the user for selecting the
+ * desired settings. User can do OR operation of these macros for configuring
+ * multiple settings.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+ */
+int8_t bme680_set_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev);
+
+/*!
+ * @brief This API is used to get the oversampling, filter and T,P,H, gas selection
+ * settings in the sensor.
+ *
+ * @param[in] dev : Structure instance of bme680_dev.
+ * @param[in] desired_settings : Variable used to select the settings which
+ * are to be get from the sensor.
+ *
+ * @return Result of API execution status
+ * @retval zero -> Success / +ve value -> Warning / -ve value -> Error.
+ */
+int8_t bme680_get_sensor_settings(uint16_t desired_settings, struct bme680_dev *dev);
+#ifdef __cplusplus
+}
+#endif /* End of CPP guard */
+#endif /* BME680_H_ */
+/** @}*/
diff --git a/include/driver/bme680_defs.h b/include/driver/bme680_defs.h
new file mode 100644
index 0000000..b7c52d8
--- /dev/null
+++ b/include/driver/bme680_defs.h
@@ -0,0 +1,545 @@
+/**
+ * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * Neither the name of the copyright holder nor the names of the
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
+ *
+ * The information provided is believed to be accurate and reliable.
+ * The copyright holder assumes no responsibility
+ * for the consequences of use
+ * of such information nor for any infringement of patents or
+ * other rights of third parties which may result from its use.
+ * No license is granted by implication or otherwise under any patent or
+ * patent rights of the copyright holder.
+ *
+ * @file bme680_defs.h
+ * @date 19 Jun 2018
+ * @version 3.5.9
+ * @brief
+ *
+ */
+
+/*! @file bme680_defs.h
+ @brief Sensor driver for BME680 sensor */
+/*!
+ * @defgroup BME680 SENSOR API
+ * @brief
+ * @{*/
+#ifndef BME680_DEFS_H_
+#define BME680_DEFS_H_
+
+/********************************************************/
+/* header includes */
+#ifdef __KERNEL__
+#include <linux/types.h>
+#include <linux/kernel.h>
+#else
+#include <stdint.h>
+#include <stddef.h>
+#endif
+
+/******************************************************************************/
+/*! @name Common macros */
+/******************************************************************************/
+
+#if !defined(UINT8_C) && !defined(INT8_C)
+#define INT8_C(x) S8_C(x)
+#define UINT8_C(x) U8_C(x)
+#endif
+
+#if !defined(UINT16_C) && !defined(INT16_C)
+#define INT16_C(x) S16_C(x)
+#define UINT16_C(x) U16_C(x)
+#endif
+
+#if !defined(INT32_C) && !defined(UINT32_C)
+#define INT32_C(x) S32_C(x)
+#define UINT32_C(x) U32_C(x)
+#endif
+
+#if !defined(INT64_C) && !defined(UINT64_C)
+#define INT64_C(x) S64_C(x)
+#define UINT64_C(x) U64_C(x)
+#endif
+
+/**@}*/
+
+/**\name C standard macros */
+#ifndef NULL
+#ifdef __cplusplus
+#define NULL 0
+#else
+#define NULL ((void *) 0)
+#endif
+#endif
+
+/** BME680 configuration macros */
+/** Enable or un-comment the macro to provide floating point data output */
+#ifndef BME680_FLOAT_POINT_COMPENSATION
+/* #define BME680_FLOAT_POINT_COMPENSATION */
+#endif
+
+/** BME680 General config */
+#define BME680_POLL_PERIOD_MS UINT8_C(10)
+
+/** BME680 I2C addresses */
+#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76)
+#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77)
+
+/** BME680 unique chip identifier */
+#define BME680_CHIP_ID UINT8_C(0x61)
+
+/** BME680 coefficients related defines */
+#define BME680_COEFF_SIZE UINT8_C(41)
+#define BME680_COEFF_ADDR1_LEN UINT8_C(25)
+#define BME680_COEFF_ADDR2_LEN UINT8_C(16)
+
+/** BME680 field_x related defines */
+#define BME680_FIELD_LENGTH UINT8_C(15)
+#define BME680_FIELD_ADDR_OFFSET UINT8_C(17)
+
+/** Soft reset command */
+#define BME680_SOFT_RESET_CMD UINT8_C(0xb6)
+
+/** Error code definitions */
+#define BME680_OK INT8_C(0)
+/* Errors */
+#define BME680_E_NULL_PTR INT8_C(-1)
+#define BME680_E_COM_FAIL INT8_C(-2)
+#define BME680_E_DEV_NOT_FOUND INT8_C(-3)
+#define BME680_E_INVALID_LENGTH INT8_C(-4)
+
+/* Warnings */
+#define BME680_W_DEFINE_PWR_MODE INT8_C(1)
+#define BME680_W_NO_NEW_DATA INT8_C(2)
+
+/* Info's */
+#define BME680_I_MIN_CORRECTION UINT8_C(1)
+#define BME680_I_MAX_CORRECTION UINT8_C(2)
+
+/** Register map */
+/** Other coefficient's address */
+#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00)
+#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02)
+#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04)
+#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A)
+#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64)
+
+/** Field settings */
+#define BME680_FIELD0_ADDR UINT8_C(0x1d)
+
+/** Heater settings */
+#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a)
+#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64)
+
+/** Sensor configuration registers */
+#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70)
+#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71)
+#define BME680_CONF_OS_H_ADDR UINT8_C(0x72)
+#define BME680_MEM_PAGE_ADDR UINT8_C(0xf3)
+#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74)
+#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75)
+
+/** Coefficient's address */
+#define BME680_COEFF_ADDR1 UINT8_C(0x89)
+#define BME680_COEFF_ADDR2 UINT8_C(0xe1)
+
+/** Chip identifier */
+#define BME680_CHIP_ID_ADDR UINT8_C(0xd0)
+
+/** Soft reset register */
+#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0)
+
+/** Heater control settings */
+#define BME680_ENABLE_HEATER UINT8_C(0x00)
+#define BME680_DISABLE_HEATER UINT8_C(0x08)
+
+/** Gas measurement settings */
+#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00)
+#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01)
+
+/** Over-sampling settings */
+#define BME680_OS_NONE UINT8_C(0)
+#define BME680_OS_1X UINT8_C(1)
+#define BME680_OS_2X UINT8_C(2)
+#define BME680_OS_4X UINT8_C(3)
+#define BME680_OS_8X UINT8_C(4)
+#define BME680_OS_16X UINT8_C(5)
+
+/** IIR filter settings */
+#define BME680_FILTER_SIZE_0 UINT8_C(0)
+#define BME680_FILTER_SIZE_1 UINT8_C(1)
+#define BME680_FILTER_SIZE_3 UINT8_C(2)
+#define BME680_FILTER_SIZE_7 UINT8_C(3)
+#define BME680_FILTER_SIZE_15 UINT8_C(4)
+#define BME680_FILTER_SIZE_31 UINT8_C(5)
+#define BME680_FILTER_SIZE_63 UINT8_C(6)
+#define BME680_FILTER_SIZE_127 UINT8_C(7)
+
+/** Power mode settings */
+#define BME680_SLEEP_MODE UINT8_C(0)
+#define BME680_FORCED_MODE UINT8_C(1)
+
+/** Delay related macro declaration */
+#define BME680_RESET_PERIOD UINT32_C(10)
+
+/** SPI memory page settings */
+#define BME680_MEM_PAGE0 UINT8_C(0x10)
+#define BME680_MEM_PAGE1 UINT8_C(0x00)
+
+/** Ambient humidity shift value for compensation */
+#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4)
+
+/** Run gas enable and disable settings */
+#define BME680_RUN_GAS_DISABLE UINT8_C(0)
+#define BME680_RUN_GAS_ENABLE UINT8_C(1)
+
+/** Buffer length macro declaration */
+#define BME680_TMP_BUFFER_LENGTH UINT8_C(40)
+#define BME680_REG_BUFFER_LENGTH UINT8_C(6)
+#define BME680_FIELD_DATA_LENGTH UINT8_C(3)
+#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20)
+
+/** Settings selector */
+#define BME680_OST_SEL UINT16_C(1)
+#define BME680_OSP_SEL UINT16_C(2)
+#define BME680_OSH_SEL UINT16_C(4)
+#define BME680_GAS_MEAS_SEL UINT16_C(8)
+#define BME680_FILTER_SEL UINT16_C(16)
+#define BME680_HCNTRL_SEL UINT16_C(32)
+#define BME680_RUN_GAS_SEL UINT16_C(64)
+#define BME680_NBCONV_SEL UINT16_C(128)
+#define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
+
+/** Number of conversion settings*/
+#define BME680_NBCONV_MIN UINT8_C(0)
+#define BME680_NBCONV_MAX UINT8_C(10)
+
+/** Mask definitions */
+#define BME680_GAS_MEAS_MSK UINT8_C(0x30)
+#define BME680_NBCONV_MSK UINT8_C(0X0F)
+#define BME680_FILTER_MSK UINT8_C(0X1C)
+#define BME680_OST_MSK UINT8_C(0XE0)
+#define BME680_OSP_MSK UINT8_C(0X1C)
+#define BME680_OSH_MSK UINT8_C(0X07)
+#define BME680_HCTRL_MSK UINT8_C(0x08)
+#define BME680_RUN_GAS_MSK UINT8_C(0x10)
+#define BME680_MODE_MSK UINT8_C(0x03)
+#define BME680_RHRANGE_MSK UINT8_C(0x30)
+#define BME680_RSERROR_MSK UINT8_C(0xf0)
+#define BME680_NEW_DATA_MSK UINT8_C(0x80)
+#define BME680_GAS_INDEX_MSK UINT8_C(0x0f)
+#define BME680_GAS_RANGE_MSK UINT8_C(0x0f)
+#define BME680_GASM_VALID_MSK UINT8_C(0x20)
+#define BME680_HEAT_STAB_MSK UINT8_C(0x10)
+#define BME680_MEM_PAGE_MSK UINT8_C(0x10)
+#define BME680_SPI_RD_MSK UINT8_C(0x80)
+#define BME680_SPI_WR_MSK UINT8_C(0x7f)
+#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F)
+
+/** Bit position definitions for sensor settings */
+#define BME680_GAS_MEAS_POS UINT8_C(4)
+#define BME680_FILTER_POS UINT8_C(2)
+#define BME680_OST_POS UINT8_C(5)
+#define BME680_OSP_POS UINT8_C(2)
+#define BME680_RUN_GAS_POS UINT8_C(4)
+
+/** Array Index to Field data mapping for Calibration Data*/
+#define BME680_T2_LSB_REG (1)
+#define BME680_T2_MSB_REG (2)
+#define BME680_T3_REG (3)
+#define BME680_P1_LSB_REG (5)
+#define BME680_P1_MSB_REG (6)
+#define BME680_P2_LSB_REG (7)
+#define BME680_P2_MSB_REG (8)
+#define BME680_P3_REG (9)
+#define BME680_P4_LSB_REG (11)
+#define BME680_P4_MSB_REG (12)
+#define BME680_P5_LSB_REG (13)
+#define BME680_P5_MSB_REG (14)
+#define BME680_P7_REG (15)
+#define BME680_P6_REG (16)
+#define BME680_P8_LSB_REG (19)
+#define BME680_P8_MSB_REG (20)
+#define BME680_P9_LSB_REG (21)
+#define BME680_P9_MSB_REG (22)
+#define BME680_P10_REG (23)
+#define BME680_H2_MSB_REG (25)
+#define BME680_H2_LSB_REG (26)
+#define BME680_H1_LSB_REG (26)
+#define BME680_H1_MSB_REG (27)
+#define BME680_H3_REG (28)
+#define BME680_H4_REG (29)
+#define BME680_H5_REG (30)
+#define BME680_H6_REG (31)
+#define BME680_H7_REG (32)
+#define BME680_T1_LSB_REG (33)
+#define BME680_T1_MSB_REG (34)
+#define BME680_GH2_LSB_REG (35)
+#define BME680_GH2_MSB_REG (36)
+#define BME680_GH1_REG (37)
+#define BME680_GH3_REG (38)
+
+/** BME680 register buffer index settings*/
+#define BME680_REG_FILTER_INDEX UINT8_C(5)
+#define BME680_REG_TEMP_INDEX UINT8_C(4)
+#define BME680_REG_PRES_INDEX UINT8_C(4)
+#define BME680_REG_HUM_INDEX UINT8_C(2)
+#define BME680_REG_NBCONV_INDEX UINT8_C(1)
+#define BME680_REG_RUN_GAS_INDEX UINT8_C(1)
+#define BME680_REG_HCTRL_INDEX UINT8_C(0)
+
+/** BME680 pressure calculation macros */
+/*! This max value is used to provide precedence to multiplication or division
+ * in pressure compensation equation to achieve least loss of precision and
+ * avoiding overflows.
+ * i.e Comparing value, BME680_MAX_OVERFLOW_VAL = INT32_C(1 << 30)
+ */
+#define BME680_MAX_OVERFLOW_VAL INT32_C(0x40000000)
+
+/** Macro to combine two 8 bit data's to form a 16 bit data */
+#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
+
+/** Macro to SET and GET BITS of a register */
+#define BME680_SET_BITS(reg_data, bitname, data) \
+ ((reg_data & ~(bitname##_MSK)) | \
+ ((data << bitname##_POS) & bitname##_MSK))
+#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
+ (bitname##_POS))
+
+/** Macro variant to handle the bitname position if it is zero */
+#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \
+ ((reg_data & ~(bitname##_MSK)) | \
+ (data & bitname##_MSK))
+#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
+
+/** Type definitions */
+/*!
+ * Generic communication function pointer
+ * @param[in] dev_id: Place holder to store the id of the device structure
+ * Can be used to store the index of the Chip select or
+ * I2C address of the device.
+ * @param[in] reg_addr: Used to select the register the where data needs to
+ * be read from or written to.
+ * @param[in/out] reg_data: Data array to read/write
+ * @param[in] len: Length of the data array
+ */
+typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
+
+/*!
+ * Delay function pointer
+ * @param[in] period: Time period in milliseconds
+ */
+typedef void (*bme680_delay_fptr_t)(uint32_t period);
+
+/*!
+ * @brief Interface selection Enumerations
+ */
+enum bme680_intf {
+ /*! SPI interface */
+ BME680_SPI_INTF,
+ /*! I2C interface */
+ BME680_I2C_INTF
+};
+
+/* structure definitions */
+/*!
+ * @brief Sensor field data structure
+ */
+struct bme680_field_data {
+ /*! Contains new_data, gasm_valid & heat_stab */
+ uint8_t status;
+ /*! The index of the heater profile used */
+ uint8_t gas_index;
+ /*! Measurement index to track order */
+ uint8_t meas_index;
+
+#ifndef BME680_FLOAT_POINT_COMPENSATION
+ /*! Temperature in degree celsius x100 */
+ int16_t temperature;
+ /*! Pressure in Pascal */
+ uint32_t pressure;
+ /*! Humidity in % relative humidity x1000 */
+ uint32_t humidity;
+ /*! Gas resistance in Ohms */
+ uint32_t gas_resistance;
+#else
+ /*! Temperature in degree celsius */
+ float temperature;
+ /*! Pressure in Pascal */
+ float pressure;
+ /*! Humidity in % relative humidity x1000 */
+ float humidity;
+ /*! Gas resistance in Ohms */
+ float gas_resistance;
+
+#endif
+
+};
+
+/*!
+ * @brief Structure to hold the Calibration data
+ */
+struct bme680_calib_data {
+ /*! Variable to store calibrated humidity data */
+ uint16_t par_h1;
+ /*! Variable to store calibrated humidity data */
+ uint16_t par_h2;
+ /*! Variable to store calibrated humidity data */
+ int8_t par_h3;
+ /*! Variable to store calibrated humidity data */
+ int8_t par_h4;
+ /*! Variable to store calibrated humidity data */
+ int8_t par_h5;
+ /*! Variable to store calibrated humidity data */
+ uint8_t par_h6;
+ /*! Variable to store calibrated humidity data */
+ int8_t par_h7;
+ /*! Variable to store calibrated gas data */
+ int8_t par_gh1;
+ /*! Variable to store calibrated gas data */
+ int16_t par_gh2;
+ /*! Variable to store calibrated gas data */
+ int8_t par_gh3;
+ /*! Variable to store calibrated temperature data */
+ uint16_t par_t1;
+ /*! Variable to store calibrated temperature data */
+ int16_t par_t2;
+ /*! Variable to store calibrated temperature data */
+ int8_t par_t3;
+ /*! Variable to store calibrated pressure data */
+ uint16_t par_p1;
+ /*! Variable to store calibrated pressure data */
+ int16_t par_p2;
+ /*! Variable to store calibrated pressure data */
+ int8_t par_p3;
+ /*! Variable to store calibrated pressure data */
+ int16_t par_p4;
+ /*! Variable to store calibrated pressure data */
+ int16_t par_p5;
+ /*! Variable to store calibrated pressure data */
+ int8_t par_p6;
+ /*! Variable to store calibrated pressure data */
+ int8_t par_p7;
+ /*! Variable to store calibrated pressure data */
+ int16_t par_p8;
+ /*! Variable to store calibrated pressure data */
+ int16_t par_p9;
+ /*! Variable to store calibrated pressure data */
+ uint8_t par_p10;
+
+#ifndef BME680_FLOAT_POINT_COMPENSATION
+ /*! Variable to store t_fine size */
+ int32_t t_fine;
+#else
+ /*! Variable to store t_fine size */
+ float t_fine;
+#endif
+ /*! Variable to store heater resistance range */
+ uint8_t res_heat_range;
+ /*! Variable to store heater resistance value */
+ int8_t res_heat_val;
+ /*! Variable to store error range */
+ int8_t range_sw_err;
+};
+
+/*!
+ * @brief BME680 sensor settings structure which comprises of ODR,
+ * over-sampling and filter settings.
+ */
+struct bme680_tph_sett {
+ /*! Humidity oversampling */
+ uint8_t os_hum;
+ /*! Temperature oversampling */
+ uint8_t os_temp;
+ /*! Pressure oversampling */
+ uint8_t os_pres;
+ /*! Filter coefficient */
+ uint8_t filter;
+};
+
+/*!
+ * @brief BME680 gas sensor which comprises of gas settings
+ * and status parameters
+ */
+struct bme680_gas_sett {
+ /*! Variable to store nb conversion */
+ uint8_t nb_conv;
+ /*! Variable to store heater control */
+ uint8_t heatr_ctrl;
+ /*! Run gas enable value */
+ uint8_t run_gas;
+ /*! Heater temperature value */
+ uint16_t heatr_temp;
+ /*! Duration profile value */
+ uint16_t heatr_dur;
+};
+
+/*!
+ * @brief BME680 device structure
+ */
+struct bme680_dev {
+ /*! Chip Id */
+ uint8_t chip_id;
+ /*! Device Id */
+ uint8_t dev_id;
+ /*! SPI/I2C interface */
+ enum bme680_intf intf;
+ /*! Memory page used */
+ uint8_t mem_page;
+ /*! Ambient temperature in Degree C */
+ int8_t amb_temp;
+ /*! Sensor calibration data */
+ struct bme680_calib_data calib;
+ /*! Sensor settings */
+ struct bme680_tph_sett tph_sett;
+ /*! Gas Sensor settings */
+ struct bme680_gas_sett gas_sett;
+ /*! Sensor power modes */
+ uint8_t power_mode;
+ /*! New sensor fields */
+ uint8_t new_fields;
+ /*! Store the info messages */
+ uint8_t info_msg;
+ /*! Bus read function pointer */
+ bme680_com_fptr_t read;
+ /*! Bus write function pointer */
+ bme680_com_fptr_t write;
+ /*! delay function pointer */
+ bme680_delay_fptr_t delay_ms;
+ /*! Communication function result */
+ int8_t com_rslt;
+};
+
+
+
+#endif /* BME680_DEFS_H_ */
+/** @}*/
+/** @}*/
diff --git a/include/driver/bme680_util.h b/include/driver/bme680_util.h
new file mode 100644
index 0000000..1341b49
--- /dev/null
+++ b/include/driver/bme680_util.h
@@ -0,0 +1,7 @@
+#include <stdint.h>
+
+void bme680_delay_ms(uint32_t const period);
+
+int8_t bme680_i2c_read(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);
+
+int8_t bme680_i2c_write(uint8_t dev_id, uint8_t reg_addr, uint8_t *reg_data, uint16_t len);