1 /*
2 * Copyright (c) 2024, Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/kernel.h>
8 #include <zephyr/device.h>
9 #include <zephyr/ztest.h>
10 #include <zephyr/drivers/adc.h>
11
12 static const struct device *dev_adc = DEVICE_DT_GET(DT_ALIAS(adc));
13 #define BUFFER_LEN 8
14 static uint16_t m_sample_buffer[BUFFER_LEN];
15
16 static const struct adc_channel_cfg valid_channel_cfg = {
17 .gain = ADC_GAIN_1,
18 .channel_id = 0,
19 .reference = ADC_REF_INTERNAL,
20 .acquisition_time = ADC_ACQ_TIME_DEFAULT,
21 .differential = false,
22 #ifdef CONFIG_ADC_CONFIGURABLE_INPUTS
23 .input_positive = 1,
24 #endif
25 };
26
27 static const struct adc_sequence valid_seq = {
28 .buffer = m_sample_buffer,
29 .buffer_size = BUFFER_LEN * sizeof(m_sample_buffer),
30 .options = NULL,
31 .resolution = 10,
32 .oversampling = 0,
33 .channels = 1,
34 };
35
36 /**
37 * @brief test adc_read() with invalid oversampling value
38 *
39 * function should return -EINVAL
40 */
41
ZTEST(adc_error_cases,test_adc_read_invalid_oversampling)42 ZTEST(adc_error_cases, test_adc_read_invalid_oversampling)
43 {
44 int ret;
45
46 adc_channel_setup(dev_adc, &valid_channel_cfg);
47
48 struct adc_sequence invalid_seq = valid_seq;
49 /* Set oversampling to invalid value */
50 invalid_seq.oversampling = 99;
51
52 ret = adc_read(dev_adc, &invalid_seq);
53
54 zassert_true(
55 ret == -EINVAL,
56 "adc_read() should return -EINVAL,"
57 " got unexpected value of %d",
58 ret
59 );
60 }
61
62 /**
63 * @brief test adc_read() with invalid resolution value
64 *
65 * function should return -EINVAL
66 */
67
ZTEST(adc_error_cases,test_adc_read_invalid_resolution)68 ZTEST(adc_error_cases, test_adc_read_invalid_resolution)
69 {
70 int ret;
71
72 adc_channel_setup(dev_adc, &valid_channel_cfg);
73
74 struct adc_sequence invalid_seq = valid_seq;
75 /* Set resolution to invalid value */
76 invalid_seq.resolution = 99;
77
78 ret = adc_read(dev_adc, &invalid_seq);
79
80 zassert_true(
81 ret == -EINVAL,
82 "adc_read() should return -EINVAL,"
83 " got unexpected value of %d",
84 ret
85 );
86 }
87
88 /**
89 * @brief test adc_read() with invalid channels value
90 *
91 * function should return -EINVAL
92 */
93
ZTEST(adc_error_cases,test_adc_read_invalid_channels)94 ZTEST(adc_error_cases, test_adc_read_invalid_channels)
95 {
96 int ret;
97
98 adc_channel_setup(dev_adc, &valid_channel_cfg);
99
100 struct adc_sequence invalid_seq = valid_seq;
101 /* Set channels configuration to invalid value */
102 invalid_seq.channels = 0;
103
104 ret = adc_read(dev_adc, &invalid_seq);
105
106 zassert_true(
107 ret == -EINVAL,
108 "adc_read() should return -EINVAL,"
109 " got unexpected value of %d",
110 ret
111 );
112 }
113
114 /**
115 * @brief test adc_read() with not configured channel
116 *
117 * function should return -EINVAL
118 */
119
ZTEST(adc_error_cases,test_adc_read_not_configured_channel)120 ZTEST(adc_error_cases, test_adc_read_not_configured_channel)
121 {
122 int ret;
123
124 adc_channel_setup(dev_adc, &valid_channel_cfg);
125
126 struct adc_sequence invalid_seq = valid_seq;
127 /* Set channels configuration to use not configured channel */
128 invalid_seq.channels = BIT(1);
129
130 ret = adc_read(dev_adc, &invalid_seq);
131
132 zassert_true(
133 ret == -EINVAL,
134 "adc_read() should return -EINVAL,"
135 " got unexpected value of %d",
136 ret
137 );
138 }
139
140 /**
141 * @brief test adc_read() with invalid buffer length
142 *
143 * function should return -ENOMEM
144 */
145
ZTEST(adc_error_cases,test_adc_read_invalid_buffer)146 ZTEST(adc_error_cases, test_adc_read_invalid_buffer)
147 {
148 int ret;
149
150 adc_channel_setup(dev_adc, &valid_channel_cfg);
151
152 struct adc_sequence invalid_seq = valid_seq;
153 /* set buffer size to 0 bytes */
154 invalid_seq.buffer_size = 0;
155
156 ret = adc_read(dev_adc, &invalid_seq);
157
158 zassert_true(
159 ret == -ENOMEM,
160 "adc_read() should return -ENOMEM,"
161 " got unexpected value of %d",
162 ret
163 );
164 }
165
166 /**
167 * @brief test adc_channel_setup() with invalid reference value
168 *
169 * function should return -EINVAL
170 */
171
ZTEST(adc_error_cases,test_adc_setup_invalid_reference)172 ZTEST(adc_error_cases, test_adc_setup_invalid_reference)
173 {
174 int ret;
175
176 struct adc_channel_cfg invalid_channel_cfg = valid_channel_cfg;
177 /* set invalid reference */
178 invalid_channel_cfg.reference = 99;
179
180 ret = adc_channel_setup(dev_adc, &invalid_channel_cfg);
181
182 zassert_true(
183 ret == -EINVAL,
184 "adc_channel_setup() should return -EINVAL,"
185 " got unexpected value of %d",
186 ret
187 );
188 }
189
190 /**
191 * @brief test adc_read() with invalid gain value
192 *
193 * function should return -EINVAL
194 */
195
ZTEST(adc_error_cases,test_adc_setup_invalid_gain)196 ZTEST(adc_error_cases, test_adc_setup_invalid_gain)
197 {
198 int ret;
199
200 struct adc_channel_cfg invalid_channel_cfg = valid_channel_cfg;
201 /* set invalid gain value */
202 invalid_channel_cfg.gain = 99;
203 ret = adc_channel_setup(dev_adc, &invalid_channel_cfg);
204 zassert_true(
205 ret == -EINVAL,
206 "adc_channel_setup() should return -EINVAL,"
207 " got unexpected value of %d",
208 ret
209 );
210 }
211
suite_setup(void)212 static void *suite_setup(void)
213 {
214 TC_PRINT("Test executed on %s\n", CONFIG_BOARD_TARGET);
215 TC_PRINT("===================================================================\n");
216
217 return NULL;
218 }
219
220 ZTEST_SUITE(adc_error_cases, NULL, suite_setup, NULL, NULL, NULL);
221