Commit e7be7644 authored by Lukáš Voborský's avatar Lukáš Voborský Committed by Marcel Stör
Browse files

Update sensor driver for BME680 to 3.5.9 (#2969)

parent bfcccbf0
...@@ -68,7 +68,10 @@ static uint8_t r8u(uint8_t reg) { ...@@ -68,7 +68,10 @@ static uint8_t r8u(uint8_t reg) {
return ret[0]; return ret[0];
} }
/* This part of code is coming from the original bme680.c driver by Bosch. // replace 'dev->calib.' with 'bme680_data.'
// replace 'dev->amb_temp' with 'amb_temp'
/**\mainpage
* Copyright (C) 2017 - 2018 Bosch Sensortec GmbH * Copyright (C) 2017 - 2018 Bosch Sensortec GmbH
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
...@@ -108,20 +111,13 @@ static uint8_t r8u(uint8_t reg) { ...@@ -108,20 +111,13 @@ static uint8_t r8u(uint8_t reg) {
* other rights of third parties which may result from its use. * other rights of third parties which may result from its use.
* No license is granted by implication or otherwise under any patent or * No license is granted by implication or otherwise under any patent or
* patent rights of the copyright holder. * patent rights of the copyright holder.
*
* File bme680.c
* @date 19 Jun 2018
* @version 3.5.9
*
*/ */
/**static variables */
/**Look up table for the possible gas range values */
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777), UINT32_C(2147483647),
UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228), UINT32_C(2147483647), UINT32_C(2126008810),
UINT32_C(2147483647), UINT32_C(2147483647) };
/**Look up table for the possible gas range values */
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016), UINT32_C(
8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000), UINT32_C(250000),
UINT32_C(125000) };
static uint8_t calc_heater_res(uint16_t temp) static uint8_t calc_heater_res(uint16_t temp)
{ {
uint8_t heatr_res; uint8_t heatr_res;
...@@ -132,9 +128,7 @@ static uint8_t calc_heater_res(uint16_t temp) ...@@ -132,9 +128,7 @@ static uint8_t calc_heater_res(uint16_t temp)
int32_t var5; int32_t var5;
int32_t heatr_res_x100; int32_t heatr_res_x100;
if (temp < 200) /* Cap temperature */ if (temp > 400) /* Cap temperature */
temp = 200;
else if (temp > 400)
temp = 400; temp = 400;
var1 = (((int32_t) amb_temp * bme680_data.par_gh3) / 1000) * 256; var1 = (((int32_t) amb_temp * bme680_data.par_gh3) / 1000) * 256;
...@@ -173,12 +167,12 @@ static int16_t calc_temperature(uint32_t temp_adc) ...@@ -173,12 +167,12 @@ static int16_t calc_temperature(uint32_t temp_adc)
int64_t var3; int64_t var3;
int16_t calc_temp; int16_t calc_temp;
var1 = ((int32_t) temp_adc / 8) - ((int32_t) bme680_data.par_t1 * 2); var1 = ((int32_t) temp_adc >> 3) - ((int32_t) bme680_data.par_t1 << 1);
var2 = (var1 * (int32_t) bme680_data.par_t2) / 2048; var2 = (var1 * (int32_t) bme680_data.par_t2) >> 11;
var3 = ((var1 / 2) * (var1 / 2)) / 4096; var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
var3 = ((var3) * ((int32_t) bme680_data.par_t3 * 16)) / 16384; var3 = ((var3) * ((int32_t) bme680_data.par_t3 << 4)) >> 14;
bme680_data.t_fine = (int32_t) (var2 + var3); bme680_data.t_fine = (int32_t) (var2 + var3);
calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) / 256); calc_temp = (int16_t) (((bme680_data.t_fine * 5) + 128) >> 8);
return calc_temp; return calc_temp;
} }
...@@ -188,27 +182,37 @@ static uint32_t calc_pressure(uint32_t pres_adc) ...@@ -188,27 +182,37 @@ static uint32_t calc_pressure(uint32_t pres_adc)
int32_t var1; int32_t var1;
int32_t var2; int32_t var2;
int32_t var3; int32_t var3;
int32_t calc_pres; int32_t pressure_comp;
var1 = (((int32_t) bme680_data.t_fine) / 2) - 64000; var1 = (((int32_t)bme680_data.t_fine) >> 1) - 64000;
var2 = ((var1 / 4) * (var1 / 4)) / 2048; var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) *
var2 = ((var2) * (int32_t) bme680_data.par_p6) / 4; (int32_t)bme680_data.par_p6) >> 2;
var2 = var2 + ((var1 * (int32_t) bme680_data.par_p5) * 2); var2 = var2 + ((var1 * (int32_t)bme680_data.par_p5) << 1);
var2 = (var2 / 4) + ((int32_t) bme680_data.par_p4 * 65536); var2 = (var2 >> 2) + ((int32_t)bme680_data.par_p4 << 16);
var1 = ((var1 / 4) * (var1 / 4)) / 8192; var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
var1 = (((var1) * ((int32_t) bme680_data.par_p3 * 32)) / 8) + (((int32_t) bme680_data.par_p2 * var1) / 2); ((int32_t)bme680_data.par_p3 << 5)) >> 3) +
var1 = var1 / 262144; (((int32_t)bme680_data.par_p2 * var1) >> 1);
var1 = ((32768 + var1) * (int32_t) bme680_data.par_p1) / 32768; var1 = var1 >> 18;
calc_pres = (int32_t) (1048576 - pres_adc); var1 = ((32768 + var1) * (int32_t)bme680_data.par_p1) >> 15;
calc_pres = (int32_t) ((calc_pres - (var2 / 4096)) * (3125)); pressure_comp = 1048576 - pres_adc;
calc_pres = ((calc_pres / var1) * 2); pressure_comp = (int32_t)((pressure_comp - (var2 >> 12)) * ((uint32_t)3125));
var1 = ((int32_t) bme680_data.par_p9 * (int32_t) (((calc_pres / 8) * (calc_pres / 8)) / 8192)) / 4096; if (pressure_comp >= BME680_MAX_OVERFLOW_VAL)
var2 = ((int32_t) (calc_pres / 4) * (int32_t) bme680_data.par_p8) / 8192; pressure_comp = ((pressure_comp / var1) << 1);
var3 = ((int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) * (int32_t) (calc_pres / 256) else
* (int32_t) bme680_data.par_p10) / 131072; pressure_comp = ((pressure_comp << 1) / var1);
calc_pres = (int32_t) (calc_pres) + ((var1 + var2 + var3 + ((int32_t) bme680_data.par_p7 * 128)) / 16); var1 = ((int32_t)bme680_data.par_p9 * (int32_t)(((pressure_comp >> 3) *
(pressure_comp >> 3)) >> 13)) >> 12;
return (uint32_t) calc_pres; var2 = ((int32_t)(pressure_comp >> 2) *
(int32_t)bme680_data.par_p8) >> 13;
var3 = ((int32_t)(pressure_comp >> 8) * (int32_t)(pressure_comp >> 8) *
(int32_t)(pressure_comp >> 8) *
(int32_t)bme680_data.par_p10) >> 17;
pressure_comp = (int32_t)(pressure_comp) + ((var1 + var2 + var3 +
((int32_t)bme680_data.par_p7 << 7)) >> 4);
return (uint32_t)pressure_comp;
} }
static uint32_t calc_humidity(uint16_t hum_adc) static uint32_t calc_humidity(uint16_t hum_adc)
...@@ -222,19 +226,19 @@ static uint32_t calc_humidity(uint16_t hum_adc) ...@@ -222,19 +226,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
int32_t temp_scaled; int32_t temp_scaled;
int32_t calc_hum; int32_t calc_hum;
temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) / 256; temp_scaled = (((int32_t) bme680_data.t_fine * 5) + 128) >> 8;
var1 = (int32_t) (hum_adc - ((int32_t) ((int32_t) bme680_data.par_h1 * 16))) var1 = (int32_t) (hum_adc - ((int32_t) ((int32_t) bme680_data.par_h1 * 16)))
- (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) / 2); - (((temp_scaled * (int32_t) bme680_data.par_h3) / ((int32_t) 100)) >> 1);
var2 = ((int32_t) bme680_data.par_h2 var2 = ((int32_t) bme680_data.par_h2
* (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100)) * (((temp_scaled * (int32_t) bme680_data.par_h4) / ((int32_t) 100))
+ (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) / 64) + (((temp_scaled * ((temp_scaled * (int32_t) bme680_data.par_h5) / ((int32_t) 100))) >> 6)
/ ((int32_t) 100)) + (int32_t) (1 * 16384))) / 1024; / ((int32_t) 100)) + (int32_t) (1 << 14))) >> 10;
var3 = var1 * var2; var3 = var1 * var2;
var4 = (int32_t) bme680_data.par_h6 * 128; var4 = (int32_t) bme680_data.par_h6 << 7;
var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) / 16; var4 = ((var4) + ((temp_scaled * (int32_t) bme680_data.par_h7) / ((int32_t) 100))) >> 4;
var5 = ((var3 / 16384) * (var3 / 16384)) / 1024; var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
var6 = (var4 * var5) / 2; var6 = (var4 * var5) >> 1;
calc_hum = (((var3 + var6) / 1024) * ((int32_t) 1000)) / 4096; calc_hum = (((var3 + var6) >> 10) * ((int32_t) 1000)) >> 12;
if (calc_hum > 100000) /* Cap at 100%rH */ if (calc_hum > 100000) /* Cap at 100%rH */
calc_hum = 100000; calc_hum = 100000;
...@@ -244,6 +248,19 @@ static uint32_t calc_humidity(uint16_t hum_adc) ...@@ -244,6 +248,19 @@ static uint32_t calc_humidity(uint16_t hum_adc)
return (uint32_t) calc_hum; return (uint32_t) calc_hum;
} }
/**static variables */
/**Look up table 1 for the possible gas range values */
uint32_t lookupTable1[16] = { UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2147483647),
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2130303777),
UINT32_C(2147483647), UINT32_C(2147483647), UINT32_C(2143188679), UINT32_C(2136746228),
UINT32_C(2147483647), UINT32_C(2126008810), UINT32_C(2147483647), UINT32_C(2147483647) };
/**Look up table 2 for the possible gas range values */
uint32_t lookupTable2[16] = { UINT32_C(4096000000), UINT32_C(2048000000), UINT32_C(1024000000), UINT32_C(512000000),
UINT32_C(255744255), UINT32_C(127110228), UINT32_C(64000000), UINT32_C(32258064), UINT32_C(16016016),
UINT32_C(8000000), UINT32_C(4000000), UINT32_C(2000000), UINT32_C(1000000), UINT32_C(500000),
UINT32_C(250000), UINT32_C(125000) };
static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range) static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range)
{ {
int64_t var1; int64_t var1;
...@@ -251,14 +268,16 @@ static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range) ...@@ -251,14 +268,16 @@ static uint32_t calc_gas_resistance(uint16_t gas_res_adc, uint8_t gas_range)
int64_t var3; int64_t var3;
uint32_t calc_gas_res; uint32_t calc_gas_res;
var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) * ((int64_t) lookupTable1[gas_range])) / 65536; var1 = (int64_t) ((1340 + (5 * (int64_t) bme680_data.range_sw_err)) *
var2 = (((int64_t) ((int64_t) gas_res_adc * 32768) - (int64_t) (16777216)) + var1); ((int64_t) lookupTable1[gas_range])) >> 16;
var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) / 512); var2 = (((int64_t) ((int64_t) gas_res_adc << 15) - (int64_t) (16777216)) + var1);
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 / 2)) / (int64_t) var2); var3 = (((int64_t) lookupTable2[gas_range] * (int64_t) var1) >> 9);
calc_gas_res = (uint32_t) ((var3 + ((int64_t) var2 >> 1)) / (int64_t) var2);
return calc_gas_res; return calc_gas_res;
} }
uint16_t calc_dur() uint16_t calc_dur()
{ {
uint32_t tph_dur; /* Calculate in us */ uint32_t tph_dur; /* Calculate in us */
......
...@@ -39,78 +39,47 @@ ...@@ -39,78 +39,47 @@
* No license is granted by implication or otherwise under any patent or * No license is granted by implication or otherwise under any patent or
* patent rights of the copyright holder. * patent rights of the copyright holder.
* *
* @file bme680_defs.h * @file bme680_defs.h
* @date 5 Jul 2017 * @date 19 Jun 2018
* @version 3.5.1 * @version 3.5.9
* @brief * @brief Sensor driver for BME680 sensor
*
*/ */
/*! @file bme680_defs.h
@brief Sensor driver for BME680 sensor */
/*!
* @defgroup BME680 SENSOR API
* @brief
* @{*/
#ifndef BME680_DEFS_H_ #ifndef BME680_DEFS_H_
#define BME680_DEFS_H_ #define BME680_DEFS_H_
/********************************************************/ /** header includes **/
/* header includes */
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <linux/types.h> #include <linux/types.h>
#include <linux/kernel.h>
#else #else
#include <stdint.h> #include <stdint.h>
#include <stddef.h>
#endif #endif
#ifdef __KERNEL__ /** Common macros **/
#if (LONG_MAX) > 0x7fffffff
#define __have_long64 1
#elif (LONG_MAX) == 0x7fffffff
#define __have_long32 1
#endif
#if !defined(UINT8_C) #if !defined(UINT8_C) && !defined(INT8_C)
#define INT8_C(x) x #define INT8_C(x) S8_C(x)
#if (INT_MAX) > 0x7f #define UINT8_C(x) U8_C(x)
#define UINT8_C(x) x
#else
#define UINT8_C(x) x##U
#endif
#endif #endif
#if !defined(UINT16_C) #if !defined(UINT16_C) && !defined(INT16_C)
#define INT16_C(x) x #define INT16_C(x) S16_C(x)
#if (INT_MAX) > 0x7fff #define UINT16_C(x) U16_C(x)
#define UINT16_C(x) x
#else
#define UINT16_C(x) x##U
#endif
#endif #endif
#if !defined(INT32_C) && !defined(UINT32_C) #if !defined(INT32_C) && !defined(UINT32_C)
#if __have_long32 #define INT32_C(x) S32_C(x)
#define INT32_C(x) x##L #define UINT32_C(x) U32_C(x)
#define UINT32_C(x) x##UL
#else
#define INT32_C(x) x
#define UINT32_C(x) x##U
#endif
#endif #endif
#if !defined(INT64_C) && !defined(UINT64_C) #if !defined(INT64_C) && !defined(UINT64_C)
#if __have_long64 #define INT64_C(x) S64_C(x)
#define INT64_C(x) x##L #define UINT64_C(x) U64_C(x)
#define UINT64_C(x) x##UL
#else
#define INT64_C(x) x##LL
#define UINT64_C(x) x##ULL
#endif
#endif
#endif #endif
/**@}*/
/**\name C standard macros */ /** C standard macros **/
#ifndef NULL #ifndef NULL
#ifdef __cplusplus #ifdef __cplusplus
#define NULL 0 #define NULL 0
...@@ -119,29 +88,35 @@ ...@@ -119,29 +88,35 @@
#endif #endif
#endif #endif
/** BME680 General config */ /** 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) #define BME680_POLL_PERIOD_MS UINT8_C(10)
/** BME680 I2C addresses */ /** BME680 I2C addresses **/
#define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76) #define BME680_I2C_ADDR_PRIMARY UINT8_C(0x76)
#define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77) #define BME680_I2C_ADDR_SECONDARY UINT8_C(0x77)
/** BME680 unique chip identifier */ /** BME680 unique chip identifier **/
#define BME680_CHIP_ID UINT8_C(0x61) #define BME680_CHIP_ID UINT8_C(0x61)
/** BME680 coefficients related defines */ /** BME680 coefficients related defines **/
#define BME680_COEFF_SIZE UINT8_C(0x41) #define BME680_COEFF_SIZE UINT8_C(41)
#define BME680_COEFF_ADDR1_LEN UINT8_C(25) #define BME680_COEFF_ADDR1_LEN UINT8_C(25)
#define BME680_COEFF_ADDR2_LEN UINT8_C(16) #define BME680_COEFF_ADDR2_LEN UINT8_C(16)
/** BME680 field_x related defines */ /** BME680 field_x related defines **/
#define BME680_FIELD_LENGTH UINT8_C(15) #define BME680_FIELD_LENGTH UINT8_C(15)
#define BME680_FIELD_ADDR_OFFSET UINT8_C(17) #define BME680_FIELD_ADDR_OFFSET UINT8_C(17)
/** Soft reset command */ /** Soft reset command **/
#define BME680_SOFT_RESET_CMD UINT8_C(0xb6) #define BME680_SOFT_RESET_CMD UINT8_C(0xb6)
/** Error code definitions */ /** Error code definitions **/
#define BME680_OK INT8_C(0) #define BME680_OK INT8_C(0)
/* Errors */ /* Errors */
#define BME680_E_NULL_PTR INT8_C(-1) #define BME680_E_NULL_PTR INT8_C(-1)
...@@ -157,22 +132,22 @@ ...@@ -157,22 +132,22 @@
#define BME680_I_MIN_CORRECTION UINT8_C(1) #define BME680_I_MIN_CORRECTION UINT8_C(1)
#define BME680_I_MAX_CORRECTION UINT8_C(2) #define BME680_I_MAX_CORRECTION UINT8_C(2)
/** Register map */ /** Register map **/
/** Other coefficient's address */ /** Other coefficient's address **/
#define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00) #define BME680_ADDR_RES_HEAT_VAL_ADDR UINT8_C(0x00)
#define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02) #define BME680_ADDR_RES_HEAT_RANGE_ADDR UINT8_C(0x02)
#define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04) #define BME680_ADDR_RANGE_SW_ERR_ADDR UINT8_C(0x04)
#define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A) #define BME680_ADDR_SENS_CONF_START UINT8_C(0x5A)
#define BME680_ADDR_GAS_CONF_START UINT8_C(0x64) #define BME680_ADDR_GAS_CONF_START UINT8_C(0x64)
/** Field settings */ /** Field settings **/
#define BME680_FIELD0_ADDR UINT8_C(0x1d) #define BME680_FIELD0_ADDR UINT8_C(0x1d)
/** Heater settings */ /** Heater settings **/
#define BME680_RES_HEAT0_ADDR UINT8_C(0x5a) #define BME680_RES_HEAT0_ADDR UINT8_C(0x5a)
#define BME680_GAS_WAIT0_ADDR UINT8_C(0x64) #define BME680_GAS_WAIT0_ADDR UINT8_C(0x64)
/** Sensor configuration registers */ /** Sensor configuration registers **/
#define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70) #define BME680_CONF_HEAT_CTRL_ADDR UINT8_C(0x70)
#define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71) #define BME680_CONF_ODR_RUN_GAS_NBC_ADDR UINT8_C(0x71)
#define BME680_CONF_OS_H_ADDR UINT8_C(0x72) #define BME680_CONF_OS_H_ADDR UINT8_C(0x72)
...@@ -180,25 +155,25 @@ ...@@ -180,25 +155,25 @@
#define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74) #define BME680_CONF_T_P_MODE_ADDR UINT8_C(0x74)
#define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75) #define BME680_CONF_ODR_FILT_ADDR UINT8_C(0x75)
/** Coefficient's address */ /** Coefficient's address **/
#define BME680_COEFF_ADDR1 UINT8_C(0x89) #define BME680_COEFF_ADDR1 UINT8_C(0x89)
#define BME680_COEFF_ADDR2 UINT8_C(0xe1) #define BME680_COEFF_ADDR2 UINT8_C(0xe1)
/** Chip identifier */ /** Chip identifier **/
#define BME680_CHIP_ID_ADDR UINT8_C(0xd0) #define BME680_CHIP_ID_ADDR UINT8_C(0xd0)
/** Soft reset register */ /** Soft reset register **/
#define BME680_SOFT_RESET_ADDR UINT8_C(0xe0) #define BME680_SOFT_RESET_ADDR UINT8_C(0xe0)
/** Heater control settings */ /** Heater control settings **/
#define BME680_ENABLE_HEATER UINT8_C(0x00) #define BME680_ENABLE_HEATER UINT8_C(0x00)
#define BME680_DISABLE_HEATER UINT8_C(0x08) #define BME680_DISABLE_HEATER UINT8_C(0x08)
/** Gas measurement settings */ /** Gas measurement settings **/
#define BME680_DISABLE_GAS_MEAS UINT8_C(0x00) #define BME680_DISABLE_GAS_MEAS UINT8_C(0x00)
#define BME680_ENABLE_GAS_MEAS UINT8_C(0x01) #define BME680_ENABLE_GAS_MEAS UINT8_C(0x01)
/** Over-sampling settings */ /** Over-sampling settings **/
#define BME680_OS_NONE UINT8_C(0) #define BME680_OS_NONE UINT8_C(0)
#define BME680_OS_1X UINT8_C(1) #define BME680_OS_1X UINT8_C(1)
#define BME680_OS_2X UINT8_C(2) #define BME680_OS_2X UINT8_C(2)
...@@ -206,7 +181,7 @@ ...@@ -206,7 +181,7 @@
#define BME680_OS_8X UINT8_C(4) #define BME680_OS_8X UINT8_C(4)
#define BME680_OS_16X UINT8_C(5) #define BME680_OS_16X UINT8_C(5)
/** IIR filter settings */ /** IIR filter settings **/
#define BME680_FILTER_SIZE_0 UINT8_C(0) #define BME680_FILTER_SIZE_0 UINT8_C(0)
#define BME680_FILTER_SIZE_1 UINT8_C(1) #define BME680_FILTER_SIZE_1 UINT8_C(1)
#define BME680_FILTER_SIZE_3 UINT8_C(2) #define BME680_FILTER_SIZE_3 UINT8_C(2)
...@@ -220,28 +195,27 @@ ...@@ -220,28 +195,27 @@
#define BME680_SLEEP_MODE UINT8_C(0) #define BME680_SLEEP_MODE UINT8_C(0)
#define BME680_FORCED_MODE UINT8_C(1) #define BME680_FORCED_MODE UINT8_C(1)
/** Delay related macro declaration */ /** Delay related macro declaration **/
#define BME680_RESET_PERIOD UINT32_C(10) #define BME680_RESET_PERIOD UINT32_C(10)
/** SPI memory page settings */ /** SPI memory page settings **/
#define BME680_MEM_PAGE0 UINT8_C(0x10) #define BME680_MEM_PAGE0 UINT8_C(0x10)
#define BME680_MEM_PAGE1 UINT8_C(0x00) #define BME680_MEM_PAGE1 UINT8_C(0x00)
/** Ambient humidity shift value for compensation */ /** Ambient humidity shift value for compensation **/
#define BME680_HUM_REG_SHIFT_VAL UINT8_C(4) #define BME680_HUM_REG_SHIFT_VAL UINT8_C(4)
/** Run gas enable and disable settings */ /** Run gas enable and disable settings **/
#define BME680_RUN_GAS_DISABLE UINT8_C(0) #define BME680_RUN_GAS_DISABLE UINT8_C(0)
#define BME680_RUN_GAS_ENABLE UINT8_C(1) #define BME680_RUN_GAS_ENABLE UINT8_C(1)
/** Buffer length macro declaration */ /** Buffer length macro declaration **/
#define BME680_TMP_BUFFER_LENGTH UINT8_C(40) #define BME680_TMP_BUFFER_LENGTH UINT8_C(40)
#define BME680_REG_BUFFER_LENGTH UINT8_C(6) #define BME680_REG_BUFFER_LENGTH UINT8_C(6)
#define BME680_FIELD_DATA_LENGTH UINT8_C(3) #define BME680_FIELD_DATA_LENGTH UINT8_C(3)
#define BME680_GAS_REG_BUF_LENGTH UINT8_C(20) #define BME680_GAS_REG_BUF_LENGTH UINT8_C(20)
#define BME680_GAS_HEATER_PROF_LEN_MAX UINT8_C(10)
/** Settings selector */ /** Settings selector **/
#define BME680_OST_SEL UINT16_C(1) #define BME680_OST_SEL UINT16_C(1)
#define BME680_OSP_SEL UINT16_C(2) #define BME680_OSP_SEL UINT16_C(2)
#define BME680_OSH_SEL UINT16_C(4) #define BME680_OSH_SEL UINT16_C(4)
...@@ -250,13 +224,13 @@ ...@@ -250,13 +224,13 @@
#define BME680_HCNTRL_SEL UINT16_C(32) #define BME680_HCNTRL_SEL UINT16_C(32)
#define BME680_RUN_GAS_SEL UINT16_C(64) #define BME680_RUN_GAS_SEL UINT16_C(64)
#define BME680_NBCONV_SEL UINT16_C(128) #define BME680_NBCONV_SEL UINT16_C(128)
#define BME680_GAS_SENSOR_SEL UINT16_C(BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL) #define BME680_GAS_SENSOR_SEL (BME680_GAS_MEAS_SEL | BME680_RUN_GAS_SEL | BME680_NBCONV_SEL)
/** Number of conversion settings*/ /** Number of conversion settings **/
#define BME680_NBCONV_MIN UINT8_C(0) #define BME680_NBCONV_MIN UINT8_C(0)
#define BME680_NBCONV_MAX UINT8_C(10) #define BME680_NBCONV_MAX UINT8_C(10)
/** Mask definitions */ /** Mask definitions **/
#define BME680_GAS_MEAS_MSK UINT8_C(0x30) #define BME680_GAS_MEAS_MSK UINT8_C(0x30)
#define BME680_NBCONV_MSK UINT8_C(0X0F) #define BME680_NBCONV_MSK UINT8_C(0X0F)
#define BME680_FILTER_MSK UINT8_C(0X1C) #define BME680_FILTER_MSK UINT8_C(0X1C)
...@@ -278,14 +252,14 @@ ...@@ -278,14 +252,14 @@
#define BME680_SPI_WR_MSK UINT8_C(0x7f) #define BME680_SPI_WR_MSK UINT8_C(0x7f)
#define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F) #define BME680_BIT_H1_DATA_MSK UINT8_C(0x0F)
/** Bit position definitions for sensor settings */ /** Bit position definitions for sensor settings **/
#define BME680_GAS_MEAS_POS UINT8_C(4) #define BME680_GAS_MEAS_POS UINT8_C(4)
#define BME680_FILTER_POS UINT8_C(2) #define BME680_FILTER_POS UINT8_C(2)
#define BME680_OST_POS UINT8_C(5) #define BME680_OST_POS UINT8_C(5)
#define BME680_OSP_POS UINT8_C(2) #define BME680_OSP_POS UINT8_C(2)
#define BME680_RUN_GAS_POS UINT8_C(4) #define BME680_RUN_GAS_POS UINT8_C(4)
/** Array Index to Field data mapping for Calibration Data*/ /** Array Index to Field data mapping for Calibration Data **/
#define BME680_T2_LSB_REG (1) #define BME680_T2_LSB_REG (1)
#define BME680_T2_MSB_REG (2) #define BME680_T2_MSB_REG (2)
#define BME680_T3_REG (3) #define BME680_T3_REG (3)
...@@ -321,7 +295,7 @@ ...@@ -321,7 +295,7 @@
#define BME680_GH1_REG (37) #define BME680_GH1_REG (37)
#define BME680_GH3_REG (38) #define BME680_GH3_REG (38)
/** BME680 register buffer index settings*/ /** BME680 register buffer index settings **/
#define BME680_REG_FILTER_INDEX UINT8_C(5) #define BME680_REG_FILTER_INDEX UINT8_C(5)
#define BME680_REG_TEMP_INDEX UINT8_C(4) #define BME680_REG_TEMP_INDEX UINT8_C(4)
#define BME680_REG_PRES_INDEX UINT8_C(4) #define BME680_REG_PRES_INDEX UINT8_C(4)
...@@ -330,38 +304,51 @@ ...@@ -330,38 +304,51 @@
#define BME680_REG_RUN_GAS_INDEX UINT8_C(1) #define BME680_REG_RUN_GAS_INDEX UINT8_C(1)
#define BME680_REG_HCTRL_INDEX UINT8_C(0) #define BME680_REG_HCTRL_INDEX UINT8_C(0)
/** Macro to combine two 8 bit data's to form a 16 bit data */ /** 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) #define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
/** Macro to SET and GET BITS of a register */ /** Macro to SET and GET BITS of a register **/
#define BME680_SET_BITS(reg_data, bitname, data) \ #define BME680_SET_BITS(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \ ((reg_data & ~(bitname##_MSK)) | \
((data << bitname##_POS) & bitname##_MSK)) ((data << bitname##_POS) & bitname##_MSK))
#define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \ #define BME680_GET_BITS(reg_data, bitname) ((reg_data & (bitname##_MSK)) >> \
(bitname##_POS)) (bitname##_POS))
/** Macro variant to handle the bitname position if it is zero */ /** Macro variant to handle the bitname position if it is zero **/
#define BME680_SET_BITS_POS_0(reg_data, bitname, data) \ #define BME680_SET_BITS_POS_0(reg_data, bitname, data) \
((reg_data & ~(bitname##_MSK)) | \ ((reg_data & ~(bitname##_MSK)) | \
(data & bitname##_MSK)) (data & bitname##_MSK))
#define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK)) #define BME680_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))
/** Type definitions */ /** Type definitions **/
/* /*!
* Generic communication function pointer * @brief Generic communication function pointer
* @param[in] dev_id: Place holder to store the id of the device structure * @param[in] dev_id
* Can be used to store the index of the Chip select or * Place holder to store the id of the device structure
* I2C address of the device. * Can be used to store the index of the Chip select or
* @param[in] reg_addr: Used to select the register the where data needs to * I2C address of the device.
* be read from or written to. * @param[in] reg_addr
* @param[in/out] reg_data: Data array to read/write * Used to select the register the where data needs to
* @param[in] len: Length of the data array * 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); typedef int8_t (*bme680_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);
/* /*!
* Delay function pointer * @brief Delay function pointer
* @param[in] period: Time period in milliseconds * @param[in] period
* Time period in milliseconds
*/ */
typedef void (*bme680_delay_fptr_t)(uint32_t period); typedef void (*bme680_delay_fptr_t)(uint32_t period);
...@@ -375,7 +362,7 @@ enum bme680_intf { ...@@ -375,7 +362,7 @@ enum bme680_intf {
BME680_I2C_INTF BME680_I2C_INTF
}; };
/* structure definitions */ /** structure definitions **/
/*! /*!
* @brief Sensor field data structure * @brief Sensor field data structure
*/ */
...@@ -386,6 +373,8 @@ struct bme680_field_data { ...@@ -386,6 +373,8 @@ struct bme680_field_data {
uint8_t gas_index; uint8_t gas_index;
/*! Measurement index to track order */ /*! Measurement index to track order */
uint8_t meas_index; uint8_t meas_index;
#ifndef BME680_FLOAT_POINT_COMPENSATION
/*! Temperature in degree celsius x100 */ /*! Temperature in degree celsius x100 */
int16_t temperature; int16_t temperature;
/*! Pressure in Pascal */ /*! Pressure in Pascal */
...@@ -394,6 +383,18 @@ struct bme680_field_data { ...@@ -394,6 +383,18 @@ struct bme680_field_data {
uint32_t humidity; uint32_t humidity;
/*! Gas resistance in Ohms */ /*! Gas resistance in Ohms */
uint32_t gas_resistance; 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
}; };
/*! /*!
...@@ -446,8 +447,14 @@ struct bme680_calib_data { ...@@ -446,8 +447,14 @@ struct bme680_calib_data {
int16_t par_p9; int16_t par_p9;
/*! Variable to store calibrated pressure data */ /*! Variable to store calibrated pressure data */
uint8_t par_p10; uint8_t par_p10;
#ifndef BME680_FLOAT_POINT_COMPENSATION
/*! Variable to store t_fine size */ /*! Variable to store t_fine size */
int32_t t_fine; int32_t t_fine;
#else
/*! Variable to store t_fine size */
float t_fine;
#endif
/*! Variable to store heater resistance range */ /*! Variable to store heater resistance range */
uint8_t res_heat_range; uint8_t res_heat_range;
/*! Variable to store heater resistance value */ /*! Variable to store heater resistance value */
...@@ -458,7 +465,7 @@ struct bme680_calib_data { ...@@ -458,7 +465,7 @@ struct bme680_calib_data {
/*! /*!
* @brief BME680 sensor settings structure which comprises of ODR, * @brief BME680 sensor settings structure which comprises of ODR,
* over-sampling and filter settings. * over-sampling and filter settings.
*/ */
struct bme680_tph_sett { struct bme680_tph_sett {
/*! Humidity oversampling */ /*! Humidity oversampling */
...@@ -473,7 +480,7 @@ struct bme680_tph_sett { ...@@ -473,7 +480,7 @@ struct bme680_tph_sett {
/*! /*!
* @brief BME680 gas sensor which comprises of gas settings * @brief BME680 gas sensor which comprises of gas settings
* and status parameters * and status parameters
*/ */
struct bme680_gas_sett { struct bme680_gas_sett {
/*! Variable to store nb conversion */ /*! Variable to store nb conversion */
...@@ -482,9 +489,9 @@ struct bme680_gas_sett { ...@@ -482,9 +489,9 @@ struct bme680_gas_sett {
uint8_t heatr_ctrl; uint8_t heatr_ctrl;
/*! Run gas enable value */ /*! Run gas enable value */
uint8_t run_gas; uint8_t run_gas;
/*! Pointer to store heater temperature */ /*! Heater temperature value */
uint16_t heatr_temp; uint16_t heatr_temp;
/*! Pointer to store duration profile */ /*! Duration profile value */
uint16_t heatr_dur; uint16_t heatr_dur;
}; };
...@@ -500,7 +507,7 @@ struct bme680_dev { ...@@ -500,7 +507,7 @@ struct bme680_dev {
enum bme680_intf intf; enum bme680_intf intf;
/*! Memory page used */ /*! Memory page used */
uint8_t mem_page; uint8_t mem_page;
/*! Ambient temperature in Degree C*/ /*! Ambient temperature in Degree C */
int8_t amb_temp; int8_t amb_temp;
/*! Sensor calibration data */ /*! Sensor calibration data */
struct bme680_calib_data calib; struct bme680_calib_data calib;
...@@ -514,16 +521,18 @@ struct bme680_dev { ...@@ -514,16 +521,18 @@ struct bme680_dev {
uint8_t new_fields; uint8_t new_fields;
/*! Store the info messages */ /*! Store the info messages */
uint8_t info_msg; uint8_t info_msg;
/*! Burst read structure */ /*! Bus read function pointer */
bme680_com_fptr_t read; bme680_com_fptr_t read;
/*! Burst write structure */ /*! Bus write function pointer */
bme680_com_fptr_t write; bme680_com_fptr_t write;
/*! Delay in ms */ /*! delay function pointer */
bme680_delay_fptr_t delay_ms; bme680_delay_fptr_t delay_ms;
/*! Communication function result */ /*! Communication function result */
int8_t com_rslt; int8_t com_rslt;
}; };
#endif /* BME680_DEFS_H_ */ #endif /* BME680_DEFS_H_ */
/** @}*/ /** @}*/
/** @}*/ /** @}*/
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment