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