summaryrefslogtreecommitdiff
path: root/nrfdemo/src/bme680/bme680.h
diff options
context:
space:
mode:
authorMichal Hanus <hanus.michal@divelit.cz>2025-04-23 13:43:14 +0200
committerMichal Hanus <hanus.michal@divelit.cz>2025-04-23 13:43:14 +0200
commitd1c04e8b36bc206eb520f7b79183d5c015855252 (patch)
tree469857024814e16b8ed27c52c5b8689358455f33 /nrfdemo/src/bme680/bme680.h
parent851d92974af6cefa00de1379dad8b8076c2dd107 (diff)
parent0dee9f28ef79d54ec06f460b5e1deb10a8efd303 (diff)
Merge remote-tracking branch 'refs/remotes/xyz/master'
Diffstat (limited to 'nrfdemo/src/bme680/bme680.h')
-rw-r--r--nrfdemo/src/bme680/bme680.h220
1 files changed, 220 insertions, 0 deletions
diff --git a/nrfdemo/src/bme680/bme680.h b/nrfdemo/src/bme680/bme680.h
new file mode 100644
index 0000000..125aea1
--- /dev/null
+++ b/nrfdemo/src/bme680/bme680.h
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 2018 Bosch Sensortec GmbH
+ * Copyright (c) 2022, Leonard Pollak
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#ifndef __ZEPHYR_DRIVERS_SENSOR_BME680_H__
+#define __ZEPHYR_DRIVERS_SENSOR_BME680_H__
+
+#include <zephyr/types.h>
+#include <zephyr/device.h>
+#include <zephyr/devicetree.h>
+#include <zephyr/drivers/spi.h>
+#include <zephyr/drivers/i2c.h>
+
+#define DT_DRV_COMPAT bosch_bme680
+
+#define BME680_BUS_SPI DT_ANY_INST_ON_BUS_STATUS_OKAY(spi)
+#define BME680_BUS_I2C DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c)
+
+union bme680_bus {
+#if BME680_BUS_SPI
+ struct spi_dt_spec spi;
+#endif
+#if BME680_BUS_I2C
+ struct i2c_dt_spec i2c;
+#endif
+};
+
+typedef int (*bme680_bus_check_fn)(const union bme680_bus *bus);
+typedef int (*bme680_reg_read_fn)(const struct device *dev,
+ uint8_t start, uint8_t *buf, int size);
+typedef int (*bme680_reg_write_fn)(const struct device *dev,
+ uint8_t reg, uint8_t val);
+
+struct bme680_bus_io {
+ bme680_bus_check_fn check;
+ bme680_reg_read_fn read;
+ bme680_reg_write_fn write;
+};
+
+#if BME680_BUS_SPI
+#define BME680_SPI_OPERATION (SPI_WORD_SET(8) | SPI_TRANSFER_MSB | SPI_MODE_CPOL \
+ | SPI_MODE_CPHA | SPI_OP_MODE_MASTER)
+extern const struct bme680_bus_io bme680_bus_io_spi;
+#endif
+
+#if BME680_BUS_I2C
+extern const struct bme680_bus_io bme680_bus_io_i2c;
+#endif
+
+struct bme680_config {
+ union bme680_bus bus;
+ const struct bme680_bus_io *bus_io;
+};
+
+#define BME680_CHIP_ID 0x61
+
+#define BME680_LEN_FIELD 15
+#define BME680_LEN_COEFF_ALL 42
+#define BME680_LEN_COEFF1 23
+#define BME680_LEN_COEFF2 14
+#define BME680_LEN_COEFF3 5
+
+#define BME680_REG_COEFF3 0x00
+#define BME680_REG_FIELD0 0x1d
+#define BME680_REG_IDAC_HEAT0 0x50
+#define BME680_REG_RES_HEAT0 0x5A
+#define BME680_REG_GAS_WAIT0 0x64
+#define BME680_REG_SHD_HEATR_DUR 0x6E
+#define BME680_REG_CTRL_GAS_0 0x70
+#define BME680_REG_CTRL_GAS_1 0x71
+#define BME680_REG_CTRL_HUM 0x72
+#define BME680_REG_CTRL_MEAS 0x74
+#define BME680_REG_CONFIG 0x75
+#define BME680_REG_STATUS 0x73
+#define BME680_REG_UNIQUE_ID 0x83
+#define BME680_REG_COEFF1 0x8a
+#define BME680_REG_COEFF2 0xe1
+#define BME680_REG_CHIP_ID 0xd0
+#define BME680_REG_SOFT_RESET 0xe0
+
+#define BME680_MSK_NEW_DATA 0x80
+#define BME680_MSK_GAS_RANGE 0x0f
+#define BME680_MSK_RH_RANGE 0x30
+#define BME680_MSK_RANGE_SW_ERR 0xf0
+#define BME680_MSK_HEATR_STAB 0x10
+
+#define BME680_SPI_MEM_PAGE_MSK 0x10
+#define BME680_SPI_MEM_PAGE_POS 4
+#define BME680_SPI_READ_BIT 0x80
+#define BME680_SPI_WRITE_MSK 0x7f
+
+#if defined CONFIG_BME680_TEMP_OVER_1X
+#define BME680_TEMP_OVER (1 << 5)
+#elif defined CONFIG_BME680_TEMP_OVER_2X
+#define BME680_TEMP_OVER (2 << 5)
+#elif defined CONFIG_BME680_TEMP_OVER_4X
+#define BME680_TEMP_OVER (3 << 5)
+#elif defined CONFIG_BME680_TEMP_OVER_8X
+#define BME680_TEMP_OVER (4 << 5)
+#elif defined CONFIG_BME680_TEMP_OVER_16X
+#define BME680_TEMP_OVER (5 << 5)
+#endif
+
+#if defined CONFIG_BME680_PRESS_OVER_1X
+#define BME680_PRESS_OVER (1 << 2)
+#elif defined CONFIG_BME680_PRESS_OVER_2X
+#define BME680_PRESS_OVER (2 << 2)
+#elif defined CONFIG_BME680_PRESS_OVER_4X
+#define BME680_PRESS_OVER (3 << 2)
+#elif defined CONFIG_BME680_PRESS_OVER_8X
+#define BME680_PRESS_OVER (4 << 2)
+#elif defined CONFIG_BME680_PRESS_OVER_16X
+#define BME680_PRESS_OVER (5 << 2)
+#endif
+
+#if defined CONFIG_BME680_HUMIDITY_OVER_1X
+#define BME680_HUMIDITY_OVER 1
+#elif defined CONFIG_BME680_HUMIDITY_OVER_2X
+#define BME680_HUMIDITY_OVER 2
+#elif defined CONFIG_BME680_HUMIDITY_OVER_4X
+#define BME680_HUMIDITY_OVER 3
+#elif defined CONFIG_BME680_HUMIDITY_OVER_8X
+#define BME680_HUMIDITY_OVER 4
+#elif defined CONFIG_BME680_HUMIDITY_OVER_16X
+#define BME680_HUMIDITY_OVER 5
+#endif
+
+#if defined CONFIG_BME680_HEATR_TEMP_LP
+#define BME680_HEATR_TEMP 320
+#elif defined CONFIG_BME680_HEATR_TEMP_ULP
+#define BME680_HEATR_TEMP 400
+#endif
+
+#if defined CONFIG_BME680_HEATR_DUR_LP
+#define BME680_HEATR_DUR_MS 197
+#elif defined CONFIG_BME680_HEATR_DUR_ULP
+#define BME680_HEATR_DUR_MS 1943
+#endif
+
+#if defined CONFIG_BME680_FILTER_OFF
+#define BME680_FILTER 0
+#elif defined CONFIG_BME680_FILTER_2
+#define BME680_FILTER (1 << 2)
+#elif defined CONFIG_BME680_FILTER_4
+#define BME680_FILTER (2 << 2)
+#elif defined CONFIG_BME680_FILTER_8
+#define BME680_FILTER (3 << 2)
+#elif defined CONFIG_BME680_FILTER_16
+#define BME680_FILTER (4 << 2)
+#elif defined CONFIG_BME680_FILTER_32
+#define BME680_FILTER (5 << 2)
+#elif defined CONFIG_BME680_FILTER_64
+#define BME680_FILTER (6 << 2)
+#elif defined CONFIG_BME680_FILTER_128
+#define BME680_FILTER (7 << 2)
+#endif
+
+#define BME680_MODE_SLEEP 0
+#define BME680_MODE_FORCED 1
+
+#define BME680_CTRL_MEAS_VAL (BME680_PRESS_OVER | BME680_TEMP_OVER \
+ | BME680_MODE_FORCED)
+#define BME680_CONFIG_VAL BME680_FILTER
+#define BME680_CTRL_GAS_1_VAL 0x10
+
+#define BME680_CONCAT_BYTES(msb, lsb) (((uint16_t)msb << 8) | (uint16_t)lsb)
+
+struct bme680_data {
+ /* Compensation parameters. */
+ uint16_t par_h1;
+ uint16_t par_h2;
+ int8_t par_h3;
+ int8_t par_h4;
+ int8_t par_h5;
+ uint8_t par_h6;
+ int8_t par_h7;
+ int8_t par_gh1;
+ int16_t par_gh2;
+ int8_t par_gh3;
+ uint16_t par_t1;
+ int16_t par_t2;
+ int8_t par_t3;
+ uint16_t par_p1;
+ int16_t par_p2;
+ int8_t par_p3;
+ int16_t par_p4;
+ int16_t par_p5;
+ int8_t par_p6;
+ int8_t par_p7;
+ int16_t par_p8;
+ int16_t par_p9;
+ uint8_t par_p10;
+ uint8_t res_heat_range;
+ int8_t res_heat_val;
+ int8_t range_sw_err;
+
+ /* Calculated sensor values. */
+ int32_t calc_temp;
+ uint32_t calc_press;
+ uint32_t calc_humidity;
+ uint32_t calc_gas_resistance;
+
+ /* Additional information */
+ uint8_t new_data;
+ uint8_t heatr_stab;
+
+ /* Carryover between temperature and pressure/humidity compensation. */
+ int32_t t_fine;
+
+ uint8_t chip_id;
+
+#if BME680_BUS_SPI
+ uint8_t mem_page;
+#endif
+};
+
+#endif /* __ZEPHYR_DRIVERS_SENSOR_BME680_H__ */