1 /*
2  * Copyright (c) 2018 Alexander Wachter.
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_
8 #define ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_
9 
10 #include <device.h>
11 #include <drivers/gpio.h>
12 #include <sys/util.h>
13 
14 /* Registers */
15 #define ENS210_REG_PART_ID    0x00
16 #define ENS210_REG_UID        0x04
17 #define ENS210_REG_SYS_CTRL   0x10
18 #define ENS210_REG_SYS_STAT   0x11
19 #define ENS210_REG_SENS_RUN   0x21
20 #define ENS210_REG_SENS_START 0x22
21 #define ENS210_REG_SENS_STOP  0x23
22 #define ENS210_REG_SENS_STAT  0x24
23 #define ENS210_REG_T_VAL      0x30
24 #define ENS210_REG_H_VAL      0x33
25 
26 #define ENS210_PART_ID 0x0210
27 
28 #if defined CONFIG_ENS210_TEMPERATURE_OFF
29 #define ENS210_T_RUN   0
30 #define ENS210_T_START 0
31 #elif defined CONFIG_ENS210_TEMPERATURE_SINGLE
32 #define ENS210_T_RUN   0
33 #define ENS210_T_START 1
34 #elif defined CONFIG_ENS210_TEMPERATURE_CONTINUOUS
35 #define ENS210_T_RUN   1
36 #define ENS210_T_START 1
37 #endif
38 
39 #if defined CONFIG_ENS210_HUMIDITY_OFF
40 #define ENS210_H_RUN   0
41 #define ENS210_H_START 0
42 #elif defined CONFIG_ENS210_HUMIDITY_SINGLE
43 #define ENS210_H_RUN   0
44 #define ENS210_H_START 1
45 #elif defined CONFIG_ENS210_HUMIDITY_CONTINUOUS
46 #define ENS210_H_RUN   1
47 #define ENS210_H_START 1
48 #endif
49 
50 /*
51  * Polynomial
52  * 0b 1000 1001 ~ x^7+x^3+x^0
53  * 0x    8    9
54  */
55 #define ENS210_CRC7_WIDTH      7
56 #define ENS210_CRC7_POLY       0x89
57 #define ENS210_CRC7_IVEC       ((1UL << ENS210_CRC7_WIDTH) - 1)
58 #define ENS210_CRC7_DATA_WIDTH 17
59 #define ENS210_CRC7_DATA_MASK  ((1UL << ENS210_CRC7_DATA_WIDTH) - 1)
60 #define ENS210_CRC7_DATA_MSB   (1UL << (ENS210_CRC7_DATA_WIDTH - 1))
61 
62 struct ens210_value_data {
63 	uint16_t val;
64 	uint8_t  valid : 1;
65 	uint8_t  crc7  : 7;
66 } __packed;
67 
68 struct ens210_sys_ctrl {
69 	uint8_t  low_power : 1;
70 	uint8_t  reserved  : 6;
71 	uint8_t  reset     : 1;
72 } __packed;
73 
74 struct ens210_sys_stat {
75 	uint8_t  sys_active : 1;
76 	uint8_t  reserved   : 7;
77 } __packed;
78 
79 struct ens210_sens_run {
80 	uint8_t  t_run    : 1;
81 	uint8_t  h_run    : 1;
82 	uint8_t  reserved : 6;
83 } __packed;
84 
85 struct ens210_sens_start {
86 	uint8_t  t_start  : 1;
87 	uint8_t  h_start  : 1;
88 	uint8_t  reserved : 6;
89 } __packed;
90 
91 struct ens210_sens_stop {
92 	uint8_t  t_stop  : 1;
93 	uint8_t  h_stop  : 1;
94 	uint8_t  reserved : 6;
95 } __packed;
96 
97 struct ens210_sens_stat {
98 	uint8_t  t_stat  : 1;
99 	uint8_t  h_stat  : 1;
100 	uint8_t  reserved : 6;
101 } __packed;
102 
103 struct ens210_data {
104 	const struct device *i2c;
105 	struct ens210_value_data temp;
106 	struct ens210_value_data humidity;
107 };
108 
109 #endif /* ZEPHYR_DRIVERS_SENSOR_ENS210_ENS210_H_ */
110