Line data Source code
1 1 : /*
2 : * Copyright (c) 2018 Peter Bigot Consulting, LLC
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Extended public API for CCS811 Indoor Air Quality Sensor
10 : *
11 : * Some capabilities and operational requirements for this sensor
12 : * cannot be expressed within the sensor driver abstraction.
13 : */
14 :
15 : #ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_CCS811_H_
16 : #define ZEPHYR_INCLUDE_DRIVERS_SENSOR_CCS811_H_
17 :
18 : #ifdef __cplusplus
19 : extern "C" {
20 : #endif
21 :
22 : #include <zephyr/device.h>
23 : #include <zephyr/drivers/sensor.h>
24 :
25 : /* Status register fields */
26 0 : #define CCS811_STATUS_ERROR BIT(0)
27 0 : #define CCS811_STATUS_DATA_READY BIT(3)
28 0 : #define CCS811_STATUS_APP_VALID BIT(4)
29 0 : #define CCS811_STATUS_FW_MODE BIT(7)
30 :
31 : /* Error register fields */
32 0 : #define CCS811_ERROR_WRITE_REG_INVALID BIT(0)
33 0 : #define CCS811_ERROR_READ_REG_INVALID BIT(1)
34 0 : #define CCS811_ERROR_MEASMODE_INVALID BIT(2)
35 0 : #define CCS811_ERROR_MAX_RESISTANCE BIT(3)
36 0 : #define CCS811_ERROR_HEATER_FAULT BIT(4)
37 0 : #define CCS811_ERROR_HEATER_SUPPLY BIT(5)
38 :
39 : /* Measurement mode constants */
40 0 : #define CCS811_MODE_IDLE 0x00
41 0 : #define CCS811_MODE_IAQ_1SEC 0x10
42 0 : #define CCS811_MODE_IAQ_10SEC 0x20
43 0 : #define CCS811_MODE_IAQ_60SEC 0x30
44 0 : #define CCS811_MODE_IAQ_250MSEC 0x40
45 0 : #define CCS811_MODE_MSK 0x70
46 :
47 : /** @brief Information collected from the sensor on each fetch. */
48 1 : struct ccs811_result_type {
49 : /** Equivalent carbon dioxide in parts-per-million volume (ppmv). */
50 1 : uint16_t co2;
51 :
52 : /**
53 : * Equivalent total volatile organic compounds in
54 : * parts-per-billion volume.
55 : */
56 1 : uint16_t voc;
57 :
58 : /** Raw voltage and current measured by sensor. */
59 1 : uint16_t raw;
60 :
61 : /** Sensor status at completion of most recent fetch. */
62 1 : uint8_t status;
63 :
64 : /**
65 : * Sensor error flags at completion of most recent fetch.
66 : *
67 : * Note that errors are cleared when read.
68 : */
69 1 : uint8_t error;
70 : };
71 :
72 : /**
73 : * @brief Access storage for the most recent data read from the sensor.
74 : *
75 : * This content of the object referenced is updated by
76 : * sensor_fetch_sample(), except for ccs811_result_type::mode which is
77 : * set on driver initialization.
78 : *
79 : * @param dev Pointer to the sensor device
80 : *
81 : * @return a pointer to the result information.
82 : */
83 1 : const struct ccs811_result_type *ccs811_result(const struct device *dev);
84 :
85 : /**
86 : * @brief Get information about static CCS811 state.
87 : *
88 : * This includes the configured operating mode as well as hardware and
89 : * firmware versions.
90 : */
91 1 : struct ccs811_configver_type {
92 0 : uint16_t fw_boot_version;
93 0 : uint16_t fw_app_version;
94 0 : uint8_t hw_version;
95 0 : uint8_t mode;
96 : };
97 :
98 : /**
99 : * @brief Fetch operating mode and version information.
100 : *
101 : * @param dev Pointer to the sensor device
102 : *
103 : * @param ptr Pointer to where the returned information should be stored
104 : *
105 : * @return 0 on success, or a negative errno code on failure.
106 : */
107 1 : int ccs811_configver_fetch(const struct device *dev,
108 : struct ccs811_configver_type *ptr);
109 :
110 : /**
111 : * @brief Fetch the current value of the BASELINE register.
112 : *
113 : * The BASELINE register encodes data used to correct sensor readings
114 : * based on individual device configuration and variation over time.
115 : *
116 : * For proper management of the BASELINE register see AN000370
117 : * "Baseline Save and Restore on CCS811".
118 : *
119 : * @param dev Pointer to the sensor device
120 : *
121 : * @return a non-negative 16-bit register value, or a negative errno
122 : * code on failure.
123 : */
124 1 : int ccs811_baseline_fetch(const struct device *dev);
125 :
126 : /**
127 : * @brief Update the BASELINE register.
128 : *
129 : * For proper management of the BASELINE register see AN000370
130 : * "Baseline Save and Restore on CCS811".
131 : *
132 : * @param dev Pointer to the sensor device
133 : *
134 : * @param baseline the value to be stored in the BASELINE register.
135 : *
136 : * @return 0 if successful, negative errno code if failure.
137 : */
138 1 : int ccs811_baseline_update(const struct device *dev, uint16_t baseline);
139 :
140 : /**
141 : * @brief Update the ENV_DATA register.
142 : *
143 : * Accurate calculation of gas levels requires accurate environment
144 : * data. Measurements are only accurate to 0.5 Cel and 0.5 %RH.
145 : *
146 : * @param dev Pointer to the sensor device
147 : *
148 : * @param temperature the current temperature at the sensor
149 : *
150 : * @param humidity the current humidity at the sensor
151 : *
152 : * @return 0 if successful, negative errno code if failure.
153 : */
154 1 : int ccs811_envdata_update(const struct device *dev,
155 : const struct sensor_value *temperature,
156 : const struct sensor_value *humidity);
157 :
158 : #ifdef __cplusplus
159 : }
160 : #endif
161 :
162 : #endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_CCS811_H_ */
|