1 /*
2  * Copyright (c) 2025 Andreas Klinger
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML6031_H_
8 #define ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML6031_H_
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 /**
15  * @brief ALS integration time settings in veml6031_it
16  */
17 #define VEML6031_IT_COUNT 8
18 
19 /**
20  * @brief Effective photodiode size in enum veml6031_size.
21  */
22 #define VEML6031_DIV4_COUNT 2
23 
24 /**
25  * @brief Gain selections in enum veml6031_gain.
26  */
27 #define VEML6031_GAIN_COUNT 4
28 
29 /**
30  * @brief VEML6031 integration time options for ambient light measurements.
31  */
32 enum veml6031_it {
33 	VEML6031_IT_3_125,
34 	VEML6031_IT_6_25,
35 	VEML6031_IT_12_5,
36 	VEML6031_IT_25,
37 	VEML6031_IT_50,
38 	VEML6031_IT_100,
39 	VEML6031_IT_200,
40 	VEML6031_IT_400,
41 };
42 
43 /**
44  * @brief VEML6031 size options for ambient light measurements.
45  */
46 enum veml6031_div4 {
47 	VEML6031_SIZE_4_4 = 0x00, /* 0b0 */
48 	VEML6031_SIZE_1_4 = 0x01, /* 0b1 */
49 };
50 
51 /**
52  * @brief VEML6031 gain options for ambient light measurements.
53  */
54 enum veml6031_gain {
55 	VEML6031_GAIN_1 = 0x00,    /* 0b00 */
56 	VEML6031_GAIN_2 = 0x01,    /* 0b01 */
57 	VEML6031_GAIN_0_66 = 0x02, /* 0b10 */
58 	VEML6031_GAIN_0_5 = 0x03,  /* 0b11 */
59 };
60 
61 /**
62  * @brief VEML6031 ALS interrupt persistence protect number options.
63  */
64 enum veml6031_pers {
65 	VEML6031_PERS_1 = 0x00, /* 0b00 */
66 	VEML6031_PERS_2 = 0x01, /* 0b01 */
67 	VEML6031_PERS_4 = 0x02, /* 0b10 */
68 	VEML6031_PERS_8 = 0x03, /* 0b11 */
69 };
70 
71 /**
72  * @brief VEML6031 specific sensor attributes.
73  *
74  * For high and low threshold window settings (ALS_WH_L, ALS_WH_H, ALS_WL_L and
75  * ALS_WL_H) use the generic attributes <tt>SENSOR_ATTR_UPPER_THRESH</tt> and
76  * <tt>SENSOR_ATTR_LOWER_THRESH</tt> with 16-bit unsigned integer values. Both
77  * threshold settings are in lux and converted by the driver to a value
78  * compatible with the sensor. This conversion depends on the current gain,
79  * integration time and effective photodiode size settings. So a change in
80  * gain, integration time or effective photodiode size usually requires an
81  * update of threshold window settings. To get the correct threshold values
82  * into the sensor update the thresholds -after- a change of gain or
83  * integration time.
84  *
85  * All attributes must be set for the <tt>SENSOR_CHAN_LIGHT</tt> channel.
86  *
87  * When the sensor goes into saturation <tt>-E2BIG</tt> is returned. This
88  * happens when the maximum value <tt>0xFFFF</tt> is returned as raw ALS value.
89  * In this case it's up to the user to reduce one or more of the following
90  * attributes to come back into the optimal measurement range of the sensor:
91  *  <tt>SENSOR_ATTR_VEML6031_GAIN</tt> (gain)
92  *  <tt>SENSOR_ATTR_VEML6031_IT</tt> (integration time)
93  *  <tt>SENSOR_ATTR_VEML6031_DIV4</tt> (effective photodiode size)
94  */
95 enum sensor_attribute_veml6031 {
96 	/**
97 	 * @brief Integration time setting for ALS measurements (IT).
98 	 *
99 	 * Use enum veml6031_it for attribute values.
100 	 */
101 	SENSOR_ATTR_VEML6031_IT = SENSOR_ATTR_PRIV_START,
102 	/**
103 	 * @brief Effective photodiode size (DIV4)
104 	 *
105 	 * Use enum veml6031_div4 for attribute values.
106 	 */
107 	SENSOR_ATTR_VEML6031_DIV4,
108 	/**
109 	 * @brief Gain setting for ALS measurements (GAIN).
110 	 *
111 	 * Use enum veml6031_gain for attribute values.
112 	 */
113 	SENSOR_ATTR_VEML6031_GAIN,
114 	/**
115 	 * @brief ALS persistence protect number setting (PERS).
116 	 *
117 	 * Use enum veml6031_pers for attribute values.
118 	 */
119 	SENSOR_ATTR_VEML6031_PERS,
120 };
121 
122 /**
123  * @brief VEML6031 specific sensor channels.
124  */
125 enum sensor_channel_veml6031 {
126 	/**
127 	 * @brief Channel for raw ALS sensor values.
128 	 *
129 	 * This channel represents the raw measurement counts provided by the
130 	 * sensor ALS register. It is useful for estimating good values for
131 	 * integration time, effective photodiode size and gain attributes in
132 	 * fetch and get mode.
133 	 *
134 	 * For future implementations with triggers it can also be used to
135 	 * estimate the threshold window attributes for the sensor interrupt
136 	 * handling.
137 	 *
138 	 * It cannot be fetched directly. Instead, this channel's value is
139 	 * fetched implicitly using <tt>SENSOR_CHAN_LIGHT</tt>. Trying to call
140 	 * <tt>sensor_channel_fetch_chan()</tt> with this enumerator as an
141 	 * argument will result in a <tt>-ENOTSUP</tt>.
142 	 */
143 	SENSOR_CHAN_VEML6031_ALS_RAW_COUNTS = SENSOR_CHAN_PRIV_START,
144 
145 	/**
146 	 * @brief Channel for IR sensor values.
147 	 *
148 	 * This channel is the raw IR Channel count output of the sensor. About
149 	 * fetching the same as for
150 	 * <tt>SENSOR_CHAN_VEML6031_ALS_RAW_COUNTS</tt> applies.
151 	 */
152 	SENSOR_CHAN_VEML6031_IR_RAW_COUNTS,
153 };
154 
155 #ifdef __cplusplus
156 }
157 #endif
158 
159 #endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML6031_H_ */
160