1 /*
2 * SPDX-FileCopyrightText: Copyright (c) 2025 Jilay Sandeep Pandya
3 * SPDX-FileCopyrightText: Copyright (c) 2023 Carl Zeiss Meditec AG
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/devicetree.h>
8 #include <zephyr/drivers/emul_sensor.h>
9 #include <zephyr/drivers/emul.h>
10 #include <zephyr/drivers/i2c_emul.h>
11 #include <zephyr/drivers/sensor.h>
12 #include <zephyr/drivers/sensor/adltc2990.h>
13 #include <zephyr/fff.h>
14 #include <zephyr/ztest.h>
15
16 #include "adltc2990_emul.h"
17 #include "adltc2990_reg.h"
18 #include "adltc2990_internal.h"
19
20 #include <zephyr/logging/log.h>
21
22 DEFINE_FFF_GLOBALS;
23
24 DECLARE_FAKE_VALUE_FUNC(int, fake_mock_i2c_transfer, uint8_t, int, int);
25
26 DEFINE_FAKE_VALUE_FUNC(int, fake_mock_i2c_transfer, uint8_t, int, int);
27
28 static int mock_i2c_transfer_fail_reg_number = -1;
29
adltc2990_i2c_is_touching_reg_delegate(uint8_t start_reg,int num_msgs,int reg)30 static int adltc2990_i2c_is_touching_reg_delegate(uint8_t start_reg, int num_msgs, int reg)
31 {
32
33 if (start_reg == reg) {
34 return -EIO;
35 }
36
37 return 0;
38 }
39
mock_i2c_transfer_delegate(const struct emul * target,struct i2c_msg * msgs,int num_msgs,int addr)40 static int mock_i2c_transfer_delegate(const struct emul *target, struct i2c_msg *msgs, int num_msgs,
41 int addr)
42 {
43 ARG_UNUSED(target);
44 ARG_UNUSED(addr);
45
46 uint8_t start_reg = msgs[0].buf[0];
47
48 fake_mock_i2c_transfer_fake.return_val =
49 fake_mock_i2c_transfer(start_reg, num_msgs, mock_i2c_transfer_fail_reg_number);
50 if (fake_mock_i2c_transfer_fake.return_val == -EIO) {
51 return -EIO;
52 }
53 return -ENOSYS;
54 }
55
reset_mock_i2c_transfer_fake(void)56 static void reset_mock_i2c_transfer_fake(void)
57 {
58 mock_i2c_transfer_fail_reg_number = -1;
59 fake_mock_i2c_transfer_reset();
60 fake_mock_i2c_transfer_fake.custom_fake = adltc2990_i2c_is_touching_reg_delegate;
61 }
62
63 /* Colllection of common assertion macros */
64 #define CHECK_SINGLE_ENDED_VOLTAGE(sensor_val, index, pin_voltage, r1, r2) \
65 zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE)); \
66 zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, sensor_val)); \
67 zassert_between_inclusive( \
68 sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000, \
69 (pin_voltage - 0.01f) * ((r1 + r2) / (float)r2), \
70 (pin_voltage + 0.01f) * ((r1 + r2) / (float)r2), \
71 "%f Out of Range [%f,%f] input %f, [%dmΩ, %dmΩ] " \
72 "\nCheck if the sensor node is configured correctly", \
73 (double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000), \
74 (double)((pin_voltage - 0.01f) * ((r1 + r2) / (float)r2)), \
75 (double)((pin_voltage + 0.01f) * ((r1 + r2) / (float)r2)), (double)pin_voltage, \
76 r1, r2);
77
78 #define CHECK_CURRENT(sensor_val, index, pin_voltage, r_microohms) \
79 zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT)); \
80 zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, sensor_val)); \
81 zassert_between_inclusive( \
82 sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000, \
83 (pin_voltage - 0.01f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / r_microohms, \
84 (pin_voltage + 0.01f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / r_microohms, \
85 "%f Out of Range [%f,%f] input %f, current-resistor: %dµΩ\nCheck if the sensor " \
86 "node is configured correctly", \
87 (double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000), \
88 (double)((pin_voltage - 0.001f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / \
89 r_microohms), \
90 (double)((pin_voltage + 0.001f) * ADLTC2990_MICROOHM_CONVERSION_FACTOR / \
91 r_microohms), \
92 (double)pin_voltage, r_microohms);
93
94 #define CHECK_TEMPERATURE(sensor_val, index, expected_temperature, temperature_type) \
95 zassert_ok(sensor_sample_fetch_chan(fixture->dev, temperature_type)); \
96 zassert_ok(sensor_channel_get(fixture->dev, temperature_type, sensor_val)); \
97 zassert_equal(expected_temperature, \
98 sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000, \
99 "expected %f, got %f", (double)expected_temperature, \
100 (double)(sensor_val[index].val1 + (float)sensor_val[index].val2 / 1000000));
101
102 /*** TEST-SUITE: ADLTC2990 Measurement Mode 0 0***/
103
104 struct adltc2990_0_0_fixture {
105 const struct device *dev;
106 const struct emul *target;
107 };
108
adltc2990_0_0_setup(void)109 static void *adltc2990_0_0_setup(void)
110 {
111 static struct adltc2990_0_0_fixture fixture = {
112 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_0_0)),
113 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_0_0)),
114 };
115
116 zassert_not_null(fixture.dev);
117 zassert_not_null(fixture.target);
118 return &fixture;
119 }
120
adltc2990_0_0_before(void * f)121 static void adltc2990_0_0_before(void *f)
122 {
123 struct adltc2990_0_0_fixture *fixture = f;
124
125 adltc2990_emul_reset(fixture->target);
126 }
127
128 ZTEST_SUITE(adltc2990_0_0, NULL, adltc2990_0_0_setup, adltc2990_0_0_before, NULL, NULL);
129
ZTEST_F(adltc2990_0_0,test_measure_mode_internal_temperature_only)130 ZTEST_F(adltc2990_0_0, test_measure_mode_internal_temperature_only)
131 {
132 struct sensor_value value[1];
133
134 zassert_equal(-ENOTSUP, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_MAGN_X));
135 zassert_equal(-ENOTSUP, sensor_channel_get(fixture->dev, SENSOR_CHAN_MAGN_Z, value));
136 zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, value));
137 zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP, value));
138 }
139
140 /*** TEST-SUITE: ADLTC2990 Measurement Mode 4 3***/
141
142 struct adltc2990_4_3_fixture {
143 const struct device *dev;
144 const struct emul *target;
145 };
146
adltc2990_4_3_setup(void)147 static void *adltc2990_4_3_setup(void)
148 {
149 static struct adltc2990_4_3_fixture fixture = {
150 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_4_3)),
151 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_4_3)),
152 };
153
154 zassert_not_null(fixture.dev);
155 zassert_not_null(fixture.target);
156 return &fixture;
157 }
158
adltc2990_4_3_before(void * f)159 static void adltc2990_4_3_before(void *f)
160 {
161 struct adltc2990_4_3_fixture *fixture = f;
162
163 adltc2990_emul_reset(fixture->target);
164 }
165
166 ZTEST_SUITE(adltc2990_4_3, NULL, adltc2990_4_3_setup, adltc2990_4_3_before, NULL, NULL);
167
ZTEST_F(adltc2990_4_3,test_mock_i2c_error)168 ZTEST_F(adltc2990_4_3, test_mock_i2c_error)
169 {
170 struct i2c_emul_api mock_bus_api;
171
172 fixture->target->bus.i2c->mock_api = &mock_bus_api;
173 mock_bus_api.transfer = mock_i2c_transfer_delegate;
174
175 reset_mock_i2c_transfer_fake();
176
177 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_STATUS;
178 bool is_busy;
179
180 zassert_equal(-EIO, adltc2990_is_busy(fixture->dev, &is_busy), "I2C Error not detected");
181 zassert_equal(1, fake_mock_i2c_transfer_fake.call_count);
182
183 reset_mock_i2c_transfer_fake();
184
185 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_TRIGGER;
186 adltc2990_trigger_measurement(fixture->dev, ADLTC2990_REPEATED_ACQUISITION);
187 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
188
189 reset_mock_i2c_transfer_fake();
190
191 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_CONTROL;
192 adltc2990_trigger_measurement(fixture->dev, ADLTC2990_SINGLE_SHOT_ACQUISITION);
193 zassert_equal(ADLTC2990_REG_CONTROL, fake_mock_i2c_transfer_fake.arg0_val);
194 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
195
196 reset_mock_i2c_transfer_fake();
197
198 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_VCC_LSB;
199 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
200 zassert_equal(ADLTC2990_REG_VCC_LSB, fake_mock_i2c_transfer_fake.arg0_val);
201
202 reset_mock_i2c_transfer_fake();
203
204 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V1_MSB;
205 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
206 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
207
208 reset_mock_i2c_transfer_fake();
209
210 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V3_MSB;
211 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
212 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
213
214 reset_mock_i2c_transfer_fake();
215
216 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_INTERNAL_TEMP_MSB;
217 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_DIE_TEMP));
218 zassert_equal(1, fake_mock_i2c_transfer_fake.call_count);
219
220 reset_mock_i2c_transfer_fake();
221
222 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V1_MSB;
223 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
224 zassert_equal(1, fake_mock_i2c_transfer_fake.call_count);
225 }
226
ZTEST_F(adltc2990_4_3,test_available_channels)227 ZTEST_F(adltc2990_4_3, test_available_channels)
228 {
229 struct sensor_value value[3];
230
231 zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
232 zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, value));
233 zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
234 zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP, value));
235 zassert_equal(0, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
236 zassert_equal(0, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, value));
237 }
238
239 /*** TEST-SUITE: ADLTC2990 Measurement Mode 1 3***/
240
241 struct adltc2990_1_3_fixture {
242 const struct device *dev;
243 const struct emul *target;
244 };
245
adltc2990_1_3_setup(void)246 static void *adltc2990_1_3_setup(void)
247 {
248 static struct adltc2990_1_3_fixture fixture = {
249 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_1_3)),
250 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_1_3)),
251 };
252
253 zassert_not_null(fixture.dev);
254 zassert_not_null(fixture.target);
255 return &fixture;
256 }
257
adltc2990_1_3_before(void * f)258 static void adltc2990_1_3_before(void *f)
259 {
260 struct adltc2990_1_3_fixture *fixture = f;
261
262 uint8_t ctrl_reg_value;
263
264 adltc2990_emul_get_reg(fixture->target, ADLTC2990_REG_CONTROL, &ctrl_reg_value);
265
266 adltc2990_emul_reset(fixture->target);
267
268 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_CONTROL, &ctrl_reg_value);
269 }
270
271 ZTEST_SUITE(adltc2990_1_3, NULL, adltc2990_1_3_setup, adltc2990_1_3_before, NULL, NULL);
272
ZTEST_F(adltc2990_1_3,test_acq_format)273 ZTEST_F(adltc2990_1_3, test_acq_format)
274 {
275 uint8_t ctrl_register_value;
276
277 adltc2990_trigger_measurement(fixture->dev, ADLTC2990_SINGLE_SHOT_ACQUISITION);
278 adltc2990_emul_get_reg(fixture->target, ADLTC2990_REG_CONTROL, &ctrl_register_value);
279 zassert_equal(ADLTC2990_SINGLE_SHOT_ACQUISITION,
280 ADLTC2990_ACQUISITION_BIT_VAL(ctrl_register_value),
281 "Repeated Acquisition not set");
282
283 adltc2990_trigger_measurement(fixture->dev, ADLTC2990_REPEATED_ACQUISITION);
284 adltc2990_emul_get_reg(fixture->target, ADLTC2990_REG_CONTROL, &ctrl_register_value);
285 zassert_equal(ADLTC2990_REPEATED_ACQUISITION,
286 ADLTC2990_ACQUISITION_BIT_VAL(ctrl_register_value),
287 "Single Shot Acquisition not set");
288 }
289
ZTEST_F(adltc2990_1_3,test_die_temperature)290 ZTEST_F(adltc2990_1_3, test_die_temperature)
291 {
292 /* The following values are taken from datasheet and should translate to 125°c */
293 uint8_t msb = 0b00000111, lsb = 0b11010000;
294
295 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
296 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);
297
298 struct sensor_value temp_value[1];
299
300 CHECK_TEMPERATURE(temp_value, 0, 125.00f, SENSOR_CHAN_DIE_TEMP);
301
302 /*0b00011101 0b10000000 –40.0000*/
303 msb = 0b00011101;
304 lsb = 0b10000000;
305
306 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
307 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);
308
309 CHECK_TEMPERATURE(temp_value, 0, -40.00f, SENSOR_CHAN_DIE_TEMP);
310 }
311
ZTEST_F(adltc2990_1_3,test_ambient_temperature)312 ZTEST_F(adltc2990_1_3, test_ambient_temperature)
313 {
314 /* 0b00000001 0b10010001 +25.0625 */
315 uint8_t msb = 0b00000001, lsb = 0b10010001;
316 struct sensor_value temp_ambient[1];
317
318 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb);
319 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb);
320
321 CHECK_TEMPERATURE(temp_ambient, 0, 25.06250f, SENSOR_CHAN_AMBIENT_TEMP);
322 }
323
ZTEST_F(adltc2990_1_3,test_current)324 ZTEST_F(adltc2990_1_3, test_current)
325 {
326 /* 0b00111100 0b01011000 +0.300 */
327 uint8_t msb_reg_value = 0b00111100, lsb_reg_value = 0b01011000;
328
329 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
330 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);
331
332 struct sensor_value current_values[1];
333 const struct adltc2990_config *dev_config = fixture->target->dev->config;
334
335 CHECK_CURRENT(current_values, 0, 0.3f, dev_config->pins_v1_v2.pins_current_resistor);
336
337 /* 0b00100000 0b00000000 +0.159 */
338 msb_reg_value = 0b00100000, lsb_reg_value = 0b00000000;
339 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
340 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);
341 CHECK_CURRENT(current_values, 0, 0.159f, dev_config->pins_v1_v2.pins_current_resistor);
342 }
343
ZTEST_F(adltc2990_1_3,test_V1_MINUS_V2_VCC)344 ZTEST_F(adltc2990_1_3, test_V1_MINUS_V2_VCC)
345 {
346 uint8_t msb = 0b01100000, lsb = 0b00000000;
347
348 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb);
349 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb);
350
351 msb = 0b00000010;
352 lsb = 0b10001111;
353 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_MSB, &msb);
354 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_LSB, &lsb);
355
356 zassert_ok(sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
357
358 struct sensor_value voltage_values[2];
359
360 zassert_ok(sensor_channel_get(fixture->dev, SENSOR_CHAN_VOLTAGE, voltage_values));
361
362 float test_value = voltage_values[0].val1 + (float)voltage_values[0].val2 / 1000000;
363
364 zassert_between_inclusive(test_value, -0.16f, -0.159f, "Out of Range [-0.16,-0.159]%.6f",
365 (double)test_value);
366
367 test_value = voltage_values[1].val1 + (float)voltage_values[1].val2 / 1000000;
368 zassert_between_inclusive(test_value, 2.69f, 2.7f, "Out of Range [2.69, 2.7]%.6f",
369 (double)test_value);
370 }
371
372 /*** TEST-SUITE: ADLTC2990 Measurement Mode 5 3***/
373
374 struct adltc2990_5_3_fixture {
375 const struct device *dev;
376 const struct emul *target;
377 };
378
adltc2990_5_3_setup(void)379 static void *adltc2990_5_3_setup(void)
380 {
381 static struct adltc2990_5_3_fixture fixture = {
382 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_5_3)),
383 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_5_3)),
384 };
385
386 zassert_not_null(fixture.dev);
387 zassert_not_null(fixture.target);
388 return &fixture;
389 }
390
adltc2990_5_3_before(void * f)391 static void adltc2990_5_3_before(void *f)
392 {
393 struct adltc2990_5_3_fixture *fixture = f;
394
395 adltc2990_emul_reset(fixture->target);
396 }
397
398 ZTEST_SUITE(adltc2990_5_3, NULL, adltc2990_5_3_setup, adltc2990_5_3_before, NULL, NULL);
399
ZTEST_F(adltc2990_5_3,test_mock_i2c_error)400 ZTEST_F(adltc2990_5_3, test_mock_i2c_error)
401 {
402 struct i2c_emul_api mock_bus_api;
403
404 fixture->target->bus.i2c->mock_api = &mock_bus_api;
405 mock_bus_api.transfer = mock_i2c_transfer_delegate;
406
407 reset_mock_i2c_transfer_fake();
408
409 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V3_MSB;
410 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
411 zassert_equal(3, fake_mock_i2c_transfer_fake.call_count);
412 }
413
ZTEST_F(adltc2990_5_3,test_ambient_temperature)414 ZTEST_F(adltc2990_5_3, test_ambient_temperature)
415 {
416 /*Kelvin 0b00010001 0b00010010 273.1250*/
417 uint8_t msb = 0b00010001, lsb = 0b00010010;
418
419 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb);
420 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb);
421
422 struct sensor_value temp_value[2];
423
424 CHECK_TEMPERATURE(temp_value, 0, 273.1250f, SENSOR_CHAN_AMBIENT_TEMP);
425
426 /*Kelvin 0b00001110 0b10010010 233.125*/
427 msb = 0b00001110;
428 lsb = 0b10010010;
429 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb);
430 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb);
431 CHECK_TEMPERATURE(temp_value, 1, 233.1250f, SENSOR_CHAN_AMBIENT_TEMP);
432 }
433
ZTEST_F(adltc2990_5_3,test_die_temperature)434 ZTEST_F(adltc2990_5_3, test_die_temperature)
435 {
436 /*0b00011000 0b11100010 398.1250*/
437 uint8_t msb = 0b00011000, lsb = 0b11100010;
438
439 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
440 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);
441
442 struct sensor_value temp_value[1];
443
444 CHECK_TEMPERATURE(temp_value, 0, 398.1250f, SENSOR_CHAN_DIE_TEMP);
445 }
446
447 /*** TEST-SUITE: ADLTC2990 Measurement Mode 7 3***/
448
449 struct adltc2990_6_3_fixture {
450 const struct device *dev;
451 const struct emul *target;
452 };
453
adltc2990_6_3_setup(void)454 static void *adltc2990_6_3_setup(void)
455 {
456 static struct adltc2990_6_3_fixture fixture = {
457 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_6_3)),
458 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_6_3)),
459 };
460
461 zassert_not_null(fixture.dev);
462 zassert_not_null(fixture.target);
463 return &fixture;
464 }
465
adltc2990_6_3_before(void * f)466 static void adltc2990_6_3_before(void *f)
467 {
468 struct adltc2990_6_3_fixture *fixture = f;
469
470 adltc2990_emul_reset(fixture->target);
471 }
472
473 ZTEST_SUITE(adltc2990_6_3, NULL, adltc2990_6_3_setup, adltc2990_6_3_before, NULL, NULL);
474
ZTEST_F(adltc2990_6_3,test_mock_i2c_error)475 ZTEST_F(adltc2990_6_3, test_mock_i2c_error)
476 {
477 struct i2c_emul_api mock_bus_api;
478
479 fixture->target->bus.i2c->mock_api = &mock_bus_api;
480 mock_bus_api.transfer = mock_i2c_transfer_delegate;
481
482 reset_mock_i2c_transfer_fake();
483
484 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_VCC_LSB;
485 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
486 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
487 zassert_equal(2, fake_mock_i2c_transfer_fake.call_count);
488
489 reset_mock_i2c_transfer_fake();
490
491 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V1_MSB;
492 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
493 zassert_equal(3, fake_mock_i2c_transfer_fake.call_count);
494
495 reset_mock_i2c_transfer_fake();
496
497 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V3_MSB;
498 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
499 zassert_equal(5, fake_mock_i2c_transfer_fake.call_count);
500
501 reset_mock_i2c_transfer_fake();
502
503 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V1_LSB;
504 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
505 zassert_equal(2, fake_mock_i2c_transfer_fake.call_count);
506 }
507
ZTEST_F(adltc2990_6_3,test_current)508 ZTEST_F(adltc2990_6_3, test_current)
509 {
510 /* 0b00111100 0b01011000 +0.300 */
511 uint8_t msb_reg_value = 0b00111100, lsb_reg_value = 0b01011000;
512
513 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
514 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);
515
516 struct sensor_value current_values[2];
517 const struct adltc2990_config *dev_config = fixture->target->dev->config;
518
519 CHECK_CURRENT(current_values, 0, 0.3f, dev_config->pins_v1_v2.pins_current_resistor);
520
521 /* 0b00100000 0b00000000 +0.159 */
522 msb_reg_value = 0b00100000, lsb_reg_value = 0b00000000;
523 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb_reg_value);
524 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb_reg_value);
525 CHECK_CURRENT(current_values, 1, 0.159f, dev_config->pins_v3_v4.pins_current_resistor);
526 }
527
528 /*** TEST-SUITE: ADLTC2990 Measurement Mode 7 3***/
529 struct adltc2990_7_3_fixture {
530 const struct device *dev;
531 const struct emul *target;
532 };
533
adltc2990_7_3_setup(void)534 static void *adltc2990_7_3_setup(void)
535 {
536 static struct adltc2990_7_3_fixture fixture = {
537 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_7_3)),
538 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_7_3)),
539 };
540
541 zassert_not_null(fixture.dev);
542 zassert_not_null(fixture.target);
543 return &fixture;
544 }
545
adltc2990_7_3_before(void * f)546 static void adltc2990_7_3_before(void *f)
547 {
548 struct adltc2990_7_3_fixture *fixture = f;
549
550 adltc2990_emul_reset(fixture->target);
551 }
552
553 ZTEST_SUITE(adltc2990_7_3, NULL, adltc2990_7_3_setup, adltc2990_7_3_before, NULL, NULL);
554
ZTEST_F(adltc2990_7_3,test_mock_i2c_error)555 ZTEST_F(adltc2990_7_3, test_mock_i2c_error)
556 {
557 struct i2c_emul_api mock_bus_api;
558
559 fixture->target->bus.i2c->mock_api = &mock_bus_api;
560 mock_bus_api.transfer = mock_i2c_transfer_delegate;
561
562 reset_mock_i2c_transfer_fake();
563
564 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_VCC_LSB;
565 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
566 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
567 zassert_equal(2, fake_mock_i2c_transfer_fake.call_count);
568
569 reset_mock_i2c_transfer_fake();
570
571 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V1_MSB;
572 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
573 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
574 zassert_equal(3, fake_mock_i2c_transfer_fake.call_count);
575
576 reset_mock_i2c_transfer_fake();
577
578 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V2_MSB;
579 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
580 zassert_equal(-EIO, fake_mock_i2c_transfer_fake.return_val);
581 zassert_equal(5, fake_mock_i2c_transfer_fake.call_count);
582
583 reset_mock_i2c_transfer_fake();
584
585 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V3_MSB;
586 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
587 zassert_equal(7, fake_mock_i2c_transfer_fake.call_count);
588
589 reset_mock_i2c_transfer_fake();
590
591 mock_i2c_transfer_fail_reg_number = ADLTC2990_REG_V4_MSB;
592 zassert_equal(-EIO, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_VOLTAGE));
593 zassert_equal(9, fake_mock_i2c_transfer_fake.call_count);
594 }
595
ZTEST_F(adltc2990_7_3,test_available_channels)596 ZTEST_F(adltc2990_7_3, test_available_channels)
597 {
598 zassert_equal(-EINVAL, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_AMBIENT_TEMP));
599 zassert_equal(-EINVAL, sensor_sample_fetch_chan(fixture->dev, SENSOR_CHAN_CURRENT));
600 }
601
ZTEST_F(adltc2990_7_3,test_is_device_busy)602 ZTEST_F(adltc2990_7_3, test_is_device_busy)
603 {
604 uint8_t is_busy = BIT(0);
605 bool result;
606
607 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_STATUS, &is_busy);
608 adltc2990_is_busy(fixture->dev, &result);
609 zassert_equal(1, result, "expected 1, got %d", result);
610
611 is_busy = 0;
612 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_STATUS, &is_busy);
613 adltc2990_is_busy(fixture->dev, &result);
614 zassert_equal(0, result, "expected 0, got %d", result);
615 }
616
ZTEST_F(adltc2990_7_3,test_die_temperature)617 ZTEST_F(adltc2990_7_3, test_die_temperature)
618 {
619 /* The following values are taken from datasheet and should translate to 398.1250K */
620
621 uint8_t msb = 0b00011000, lsb = 0b11100010;
622
623 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_MSB, &msb);
624 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_INTERNAL_TEMP_LSB, &lsb);
625
626 struct sensor_value *die_temp_value_null = (struct sensor_value *)NULL;
627
628 zassert_equal(-EINVAL,
629 sensor_channel_get(fixture->dev, SENSOR_CHAN_ALL, die_temp_value_null));
630
631 struct sensor_value die_temp_value[1];
632
633 CHECK_TEMPERATURE(die_temp_value, 0, 398.1250f, SENSOR_CHAN_DIE_TEMP);
634 }
635
ZTEST_F(adltc2990_7_3,test_V1_V2_V3_V4_VCC)636 ZTEST_F(adltc2990_7_3, test_V1_V2_V3_V4_VCC)
637 {
638 /* 0b00111111 0b11111111 >5 */
639 uint8_t msb_reg_value = 0b00111111, lsb_reg_value = 0b11111111;
640
641 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_MSB, &msb_reg_value);
642 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V1_LSB, &lsb_reg_value);
643
644 /* 0b00101100 0b11001101 3.500 */
645 msb_reg_value = 0b00101100;
646 lsb_reg_value = 0b11001101;
647 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V2_MSB, &msb_reg_value);
648 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V2_LSB, &lsb_reg_value);
649
650 /* 0b00011111 0b11111111 2.500 */
651 msb_reg_value = 0b00011111;
652 lsb_reg_value = 0b11111111;
653 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_MSB, &msb_reg_value);
654 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V3_LSB, &lsb_reg_value);
655
656 /* 0b01111100 0b00101001 –0.300 */
657 msb_reg_value = 0b01111100;
658 lsb_reg_value = 0b00101001;
659 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V4_MSB, &msb_reg_value);
660 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_V4_LSB, &lsb_reg_value);
661
662 /* VCC = 6V */
663 msb_reg_value = 0b00101100;
664 lsb_reg_value = 0b11001101;
665 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_MSB, &msb_reg_value);
666 adltc2990_emul_set_reg(fixture->target, ADLTC2990_REG_VCC_LSB, &lsb_reg_value);
667
668 struct sensor_value voltage_values[5];
669
670 const struct adltc2990_config *dev_config = fixture->dev->config;
671
672 CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 0, 5.0f,
673 dev_config->pins_v1_v2.voltage_divider_resistors.v1_r1_r2[0],
674 dev_config->pins_v1_v2.voltage_divider_resistors.v1_r1_r2[1]);
675
676 CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 1, 3.5f,
677 dev_config->pins_v1_v2.voltage_divider_resistors.v2_r1_r2[0],
678 dev_config->pins_v1_v2.voltage_divider_resistors.v2_r1_r2[1]);
679
680 CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 2, 2.5f,
681 dev_config->pins_v3_v4.voltage_divider_resistors.v3_r1_r2[0],
682 dev_config->pins_v3_v4.voltage_divider_resistors.v3_r1_r2[1]);
683
684 CHECK_SINGLE_ENDED_VOLTAGE(voltage_values, 3, -0.3f,
685 dev_config->pins_v3_v4.voltage_divider_resistors.v4_r1_r2[0],
686 dev_config->pins_v3_v4.voltage_divider_resistors.v4_r1_r2[1]);
687
688 double test_value = voltage_values[4].val1 + (double)voltage_values[4].val2 / 1000000;
689
690 zassert_between_inclusive(test_value, 6.0, 6.1, "Out of Range [6.0,6.1] %.6f",
691 (double)test_value);
692
693 zassert_equal(6, voltage_values[4].val1);
694 }
695
696 /*** TEST-SUITE: ADLTC2990 Measurement Mode Incorrect***/
697 struct adltc2990_incorrect_fixture {
698 const struct device *dev;
699 const struct emul *target;
700 };
701
adltc2990_incorrect_setup(void)702 static void *adltc2990_incorrect_setup(void)
703 {
704 static struct adltc2990_incorrect_fixture fixture = {
705 .dev = DEVICE_DT_GET(DT_NODELABEL(adltc2990_incorrect)),
706 .target = EMUL_DT_GET(DT_NODELABEL(adltc2990_incorrect)),
707 };
708
709 zassert_not_null(fixture.dev);
710 zassert_not_null(fixture.target);
711 return &fixture;
712 }
713
adltc2990_incorrect_before(void * f)714 static void adltc2990_incorrect_before(void *f)
715 {
716 struct adltc2990_incorrect_fixture *fixture = f;
717
718 adltc2990_emul_reset(fixture->target);
719 }
720
721 ZTEST_SUITE(adltc2990_incorrect, NULL, adltc2990_incorrect_setup, adltc2990_incorrect_before, NULL,
722 NULL);
723
ZTEST_F(adltc2990_incorrect,test_current_cannot_be_measured)724 ZTEST_F(adltc2990_incorrect, test_current_cannot_be_measured)
725 {
726 struct sensor_value current[1];
727
728 zassert_equal(-EINVAL, sensor_channel_get(fixture->dev, SENSOR_CHAN_CURRENT, current));
729 }
730