| /* |
| * 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_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_MEAS_STATUS 0x1D |
| #define BME680_REG_FIELD0 0x1F |
| #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_STATUS 0x73 |
| #define BME680_REG_CTRL_MEAS 0x74 |
| #define BME680_REG_CONFIG 0x75 |
| #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; |
| bool has_read_compensation; |
| |
| /* Calculated sensor values. */ |
| int32_t calc_temp; |
| uint32_t calc_press; |
| uint32_t calc_humidity; |
| uint32_t calc_gas_resistance; |
| |
| /* Additional information */ |
| 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__ */ |