]> git.itanic.dy.fi Git - BME280_driver/blob - bme280_defs.h
900115df12cf232ad4d3c4feea76e8f2b4c4bd10
[BME280_driver] / bme280_defs.h
1 /**\r
2 * Copyright (c) 2020 Bosch Sensortec GmbH. All rights reserved.\r
3 *\r
4 * BSD-3-Clause\r
5 *\r
6 * Redistribution and use in source and binary forms, with or without\r
7 * modification, are permitted provided that the following conditions are met:\r
8 *\r
9 * 1. Redistributions of source code must retain the above copyright\r
10 *    notice, this list of conditions and the following disclaimer.\r
11 *\r
12 * 2. Redistributions in binary form must reproduce the above copyright\r
13 *    notice, this list of conditions and the following disclaimer in the\r
14 *    documentation and/or other materials provided with the distribution.\r
15 *\r
16 * 3. Neither the name of the copyright holder nor the names of its\r
17 *    contributors may be used to endorse or promote products derived from\r
18 *    this software without specific prior written permission.\r
19 *\r
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r
24 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\r
30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
31 * POSSIBILITY OF SUCH DAMAGE.\r
32 *\r
33 * @file bme280_defs.h\r
34 * @date 21/01/2020\r
35 * @version  3.4.2\r
36 *\r
37 */\r
38 \r
39 /*! @file bme280_defs.h\r
40  * @brief Sensor driver for BME280 sensor\r
41  */\r
42 \r
43 /*!\r
44  * @defgroup BME280 SENSOR API\r
45  * @brief\r
46  */\r
47 #ifndef BME280_DEFS_H_\r
48 #define BME280_DEFS_H_\r
49 \r
50 /********************************************************/\r
51 /* header includes */\r
52 #ifdef __KERNEL__\r
53 #include <linux/types.h>\r
54 #include <linux/kernel.h>\r
55 #else\r
56 #include <stdint.h>\r
57 #include <stddef.h>\r
58 #endif\r
59 \r
60 /********************************************************/\r
61 /*! @name       Common macros               */\r
62 /********************************************************/\r
63 \r
64 #if !defined(UINT8_C) && !defined(INT8_C)\r
65 #define INT8_C(x)   S8_C(x)\r
66 #define UINT8_C(x)  U8_C(x)\r
67 #endif\r
68 \r
69 #if !defined(UINT16_C) && !defined(INT16_C)\r
70 #define INT16_C(x)  S16_C(x)\r
71 #define UINT16_C(x) U16_C(x)\r
72 #endif\r
73 \r
74 #if !defined(INT32_C) && !defined(UINT32_C)\r
75 #define INT32_C(x)  S32_C(x)\r
76 #define UINT32_C(x) U32_C(x)\r
77 #endif\r
78 \r
79 #if !defined(INT64_C) && !defined(UINT64_C)\r
80 #define INT64_C(x)  S64_C(x)\r
81 #define UINT64_C(x) U64_C(x)\r
82 #endif\r
83 \r
84 /**@}*/\r
85 /**\name C standard macros */\r
86 #ifndef NULL\r
87 #ifdef __cplusplus\r
88 #define NULL 0\r
89 #else\r
90 #define NULL ((void *) 0)\r
91 #endif\r
92 #endif\r
93 \r
94 /********************************************************/\r
95 \r
96 #ifndef BME280_FLOAT_ENABLE\r
97 \r
98 /* #define BME280_FLOAT_ENABLE */\r
99 #endif\r
100 \r
101 #ifndef BME280_FLOAT_ENABLE\r
102 #ifndef BME280_64BIT_ENABLE\r
103 #define BME280_64BIT_ENABLE\r
104 #endif\r
105 #endif\r
106 \r
107 #ifndef TRUE\r
108 #define TRUE                              UINT8_C(1)\r
109 #endif\r
110 #ifndef FALSE\r
111 #define FALSE                             UINT8_C(0)\r
112 #endif\r
113 \r
114 /**\name I2C addresses */\r
115 #define BME280_I2C_ADDR_PRIM              UINT8_C(0x76)\r
116 #define BME280_I2C_ADDR_SEC               UINT8_C(0x77)\r
117 \r
118 /**\name BME280 chip identifier */\r
119 #define BME280_CHIP_ID                    UINT8_C(0x60)\r
120 \r
121 /**\name Register Address */\r
122 #define BME280_CHIP_ID_ADDR               UINT8_C(0xD0)\r
123 #define BME280_RESET_ADDR                 UINT8_C(0xE0)\r
124 #define BME280_TEMP_PRESS_CALIB_DATA_ADDR UINT8_C(0x88)\r
125 #define BME280_HUMIDITY_CALIB_DATA_ADDR   UINT8_C(0xE1)\r
126 #define BME280_PWR_CTRL_ADDR              UINT8_C(0xF4)\r
127 #define BME280_CTRL_HUM_ADDR              UINT8_C(0xF2)\r
128 #define BME280_CTRL_MEAS_ADDR             UINT8_C(0xF4)\r
129 #define BME280_CONFIG_ADDR                UINT8_C(0xF5)\r
130 #define BME280_DATA_ADDR                  UINT8_C(0xF7)\r
131 \r
132 /**\name API success code */\r
133 #define BME280_OK                         INT8_C(0)\r
134 \r
135 /**\name API error codes */\r
136 #define BME280_E_NULL_PTR                 INT8_C(-1)\r
137 #define BME280_E_DEV_NOT_FOUND            INT8_C(-2)\r
138 #define BME280_E_INVALID_LEN              INT8_C(-3)\r
139 #define BME280_E_COMM_FAIL                INT8_C(-4)\r
140 #define BME280_E_SLEEP_MODE_FAIL          INT8_C(-5)\r
141 #define BME280_E_NVM_COPY_FAILED          INT8_C(-6)\r
142 \r
143 /**\name API warning codes */\r
144 #define BME280_W_INVALID_OSR_MACRO        INT8_C(1)\r
145 \r
146 /**\name Macros related to size */\r
147 #define BME280_TEMP_PRESS_CALIB_DATA_LEN  UINT8_C(26)\r
148 #define BME280_HUMIDITY_CALIB_DATA_LEN    UINT8_C(7)\r
149 #define BME280_P_T_H_DATA_LEN             UINT8_C(8)\r
150 \r
151 /**\name Sensor power modes */\r
152 #define BME280_SLEEP_MODE                 UINT8_C(0x00)\r
153 #define BME280_FORCED_MODE                UINT8_C(0x01)\r
154 #define BME280_NORMAL_MODE                UINT8_C(0x03)\r
155 \r
156 /**\name Macro to combine two 8 bit data's to form a 16 bit data */\r
157 #define BME280_CONCAT_BYTES(msb, lsb)            (((uint16_t)msb << 8) | (uint16_t)lsb)\r
158 \r
159 #define BME280_SET_BITS(reg_data, bitname, data) \\r
160     ((reg_data & ~(bitname##_MSK)) | \\r
161      ((data << bitname##_POS) & bitname##_MSK))\r
162 #define BME280_SET_BITS_POS_0(reg_data, bitname, data) \\r
163     ((reg_data & ~(bitname##_MSK)) | \\r
164      (data & bitname##_MSK))\r
165 \r
166 #define BME280_GET_BITS(reg_data, bitname)       ((reg_data & (bitname##_MSK)) >> \\r
167                                                   (bitname##_POS))\r
168 #define BME280_GET_BITS_POS_0(reg_data, bitname) (reg_data & (bitname##_MSK))\r
169 \r
170 /**\name Macros for bit masking */\r
171 #define BME280_SENSOR_MODE_MSK      UINT8_C(0x03)\r
172 #define BME280_SENSOR_MODE_POS      UINT8_C(0x00)\r
173 \r
174 #define BME280_CTRL_HUM_MSK         UINT8_C(0x07)\r
175 #define BME280_CTRL_HUM_POS         UINT8_C(0x00)\r
176 \r
177 #define BME280_CTRL_PRESS_MSK       UINT8_C(0x1C)\r
178 #define BME280_CTRL_PRESS_POS       UINT8_C(0x02)\r
179 \r
180 #define BME280_CTRL_TEMP_MSK        UINT8_C(0xE0)\r
181 #define BME280_CTRL_TEMP_POS        UINT8_C(0x05)\r
182 \r
183 #define BME280_FILTER_MSK           UINT8_C(0x1C)\r
184 #define BME280_FILTER_POS           UINT8_C(0x02)\r
185 \r
186 #define BME280_STANDBY_MSK          UINT8_C(0xE0)\r
187 #define BME280_STANDBY_POS          UINT8_C(0x05)\r
188 \r
189 /**\name Sensor component selection macros\r
190  * These values are internal for API implementation. Don't relate this to\r
191  * data sheet.\r
192  */\r
193 #define BME280_PRESS                UINT8_C(1)\r
194 #define BME280_TEMP                 UINT8_C(1 << 1)\r
195 #define BME280_HUM                  UINT8_C(1 << 2)\r
196 #define BME280_ALL                  UINT8_C(0x07)\r
197 \r
198 /**\name Settings selection macros */\r
199 #define BME280_OSR_PRESS_SEL        UINT8_C(1)\r
200 #define BME280_OSR_TEMP_SEL         UINT8_C(1 << 1)\r
201 #define BME280_OSR_HUM_SEL          UINT8_C(1 << 2)\r
202 #define BME280_FILTER_SEL           UINT8_C(1 << 3)\r
203 #define BME280_STANDBY_SEL          UINT8_C(1 << 4)\r
204 #define BME280_ALL_SETTINGS_SEL     UINT8_C(0x1F)\r
205 \r
206 /**\name Oversampling macros */\r
207 #define BME280_NO_OVERSAMPLING      UINT8_C(0x00)\r
208 #define BME280_OVERSAMPLING_1X      UINT8_C(0x01)\r
209 #define BME280_OVERSAMPLING_2X      UINT8_C(0x02)\r
210 #define BME280_OVERSAMPLING_4X      UINT8_C(0x03)\r
211 #define BME280_OVERSAMPLING_8X      UINT8_C(0x04)\r
212 #define BME280_OVERSAMPLING_16X     UINT8_C(0x05)\r
213 \r
214 /**\name Measurement delay calculation macros  */\r
215 #define BME280_MEAS_OFFSET          UINT16_C(1250)\r
216 #define BME280_MEAS_DUR             UINT16_C(2300)\r
217 #define BME280_PRES_HUM_MEAS_OFFSET UINT16_C(575)\r
218 #define BME280_MEAS_SCALING_FACTOR  UINT16_C(1000)\r
219 \r
220 /**\name Standby duration selection macros */\r
221 #define BME280_STANDBY_TIME_0_5_MS  (0x00)\r
222 #define BME280_STANDBY_TIME_62_5_MS (0x01)\r
223 #define BME280_STANDBY_TIME_125_MS  (0x02)\r
224 #define BME280_STANDBY_TIME_250_MS  (0x03)\r
225 #define BME280_STANDBY_TIME_500_MS  (0x04)\r
226 #define BME280_STANDBY_TIME_1000_MS (0x05)\r
227 #define BME280_STANDBY_TIME_10_MS   (0x06)\r
228 #define BME280_STANDBY_TIME_20_MS   (0x07)\r
229 \r
230 /**\name Filter coefficient selection macros */\r
231 #define BME280_FILTER_COEFF_OFF     (0x00)\r
232 #define BME280_FILTER_COEFF_2       (0x01)\r
233 #define BME280_FILTER_COEFF_4       (0x02)\r
234 #define BME280_FILTER_COEFF_8       (0x03)\r
235 #define BME280_FILTER_COEFF_16      (0x04)\r
236 \r
237 #define BME280_STATUS_REG_ADDR      (0xF3)\r
238 #define BME280_SOFT_RESET_COMMAND   (0xB6)\r
239 #define BME280_STATUS_IM_UPDATE     (0x01)\r
240 \r
241 /*!\r
242  * @brief Interface selection Enums\r
243  */\r
244 enum bme280_intf {\r
245     /*! SPI interface */\r
246     BME280_SPI_INTF,\r
247 \r
248     /*! I2C interface */\r
249     BME280_I2C_INTF\r
250 };\r
251 \r
252 /*!\r
253  * @brief Type definitions\r
254  */\r
255 typedef int8_t (*bme280_com_fptr_t)(uint8_t dev_id, uint8_t reg_addr, uint8_t *data, uint16_t len);\r
256 typedef void (*bme280_delay_fptr_t)(uint32_t period);\r
257 \r
258 /*!\r
259  * @brief Calibration data\r
260  */\r
261 struct bme280_calib_data\r
262 {\r
263     /**\r
264      * @ Trim Variables\r
265      */\r
266 \r
267     /**@{*/\r
268     uint16_t dig_t1;\r
269     int16_t dig_t2;\r
270     int16_t dig_t3;\r
271     uint16_t dig_p1;\r
272     int16_t dig_p2;\r
273     int16_t dig_p3;\r
274     int16_t dig_p4;\r
275     int16_t dig_p5;\r
276     int16_t dig_p6;\r
277     int16_t dig_p7;\r
278     int16_t dig_p8;\r
279     int16_t dig_p9;\r
280     uint8_t dig_h1;\r
281     int16_t dig_h2;\r
282     uint8_t dig_h3;\r
283     int16_t dig_h4;\r
284     int16_t dig_h5;\r
285     int8_t dig_h6;\r
286     int32_t t_fine;\r
287 \r
288     /**@}*/\r
289 };\r
290 \r
291 /*!\r
292  * @brief bme280 sensor structure which comprises of temperature, pressure and\r
293  * humidity data\r
294  */\r
295 #ifdef BME280_FLOAT_ENABLE\r
296 struct bme280_data\r
297 {\r
298     /*! Compensated pressure */\r
299     double pressure;\r
300 \r
301     /*! Compensated temperature */\r
302     double temperature;\r
303 \r
304     /*! Compensated humidity */\r
305     double humidity;\r
306 };\r
307 #else\r
308 struct bme280_data\r
309 {\r
310     /*! Compensated pressure */\r
311     uint32_t pressure;\r
312 \r
313     /*! Compensated temperature */\r
314     int32_t temperature;\r
315 \r
316     /*! Compensated humidity */\r
317     uint32_t humidity;\r
318 };\r
319 #endif /* BME280_USE_FLOATING_POINT */\r
320 \r
321 /*!\r
322  * @brief bme280 sensor structure which comprises of uncompensated temperature,\r
323  * pressure and humidity data\r
324  */\r
325 struct bme280_uncomp_data\r
326 {\r
327     /*! un-compensated pressure */\r
328     uint32_t pressure;\r
329 \r
330     /*! un-compensated temperature */\r
331     uint32_t temperature;\r
332 \r
333     /*! un-compensated humidity */\r
334     uint32_t humidity;\r
335 };\r
336 \r
337 /*!\r
338  * @brief bme280 sensor settings structure which comprises of mode,\r
339  * oversampling and filter settings.\r
340  */\r
341 struct bme280_settings\r
342 {\r
343     /*! pressure oversampling */\r
344     uint8_t osr_p;\r
345 \r
346     /*! temperature oversampling */\r
347     uint8_t osr_t;\r
348 \r
349     /*! humidity oversampling */\r
350     uint8_t osr_h;\r
351 \r
352     /*! filter coefficient */\r
353     uint8_t filter;\r
354 \r
355     /*! standby time */\r
356     uint8_t standby_time;\r
357 };\r
358 \r
359 /*!\r
360  * @brief bme280 device structure\r
361  */\r
362 struct bme280_dev\r
363 {\r
364     /*! Chip Id */\r
365     uint8_t chip_id;\r
366 \r
367     /*! Device Id */\r
368     uint8_t dev_id;\r
369 \r
370     /*! SPI/I2C interface */\r
371     enum bme280_intf intf;\r
372 \r
373     /*! Read function pointer */\r
374     bme280_com_fptr_t read;\r
375 \r
376     /*! Write function pointer */\r
377     bme280_com_fptr_t write;\r
378 \r
379     /*! Delay function pointer */\r
380     bme280_delay_fptr_t delay_ms;\r
381 \r
382     /*! Trim data */\r
383     struct bme280_calib_data calib_data;\r
384 \r
385     /*! Sensor settings */\r
386     struct bme280_settings settings;\r
387 };\r
388 \r
389 #endif /* BME280_DEFS_H_ */\r
390 /** @}*/\r
391 /** @}*/\r