• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2 * Copyright (c) 2024 Bosch Sensortec GmbH. All rights reserved.
3 *
4 * gas_bmr688_driver.h as part of the * /chipsets subdirectory
5 * is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 * See the LICENSE file in the root of this repository for complete details.
8 */
9 
10 #ifndef BME688_H
11 #define BME688_H
12 
13 #include "sensor_gas_driver.h"
14 #include "sensor_config_parser.h"
15 
16 #define BME688_AMB_TEMP                (int8_t)25       /*ambient temperature*/
17 #define BME688_HEATR_TEMP              300              /*heating temperature*/
18 #define BME688_HEATR_DUR               100              /*heating duration*/
19 
20 #if !defined(BME_UINT32_C)
21 #define BME_UINT32_C(val) val ## U
22 #endif
23 
24 #if !defined(BME_INT32_C)
25 #define BME_INT32_C(val) val ## L
26 #endif
27 
28 #define BME68X_CHIP_ID                 0x61     /* BME68X unique chip identifier */
29 
30 #define BME68X_REG_CTRL_MEAS           0x74     /* CTRL_MEAS address */
31 #define BME68X_REG_COEFF1              0x8a     /* Register for 1st group of coefficients */
32 #define BME68X_REG_COEFF2              0xe1     /* Register for 2nd group of coefficients */
33 #define BME68X_REG_COEFF3              0x00     /* Register for 3rd group of coefficients */
34 #define BME68X_REG_CHIP_ID             0xd0     /* Chip ID address */
35 #define BME68X_REG_SOFT_RESET          0xe0     /* Soft reset address */
36 #define BME68X_REG_VARIANT_ID          0xF0     /* Variant ID Register */
37 #define BME68X_REG_FIELD0              0x1d     /* 0th Field address*/
38 #define BME68X_REG_RES_HEAT0           0x5a     /* 0th Res heat address */
39 #define BME68X_REG_IDAC_HEAT0          0x50     /* 0th Current DAC address*/
40 #define BME68X_REG_GAS_WAIT0           0x64     /* 0th Gas wait address */
41 #define BME68X_REG_CTRL_GAS_0          0x70     /* CTRL_GAS_0 address */
42 #define BME68X_REG_CTRL_GAS_1          0x71     /* CTRL_GAS_1 address */
43 #define BME68X_SOFT_RESET_CMD          0xb6     /* Soft reset command */
44 
45 #define BME68X_LEN_COEFF_ALL           42       /* Length for all coefficients */
46 #define BME68X_LEN_COEFF1              23       /* Length for 1st group of coefficients */
47 #define BME68X_LEN_COEFF2              14       /* Length for 2nd group of coefficients */
48 #define BME68X_LEN_COEFF3              5        /* Length for 3rd group of coefficients */
49 #define BME68X_LEN_CONFIG              5        /* Length of the configuration register */
50 #define BME68X_LEN_FIELD               17       /* Length of the field */
51 #define BME68X_LEN_FIELD_OFFSET        17       /* Length between two fields */
52 
53 #define BME68X_MODE_MSK                0x03     /* Mask for operation mode */
54 
55 #define BME68X_GASM_VALID_MSK          0x20     /* Mask for gas measurement valid */
56 #define BME68X_GAS_INDEX_MSK           0x0f     /* Mask for gas index */
57 #define BME68X_GAS_RANGE_MSK           0x0f     /* Mask for gas range */
58 #define BME68X_GASM_VALID_MSK          0x20     /* Mask for gas measurement valid */
59 #define BME68X_HEAT_STAB_MSK           0x10     /* Mask for heater stability */
60 #define BME68X_NEW_DATA_MSK            0x80     /* Mask for new data */
61 #define BME68X_BIT_H1_DATA_MSK         0x0f     /* Mask for the H1 calibration coefficient */
62 #define BME68X_RHRANGE_MSK             0x30     /* Mask for res heat range */
63 #define BME68X_RSERROR_MSK             0xf0     /* Mask for range switching error */
64 
65 #define BME68X_FILTER_MSK              0X1c     /* Mask for IIR filter */
66 #define BME68X_OST_MSK                 0Xe0     /* Mask for temperature oversampling */
67 #define BME68X_OSP_MSK                 0X1c     /* Mask for pressure oversampling */
68 #define BME68X_OSH_MSK                 0X07     /* Mask for humidity oversampling */
69 #define BME68X_ODR20_MSK               0xe0     /* Mask for ODR[2:0] */
70 #define BME68X_ODR3_MSK                0x80     /* Mask for ODR[3] */
71 #define BME68X_HCTRL_MSK               0x08     /* Mask for heater control */
72 #define BME68X_NBCONV_MSK              0X0f     /* Mask for number of conversions */
73 #define BME68X_RUN_GAS_MSK             0x30     /* Mask for run gas */
74 #define BME688_NEW_DATA_READY          0x80     /* Mask for new data */
75 
76 #define BME68X_SLEEP_MODE              0        /* Sleep operation mode */
77 #define BME68X_FORCED_MODE             1        /* Forced operation mode */
78 #define BME68X_PARALLEL_MODE           2        /* Parallel operation mode */
79 
80 #define BME68X_VARIANT_GAS_HIGH        0x01     /* High Gas variant */
81 
82 #define BME68X_IDX_T1_LSB              31       /* Coefficient T1 LSB position */
83 #define BME68X_IDX_T1_MSB              32       /* Coefficient T1 MSB position */
84 #define BME68X_IDX_T2_LSB              0        /* Coefficient T2 LSB position */
85 #define BME68X_IDX_T2_MSB              1        /* Coefficient T2 MSB position */
86 #define BME68X_IDX_T3                  2        /* Coefficient T3 position */
87 #define BME68X_IDX_P1_LSB              4        /* Coefficient P1 LSB position */
88 #define BME68X_IDX_P1_MSB              5        /* Coefficient P1 MSB position */
89 #define BME68X_IDX_P2_LSB              6        /* Coefficient P2 LSB position */
90 #define BME68X_IDX_P2_MSB              7        /* Coefficient P2 MSB position */
91 #define BME68X_IDX_P3                  8        /* Coefficient P3 position */
92 #define BME68X_IDX_P4_LSB              10       /* Coefficient P4 LSB position */
93 #define BME68X_IDX_P4_MSB              11       /* Coefficient P4 MSB position */
94 #define BME68X_IDX_P5_LSB              12       /* Coefficient P5 LSB position */
95 #define BME68X_IDX_P5_MSB              13       /* Coefficient P5 MSB position */
96 #define BME68X_IDX_P7                  14       /* Coefficient P7 position */
97 #define BME68X_IDX_P6                  15       /* Coefficient P6 position */
98 #define BME68X_IDX_P8_LSB              18       /* Coefficient P8 LSB position */
99 #define BME68X_IDX_P8_MSB              19       /* Coefficient P8 MSB position */
100 #define BME68X_IDX_P9_LSB              20       /* Coefficient P9 LSB position */
101 #define BME68X_IDX_P9_MSB              21       /* Coefficient P9 MSB position */
102 #define BME68X_IDX_P10                 22       /* Coefficient P10 position */
103 #define BME68X_IDX_H2_MSB              23       /* Coefficient H2 MSB position */
104 #define BME68X_IDX_H2_LSB              24       /* Coefficient H2 LSB position */
105 #define BME68X_IDX_H1_LSB              24       /* Coefficient H1 LSB position */
106 #define BME68X_IDX_H1_MSB              25       /* Coefficient H1 MSB position */
107 #define BME68X_IDX_H3                  26       /* Coefficient H3 position */
108 #define BME68X_IDX_H4                  27       /* Coefficient H4 position */
109 #define BME68X_IDX_H5                  28       /* Coefficient H5 position */
110 #define BME68X_IDX_H6                  29       /* Coefficient H6 position */
111 #define BME68X_IDX_H7                  30       /* Coefficient H7 position */
112 #define BME68X_IDX_T1_LSB              31       /* Coefficient T1 LSB position */
113 #define BME68X_IDX_T1_MSB              32       /* Coefficient T1 MSB position */
114 #define BME68X_IDX_GH2_LSB             33       /* Coefficient GH2 LSB position */
115 #define BME68X_IDX_GH2_MSB             34       /* Coefficient GH2 MSB position */
116 #define BME68X_IDX_GH1                 35       /* Coefficient GH1 position */
117 #define BME68X_IDX_GH3                 36       /* Coefficient GH3 position */
118 #define BME68X_IDX_RES_HEAT_VAL        37       /* Coefficient res heat value position */
119 #define BME68X_IDX_RES_HEAT_RANGE      39       /* Coefficient res heat range position */
120 #define BME68X_IDX_RANGE_SW_ERR        41       /* Coefficient range switching error position */
121 
122 #define BME68X_FILTER_SIZE_127         7        /* Filter coefficient of 128 */
123 
124 #define BME68X_OS_1X                   1        /* Perform 1 measurement */
125 #define BME68X_OS_2X                   2        /* Perform 2 measurements */
126 #define BME68X_OS_4X                   3        /* Perform 4 measurements */
127 #define BME68X_OS_8X                   4        /* Perform 8 measurements */
128 #define BME68X_OS_16X                  5        /* Perform 16 measurements */
129 #define BME68X_ODR_NONE                8        /* No standby time */
130 
131 #define BME68X_FILTER_OFF              0        /* Switch off the filter */
132 
133 #define BME68X_ENABLE                  0x01     /* Enable */
134 #define BME68X_DISABLE                 0x00     /* Disable */
135 #define BME68X_DISABLE_HEATER          0x01     /* Disable heater */
136 #define BME68X_ENABLE_GAS_MEAS_L       0x01     /* Enable gas measurement low */
137 #define BME68X_ENABLE_GAS_MEAS_H       0x02     /* Enable gas measurement high */
138 #define BME68X_DISABLE_GAS_MEAS        0x00     /* Disable gas measurement */
139 #define BME68X_ENABLE_HEATER           0x00     /* Enable heater */
140 
141 #define BME68X_HCTRL_POS               3        /* Heater control bit position */
142 #define BME68X_RUN_GAS_POS             4        /* Run gas bit position */
143 #define BME68X_FILTER_POS              2        /* Filter bit position */
144 #define BME68X_OST_POS                 5        /* Temperature oversampling bit position */
145 #define BME68X_OSP_POS                 2        /* Pressure oversampling bit position */
146 #define BME68X_ODR3_POS                7        /* ODR[3] bit position */
147 #define BME68X_ODR20_POS               5        /* ODR[2:0] bit position */
148 
149 #define BME688_WORK_MODE_SUSPEND       1        /* Suspend mode */
150 #define BME688_WORK_MODE_IDLE          2        /* idle mode */
151 
152 #define BME688_DELAY_4                 4        /*delay time about 4 */
153 #define BME688_DELAY_5                 5        /*delay time about 5 */
154 #define BME688_DELAY_10                10       /*delay time about 10 */
155 #define BME688_DELAY_50                50       /*delay time about 50 */
156 
157 #define BME688_MAX_HUM                 100000   /* max humidity  */
158 #define BME688_MAX_TEMP                400      /* max temperature  */
159 
160 #define BME68X_LEN_INTERLEAVE_BUFF     20       /* Length of the interleaved buffer */
161 
162 #define BME688_TRY_TIMES               5        /* try to read field data times*/
163 
164 /* Macro to combine two 8 bit data's to form a 16 bit data */
165 #define BME68X_CONCAT_BYTES(msb, lsb)          ((uint16_t)((msb) << 8) | (uint16_t)(lsb))
166 
167 /* Macro to set bits */
168 #define BME68X_SET_BITS(reg_data, bitname, data) \
169     (((reg_data) & ~(bitname##_MSK)) | \
170     (((data) << bitname##_POS) & bitname##_MSK))
171 
172 /* Macro to set bits starting from position 0 */
173 #define BME68X_SET_BITS_POS_0(reg_data, bitname, data) \
174     (((reg_data) & ~(bitname##_MSK)) | ((data) & bitname##_MSK))
175 
176 struct Bme688CalibData {
177     /*! Calibration coefficient for the humidity sensor */
178     uint16_t par_h1;
179 
180     /*! Calibration coefficient for the humidity sensor */
181     uint16_t par_h2;
182 
183     /*! Calibration coefficient for the humidity sensor */
184     int8_t par_h3;
185 
186     /*! Calibration coefficient for the humidity sensor */
187     int8_t par_h4;
188 
189     /*! Calibration coefficient for the humidity sensor */
190     int8_t par_h5;
191 
192     /*! Calibration coefficient for the humidity sensor */
193     uint8_t par_h6;
194 
195     /*! Calibration coefficient for the humidity sensor */
196     int8_t par_h7;
197 
198     /*! Calibration coefficient for the gas sensor */
199     int8_t par_gh1;
200 
201     /*! Calibration coefficient for the gas sensor */
202     int16_t par_gh2;
203 
204     /*! Calibration coefficient for the gas sensor */
205     int8_t par_gh3;
206 
207     /*! Calibration coefficient for the temperature sensor */
208     uint16_t par_t1;
209 
210     /*! Calibration coefficient for the temperature sensor */
211     int16_t par_t2;
212 
213     /*! Calibration coefficient for the temperature sensor */
214     int8_t par_t3;
215 
216     /*! Calibration coefficient for the pressure sensor */
217     uint16_t par_p1;
218 
219     /*! Calibration coefficient for the pressure sensor */
220     int16_t par_p2;
221 
222     /*! Calibration coefficient for the pressure sensor */
223     int8_t par_p3;
224 
225     /*! Calibration coefficient for the pressure sensor */
226     int16_t par_p4;
227 
228     /*! Calibration coefficient for the pressure sensor */
229     int16_t par_p5;
230 
231     /*! Calibration coefficient for the pressure sensor */
232     int8_t par_p6;
233 
234     /*! Calibration coefficient for the pressure sensor */
235     int8_t par_p7;
236 
237     /*! Calibration coefficient for the pressure sensor */
238     int16_t par_p8;
239 
240     /*! Calibration coefficient for the pressure sensor */
241     int16_t par_p9;
242 
243     /*! Calibration coefficient for the pressure sensor */
244     uint8_t par_p10;
245 
246     /*! Variable to store the intermediate temperature coefficient */
247     int32_t t_fine;
248 
249     /*! Heater resistance range coefficient */
250     uint8_t res_heat_range;
251 
252     /*! Heater resistance value coefficient */
253     int8_t res_heat_val;
254 
255     /*! Gas resistance range switching error coefficient */
256     int8_t range_sw_err;
257 };
258 
259 struct bme688HeatrConf {
260     /*! Enable gas measurement. Refer @ref en_dis */
261     uint8_t enable;
262 
263     /*! Store the heater temperature for forced mode degree Celsius */
264     uint16_t heatr_temp;
265 
266     /*! Store the heating duration for forced mode in milliseconds */
267     uint16_t heatr_dur;
268 
269     /*! Store the heater temperature profile in degree Celsius */
270     uint16_t *heatr_temp_prof;
271 
272     /*! Store the heating duration profile in milliseconds */
273     uint16_t *heatr_dur_prof;
274 
275     /*! Variable to store the length of the heating profile */
276     uint8_t profile_len;
277 
278     /*!
279      * Variable to store heating duration for parallel mode
280      * in milliseconds
281      */
282     uint16_t shared_heatr_dur;
283 };
284 
285 struct Bme688Status {
286     int8_t variantId;
287     int8_t workState;
288     int8_t inited;
289 };
290 
291 struct Bme688DrvData {
292     struct IDeviceIoService ioService;
293     struct HdfDeviceObject *device;
294     struct SensorCfgData *sensorCfg;
295 };
296 
297 enum Bme688FieldData {
298     RESISTANCE = 0,
299     TEMPERATURE = 1,
300     HUMIDITY = 2,
301     PRESSURE = 3
302 };
303 
304 #endif /* BME688_H */
305 
306