Linux Audio
Check our new training course
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
/* * 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_MEM_PAGE 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_READ_BIT 0x80 #define BME680_SPI_WRITE_MSK 0x7f #define BME680_MEM_PAGE1 0x00 #define BME680_MEM_PAGE0 0x10 #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__ */