1 /*
2 * Copyright (c) 2020 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/ztest.h>
8 #include <zephyr/devicetree.h>
9 #include <zephyr/devicetree/nvmem.h>
10 #include <zephyr/device.h>
11 #include <zephyr/drivers/gpio.h>
12
13 #include <stdlib.h>
14
15 #define TEST_CHILDREN DT_PATH(test, test_children)
16 #define TEST_DEADBEEF DT_PATH(test, gpio_deadbeef)
17 #define TEST_ABCD1234 DT_PATH(test, gpio_abcd1234)
18 #define TEST_ALIAS DT_ALIAS(test_alias)
19 #define TEST_NODELABEL DT_NODELABEL(test_nodelabel)
20 #define TEST_INST DT_INST(0, vnd_gpio_device)
21 #define TEST_ARRAYS DT_NODELABEL(test_arrays)
22 #define TEST_PH DT_NODELABEL(test_phandles)
23 #define TEST_INTC DT_NODELABEL(test_intc)
24 #define TEST_IRQ DT_NODELABEL(test_irq)
25 #define TEST_IRQ_EXT DT_NODELABEL(test_irq_extended)
26 #define TEST_TEMP DT_NODELABEL(test_temp_sensor)
27 #define TEST_REG DT_NODELABEL(test_reg)
28 #define TEST_VENDOR DT_NODELABEL(test_vendor)
29 #define TEST_MODEL DT_NODELABEL(test_vendor)
30 #define TEST_ENUM_0 DT_NODELABEL(test_enum_0)
31 #define TEST_64BIT DT_NODELABEL(test_reg_64)
32 #define TEST_INTC DT_NODELABEL(test_intc)
33
34 #define TEST_I2C DT_NODELABEL(test_i2c)
35 #define TEST_I2C_DEV DT_PATH(test, i2c_11112222, test_i2c_dev_10)
36 #define TEST_I2C_BUS DT_BUS(TEST_I2C_DEV)
37
38 #define TEST_I2C_MUX DT_NODELABEL(test_i2c_mux)
39 #define TEST_I2C_MUX_CTLR_1 DT_CHILD(TEST_I2C_MUX, i2c_mux_ctlr_1)
40 #define TEST_I2C_MUX_CTLR_2 DT_CHILD(TEST_I2C_MUX, i2c_mux_ctlr_2)
41 #define TEST_MUXED_I2C_DEV_1 DT_NODELABEL(test_muxed_i2c_dev_1)
42 #define TEST_MUXED_I2C_DEV_2 DT_NODELABEL(test_muxed_i2c_dev_2)
43
44 #define TEST_I3C DT_NODELABEL(test_i3c)
45 #define TEST_I3C_DEV DT_PATH(test, i3c_88889999, test_i3c_dev_420000abcd12345678)
46 #define TEST_I3C_BUS DT_BUS(TEST_I3C_DEV)
47
48 #define TEST_GPIO_1 DT_NODELABEL(test_gpio_1)
49 #define TEST_GPIO_2 DT_NODELABEL(test_gpio_2)
50 #define TEST_GPIO_4 DT_NODELABEL(test_gpio_4)
51
52 #define TEST_GPIO_HOG_1 DT_PATH(test, gpio_deadbeef, test_gpio_hog_1)
53 #define TEST_GPIO_HOG_2 DT_PATH(test, gpio_deadbeef, test_gpio_hog_2)
54 #define TEST_GPIO_HOG_3 DT_PATH(test, gpio_abcd1234, test_gpio_hog_3)
55
56 #define TEST_SPI DT_NODELABEL(test_spi)
57
58 #define TEST_SPI_DEV_0 DT_PATH(test, spi_33334444, test_spi_dev_0)
59 #define TEST_SPI_BUS_0 DT_BUS(TEST_SPI_DEV_0)
60
61 #define TEST_SPI_DEV_1 DT_PATH(test, spi_33334444, test_spi_dev_1)
62 #define TEST_SPI_BUS_1 DT_BUS(TEST_SPI_DEV_1)
63
64 #define TEST_SPI_NO_CS DT_NODELABEL(test_spi_no_cs)
65 #define TEST_SPI_DEV_NO_CS DT_NODELABEL(test_spi_no_cs)
66
67 #define TEST_PWM_CTLR_1 DT_NODELABEL(test_pwm1)
68 #define TEST_PWM_CTLR_2 DT_NODELABEL(test_pwm2)
69
70 #define TEST_CAN_CTRL_0 DT_NODELABEL(test_can0)
71 #define TEST_CAN_CTRL_1 DT_NODELABEL(test_can1)
72 #define TEST_CAN_CTRL_2 DT_NODELABEL(test_can2)
73 #define TEST_CAN_CTRL_3 DT_NODELABEL(test_can3)
74
75 #define TEST_DMA_CTLR_1 DT_NODELABEL(test_dma1)
76 #define TEST_DMA_CTLR_2 DT_NODELABEL(test_dma2)
77
78 #define TEST_VIDEO2 DT_NODELABEL(test_video2)
79 #define TEST_VIDEO2_PORT0 DT_NODELABEL(test_video2_port0)
80 #define TEST_VIDEO2_PORT0_IN0 DT_NODELABEL(test_video2_port0_in0)
81 #define TEST_VIDEO2_PORT0_IN1 DT_NODELABEL(test_video2_port0_in1)
82 #define TEST_VIDEO2_PORT1 DT_NODELABEL(test_video2_port1)
83 #define TEST_VIDEO2_PORT1_IN DT_NODELABEL(test_video2_port1_in)
84 #define TEST_VIDEO0 DT_NODELABEL(test_video0)
85 #define TEST_VIDEO0_OUT DT_NODELABEL(test_video0_out)
86 #define TEST_VIDEO0_PORT DT_NODELABEL(test_video0_port)
87 #define TEST_VIDEO1 DT_NODELABEL(test_video1)
88 #define TEST_VIDEO1_OUT0 DT_NODELABEL(test_video1_out0)
89 #define TEST_VIDEO1_OUT1 DT_NODELABEL(test_video1_out1)
90 #define TEST_VIDEO1_PORT DT_NODELABEL(test_video1_port)
91
92 #define TEST_IO_CHANNEL_CTLR_1 DT_NODELABEL(test_adc_1)
93 #define TEST_IO_CHANNEL_CTLR_2 DT_NODELABEL(test_adc_2)
94
95 #define TEST_RANGES_PCIE DT_NODELABEL(test_ranges_pcie)
96 #define TEST_RANGES_OTHER DT_NODELABEL(test_ranges_other)
97 #define TEST_RANGES_EMPTY DT_NODELABEL(test_ranges_empty)
98
99 #define TEST_MTD_0 DT_PATH(test, test_mtd_ffeeddcc)
100 #define TEST_MTD_1 DT_PATH(test, test_mtd_33221100)
101
102 #define TEST_MEM_0 DT_CHILD(TEST_MTD_0, flash_20000000)
103
104 #define TEST_PARTITION_0 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, partition_0)
105 #define TEST_PARTITION_1 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, partition_c0)
106 #define TEST_PARTITION_2 DT_PATH(test, test_mtd_33221100, partitions, partition_6ff80)
107
108 #define TEST_SUBPARTITION_COMBINED DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, \
109 partition_100)
110 #define TEST_SUBPARTITION_0 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, \
111 partition_100, partition_0)
112 #define TEST_SUBPARTITION_1 DT_PATH(test, test_mtd_ffeeddcc, flash_20000000, partitions, \
113 partition_100, partition_40)
114
115 #define ZEPHYR_USER DT_PATH(zephyr_user)
116
117 #define TA_HAS_COMPAT(compat) DT_NODE_HAS_COMPAT(TEST_ARRAYS, compat)
118
119 #define TO_STRING(x) TO_STRING_(x)
120 #define TO_STRING_(x) #x
121
ZTEST(devicetree_api,test_path_props)122 ZTEST(devicetree_api, test_path_props)
123 {
124 zassert_equal(DT_NUM_REGS(TEST_DEADBEEF), 1, "");
125 zassert_equal(DT_REG_ADDR(TEST_DEADBEEF), 0xdeadbeef, "");
126 zassert_equal(DT_REG_SIZE(TEST_DEADBEEF), 0x1000, "");
127 zassert_equal(DT_PROP(TEST_DEADBEEF, gpio_controller), 1, "");
128 zassert_equal(DT_PROP(TEST_DEADBEEF, ngpios), 100, "");
129 zassert_true(!strcmp(DT_PROP(TEST_DEADBEEF, status), "okay"), "");
130 zassert_equal(DT_PROP_LEN(TEST_DEADBEEF, compatible), 1, "");
131 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_DEADBEEF, compatible, 0),
132 "vnd,gpio-device"), "");
133 zassert_true(!strcmp(DT_PROP_LAST(TEST_DEADBEEF, compatible), "vnd,gpio-device"), "");
134 zassert_true(DT_NODE_HAS_PROP(TEST_DEADBEEF, status), "");
135 zassert_false(DT_NODE_HAS_PROP(TEST_DEADBEEF, foobar), "");
136
137 zassert_true(DT_SAME_NODE(TEST_ABCD1234, TEST_GPIO_2), "");
138 zassert_equal(DT_NUM_REGS(TEST_ABCD1234), 2, "");
139 zassert_equal(DT_PROP(TEST_ABCD1234, gpio_controller), 1, "");
140 zassert_equal(DT_PROP(TEST_ABCD1234, ngpios), 200, "");
141 zassert_true(!strcmp(DT_PROP(TEST_ABCD1234, status), "okay"), "");
142 zassert_equal(DT_PROP_LEN(TEST_ABCD1234, compatible), 1, "");
143 zassert_equal(DT_PROP_LEN_OR(TEST_ABCD1234, compatible, 4), 1, "");
144 zassert_equal(DT_PROP_LEN_OR(TEST_ABCD1234, invalid_property, 0), 0, "");
145 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ABCD1234, compatible, 0),
146 "vnd,gpio-device"), "");
147 }
148
ZTEST(devicetree_api,test_alias_props)149 ZTEST(devicetree_api, test_alias_props)
150 {
151 zassert_equal(DT_HAS_ALIAS(test_alias), 1, "");
152 zassert_equal(DT_HAS_ALIAS(test_alias_none), 0, "");
153 zassert_equal(DT_NUM_REGS(TEST_ALIAS), 1, "");
154 zassert_equal(DT_REG_ADDR(TEST_ALIAS), 0xdeadbeef, "");
155 zassert_equal(DT_REG_SIZE(TEST_ALIAS), 0x1000, "");
156 zassert_true(DT_SAME_NODE(TEST_ALIAS, TEST_GPIO_1), "");
157 zassert_equal(DT_PROP(TEST_ALIAS, gpio_controller), 1, "");
158 zassert_equal(DT_PROP(TEST_ALIAS, ngpios), 100, "");
159 zassert_true(!strcmp(DT_PROP(TEST_ALIAS, status), "okay"), "");
160 zassert_equal(DT_PROP_LEN(TEST_ALIAS, compatible), 1, "");
161 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ALIAS, compatible, 0),
162 "vnd,gpio-device"), "");
163 }
164
ZTEST(devicetree_api,test_nodelabel_props)165 ZTEST(devicetree_api, test_nodelabel_props)
166 {
167 zassert_equal(DT_NUM_REGS(TEST_NODELABEL), 1, "");
168 zassert_equal(DT_REG_ADDR(TEST_NODELABEL), 0xdeadbeef, "");
169 zassert_equal(DT_REG_SIZE(TEST_NODELABEL), 0x1000, "");
170 zassert_equal(DT_PROP(TEST_NODELABEL, gpio_controller), 1, "");
171 zassert_equal(DT_PROP(TEST_NODELABEL, ngpios), 100, "");
172 zassert_true(!strcmp(DT_PROP(TEST_NODELABEL, status), "okay"), "");
173 zassert_equal(DT_PROP_LEN(TEST_NODELABEL, compatible), 1, "");
174 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_NODELABEL, compatible, 0),
175 "vnd,gpio-device"), "");
176 zassert_equal(DT_PROP_LEN(TEST_ENUM_0, val), 1, "");
177 }
178
179 #undef DT_DRV_COMPAT
180 #define DT_DRV_COMPAT vnd_gpio_device
ZTEST(devicetree_api,test_inst_props)181 ZTEST(devicetree_api, test_inst_props)
182 {
183 /*
184 * Careful:
185 *
186 * We can only test properties that are shared across all
187 * instances of this compatible here. This includes instances
188 * with status "disabled".
189 */
190
191 zassert_equal(DT_PROP(TEST_INST, gpio_controller), 1, "");
192 zassert_true(!strcmp(DT_PROP(TEST_INST, status), "okay") ||
193 !strcmp(DT_PROP(TEST_INST, status), "disabled"), "");
194 zassert_equal(DT_PROP_LEN(TEST_INST, compatible), 1, "");
195 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_INST, compatible, 0),
196 "vnd,gpio-device"), "");
197
198 zassert_equal(DT_INST_NODE_HAS_PROP(0, gpio_controller), 1, "");
199 zassert_equal(DT_INST_PROP(0, gpio_controller), 1, "");
200 zassert_equal(DT_INST_NODE_HAS_PROP(0, xxxx), 0, "");
201 zassert_true(!strcmp(DT_INST_PROP(0, status), "okay") ||
202 !strcmp(DT_PROP(TEST_INST, status), "disabled"), "");
203 zassert_equal(DT_INST_PROP_LEN(0, compatible), 1, "");
204 zassert_true(!strcmp(DT_INST_PROP_BY_IDX(0, compatible, 0),
205 "vnd,gpio-device"), "");
206 }
207
208 #undef DT_DRV_COMPAT
209 #define DT_DRV_COMPAT vnd_device_with_props
ZTEST(devicetree_api,test_any_inst_prop)210 ZTEST(devicetree_api, test_any_inst_prop)
211 {
212 zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo), 1, "");
213 zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(bar), 1, "");
214 zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz), 0, "");
215 zassert_equal(DT_ANY_INST_HAS_PROP_STATUS_OKAY(does_not_exist), 0, "");
216
217 zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo),
218 (5), (6)),
219 5, "");
220 zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo),
221 (5), (6)),
222 6, "");
223 zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz),
224 (5), (6)),
225 6, "");
226 zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz),
227 (5), (6)),
228 5, "");
229 zassert_true(IS_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo)), "");
230 zassert_true(!IS_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz)), "");
231 zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(foo), (1)) + 1,
232 2, "");
233 zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_PROP_STATUS_OKAY(baz), (1)) + 1,
234 1, "");
235 }
236
ZTEST(devicetree_api,test_all_inst_prop)237 ZTEST(devicetree_api, test_all_inst_prop)
238 {
239 zassert_equal(DT_ALL_INST_HAS_PROP_STATUS_OKAY(foo), 1, "");
240 zassert_equal(DT_ALL_INST_HAS_PROP_STATUS_OKAY(bar), 0, "");
241 zassert_equal(DT_ALL_INST_HAS_PROP_STATUS_OKAY(baz), 0, "");
242 zassert_equal(DT_ALL_INST_HAS_PROP_STATUS_OKAY(does_not_exist), 0, "");
243
244 zassert_equal(COND_CODE_1(DT_ALL_INST_HAS_PROP_STATUS_OKAY(foo),
245 (5), (6)),
246 5, "");
247 zassert_equal(COND_CODE_0(DT_ALL_INST_HAS_PROP_STATUS_OKAY(foo),
248 (5), (6)),
249 6, "");
250 zassert_equal(COND_CODE_1(DT_ALL_INST_HAS_PROP_STATUS_OKAY(baz),
251 (5), (6)),
252 6, "");
253 zassert_equal(COND_CODE_0(DT_ALL_INST_HAS_PROP_STATUS_OKAY(baz),
254 (5), (6)),
255 5, "");
256 zassert_true(IS_ENABLED(DT_ALL_INST_HAS_PROP_STATUS_OKAY(foo)), "");
257 zassert_true(!IS_ENABLED(DT_ALL_INST_HAS_PROP_STATUS_OKAY(baz)), "");
258 zassert_equal(IF_ENABLED(DT_ALL_INST_HAS_PROP_STATUS_OKAY(foo), (1)) + 1,
259 2, "");
260 zassert_equal(IF_ENABLED(DT_ALL_INST_HAS_PROP_STATUS_OKAY(baz), (1)) + 1,
261 1, "");
262 }
263
264 #undef DT_DRV_COMPAT
ZTEST(devicetree_api,test_any_compat_inst_prop)265 ZTEST(devicetree_api, test_any_compat_inst_prop)
266 {
267 zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, foo), 1, "");
268 zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, bar), 1, "");
269 zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, baz), 0, "");
270 zassert_equal(DT_ANY_COMPAT_HAS_PROP_STATUS_OKAY(vnd_device_with_props, does_not_exist),
271 0, "");
272 }
273
274 #undef DT_DRV_COMPAT
275 #define DT_DRV_COMPAT vnd_device_with_props
ZTEST(devicetree_api,test_any_inst_bool)276 ZTEST(devicetree_api, test_any_inst_bool)
277 {
278 zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo), 1, "");
279 zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_bar), 1, "");
280 zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz), 0, "");
281 zassert_equal(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(does_not_exist), 0, "");
282
283 zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
284 (5), (6)),
285 5, "");
286 zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
287 (5), (6)),
288 6, "");
289 zassert_equal(COND_CODE_1(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
290 (5), (6)),
291 6, "");
292 zassert_equal(COND_CODE_0(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
293 (5), (6)),
294 5, "");
295 zassert_true(IS_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo)), "");
296 zassert_true(!IS_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz)), "");
297 zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_foo), (1)) + 1,
298 2, "");
299 zassert_equal(IF_ENABLED(DT_ANY_INST_HAS_BOOL_STATUS_OKAY(bool_baz), (1)) + 1,
300 1, "");
301 }
302
ZTEST(devicetree_api,test_all_inst_bool)303 ZTEST(devicetree_api, test_all_inst_bool)
304 {
305 zassert_equal(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_foo), 1, "");
306 zassert_equal(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_bar), 0, "");
307 zassert_equal(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_baz), 0, "");
308 zassert_equal(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(does_not_exist), 0, "");
309
310 zassert_equal(COND_CODE_1(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
311 (5), (6)),
312 5, "");
313 zassert_equal(COND_CODE_0(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_foo),
314 (5), (6)),
315 6, "");
316 zassert_equal(COND_CODE_1(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
317 (5), (6)),
318 6, "");
319 zassert_equal(COND_CODE_0(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_baz),
320 (5), (6)),
321 5, "");
322 zassert_true(IS_ENABLED(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_foo)), "");
323 zassert_true(!IS_ENABLED(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_baz)), "");
324 zassert_equal(IF_ENABLED(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_foo), (1)) + 1,
325 2, "");
326 zassert_equal(IF_ENABLED(DT_ALL_INST_HAS_BOOL_STATUS_OKAY(bool_baz), (1)) + 1,
327 1, "");
328 }
329
ZTEST(devicetree_api,test_default_prop_access)330 ZTEST(devicetree_api, test_default_prop_access)
331 {
332 /*
333 * The APIs guarantee that the default_value is not expanded
334 * if the relevant property or cell is defined. This "X" macro
335 * is meant as poison which causes (hopefully) easy to
336 * understand build errors if this guarantee is not met due to
337 * a regression.
338 */
339 #undef X
340 #define X do.not.expand.this.argument
341
342 /* Node identifier variants. */
343 zassert_equal(DT_PROP_OR(TEST_REG, misc_prop, X), 1234, "");
344 zassert_equal(DT_PROP_OR(TEST_REG, not_a_property, -1), -1, "");
345
346 zassert_equal(DT_PHA_BY_IDX_OR(TEST_TEMP, dmas, 1, channel, X), 3, "");
347 zassert_equal(DT_PHA_BY_IDX_OR(TEST_TEMP, dmas, 1, not_a_cell, -1), -1,
348 "");
349
350 zassert_equal(DT_PHA_OR(TEST_TEMP, dmas, channel, X), 1, "");
351 zassert_equal(DT_PHA_OR(TEST_TEMP, dmas, not_a_cell, -1), -1, "");
352
353 zassert_equal(DT_PHA_BY_NAME_OR(TEST_TEMP, dmas, tx, channel, X), 1,
354 "");
355 zassert_equal(DT_PHA_BY_NAME_OR(TEST_TEMP, dmas, tx, not_a_cell, -1),
356 -1, "");
357
358 /* Instance number variants. */
359 #undef DT_DRV_COMPAT
360 #define DT_DRV_COMPAT vnd_reg_holder
361 zassert_equal(DT_INST_PROP_OR(0, misc_prop, X), 1234, "");
362 zassert_equal(DT_INST_PROP_OR(0, not_a_property, -1), -1, "");
363
364 #undef DT_DRV_COMPAT
365 #define DT_DRV_COMPAT vnd_array_holder
366 zassert_equal(DT_INST_PROP_LEN_OR(0, a, X), 3, "");
367 zassert_equal(DT_INST_PROP_LEN_OR(0, not_a_property, -1), -1, "");
368
369 #undef DT_DRV_COMPAT
370 #define DT_DRV_COMPAT vnd_adc_temp_sensor
371 zassert_equal(DT_INST_PHA_BY_IDX_OR(0, dmas, 1, channel, X), 3, "");
372 zassert_equal(DT_INST_PHA_BY_IDX_OR(0, dmas, 1, not_a_cell, -1), -1,
373 "");
374
375 zassert_equal(DT_INST_PHA_OR(0, dmas, channel, X), 1, "");
376 zassert_equal(DT_INST_PHA_OR(0, dmas, not_a_cell, -1), -1, "");
377
378 zassert_equal(DT_INST_PHA_BY_NAME_OR(0, dmas, tx, channel, X), 1,
379 "");
380 zassert_equal(DT_INST_PHA_BY_NAME_OR(0, dmas, tx, not_a_cell, -1), -1,
381 "");
382
383 #undef X
384 }
385
ZTEST(devicetree_api,test_has_path)386 ZTEST(devicetree_api, test_has_path)
387 {
388 zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_0), okay), 0, "");
389 zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_deadbeef), okay), 1,
390 "");
391 zassert_equal(DT_NODE_HAS_STATUS(DT_PATH(test, gpio_abcd1234), okay), 1,
392 "");
393 }
394
ZTEST(devicetree_api,test_has_alias)395 ZTEST(devicetree_api, test_has_alias)
396 {
397 zassert_equal(DT_NODE_HAS_STATUS(DT_ALIAS(test_alias), okay), 1, "");
398 zassert_equal(DT_NODE_HAS_STATUS(DT_ALIAS(test_undef), okay), 0, "");
399 }
400
ZTEST(devicetree_api,test_node_hashes)401 ZTEST(devicetree_api, test_node_hashes)
402 {
403 zassert_str_equal(TO_STRING(DT_NODE_HASH(DT_ROOT)),
404 "il7asoJjJEMhngUeSt4tHVu8Zxx4EFG_FDeJfL3_oPE");
405 zassert_str_equal(TO_STRING(DT_NODE_HASH(TEST_DEADBEEF)),
406 "kPPqtBX5DX_QDQMO0_cOls2ebJMevAWHhAPY1JCKTyU");
407 zassert_str_equal(TO_STRING(DT_NODE_HASH(TEST_ABCD1234)),
408 "Bk4fvF6o3Mgslz_xiIZaJcuwo6_IeelozwOaxtUsSos");
409 }
410
ZTEST(devicetree_api,test_inst_checks)411 ZTEST(devicetree_api, test_inst_checks)
412 {
413 zassert_equal(DT_NODE_EXISTS(DT_INST(0, vnd_gpio_device)), 1, "");
414 zassert_equal(DT_NODE_EXISTS(DT_INST(1, vnd_gpio_device)), 1, "");
415 zassert_equal(DT_NODE_EXISTS(DT_INST(2, vnd_gpio_device)), 1, "");
416
417 zassert_equal(DT_NUM_INST_STATUS_OKAY(vnd_gpio_device), 2, "");
418 zassert_equal(DT_NUM_INST_STATUS_OKAY(xxxx), 0, "");
419 }
420
ZTEST(devicetree_api,test_has_nodelabel)421 ZTEST(devicetree_api, test_has_nodelabel)
422 {
423 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), okay), 0,
424 "");
425 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_nodelabel), okay), 1,
426 "");
427 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_nodelabel_allcaps),
428 okay),
429 1, "");
430 }
431
ZTEST(devicetree_api,test_has_compat)432 ZTEST(devicetree_api, test_has_compat)
433 {
434 unsigned int compats;
435
436 zassert_true(DT_HAS_COMPAT_STATUS_OKAY(vnd_gpio_device), "");
437 zassert_true(DT_HAS_COMPAT_STATUS_OKAY(vnd_gpio_device), "");
438 zassert_false(DT_HAS_COMPAT_STATUS_OKAY(vnd_disabled_compat), "");
439 zassert_false(DT_HAS_COMPAT_STATUS_OKAY(vnd_reserved_compat), "");
440
441 zassert_equal(TA_HAS_COMPAT(vnd_array_holder), 1, "");
442 zassert_equal(TA_HAS_COMPAT(vnd_undefined_compat), 1, "");
443 zassert_equal(TA_HAS_COMPAT(vnd_not_a_test_array_compat), 0, "");
444 compats = ((TA_HAS_COMPAT(vnd_array_holder) << 0) |
445 (TA_HAS_COMPAT(vnd_undefined_compat) << 1) |
446 (TA_HAS_COMPAT(vnd_not_a_test_array_compat) << 2));
447 zassert_equal(compats, 0x3, "");
448
449 #undef DT_DRV_COMPAT
450 #define DT_DRV_COMPAT vnd_model1
451 zassert_true(DT_INST_NODE_HAS_COMPAT(0, zephyr_model2));
452 }
453
ZTEST(devicetree_api,test_has_status)454 ZTEST(devicetree_api, test_has_status)
455 {
456 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), okay),
457 1, "");
458 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), disabled),
459 0, "");
460 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_gpio_1), reserved),
461 0, "");
462
463 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), okay),
464 1, "");
465 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), disabled),
466 0, "");
467 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(test_no_status), reserved),
468 0, "");
469
470 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), disabled),
471 1, "");
472 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), okay),
473 0, "");
474 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(disabled_gpio), reserved),
475 0, "");
476
477 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), reserved),
478 1, "");
479 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), disabled),
480 0, "");
481 zassert_equal(DT_NODE_HAS_STATUS(DT_NODELABEL(reserved_gpio), okay),
482 0, "");
483 }
484
ZTEST(devicetree_api,test_has_status_okay)485 ZTEST(devicetree_api, test_has_status_okay)
486 {
487 zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(test_gpio_1)), 1);
488
489 zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(test_no_status)), 1);
490
491 zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(disabled_gpio)), 0);
492
493 zassert_equal(DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(reserved_gpio)), 0);
494 }
495
ZTEST(devicetree_api,test_bus)496 ZTEST(devicetree_api, test_bus)
497 {
498 int pin, flags;
499
500 zassert_true(DT_SAME_NODE(TEST_I3C_BUS, TEST_I3C), "");
501 zassert_true(DT_SAME_NODE(TEST_I2C_BUS, TEST_I2C), "");
502 zassert_true(DT_SAME_NODE(TEST_SPI_BUS_0, TEST_SPI), "");
503 zassert_true(DT_SAME_NODE(TEST_SPI_BUS_1, TEST_SPI), "");
504
505 zassert_equal(DT_SPI_DEV_HAS_CS_GPIOS(TEST_SPI_DEV_0), 1, "");
506 zassert_equal(DT_SPI_DEV_HAS_CS_GPIOS(TEST_SPI_DEV_NO_CS), 0, "");
507
508 /* Test a nested I2C bus using vnd,i2c-mux. */
509 zassert_true(DT_SAME_NODE(TEST_I2C_MUX_CTLR_1,
510 DT_BUS(TEST_MUXED_I2C_DEV_1)), "");
511 zassert_true(DT_SAME_NODE(TEST_I2C_MUX_CTLR_2,
512 DT_BUS(TEST_MUXED_I2C_DEV_2)), "");
513
514 #undef DT_DRV_COMPAT
515 #define DT_DRV_COMPAT vnd_spi_device_2
516 /* there is only one instance, and it has no CS */
517 zassert_equal(DT_INST_SPI_DEV_HAS_CS_GPIOS(0), 0, "");
518 /* since there's only one instance, we also know its bus. */
519 zassert_true(DT_SAME_NODE(TEST_SPI_NO_CS, DT_INST_BUS(0)),
520 "expected TEST_SPI_NO_CS as bus for vnd,spi-device-2");
521
522 #undef DT_DRV_COMPAT
523 #define DT_DRV_COMPAT vnd_spi_device
524 /*
525 * DT_INST_SPI_DEV: use with care here. We could be matching
526 * either vnd,spi-device.
527 */
528 zassert_equal(DT_INST_SPI_DEV_HAS_CS_GPIOS(0), 1, "");
529
530 #define CTLR_NODE DT_INST_SPI_DEV_CS_GPIOS_CTLR(0)
531 zassert_true(DT_SAME_NODE(CTLR_NODE, DT_NODELABEL(test_gpio_1)) ||
532 DT_SAME_NODE(CTLR_NODE, DT_NODELABEL(test_gpio_2)), "");
533 #undef CTLR_NODE
534
535 pin = DT_INST_SPI_DEV_CS_GPIOS_PIN(0);
536 zassert_true((pin == 0x10) || (pin == 0x30), "");
537
538 flags = DT_INST_SPI_DEV_CS_GPIOS_FLAGS(0);
539 zassert_true((flags == 0x20) || (flags == 0x40), "");
540
541 zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, spi), 1, "");
542 zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, i2c), 0, "");
543 zassert_equal(DT_ON_BUS(TEST_SPI_DEV_0, i3c), 0, "");
544
545 zassert_equal(DT_ON_BUS(TEST_I2C_DEV, i2c), 1, "");
546 zassert_equal(DT_ON_BUS(TEST_I2C_DEV, i3c), 0, "");
547 zassert_equal(DT_ON_BUS(TEST_I2C_DEV, spi), 0, "");
548
549 #undef DT_DRV_COMPAT
550 #define DT_DRV_COMPAT vnd_spi_device
551 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 2, "");
552
553 zassert_equal(DT_INST_ON_BUS(0, spi), 1, "");
554 zassert_equal(DT_INST_ON_BUS(0, i2c), 0, "");
555 zassert_equal(DT_INST_ON_BUS(0, i3c), 0, "");
556
557 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 1, "");
558 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 0, "");
559 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 0, "");
560
561 #undef DT_DRV_COMPAT
562 #define DT_DRV_COMPAT vnd_i2c_device
563 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 2, "");
564
565 zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
566 zassert_equal(DT_INST_ON_BUS(0, i3c), 0, "");
567 zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
568
569 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
570 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 0, "");
571 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
572
573 #undef DT_DRV_COMPAT
574 #define DT_DRV_COMPAT vnd_i3c_device
575 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
576
577 zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
578 zassert_equal(DT_INST_ON_BUS(0, i3c), 1, "");
579 zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
580
581 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
582 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 1, "");
583 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
584
585 #undef DT_DRV_COMPAT
586 #define DT_DRV_COMPAT vnd_i3c_i2c_device
587 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
588
589 zassert_equal(DT_INST_ON_BUS(0, i2c), 1, "");
590 zassert_equal(DT_INST_ON_BUS(0, i3c), 1, "");
591 zassert_equal(DT_INST_ON_BUS(0, spi), 0, "");
592
593 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i2c), 1, "");
594 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(i3c), 1, "");
595 zassert_equal(DT_ANY_INST_ON_BUS_STATUS_OKAY(spi), 0, "");
596
597 #undef DT_DRV_COMPAT
598
599 /*
600 * Make sure the underlying DT_HAS_COMPAT_ON_BUS_STATUS_OKAY used by
601 * DT_ANY_INST_ON_BUS works without DT_DRV_COMPAT defined.
602 */
603 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_spi_device, spi), 1);
604 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_spi_device, i2c), 0);
605
606 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_i2c_device, i2c), 1);
607 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_i2c_device, spi), 0);
608
609 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_gpio_expander, i2c), 1);
610 zassert_equal(DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(vnd_gpio_expander, spi), 1);
611 }
612
613 #undef DT_DRV_COMPAT
614 #define DT_DRV_COMPAT vnd_vendor
615
616 #define VND_VENDOR "A stand-in for a real vendor which can be used in examples and tests"
617 #define ZEP_VENDOR "The Zephyr Project"
618
ZTEST(devicetree_api,test_vendor)619 ZTEST(devicetree_api, test_vendor)
620 {
621 /* DT_NODE_VENDOR_HAS_IDX */
622 zassert_true(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 0), "");
623 zassert_false(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 1), "");
624 zassert_true(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 2), "");
625 zassert_false(DT_NODE_VENDOR_HAS_IDX(TEST_VENDOR, 3), "");
626
627 /* DT_NODE_VENDOR_BY_IDX */
628 zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX(TEST_VENDOR, 0), VND_VENDOR), "");
629 zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX(TEST_VENDOR, 2), ZEP_VENDOR), "");
630
631 /* DT_NODE_VENDOR_BY_IDX_OR */
632 zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 0, NULL), VND_VENDOR), "");
633 zassert_is_null(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 1, NULL), "");
634 zassert_true(!strcmp(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 2, NULL), ZEP_VENDOR), "");
635 zassert_is_null(DT_NODE_VENDOR_BY_IDX_OR(TEST_VENDOR, 3, NULL), "");
636
637 /* DT_NODE_VENDOR_OR */
638 zassert_true(!strcmp(DT_NODE_VENDOR_OR(TEST_VENDOR, NULL), VND_VENDOR), "");
639 }
640
641 #define VND_MODEL "model1"
642 #define ZEP_MODEL "model2"
643
ZTEST(devicetree_api,test_model)644 ZTEST(devicetree_api, test_model)
645 {
646 /* DT_NODE_MODEL_HAS_IDX */
647 zassert_true(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 0), "");
648 zassert_false(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 1), "");
649 zassert_true(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 2), "");
650 zassert_false(DT_NODE_MODEL_HAS_IDX(TEST_MODEL, 3), "");
651
652 /* DT_NODE_MODEL_BY_IDX */
653 zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX(TEST_MODEL, 0), VND_MODEL), "");
654 zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX(TEST_MODEL, 2), ZEP_MODEL), "");
655
656 /* DT_NODE_MODEL_BY_IDX_OR */
657 zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 0, NULL), VND_MODEL), "");
658 zassert_is_null(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 1, NULL), "");
659 zassert_true(!strcmp(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 2, NULL), ZEP_MODEL), "");
660 zassert_is_null(DT_NODE_MODEL_BY_IDX_OR(TEST_MODEL, 3, NULL), "");
661
662 /* DT_NODE_MODEL_OR */
663 zassert_true(!strcmp(DT_NODE_MODEL_OR(TEST_MODEL, NULL), VND_MODEL), "");
664 }
665
666 #undef ZEP_MODEL
667 #undef VND_MODEL
668
669 #undef DT_DRV_COMPAT
670 #define DT_DRV_COMPAT vnd_reg_holder
ZTEST(devicetree_api,test_reg)671 ZTEST(devicetree_api, test_reg)
672 {
673 /* DT_REG_HAS_IDX */
674 zassert_true(DT_REG_HAS_IDX(TEST_ABCD1234, 0), "");
675 zassert_true(DT_REG_HAS_IDX(TEST_ABCD1234, 1), "");
676 zassert_false(DT_REG_HAS_IDX(TEST_ABCD1234, 2), "");
677
678 /* DT_REG_HAS_NAME */
679 zassert_true(DT_REG_HAS_NAME(TEST_ABCD1234, one), "");
680 zassert_true(DT_REG_HAS_NAME(TEST_ABCD1234, two), "");
681 zassert_false(DT_REG_HAS_NAME(TEST_ABCD1234, three), "");
682
683 /* DT_REG_ADDR_BY_IDX */
684 zassert_equal(DT_REG_ADDR_BY_IDX(TEST_ABCD1234, 0), 0xabcd1234, "");
685 zassert_equal(DT_REG_ADDR_BY_IDX(TEST_ABCD1234, 1), 0x98765432, "");
686
687 /* DT_REG_SIZE_BY_IDX */
688 zassert_equal(DT_REG_SIZE_BY_IDX(TEST_ABCD1234, 0), 0x500, "");
689 zassert_equal(DT_REG_SIZE_BY_IDX(TEST_ABCD1234, 1), 0xff, "");
690
691 /* DT_REG_ADDR */
692 zassert_equal(DT_REG_ADDR(TEST_ABCD1234), 0xabcd1234, "");
693
694 /* DT_REG_ADDR_U64 */
695 zassert_equal(DT_REG_ADDR_U64(TEST_ABCD1234), 0xabcd1234, "");
696
697 /* DT_REG_SIZE */
698 zassert_equal(DT_REG_SIZE(TEST_ABCD1234), 0x500, "");
699
700 /* DT_REG_ADDR_BY_NAME */
701 zassert_equal(DT_REG_ADDR_BY_NAME(TEST_ABCD1234, one), 0xabcd1234, "");
702 zassert_equal(DT_REG_ADDR_BY_NAME(TEST_ABCD1234, two), 0x98765432, "");
703
704 /* DT_REG_ADDR_BY_NAME_OR */
705 zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, one, 0x10), 0xabcd1234, "");
706 zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, two, 0x11), 0x98765432, "");
707 zassert_equal(DT_REG_ADDR_BY_NAME_OR(TEST_ABCD1234, three, 0x12), 0x12, "");
708
709 /* DT_REG_ADDR_BY_NAME_U64 */
710 zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_ABCD1234, one), 0xabcd1234, "");
711 zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_ABCD1234, two), 0x98765432, "");
712
713 /* DT_REG_SIZE_BY_NAME */
714 zassert_equal(DT_REG_SIZE_BY_NAME(TEST_ABCD1234, one), 0x500, "");
715 zassert_equal(DT_REG_SIZE_BY_NAME(TEST_ABCD1234, two), 0xff, "");
716
717 /* DT_REG_SIZE_BY_NAME_OR */
718 zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, one, 0x10), 0x500, "");
719 zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, two, 0x11), 0xff, "");
720 zassert_equal(DT_REG_SIZE_BY_NAME_OR(TEST_ABCD1234, three, 0x12), 0x12, "");
721
722 /* DT_INST */
723 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
724
725 /* DT_INST_REG_HAS_IDX */
726 zassert_true(DT_INST_REG_HAS_IDX(0, 0), "");
727 zassert_true(DT_INST_REG_HAS_IDX(0, 1), "");
728 zassert_false(DT_INST_REG_HAS_IDX(0, 2), "");
729
730 /* DT_INST_REG_HAS_NAME */
731 zassert_true(DT_INST_REG_HAS_NAME(0, first), "");
732 zassert_true(DT_INST_REG_HAS_NAME(0, second), "");
733 zassert_false(DT_INST_REG_HAS_NAME(0, third), "");
734
735 /* DT_INST_REG_ADDR_BY_IDX */
736 zassert_equal(DT_INST_REG_ADDR_BY_IDX(0, 0), 0x9999aaaa, "");
737 zassert_equal(DT_INST_REG_ADDR_BY_IDX(0, 1), 0xbbbbcccc, "");
738
739 /* DT_INST_REG_SIZE_BY_IDX */
740 zassert_equal(DT_INST_REG_SIZE_BY_IDX(0, 0), 0x1000, "");
741 zassert_equal(DT_INST_REG_SIZE_BY_IDX(0, 1), 0x3f, "");
742
743 /* DT_INST_REG_ADDR */
744 zassert_equal(DT_INST_REG_ADDR(0), 0x9999aaaa, "");
745
746 /* DT_INST_REG_ADDR_U64 */
747 zassert_equal(DT_INST_REG_ADDR_U64(0), 0x9999aaaa, "");
748
749 /* DT_INST_REG_SIZE */
750 zassert_equal(DT_INST_REG_SIZE(0), 0x1000, "");
751
752 /* DT_INST_REG_ADDR_BY_NAME */
753 zassert_equal(DT_INST_REG_ADDR_BY_NAME(0, first), 0x9999aaaa, "");
754 zassert_equal(DT_INST_REG_ADDR_BY_NAME(0, second), 0xbbbbcccc, "");
755
756 /* DT_INST_REG_ADDR_BY_NAME_OR */
757 zassert_equal(DT_INST_REG_ADDR_BY_NAME_OR(0, first, 0x10), 0x9999aaaa, "");
758 zassert_equal(DT_INST_REG_ADDR_BY_NAME_OR(0, second, 0x11), 0xbbbbcccc, "");
759 zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, third, 0x12), 0x12, "");
760
761 /* DT_INST_REG_ADDR_BY_NAME_U64 */
762 zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, first), 0x9999aaaa, "");
763 zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, second), 0xbbbbcccc, "");
764
765 /* DT_INST_REG_SIZE_BY_NAME */
766 zassert_equal(DT_INST_REG_SIZE_BY_NAME(0, first), 0x1000, "");
767 zassert_equal(DT_INST_REG_SIZE_BY_NAME(0, second), 0x3f, "");
768
769 /* DT_REG_SIZE_BY_NAME_OR */
770 zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, first, 0x10), 0x1000, "");
771 zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, second, 0x11), 0x3f, "");
772 zassert_equal(DT_INST_REG_SIZE_BY_NAME_OR(0, third, 0x12), 0x12, "");
773 }
774
775 #undef DT_DRV_COMPAT
776 #define DT_DRV_COMPAT vnd_reg_holder_64
ZTEST(devicetree_api,test_reg_64)777 ZTEST(devicetree_api, test_reg_64)
778 {
779 /* DT_REG_ADDR_U64 */
780 zassert_equal(DT_REG_ADDR_U64(TEST_64BIT), 0xffffffff11223344, "");
781
782 /* DT_REG_ADDR_BY_NAME_U64 */
783 zassert_equal(DT_REG_ADDR_BY_NAME_U64(TEST_64BIT, test_name), 0xffffffff11223344, "");
784
785 /* DT_INST_REG_ADDR_U64 */
786 zassert_equal(DT_INST_REG_ADDR_U64(0), 0xffffffff11223344, "");
787
788 /* DT_INST_REG_ADDR_BY_NAME_U64 */
789 zassert_equal(DT_INST_REG_ADDR_BY_NAME_U64(0, test_name), 0xffffffff11223344, "");
790 }
791
792 #undef DT_DRV_COMPAT
793 #define DT_DRV_COMPAT vnd_interrupt_holder
ZTEST(devicetree_api,test_irq)794 ZTEST(devicetree_api, test_irq)
795 {
796 /* DT_NUM_IRQS */
797 zassert_equal(DT_NUM_IRQS(TEST_DEADBEEF), 1, "");
798 zassert_equal(DT_NUM_IRQS(TEST_I2C_BUS), 2, "");
799 zassert_equal(DT_NUM_IRQS(TEST_SPI), 3, "");
800
801 /* DT_IRQ_HAS_IDX */
802 zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 0), "");
803 zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 1), "");
804 zassert_true(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 2), "");
805 zassert_false(DT_IRQ_HAS_IDX(TEST_SPI_BUS_0, 3), "");
806
807 zassert_true(DT_IRQ_HAS_IDX(TEST_DEADBEEF, 0), "");
808 zassert_false(DT_IRQ_HAS_IDX(TEST_DEADBEEF, 1), "");
809
810 zassert_true(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 0), "");
811 zassert_true(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 1), "");
812 zassert_false(DT_IRQ_HAS_IDX(TEST_I2C_BUS, 2), "");
813
814 /* DT_IRQ_BY_IDX */
815 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 0, irq), 8, "");
816 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 1, irq), 9, "");
817 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 2, irq), 10, "");
818 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 0, priority), 3, "");
819 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 1, priority), 0, "");
820 zassert_equal(DT_IRQ_BY_IDX(TEST_SPI_BUS_0, 2, priority), 1, "");
821
822 /* DT_IRQ_BY_NAME */
823 zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, status, irq), 6, "");
824 zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, error, irq), 7, "");
825 zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, status, priority), 2, "");
826 zassert_equal(DT_IRQ_BY_NAME(TEST_I2C_BUS, error, priority), 1, "");
827
828 /* DT_IRQ_HAS_CELL_AT_IDX */
829 zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, irq), "");
830 zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, priority), "");
831 zassert_false(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 0, foo), "");
832 zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, irq), "");
833 zassert_true(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, priority), "");
834 zassert_false(DT_IRQ_HAS_CELL_AT_IDX(TEST_IRQ, 2, foo), "");
835
836 /* DT_IRQ_HAS_CELL */
837 zassert_true(DT_IRQ_HAS_CELL(TEST_IRQ, irq), "");
838 zassert_true(DT_IRQ_HAS_CELL(TEST_IRQ, priority), "");
839 zassert_false(DT_IRQ_HAS_CELL(TEST_IRQ, foo), "");
840
841 /* DT_IRQ_HAS_NAME */
842 zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, err), "");
843 zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, stat), "");
844 zassert_true(DT_IRQ_HAS_NAME(TEST_IRQ, done), "");
845 zassert_false(DT_IRQ_HAS_NAME(TEST_IRQ, alpha), "");
846
847 /* DT_IRQ */
848 zassert_equal(DT_IRQ(TEST_I2C_BUS, irq), 6, "");
849 zassert_equal(DT_IRQ(TEST_I2C_BUS, priority), 2, "");
850
851 /* DT_IRQN */
852 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
853 zassert_equal(DT_IRQN(TEST_I2C_BUS), 6, "");
854 zassert_equal(DT_IRQN(DT_INST(0, DT_DRV_COMPAT)), 30, "");
855 #else
856 zassert_equal(DT_IRQN(TEST_I2C_BUS),
857 ((6 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
858 zassert_equal(DT_IRQN(DT_INST(0, DT_DRV_COMPAT)),
859 ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
860 #endif
861
862 /* DT_IRQN_BY_IDX */
863 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
864 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 0), 30, "");
865 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 1), 40, "");
866 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 2), 60, "");
867 #else
868 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 0),
869 ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
870 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 1),
871 ((40 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
872 zassert_equal(DT_IRQN_BY_IDX(DT_INST(0, DT_DRV_COMPAT), 2),
873 ((60 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
874 #endif
875
876 /* DT_INST */
877 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
878
879 /* DT_INST_NUM_IRQS */
880 zassert_equal(DT_INST_NUM_IRQS(0), 3);
881
882 /* DT_INST_IRQ_HAS_IDX */
883 zassert_equal(DT_INST_IRQ_HAS_IDX(0, 0), 1, "");
884 zassert_equal(DT_INST_IRQ_HAS_IDX(0, 1), 1, "");
885 zassert_equal(DT_INST_IRQ_HAS_IDX(0, 2), 1, "");
886 zassert_equal(DT_INST_IRQ_HAS_IDX(0, 3), 0, "");
887
888 /* DT_INST_IRQ_BY_IDX */
889 zassert_equal(DT_INST_IRQ_BY_IDX(0, 0, irq), 30, "");
890 zassert_equal(DT_INST_IRQ_BY_IDX(0, 1, irq), 40, "");
891 zassert_equal(DT_INST_IRQ_BY_IDX(0, 2, irq), 60, "");
892 zassert_equal(DT_INST_IRQ_BY_IDX(0, 0, priority), 3, "");
893 zassert_equal(DT_INST_IRQ_BY_IDX(0, 1, priority), 5, "");
894 zassert_equal(DT_INST_IRQ_BY_IDX(0, 2, priority), 7, "");
895
896 /* DT_INST_IRQ_BY_NAME */
897 zassert_equal(DT_INST_IRQ_BY_NAME(0, err, irq), 30, "");
898 zassert_equal(DT_INST_IRQ_BY_NAME(0, stat, irq), 40, "");
899 zassert_equal(DT_INST_IRQ_BY_NAME(0, done, irq), 60, "");
900 zassert_equal(DT_INST_IRQ_BY_NAME(0, err, priority), 3, "");
901 zassert_equal(DT_INST_IRQ_BY_NAME(0, stat, priority), 5, "");
902 zassert_equal(DT_INST_IRQ_BY_NAME(0, done, priority), 7, "");
903
904 /* DT_INST_IRQ */
905 zassert_equal(DT_INST_IRQ(0, irq), 30, "");
906 zassert_equal(DT_INST_IRQ(0, priority), 3, "");
907
908 /* DT_INST_IRQN */
909 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
910 zassert_equal(DT_INST_IRQN(0), 30, "");
911 #else
912 zassert_equal(DT_INST_IRQN(0), ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
913 #endif
914
915 /* DT_INST_IRQN_BY_IDX */
916 #ifndef CONFIG_MULTI_LEVEL_INTERRUPTS
917 zassert_equal(DT_INST_IRQN_BY_IDX(0, 0), 30, "");
918 zassert_equal(DT_INST_IRQN_BY_IDX(0, 1), 40, "");
919 zassert_equal(DT_INST_IRQN_BY_IDX(0, 2), 60, "");
920 #else
921 zassert_equal(DT_INST_IRQN_BY_IDX(0, 0),
922 ((30 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
923 zassert_equal(DT_INST_IRQN_BY_IDX(0, 1),
924 ((40 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
925 zassert_equal(DT_INST_IRQN_BY_IDX(0, 2),
926 ((60 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
927 #endif
928
929 /* DT_INST_IRQ_HAS_CELL_AT_IDX */
930 zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, irq), "");
931 zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, priority), "");
932 zassert_false(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 0, foo), "");
933 zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, irq), "");
934 zassert_true(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, priority), "");
935 zassert_false(DT_INST_IRQ_HAS_CELL_AT_IDX(0, 2, foo), "");
936
937 /* DT_INST_IRQ_HAS_CELL */
938 zassert_true(DT_INST_IRQ_HAS_CELL(0, irq), "");
939 zassert_true(DT_INST_IRQ_HAS_CELL(0, priority), "");
940 zassert_false(DT_INST_IRQ_HAS_CELL(0, foo), "");
941
942 /* DT_INST_IRQ_HAS_NAME */
943 zassert_true(DT_INST_IRQ_HAS_NAME(0, err), "");
944 zassert_true(DT_INST_IRQ_HAS_NAME(0, stat), "");
945 zassert_true(DT_INST_IRQ_HAS_NAME(0, done), "");
946 zassert_false(DT_INST_IRQ_HAS_NAME(0, alpha), "");
947
948 #ifdef CONFIG_MULTI_LEVEL_INTERRUPTS
949 /* the following asserts check if interrupt IDs are encoded
950 * properly when dealing with a node that consumes interrupts
951 * from L2 aggregators extending different L1 interrupts.
952 */
953 zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 0),
954 ((70 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 11, "");
955 zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 2),
956 ((42 + 1) << CONFIG_1ST_LEVEL_INTERRUPT_BITS) | 12, "");
957 #else
958 zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 0), 70, "");
959 zassert_equal(DT_IRQN_BY_IDX(TEST_IRQ_EXT, 2), 42, "");
960 #endif /* CONFIG_MULTI_LEVEL_INTERRUPTS */
961 }
962
ZTEST(devicetree_api,test_irq_level)963 ZTEST(devicetree_api, test_irq_level)
964 {
965 /* DT_IRQ_LEVEL */
966 zassert_equal(DT_IRQ_LEVEL(TEST_TEMP), 0, "");
967 zassert_equal(DT_IRQ_LEVEL(TEST_INTC), 1, "");
968 zassert_equal(DT_IRQ_LEVEL(TEST_SPI), 2, "");
969
970 /* DT_IRQ_LEVEL */
971 #undef DT_DRV_COMPAT
972 #define DT_DRV_COMPAT vnd_adc_temp_sensor
973 zassert_equal(DT_INST_IRQ_LEVEL(0), 0, "");
974
975 #undef DT_DRV_COMPAT
976 #define DT_DRV_COMPAT vnd_intc
977 zassert_equal(DT_INST_IRQ_LEVEL(1), 1, "");
978
979 #undef DT_DRV_COMPAT
980 #define DT_DRV_COMPAT vnd_spi
981 zassert_equal(DT_INST_IRQ_LEVEL(0), 2, "");
982 }
983
984 struct gpios_struct {
985 gpio_pin_t pin;
986 gpio_flags_t flags;
987 };
988
989 #define CLOCK_FREQUENCY_AND_COMMA(node_id, prop, idx) \
990 DT_PROP_BY_PHANDLE_IDX(node_id, prop, idx, clock_frequency),
991
992 /* Helper macro that UTIL_LISTIFY can use and produces an element with comma */
993 #define DT_GPIO_ELEM(idx, node_id, prop) \
994 { \
995 DT_PHA_BY_IDX(node_id, prop, idx, pin),\
996 DT_PHA_BY_IDX(node_id, prop, idx, flags),\
997 }
998 #define DT_GPIO_LISTIFY(node_id, prop) \
999 { LISTIFY(DT_PROP_LEN(node_id, prop), DT_GPIO_ELEM, (,), \
1000 node_id, prop) }
1001
1002 #undef DT_DRV_COMPAT
1003 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_phandles)1004 ZTEST(devicetree_api, test_phandles)
1005 {
1006 bool gpio_controller = DT_PROP_BY_PHANDLE(TEST_PH, ph, gpio_controller);
1007 size_t phs_freqs[] = { DT_FOREACH_PROP_ELEM(TEST_PH, phs, CLOCK_FREQUENCY_AND_COMMA) };
1008 struct gpios_struct gps[] = DT_GPIO_LISTIFY(TEST_PH, gpios);
1009
1010 /* phandle */
1011 zassert_true(DT_NODE_HAS_PROP(TEST_PH, ph), "");
1012 zassert_true(DT_SAME_NODE(DT_PROP(TEST_PH, ph),
1013 DT_NODELABEL(test_gpio_1)), "");
1014 zassert_equal(DT_PROP_LEN(TEST_PH, ph), 1, "");
1015 zassert_true(DT_SAME_NODE(DT_PROP_BY_IDX(TEST_PH, ph, 0),
1016 DT_NODELABEL(test_gpio_1)), "");
1017 /* DT_PROP_BY_PHANDLE */
1018 zassert_equal(gpio_controller, true, "");
1019
1020 /* phandles */
1021 zassert_true(DT_NODE_HAS_PROP(TEST_PH, phs), "");
1022 zassert_equal(ARRAY_SIZE(phs_freqs), 2, "");
1023 zassert_equal(DT_PROP_LEN(TEST_PH, phs), 2, "");
1024 zassert_true(DT_SAME_NODE(DT_PROP_BY_IDX(TEST_PH, phs, 1),
1025 TEST_SPI), "");
1026
1027 /* DT_FOREACH_PROP_ELEM on a phandles type property */
1028 zassert_equal(phs_freqs[0], 100000, "");
1029 zassert_equal(phs_freqs[1], 2000000, "");
1030
1031 /* DT_PROP_BY_PHANDLE_IDX on a phandles type property */
1032 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, phs, 0, clock_frequency),
1033 100000, "");
1034 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, phs, 1, clock_frequency),
1035 2000000, "");
1036
1037 /* DT_PROP_BY_PHANDLE_IDX on a phandle-array type property */
1038 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 0,
1039 ngpios), 100, "");
1040 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 1,
1041 ngpios), 200, "");
1042 zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 0, status),
1043 "okay"), "");
1044 zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX(TEST_PH, gpios, 1, status),
1045 "okay"), "");
1046
1047 /* DT_PROP_BY_PHANDLE_IDX_OR */
1048 zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX_OR(TEST_PH, phs_or, 0,
1049 val, "zero"), "one"), "");
1050 zassert_true(!strcmp(DT_PROP_BY_PHANDLE_IDX_OR(TEST_PH, phs_or, 1,
1051 val, "zero"), "zero"), "");
1052
1053 /* phandle-array */
1054 zassert_true(DT_NODE_HAS_PROP(TEST_PH, gpios), "");
1055 zassert_equal(ARRAY_SIZE(gps), 2, "");
1056 zassert_equal(DT_PROP_LEN(TEST_PH, gpios), 2, "");
1057
1058 /* DT_PROP_HAS_IDX */
1059 zassert_true(DT_PROP_HAS_IDX(TEST_PH, gpios, 0), "");
1060 zassert_true(DT_PROP_HAS_IDX(TEST_PH, gpios, 1), "");
1061 zassert_false(DT_PROP_HAS_IDX(TEST_PH, gpios, 2), "");
1062
1063 /* DT_PROP_HAS_NAME */
1064 zassert_false(DT_PROP_HAS_NAME(TEST_PH, foos, A), "");
1065 zassert_true(DT_PROP_HAS_NAME(TEST_PH, foos, a), "");
1066 zassert_false(DT_PROP_HAS_NAME(TEST_PH, foos, b-c), "");
1067 zassert_true(DT_PROP_HAS_NAME(TEST_PH, foos, b_c), "");
1068 zassert_false(DT_PROP_HAS_NAME(TEST_PH, bazs, jane), "");
1069
1070 /* DT_PHA_HAS_CELL_AT_IDX */
1071 zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, gpios, 1, pin), "");
1072 zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, gpios, 1, flags), "");
1073 /* pha-gpios index 1 has nothing, not even a phandle */
1074 zassert_false(DT_PROP_HAS_IDX(TEST_PH, pha_gpios, 1), "");
1075 zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 1, pin), "");
1076 zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 1, flags),
1077 "");
1078 /* index 2 only has a pin cell, no flags */
1079 zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 2, pin), "");
1080 zassert_false(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 2, flags),
1081 "");
1082 /* index 3 has both pin and flags cells*/
1083 zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 3, pin), "");
1084 zassert_true(DT_PHA_HAS_CELL_AT_IDX(TEST_PH, pha_gpios, 3, flags), "");
1085 /* even though index 1 has nothing, the length is still 4 */
1086 zassert_equal(DT_PROP_LEN(TEST_PH, pha_gpios), 4, "");
1087
1088 /* DT_PHA_HAS_CELL */
1089 zassert_true(DT_PHA_HAS_CELL(TEST_PH, gpios, flags), "");
1090 zassert_false(DT_PHA_HAS_CELL(TEST_PH, gpios, bar), "");
1091
1092 /* DT_PHANDLE_BY_IDX */
1093 zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_IDX(TEST_PH, gpios, 0), TEST_GPIO_1), "");
1094 zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_IDX(TEST_PH, gpios, 1), TEST_GPIO_2), "");
1095
1096 /* DT_PHANDLE */
1097 zassert_true(DT_SAME_NODE(DT_PHANDLE(TEST_PH, gpios), TEST_GPIO_1), "");
1098
1099 /* DT_PHA */
1100 zassert_equal(DT_PHA(TEST_PH, gpios, pin), 10, "");
1101 zassert_equal(DT_PHA(TEST_PH, gpios, flags), 20, "");
1102
1103 /* DT_PHA_BY_IDX */
1104 zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 0, pin), 10, "");
1105 zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 0, flags), 20, "");
1106
1107 zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 1, pin), 30, "");
1108 zassert_equal(DT_PHA_BY_IDX(TEST_PH, gpios, 1, flags), 40, "");
1109
1110 /* DT_PHA_BY_NAME */
1111 zassert_equal(DT_PHA_BY_NAME(TEST_PH, foos, a, foocell), 100, "");
1112 zassert_equal(DT_PHA_BY_NAME(TEST_PH, foos, b_c, foocell), 110, "");
1113
1114 /* DT_PHANDLE_BY_NAME */
1115 zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_NAME(TEST_PH, foos, a), TEST_GPIO_1), "");
1116 zassert_true(DT_SAME_NODE(DT_PHANDLE_BY_NAME(TEST_PH, foos, b_c), TEST_GPIO_2), "");
1117
1118 /* DT_PHA_NUM_CELLS_BY_IDX */
1119 zassert_equal(DT_PHA_NUM_CELLS_BY_IDX(TEST_PH, foos, 0), 1);
1120 zassert_equal(DT_PHA_NUM_CELLS_BY_IDX(TEST_PH, pha_gpios, 2), 1);
1121 zassert_equal(DT_PHA_NUM_CELLS_BY_IDX(TEST_PH, pha_gpios, 3), 2);
1122
1123 /* DT_PHA_NUM_CELLS_BY_NAME */
1124 zassert_equal(DT_PHA_NUM_CELLS_BY_NAME(TEST_PH, foos, a), 1);
1125 zassert_equal(DT_PHA_NUM_CELLS_BY_NAME(TEST_PH, pwms, green), 3);
1126 zassert_equal(DT_PHA_NUM_CELLS_BY_NAME(TEST_PH, pwms, red), 3);
1127
1128 /* DT_PHA_ELEM_NAME_BY_IDX */
1129 zassert_str_equal(DT_PHA_ELEM_NAME_BY_IDX(TEST_PH, foos, 0), "A");
1130 zassert_str_equal(DT_PHA_ELEM_NAME_BY_IDX(TEST_PH, foos, 1), "b-c");
1131 zassert_str_equal(DT_PHA_ELEM_NAME_BY_IDX(TEST_PH, pwms, 0), "red");
1132 zassert_str_equal(DT_PHA_ELEM_NAME_BY_IDX(TEST_PH, pwms, 1), "green");
1133
1134 /* DT_PHA_ELEM_IDX_BY_NAME */
1135 zassert_equal(DT_PHA_ELEM_IDX_BY_NAME(TEST_PH, foos, a), 0);
1136 zassert_equal(DT_PHA_ELEM_IDX_BY_NAME(TEST_PH, foos, b_c), 1);
1137 zassert_equal(DT_PHA_ELEM_IDX_BY_NAME(TEST_PH, pwms, red), 0);
1138 zassert_equal(DT_PHA_ELEM_IDX_BY_NAME(TEST_PH, pwms, green), 1);
1139
1140 /* DT_FOREACH_PHA_CELL_BY_IDX */
1141 int chksum;
1142
1143 #define ADD_TWO(node_id, pha, idx, x) (DT_PHA_BY_IDX(node_id, pha, idx, x) + 2) +
1144 chksum = DT_FOREACH_PHA_CELL_BY_IDX(TEST_PH, pwms, 0, ADD_TWO) 0;
1145 zassert_equal(chksum, 211 + 6);
1146 chksum = DT_FOREACH_PHA_CELL_BY_IDX(TEST_PH, foos, 1, ADD_TWO) 0;
1147 zassert_equal(chksum, 110 + 2);
1148
1149 /* DT_FOREACH_PHA_CELL_BY_IDX_SEP */
1150 int cells_one[2] = {
1151 DT_FOREACH_PHA_CELL_BY_IDX_SEP(TEST_PH, pha_gpios, 0, DT_PHA_BY_IDX, (,))
1152 };
1153 int cells_two[1] = {
1154 DT_FOREACH_PHA_CELL_BY_IDX_SEP(TEST_PH, pha_gpios, 2, DT_PHA_BY_IDX, (,))
1155 };
1156
1157 zassert_equal(cells_one[0], 50);
1158 zassert_equal(cells_one[1], 60);
1159 zassert_equal(cells_two[0], 70);
1160
1161 /* DT_FOREACH_PHA_CELL_BY_NAME */
1162 #define ADD_THREE(node_id, pha, idx, x) (DT_PHA_BY_NAME(node_id, pha, idx, x) + 3) +
1163 chksum = DT_FOREACH_PHA_CELL_BY_NAME(TEST_PH, pwms, red, ADD_THREE) 0;
1164 zassert_equal(chksum, 211 + 9);
1165 chksum = DT_FOREACH_PHA_CELL_BY_NAME(TEST_PH, pwms, green, ADD_THREE) 0;
1166 zassert_equal(chksum, 106 + 9);
1167
1168 /* DT_FOREACH_PHA_CELL_BY_NAME_SEP */
1169 int cells_pwms[3] = {
1170 DT_FOREACH_PHA_CELL_BY_NAME_SEP(TEST_PH, pwms, green, DT_PHA_BY_NAME, (,))
1171 };
1172
1173 zassert_equal(cells_pwms[0], 5);
1174 zassert_equal(cells_pwms[1], 100);
1175 zassert_equal(cells_pwms[2], 1);
1176
1177 /* array initializers */
1178 zassert_equal(gps[0].pin, 10, "");
1179 zassert_equal(gps[0].flags, 20, "");
1180
1181 zassert_equal(gps[1].pin, 30, "");
1182 zassert_equal(gps[1].flags, 40, "");
1183
1184 /* DT_INST */
1185 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1186
1187 /* DT_INST_PROP_BY_PHANDLE */
1188 zassert_equal(DT_INST_PROP_BY_PHANDLE(0, ph, ngpios), 100, "");
1189
1190 /* DT_INST_PROP_BY_PHANDLE_IDX */
1191 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, phs, 0, clock_frequency),
1192 100000, "");
1193 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, phs, 1, clock_frequency),
1194 2000000, "");
1195 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 0,
1196 gpio_controller),
1197 1, "");
1198 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 1,
1199 gpio_controller),
1200 1, "");
1201 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 0, ngpios),
1202 100, "");
1203 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, gpios, 1, ngpios),
1204 200, "");
1205
1206 /* DT_INST_PROP_HAS_IDX */
1207 zassert_true(DT_INST_PROP_HAS_IDX(0, gpios, 0), "");
1208 zassert_true(DT_INST_PROP_HAS_IDX(0, gpios, 1), "");
1209 zassert_false(DT_INST_PROP_HAS_IDX(0, gpios, 2), "");
1210
1211 /* DT_INST_PROP_HAS_NAME */
1212 zassert_false(DT_INST_PROP_HAS_NAME(0, foos, A), "");
1213 zassert_true(DT_INST_PROP_HAS_NAME(0, foos, a), "");
1214 zassert_false(DT_INST_PROP_HAS_NAME(0, foos, b-c), "");
1215 zassert_true(DT_INST_PROP_HAS_NAME(0, foos, b_c), "");
1216 zassert_false(DT_INST_PROP_HAS_NAME(0, bazs, jane), "");
1217
1218 /* DT_INST_PHA_HAS_CELL_AT_IDX */
1219 zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, gpios, 1, pin), "");
1220 zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, gpios, 1, flags), "");
1221 /* index 1 has nothing, not even a phandle */
1222 zassert_false(DT_INST_PROP_HAS_IDX(0, pha_gpios, 1), "");
1223 zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 1, pin), "");
1224 zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 1, flags), "");
1225 /* index 2 only has pin, no flags */
1226 zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 2, pin), "");
1227 zassert_false(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 2, flags), "");
1228 /* index 3 has both pin and flags */
1229 zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 3, pin), "");
1230 zassert_true(DT_INST_PHA_HAS_CELL_AT_IDX(0, pha_gpios, 3, flags), "");
1231 /* even though index 1 has nothing, the length is still 4 */
1232 zassert_equal(DT_INST_PROP_LEN(0, pha_gpios), 4, "");
1233
1234 /* DT_INST_PHA_HAS_CELL */
1235 zassert_true(DT_INST_PHA_HAS_CELL(0, gpios, flags), "");
1236 zassert_false(DT_INST_PHA_HAS_CELL(0, gpios, bar), "");
1237
1238 /* DT_INST_PHANDLE_BY_IDX */
1239 zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_IDX(0, gpios, 0), TEST_GPIO_1), "");
1240 zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_IDX(0, gpios, 1), TEST_GPIO_2), "");
1241
1242 /* DT_INST_PHANDLE */
1243 zassert_true(DT_SAME_NODE(DT_INST_PHANDLE(0, gpios), TEST_GPIO_1), "");
1244
1245 /* DT_INST_PHA */
1246 zassert_equal(DT_INST_PHA(0, gpios, pin), 10, "");
1247 zassert_equal(DT_INST_PHA(0, gpios, flags), 20, "");
1248
1249 /* DT_INST_PHA_BY_IDX */
1250 zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 0, pin), 10, "");
1251 zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 0, flags), 20, "");
1252
1253 zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 1, pin), 30, "");
1254 zassert_equal(DT_INST_PHA_BY_IDX(0, gpios, 1, flags), 40, "");
1255
1256 /* DT_INST_PHA_BY_NAME */
1257 zassert_equal(DT_INST_PHA_BY_NAME(0, foos, a, foocell), 100, "");
1258 zassert_equal(DT_INST_PHA_BY_NAME(0, foos, b_c, foocell), 110, "");
1259
1260 /* DT_INST_PHANDLE_BY_NAME */
1261 zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_NAME(0, foos, a), TEST_GPIO_1), "");
1262 zassert_true(DT_SAME_NODE(DT_INST_PHANDLE_BY_NAME(0, foos, b_c), TEST_GPIO_2), "");
1263 }
1264
1265 #undef DT_DRV_COMPAT
1266 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_gpio)1267 ZTEST(devicetree_api, test_gpio)
1268 {
1269 /* DT_GPIO_CTLR_BY_IDX */
1270 zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR_BY_IDX(TEST_PH, gpios, 0)),
1271 TO_STRING(DT_NODELABEL(test_gpio_1))), "");
1272 zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR_BY_IDX(TEST_PH, gpios, 1)),
1273 TO_STRING(DT_NODELABEL(test_gpio_2))), "");
1274
1275 /* DT_GPIO_CTLR */
1276 zassert_true(!strcmp(TO_STRING(DT_GPIO_CTLR(TEST_PH, gpios)),
1277 TO_STRING(DT_NODELABEL(test_gpio_1))), "");
1278
1279 /* DT_GPIO_PIN_BY_IDX */
1280 zassert_equal(DT_GPIO_PIN_BY_IDX(TEST_PH, gpios, 0), 10, "");
1281 zassert_equal(DT_GPIO_PIN_BY_IDX(TEST_PH, gpios, 1), 30, "");
1282
1283 /* DT_GPIO_PIN */
1284 zassert_equal(DT_GPIO_PIN(TEST_PH, gpios), 10, "");
1285
1286 /* DT_GPIO_FLAGS_BY_IDX */
1287 zassert_equal(DT_GPIO_FLAGS_BY_IDX(TEST_PH, gpios, 0), 20, "");
1288 zassert_equal(DT_GPIO_FLAGS_BY_IDX(TEST_PH, gpios, 1), 40, "");
1289
1290 /* DT_GPIO_FLAGS */
1291 zassert_equal(DT_GPIO_FLAGS(TEST_PH, gpios), 20, "");
1292
1293 /* DT_NUM_GPIO_HOGS */
1294 zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_1), 2, "");
1295 zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_2), 1, "");
1296 zassert_equal(DT_NUM_GPIO_HOGS(TEST_GPIO_HOG_3), 1, "");
1297
1298 /* DT_GPIO_HOG_PIN_BY_IDX */
1299 zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_1, 0), 0, "");
1300 zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_1, 1), 1, "");
1301 zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_2, 0), 3, "");
1302 zassert_equal(DT_GPIO_HOG_PIN_BY_IDX(TEST_GPIO_HOG_3, 0), 4, "");
1303
1304 /* DT_GPIO_HOG_FLAGS_BY_IDX */
1305 zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_1, 0), 0x00, "");
1306 zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_1, 1), 0x10, "");
1307 zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_2, 0), 0x20, "");
1308 zassert_equal(DT_GPIO_HOG_FLAGS_BY_IDX(TEST_GPIO_HOG_3, 0), 0x30, "");
1309
1310 /* DT_INST */
1311 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1312
1313 /* DT_INST_GPIO_PIN_BY_IDX */
1314 zassert_equal(DT_INST_GPIO_PIN_BY_IDX(0, gpios, 0), 10, "");
1315 zassert_equal(DT_INST_GPIO_PIN_BY_IDX(0, gpios, 1), 30, "");
1316
1317 /* DT_INST_GPIO_PIN */
1318 zassert_equal(DT_INST_GPIO_PIN(0, gpios), 10, "");
1319
1320 /* DT_INST_GPIO_FLAGS_BY_IDX */
1321 zassert_equal(DT_INST_GPIO_FLAGS_BY_IDX(0, gpios, 0), 20, "");
1322 zassert_equal(DT_INST_GPIO_FLAGS_BY_IDX(0, gpios, 1), 40, "");
1323
1324 /* DT_INST_GPIO_FLAGS */
1325 zassert_equal(DT_INST_GPIO_FLAGS(0, gpios), 20, "");
1326 }
1327
1328 #undef DT_DRV_COMPAT
1329 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_io_channels)1330 ZTEST(devicetree_api, test_io_channels)
1331 {
1332 /* DT_IO_CHANNELS_CTLR_BY_IDX */
1333 zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_IDX(TEST_TEMP, 0),
1334 TEST_IO_CHANNEL_CTLR_1), "");
1335 zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_IDX(TEST_TEMP, 1),
1336 TEST_IO_CHANNEL_CTLR_2), "");
1337
1338 /* DT_IO_CHANNELS_CTLR_BY_NAME */
1339 zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_NAME(TEST_TEMP, ch1),
1340 TEST_IO_CHANNEL_CTLR_1), "");
1341 zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR_BY_NAME(TEST_TEMP, ch2),
1342 TEST_IO_CHANNEL_CTLR_2), "");
1343
1344 /* DT_IO_CHANNELS_CTLR */
1345 zassert_true(DT_SAME_NODE(DT_IO_CHANNELS_CTLR(TEST_TEMP),
1346 TEST_IO_CHANNEL_CTLR_1), "");
1347
1348 /* DT_INST_IO_CHANNELS_CTLR_BY_IDX */
1349 zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_IDX(0, 0),
1350 TEST_IO_CHANNEL_CTLR_1), "");
1351 zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_IDX(0, 1),
1352 TEST_IO_CHANNEL_CTLR_2), "");
1353
1354 /* DT_INST_IO_CHANNELS_CTLR_BY_NAME */
1355 zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_NAME(0, ch1),
1356 TEST_IO_CHANNEL_CTLR_1), "");
1357 zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR_BY_NAME(0, ch2),
1358 TEST_IO_CHANNEL_CTLR_2), "");
1359
1360 /* DT_INST_IO_CHANNELS_CTLR */
1361 zassert_true(DT_SAME_NODE(DT_INST_IO_CHANNELS_CTLR(0),
1362 TEST_IO_CHANNEL_CTLR_1), "");
1363
1364 zassert_equal(DT_IO_CHANNELS_INPUT_BY_IDX(TEST_TEMP, 0), 10, "");
1365 zassert_equal(DT_IO_CHANNELS_INPUT_BY_IDX(TEST_TEMP, 1), 20, "");
1366 zassert_equal(DT_IO_CHANNELS_INPUT_BY_NAME(TEST_TEMP, ch1), 10, "");
1367 zassert_equal(DT_IO_CHANNELS_INPUT_BY_NAME(TEST_TEMP, ch2), 20, "");
1368 zassert_equal(DT_IO_CHANNELS_INPUT(TEST_TEMP), 10, "");
1369
1370 zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_IDX(0, 0), 10, "");
1371 zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_IDX(0, 1), 20, "");
1372 zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_NAME(0, ch1), 10, "");
1373 zassert_equal(DT_INST_IO_CHANNELS_INPUT_BY_NAME(0, ch2), 20, "");
1374 zassert_equal(DT_INST_IO_CHANNELS_INPUT(0), 10, "");
1375 }
1376
1377 #undef DT_DRV_COMPAT
1378 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_dma)1379 ZTEST(devicetree_api, test_dma)
1380 {
1381 /* DT_DMAS_CTLR_BY_IDX */
1382 zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_IDX(TEST_TEMP, 0),
1383 TEST_DMA_CTLR_1), "");
1384 zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_IDX(TEST_TEMP, 1),
1385 TEST_DMA_CTLR_2), "");
1386
1387 /* DT_DMAS_CTLR_BY_NAME */
1388 zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_NAME(TEST_TEMP, tx),
1389 TEST_DMA_CTLR_1), "");
1390 zassert_true(DT_SAME_NODE(DT_DMAS_CTLR_BY_NAME(TEST_TEMP, rx),
1391 TEST_DMA_CTLR_2), "");
1392
1393 /* DT_DMAS_CTLR */
1394 zassert_true(DT_SAME_NODE(DT_DMAS_CTLR(TEST_TEMP),
1395 TEST_DMA_CTLR_1), "");
1396
1397 /* DT_INST_DMAS_CTLR_BY_IDX */
1398 zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_IDX(0, 0),
1399 TEST_DMA_CTLR_1), "");
1400 zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_IDX(0, 1),
1401 TEST_DMA_CTLR_2), "");
1402
1403 /* DT_INST_DMAS_CTLR_BY_NAME */
1404 zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_NAME(0, tx),
1405 TEST_DMA_CTLR_1), "");
1406 zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR_BY_NAME(0, rx),
1407 TEST_DMA_CTLR_2), "");
1408
1409 /* DT_INST_DMAS_CTLR */
1410 zassert_true(DT_SAME_NODE(DT_INST_DMAS_CTLR(0), TEST_DMA_CTLR_1), "");
1411
1412 zassert_equal(DT_DMAS_CELL_BY_NAME(TEST_TEMP, rx, channel), 3, "");
1413 zassert_equal(DT_INST_DMAS_CELL_BY_NAME(0, rx, channel), 3, "");
1414 zassert_equal(DT_DMAS_CELL_BY_NAME(TEST_TEMP, rx, slot), 4, "");
1415 zassert_equal(DT_INST_DMAS_CELL_BY_NAME(0, rx, slot), 4, "");
1416
1417 zassert_equal(DT_DMAS_CELL_BY_IDX(TEST_TEMP, 1, channel), 3, "");
1418 zassert_equal(DT_INST_DMAS_CELL_BY_IDX(0, 1, channel), 3, "");
1419 zassert_equal(DT_DMAS_CELL_BY_IDX(TEST_TEMP, 1, slot), 4, "");
1420 zassert_equal(DT_INST_DMAS_CELL_BY_IDX(0, 1, slot), 4, "");
1421
1422 zassert_true(DT_DMAS_HAS_NAME(TEST_TEMP, tx), "");
1423 zassert_true(DT_INST_DMAS_HAS_NAME(0, tx), "");
1424 zassert_false(DT_DMAS_HAS_NAME(TEST_TEMP, output), "");
1425 zassert_false(DT_INST_DMAS_HAS_NAME(0, output), "");
1426
1427 zassert_true(DT_DMAS_HAS_IDX(TEST_TEMP, 1), "");
1428 zassert_true(DT_INST_DMAS_HAS_IDX(0, 1), "");
1429 zassert_false(DT_DMAS_HAS_IDX(TEST_TEMP, 2), "");
1430 zassert_false(DT_INST_DMAS_HAS_IDX(0, 2), "");
1431 }
1432
1433 #undef DT_DRV_COMPAT
1434 DT_FOREACH_STATUS_OKAY_VARGS(vnd_video_single_port, DEVICE_DT_DEFINE, NULL, NULL, NULL, NULL,
1435 POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, NULL);
1436 DT_FOREACH_STATUS_OKAY_VARGS(vnd_video_multi_port, DEVICE_DT_DEFINE, NULL, NULL, NULL, NULL,
1437 POST_KERNEL, CONFIG_APPLICATION_INIT_PRIORITY, NULL);
ZTEST(devicetree_api,test_video)1438 ZTEST(devicetree_api, test_video)
1439 {
1440 /* DT_INST_PORT_BY_ID */
1441 #define DT_DRV_COMPAT vnd_video_single_port
1442 zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 0),
1443 TEST_VIDEO0_PORT), "get port node of video0");
1444 zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(1, 0), TEST_VIDEO1_PORT),
1445 "get port node of video1");
1446 #undef DT_DRV_COMPAT
1447 #define DT_DRV_COMPAT vnd_video_multi_port
1448 zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 0), TEST_VIDEO2_PORT0),
1449 "get port@0 node of video2");
1450 zassert_true(DT_SAME_NODE(DT_INST_PORT_BY_ID(0, 1), TEST_VIDEO2_PORT1),
1451 "get port@1 node of video2");
1452 #undef DT_DRV_COMPAT
1453
1454 /* DT_INST_ENDPOINT_BY_ID */
1455 #define DT_DRV_COMPAT vnd_video_single_port
1456 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 0), TEST_VIDEO0_OUT),
1457 "get endpoint node of port node of video0");
1458 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(1, 0, 0), TEST_VIDEO1_OUT0),
1459 "get endpoint@0 node of port node of video1");
1460 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(1, 0, 1), TEST_VIDEO1_OUT1),
1461 "get endpoint@1 node of port node of video1");
1462 #undef DT_DRV_COMPAT
1463 #define DT_DRV_COMPAT vnd_video_multi_port
1464 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 0), TEST_VIDEO2_PORT0_IN0),
1465 "get endpoint@0 node of port@0 node of video2");
1466 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 0, 1), TEST_VIDEO2_PORT0_IN1),
1467 "get endpoint@1 node of port@0 node of video2");
1468 zassert_true(DT_SAME_NODE(DT_INST_ENDPOINT_BY_ID(0, 1, 0), TEST_VIDEO2_PORT1_IN),
1469 "get endpoint node of port@1 node of video2");
1470 #undef DT_DRV_COMPAT
1471
1472 /* DT_NODE_BY_ENDPOINT */
1473 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO0_OUT),
1474 TEST_VIDEO0), "get video0 node from its endpoint");
1475 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO1_OUT0), TEST_VIDEO1),
1476 "get video1 node from its endpoint@0");
1477 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO1_OUT1), TEST_VIDEO1),
1478 "get video1 node from its endpoint@1");
1479 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT0_IN0), TEST_VIDEO2),
1480 "get video2 node from its endpoint@0 at port@0");
1481 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT0_IN1), TEST_VIDEO2),
1482 "get video2 node from its endpoint@1 at port@0");
1483 zassert_true(DT_SAME_NODE(DT_NODE_BY_ENDPOINT(TEST_VIDEO2_PORT1_IN), TEST_VIDEO2),
1484 "get video2 node from its endpoint at port@1");
1485
1486 /* DT_NODE_REMOTE_DEVICE */
1487 #define DT_DRV_COMPAT vnd_video_single_port
1488 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO0_OUT), TEST_VIDEO2),
1489 "get remote device node of video0's endpoint");
1490 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO1_OUT0), TEST_VIDEO2),
1491 "get remote device node of video1's endpoint@0");
1492 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO1_OUT1), TEST_VIDEO2),
1493 "get remote device node of video1's endpoint@1");
1494 #undef DT_DRV_COMPAT
1495 #define DT_DRV_COMPAT vnd_video_multi_port
1496 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT0_IN0), TEST_VIDEO0),
1497 "get remote device node of video2's port@0 endpoint@0");
1498 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT0_IN1), TEST_VIDEO1),
1499 "get remote device node of video2's port@0 endpoint@1");
1500 zassert_true(DT_SAME_NODE(DT_NODE_REMOTE_DEVICE(TEST_VIDEO2_PORT1_IN), TEST_VIDEO1),
1501 "get remote device node of video2's port@1 endpoint");
1502 #undef DT_DRV_COMPAT
1503 }
1504
1505 #undef DT_DRV_COMPAT
1506 #define DT_DRV_COMPAT vnd_phandle_holder
ZTEST(devicetree_api,test_pwms)1507 ZTEST(devicetree_api, test_pwms)
1508 {
1509 /* DT_PWMS_CTLR_BY_IDX */
1510 zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_IDX(TEST_PH, 0),
1511 TEST_PWM_CTLR_1), "");
1512 zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_IDX(TEST_PH, 1),
1513 TEST_PWM_CTLR_2), "");
1514
1515 /* DT_PWMS_CTLR_BY_NAME */
1516 zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_NAME(TEST_PH, red),
1517 TEST_PWM_CTLR_1), "");
1518 zassert_true(DT_SAME_NODE(DT_PWMS_CTLR_BY_NAME(TEST_PH, green),
1519 TEST_PWM_CTLR_2), "");
1520
1521 /* DT_PWMS_CTLR */
1522 zassert_true(DT_SAME_NODE(DT_PWMS_CTLR(TEST_PH),
1523 TEST_PWM_CTLR_1), "");
1524
1525 /* DT_PWMS_CELL_BY_IDX */
1526 zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, channel), 5, "");
1527 zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, period), 100, "");
1528 zassert_equal(DT_PWMS_CELL_BY_IDX(TEST_PH, 1, flags), 1, "");
1529
1530 /* DT_PWMS_CELL_BY_NAME */
1531 zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, channel), 8, "");
1532 zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, period), 200, "");
1533 zassert_equal(DT_PWMS_CELL_BY_NAME(TEST_PH, red, flags), 3, "");
1534
1535 /* DT_PWMS_CELL */
1536 zassert_equal(DT_PWMS_CELL(TEST_PH, channel), 8, "");
1537 zassert_equal(DT_PWMS_CELL(TEST_PH, period), 200, "");
1538 zassert_equal(DT_PWMS_CELL(TEST_PH, flags), 3, "");
1539
1540 /* DT_PWMS_CHANNEL_BY_IDX */
1541 zassert_equal(DT_PWMS_CHANNEL_BY_IDX(TEST_PH, 1), 5, "");
1542
1543 /* DT_PWMS_CHANNEL_BY_NAME */
1544 zassert_equal(DT_PWMS_CHANNEL_BY_NAME(TEST_PH, green), 5, "");
1545
1546 /* DT_PWMS_CHANNEL */
1547 zassert_equal(DT_PWMS_CHANNEL(TEST_PH), 8, "");
1548
1549 /* DT_PWMS_PERIOD_BY_IDX */
1550 zassert_equal(DT_PWMS_PERIOD_BY_IDX(TEST_PH, 1), 100, "");
1551
1552 /* DT_PWMS_PERIOD_BY_NAME */
1553 zassert_equal(DT_PWMS_PERIOD_BY_NAME(TEST_PH, green), 100, "");
1554
1555 /* DT_PWMS_PERIOD */
1556 zassert_equal(DT_PWMS_PERIOD(TEST_PH), 200, "");
1557
1558 /* DT_PWMS_FLAGS_BY_IDX */
1559 zassert_equal(DT_PWMS_FLAGS_BY_IDX(TEST_PH, 1), 1, "");
1560
1561 /* DT_PWMS_FLAGS_BY_NAME */
1562 zassert_equal(DT_PWMS_FLAGS_BY_NAME(TEST_PH, green), 1, "");
1563
1564 /* DT_PWMS_FLAGS */
1565 zassert_equal(DT_PWMS_FLAGS(TEST_PH), 3, "");
1566
1567 /* DT_INST */
1568 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
1569
1570 /* DT_INST_PWMS_CTLR_BY_IDX */
1571 zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_IDX(0, 0),
1572 TEST_PWM_CTLR_1), "");
1573 zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_IDX(0, 1),
1574 TEST_PWM_CTLR_2), "");
1575
1576 /* DT_INST_PWMS_CTLR_BY_NAME */
1577 zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_NAME(0, red),
1578 TEST_PWM_CTLR_1), "");
1579 zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR_BY_NAME(0, green),
1580 TEST_PWM_CTLR_2), "");
1581
1582 /* DT_INST_PWMS_CTLR */
1583 zassert_true(DT_SAME_NODE(DT_INST_PWMS_CTLR(0), TEST_PWM_CTLR_1), "");
1584
1585 /* DT_INST_PWMS_CELL_BY_IDX */
1586 zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, channel), 5, "");
1587 zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, period), 100, "");
1588 zassert_equal(DT_INST_PWMS_CELL_BY_IDX(0, 1, flags), 1, "");
1589
1590 /* DT_INST_PWMS_CELL_BY_NAME */
1591 zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, channel), 5, "");
1592 zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, period), 100, "");
1593 zassert_equal(DT_INST_PWMS_CELL_BY_NAME(0, green, flags), 1, "");
1594
1595 /* DT_INST_PWMS_CELL */
1596 zassert_equal(DT_INST_PWMS_CELL(0, channel), 8, "");
1597 zassert_equal(DT_INST_PWMS_CELL(0, period), 200, "");
1598 zassert_equal(DT_INST_PWMS_CELL(0, flags), 3, "");
1599
1600 /* DT_INST_PWMS_CHANNEL_BY_IDX */
1601 zassert_equal(DT_INST_PWMS_CHANNEL_BY_IDX(0, 1), 5, "");
1602
1603 /* DT_INST_PWMS_CHANNEL_BY_NAME */
1604 zassert_equal(DT_INST_PWMS_CHANNEL_BY_NAME(0, green), 5, "");
1605
1606 /* DT_INST_PWMS_CHANNEL */
1607 zassert_equal(DT_INST_PWMS_CHANNEL(0), 8, "");
1608
1609 /* DT_INST_PWMS_PERIOD_BY_IDX */
1610 zassert_equal(DT_INST_PWMS_PERIOD_BY_IDX(0, 1), 100, "");
1611
1612 /* DT_INST_PWMS_PERIOD_BY_NAME */
1613 zassert_equal(DT_INST_PWMS_PERIOD_BY_NAME(0, red), 200, "");
1614
1615 /* DT_INST_PWMS_PERIOD */
1616 zassert_equal(DT_INST_PWMS_PERIOD(0), 200, "");
1617
1618 /* DT_INST_PWMS_FLAGS_BY_IDX */
1619 zassert_equal(DT_INST_PWMS_FLAGS_BY_IDX(0, 1), 1, "");
1620
1621 /* DT_INST_PWMS_FLAGS_BY_NAME */
1622 zassert_equal(DT_INST_PWMS_FLAGS_BY_NAME(0, red), 3, "");
1623
1624 /* DT_INST_PWMS_FLAGS */
1625 zassert_equal(DT_INST_PWMS_FLAGS(0), 3, "");
1626 }
1627
1628 #undef DT_DRV_COMPAT
1629 #define DT_DRV_COMPAT vnd_can_controller
ZTEST(devicetree_api,test_can)1630 ZTEST(devicetree_api, test_can)
1631 {
1632 /* DT_CAN_TRANSCEIVER_MIN_BITRATE */
1633 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 0), 10000, "");
1634 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 10000), 10000, "");
1635 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_0, 20000), 20000, "");
1636 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 0), 50000, "");
1637 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 50000), 50000, "");
1638 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_1, 100000), 100000, "");
1639 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 0), 0, "");
1640 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 10000), 10000, "");
1641 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_2, 20000), 20000, "");
1642 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 0), 0, "");
1643 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 30000), 30000, "");
1644 zassert_equal(DT_CAN_TRANSCEIVER_MIN_BITRATE(TEST_CAN_CTRL_3, 40000), 40000, "");
1645
1646 /* DT_INST_CAN_TRANSCEIVER_MIN_BITRATE */
1647 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 0), 10000, "");
1648 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 10000), 10000, "");
1649 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(0, 20000), 20000, "");
1650 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 0), 50000, "");
1651 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 50000), 50000, "");
1652 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(1, 100000), 100000, "");
1653 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 0), 0, "");
1654 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 10000), 10000, "");
1655 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(2, 20000), 20000, "");
1656 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 0), 0, "");
1657 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 30000), 30000, "");
1658 zassert_equal(DT_INST_CAN_TRANSCEIVER_MIN_BITRATE(3, 40000), 40000, "");
1659
1660 /* DT_CAN_TRANSCEIVER_MAX_BITRATE */
1661 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 1000000), 1000000, "");
1662 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 5000000), 5000000, "");
1663 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_0, 8000000), 5000000, "");
1664 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 125000), 125000, "");
1665 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 2000000), 2000000, "");
1666 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_1, 5000000), 2000000, "");
1667 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 125000), 125000, "");
1668 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 1000000), 1000000, "");
1669 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_2, 5000000), 1000000, "");
1670 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 125000), 125000, "");
1671 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 1000000), 1000000, "");
1672 zassert_equal(DT_CAN_TRANSCEIVER_MAX_BITRATE(TEST_CAN_CTRL_3, 5000000), 1000000, "");
1673
1674 /* DT_INST_CAN_TRANSCEIVER_MAX_BITRATE */
1675 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 1000000), 1000000, "");
1676 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 5000000), 5000000, "");
1677 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(0, 8000000), 5000000, "");
1678 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 125000), 125000, "");
1679 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 2000000), 2000000, "");
1680 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(1, 5000000), 2000000, "");
1681 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 125000), 125000, "");
1682 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 1000000), 1000000, "");
1683 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(2, 5000000), 1000000, "");
1684 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 125000), 125000, "");
1685 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 1000000), 1000000, "");
1686 zassert_equal(DT_INST_CAN_TRANSCEIVER_MAX_BITRATE(3, 5000000), 1000000, "");
1687 }
1688
ZTEST(devicetree_api,test_macro_names)1689 ZTEST(devicetree_api, test_macro_names)
1690 {
1691 /* white box */
1692 zassert_true(!strcmp(TO_STRING(DT_PATH(test, gpio_deadbeef)),
1693 "DT_N_S_test_S_gpio_deadbeef"), "");
1694 zassert_true(!strcmp(TO_STRING(DT_ALIAS(test_alias)),
1695 "DT_N_S_test_S_gpio_deadbeef"), "");
1696 zassert_true(!strcmp(TO_STRING(DT_NODELABEL(test_nodelabel)),
1697 "DT_N_S_test_S_gpio_deadbeef"), "");
1698 zassert_true(!strcmp(TO_STRING(DT_NODELABEL(test_nodelabel_allcaps)),
1699 "DT_N_S_test_S_gpio_deadbeef"), "");
1700
1701 #define CHILD_NODE_ID DT_CHILD(DT_PATH(test, i2c_11112222), test_i2c_dev_10)
1702 #define FULL_PATH_ID DT_PATH(test, i2c_11112222, test_i2c_dev_10)
1703
1704 zassert_true(!strcmp(TO_STRING(CHILD_NODE_ID),
1705 TO_STRING(FULL_PATH_ID)), "");
1706
1707 #undef CHILD_NODE_ID
1708 #undef FULL_PATH_ID
1709 }
1710
1711 static int a[] = DT_PROP(TEST_ARRAYS, a);
1712 static unsigned char b[] = DT_PROP(TEST_ARRAYS, b);
1713 static char *c[] = DT_PROP(TEST_ARRAYS, c);
1714
ZTEST(devicetree_api,test_arrays)1715 ZTEST(devicetree_api, test_arrays)
1716 {
1717 int ok;
1718
1719 zassert_equal(ARRAY_SIZE(a), 3, "");
1720 zassert_equal(ARRAY_SIZE(b), 4, "");
1721 zassert_equal(ARRAY_SIZE(c), 2, "");
1722
1723 zassert_equal(a[0], 1000, "");
1724 zassert_equal(a[1], 2000, "");
1725 zassert_equal(a[2], 3000, "");
1726
1727 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 0), "");
1728 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 1), "");
1729 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 2), "");
1730 zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 3), "");
1731
1732 /*
1733 * Verify that DT_PROP_HAS_IDX can be used with COND_CODE_1()
1734 * and COND_CODE_0(), i.e. its expansion is a literal 1 or 0,
1735 * not an equivalent expression that evaluates to 1 or 0.
1736 */
1737 ok = 0;
1738 COND_CODE_1(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 0), (ok = 1;), ());
1739 zassert_equal(ok, 1, "");
1740 ok = 0;
1741 COND_CODE_0(DT_PROP_HAS_IDX(TEST_ARRAYS, a, 3), (ok = 1;), ());
1742 zassert_equal(ok, 1, "");
1743
1744 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 0), a[0], "");
1745 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 1), a[1], "");
1746 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, a, 2), a[2], "");
1747 zassert_equal(DT_PROP_LAST(TEST_ARRAYS, a), a[2], "");
1748
1749 zassert_equal(DT_PROP_LEN(TEST_ARRAYS, a), 3, "");
1750
1751 zassert_equal(b[0], 0xaa, "");
1752 zassert_equal(b[1], 0xbb, "");
1753 zassert_equal(b[2], 0xcc, "");
1754 zassert_equal(b[3], 0xdd, "");
1755
1756 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 0), "");
1757 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 1), "");
1758 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 2), "");
1759 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 3), "");
1760 zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, b, 4), "");
1761
1762 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 0), b[0], "");
1763 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 1), b[1], "");
1764 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 2), b[2], "");
1765 zassert_equal(DT_PROP_BY_IDX(TEST_ARRAYS, b, 3), b[3], "");
1766
1767 zassert_equal(DT_PROP_LEN(TEST_ARRAYS, b), 4, "");
1768
1769 zassert_true(!strcmp(c[0], "bar"), "");
1770 zassert_true(!strcmp(c[1], "baz"), "");
1771
1772 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 0), "");
1773 zassert_true(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 1), "");
1774 zassert_false(DT_PROP_HAS_IDX(TEST_ARRAYS, c, 2), "");
1775
1776 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ARRAYS, c, 0), c[0]), "");
1777 zassert_true(!strcmp(DT_PROP_BY_IDX(TEST_ARRAYS, c, 1), c[1]), "");
1778
1779 zassert_equal(DT_PROP_LEN(TEST_ARRAYS, c), 2, "");
1780 }
1781
ZTEST(devicetree_api,test_foreach)1782 ZTEST(devicetree_api, test_foreach)
1783 {
1784 /*
1785 * We don't know what platform we are running on, so settle for
1786 * some basic checks related to nodes we know are in our overlay.
1787 */
1788 #define IS_ALIASES(node_id) + DT_SAME_NODE(DT_PATH(aliases), node_id)
1789 #define IS_DISABLED_GPIO(node_id) + DT_SAME_NODE(DT_NODELABEL(disabled_gpio), \
1790 node_id)
1791 zassert_equal(1, DT_FOREACH_NODE(IS_ALIASES), "");
1792 zassert_equal(1, DT_FOREACH_NODE(IS_DISABLED_GPIO), "");
1793 zassert_equal(1, DT_FOREACH_STATUS_OKAY_NODE(IS_ALIASES), "");
1794 zassert_equal(0, DT_FOREACH_STATUS_OKAY_NODE(IS_DISABLED_GPIO), "");
1795
1796 #define IS_ALIASES_VARGS(node_id, mul) + ((mul) * DT_SAME_NODE(DT_PATH(aliases), node_id))
1797 #define IS_DISABLED_GPIO_VARGS(node_id, mul) + ((mul) * \
1798 DT_SAME_NODE(DT_NODELABEL(disabled_gpio), node_id))
1799 zassert_equal(2, DT_FOREACH_NODE_VARGS(IS_ALIASES_VARGS, 2), "");
1800 zassert_equal(2, DT_FOREACH_NODE_VARGS(IS_DISABLED_GPIO_VARGS, 2), "");
1801 zassert_equal(2, DT_FOREACH_STATUS_OKAY_NODE_VARGS(IS_ALIASES_VARGS, 2), "");
1802 zassert_equal(0, DT_FOREACH_STATUS_OKAY_NODE_VARGS(IS_DISABLED_GPIO_VARGS, 2), "");
1803
1804
1805 #undef IS_ALIASES
1806 #undef IS_DISABLED_GPIO
1807 #undef IS_ALIASES_VARGS
1808 #undef IS_DISABLED_GPIO_VARGS
1809 }
1810
1811 #undef DT_DRV_COMPAT
1812 #define DT_DRV_COMPAT vnd_gpio_device
ZTEST(devicetree_api,test_foreach_status_okay)1813 ZTEST(devicetree_api, test_foreach_status_okay)
1814 {
1815 /*
1816 * For-each-node type macro tests.
1817 *
1818 * See test_foreach_prop_elem*() for tests of
1819 * for-each-property type macros.
1820 */
1821 unsigned int val;
1822 const char *str;
1823
1824 /* This should expand to something like:
1825 *
1826 * "/test/enum-0" "/test/enum-1"
1827 *
1828 * but there is no guarantee about the order of nodes in the
1829 * expansion, so we test both.
1830 */
1831 str = DT_FOREACH_STATUS_OKAY(vnd_enum_holder, DT_NODE_PATH);
1832 zassert_true(!strcmp(str, "/test/enum-0/test/enum-1") ||
1833 !strcmp(str, "/test/enum-1/test/enum-0"), "");
1834
1835 #undef MY_FN
1836 #define MY_FN(node_id, operator) DT_ENUM_IDX(node_id, val) operator
1837 /* This should expand to something like:
1838 *
1839 * 0 + 2 + 3
1840 *
1841 * and order of expansion doesn't matter, since we're adding
1842 * the values all up.
1843 */
1844 val = DT_FOREACH_STATUS_OKAY_VARGS(vnd_enum_holder, MY_FN, +) 3;
1845 zassert_equal(val, 5, "");
1846
1847 #undef MY_FN
1848 #define MY_FN(inst, compat, operator) DT_ENUM_IDX(DT_INST(inst, compat), val) operator
1849 /* This should expand to something like:
1850 *
1851 * 0 + 2 + 3
1852 *
1853 * and order of expansion doesn't matter, since we're adding
1854 * the values all up.
1855 */
1856 val = DT_COMPAT_FOREACH_STATUS_OKAY_VARGS(vnd_enum_holder, MY_FN, +) 3;
1857 zassert_equal(val, 5, "");
1858
1859 /*
1860 * Make sure DT_INST_FOREACH_STATUS_OKAY can be called from functions
1861 * using macros with side effects in the current scope.
1862 */
1863 val = 0;
1864 #define INC(inst_ignored) do { val++; } while (0);
1865 DT_INST_FOREACH_STATUS_OKAY(INC)
1866 zassert_equal(val, 2, "");
1867 #undef INC
1868
1869 val = 0;
1870 #define INC_ARG(arg) do { val++; val += arg; } while (0)
1871 #define INC(inst_ignored, arg) INC_ARG(arg);
1872 DT_INST_FOREACH_STATUS_OKAY_VARGS(INC, 1)
1873 zassert_equal(val, 4, "");
1874 #undef INC_ARG
1875 #undef INC
1876
1877 /*
1878 * Make sure DT_INST_FOREACH_STATUS_OKAY works with 0 instances, and does
1879 * not expand its argument at all.
1880 */
1881 #undef DT_DRV_COMPAT
1882 #define DT_DRV_COMPAT xxxx
1883 #define BUILD_BUG_ON_EXPANSION (there is a bug in devicetree.h)
1884 DT_INST_FOREACH_STATUS_OKAY(BUILD_BUG_ON_EXPANSION)
1885 #undef BUILD_BUG_ON_EXPANSION
1886
1887 #undef DT_DRV_COMPAT
1888 #define DT_DRV_COMPAT xxxx
1889 #define BUILD_BUG_ON_EXPANSION(arg) (there is a bug in devicetree.h)
1890 DT_INST_FOREACH_STATUS_OKAY_VARGS(BUILD_BUG_ON_EXPANSION, 1)
1891 #undef BUILD_BUG_ON_EXPANSION
1892 }
1893
ZTEST(devicetree_api,test_foreach_nodelabel)1894 ZTEST(devicetree_api, test_foreach_nodelabel)
1895 {
1896 #undef DT_DRV_COMPAT
1897 #define DT_DRV_COMPAT vnd_adc_temp_sensor
1898 #define ENTRY(nodelabel) enum_ ## nodelabel,
1899 #define VAR_PLUS(nodelabel, to_add) int nodelabel ## _added = enum_ ## nodelabel + to_add;
1900
1901 /* DT_FOREACH_NODELABEL */
1902 enum {
1903 DT_FOREACH_NODELABEL(DT_NODELABEL(test_nodelabel), ENTRY)
1904 };
1905 zassert_equal(enum_test_nodelabel, 0, "");
1906 zassert_equal(enum_TEST_NODELABEL_ALLCAPS, 1, "");
1907 zassert_equal(enum_test_gpio_1, 2, "");
1908
1909 /* DT_FOREACH_NODELABEL_VARGS */
1910 DT_FOREACH_NODELABEL_VARGS(DT_NODELABEL(test_nodelabel), VAR_PLUS, 1);
1911 zassert_equal(test_nodelabel_added, 1, "");
1912 zassert_equal(TEST_NODELABEL_ALLCAPS_added, 2, "");
1913 zassert_equal(test_gpio_1_added, 3, "");
1914
1915 /* DT_NODELABEL_STRING_ARRAY is tested here since it's closely related */
1916 const char *nodelabels[] = DT_NODELABEL_STRING_ARRAY(DT_NODELABEL(test_nodelabel));
1917
1918 zassert_equal(ARRAY_SIZE(nodelabels), 3);
1919 zassert_true(!strcmp(nodelabels[0], "test_nodelabel"), "");
1920 zassert_true(!strcmp(nodelabels[1], "TEST_NODELABEL_ALLCAPS"), "");
1921 zassert_true(!strcmp(nodelabels[2], "test_gpio_1"), "");
1922
1923 /* DT_NUM_NODELABELS */
1924 zassert_equal(DT_NUM_NODELABELS(DT_NODELABEL(test_nodelabel)), 3, "");
1925 zassert_equal(DT_NUM_NODELABELS(DT_PATH(chosen)), 0, "");
1926 zassert_equal(DT_NUM_NODELABELS(DT_ROOT), 0, "");
1927
1928 /* DT_INST_FOREACH_NODELABEL */
1929 enum {
1930 DT_INST_FOREACH_NODELABEL(0, ENTRY)
1931 };
1932 zassert_equal(enum_test_temp_sensor, 0, "");
1933
1934 /* DT_INST_FOREACH_NODELABEL_VARGS */
1935 DT_INST_FOREACH_NODELABEL_VARGS(0, VAR_PLUS, 1);
1936 zassert_equal(test_temp_sensor_added, 1, "");
1937
1938 /* DT_INST_NODELABEL_STRING_ARRAY */
1939 const char *inst_nodelabels[] = DT_INST_NODELABEL_STRING_ARRAY(0);
1940
1941 zassert_equal(ARRAY_SIZE(inst_nodelabels), 1);
1942 zassert_true(!strcmp(inst_nodelabels[0], "test_temp_sensor"), "");
1943
1944 /* DT_INST_NUM_NODELABELS */
1945 zassert_equal(DT_INST_NUM_NODELABELS(0), 1, "");
1946
1947 #undef VAR_PLUS
1948 #undef ENTRY
1949 #undef DT_DRV_COMPAT
1950 }
1951
ZTEST(devicetree_api,test_foreach_prop_elem)1952 ZTEST(devicetree_api, test_foreach_prop_elem)
1953 {
1954 #define TIMES_TWO(node_id, prop, idx) \
1955 (2 * DT_PROP_BY_IDX(node_id, prop, idx)),
1956 #define BY_IDX_COMMA(node_id, prop, idx) DT_PROP_BY_IDX(node_id, prop, idx),
1957
1958 int array_a[] = {
1959 DT_FOREACH_PROP_ELEM(TEST_ARRAYS, a, TIMES_TWO)
1960 };
1961
1962 zassert_equal(ARRAY_SIZE(array_a), 3, "");
1963 zassert_equal(array_a[0], 2000, "");
1964 zassert_equal(array_a[1], 4000, "");
1965 zassert_equal(array_a[2], 6000, "");
1966
1967 int array_b[] = {
1968 DT_FOREACH_PROP_ELEM(TEST_ARRAYS, b, TIMES_TWO)
1969 };
1970
1971 zassert_equal(ARRAY_SIZE(array_b), 4, "");
1972 zassert_equal(array_b[0], 2 * 0xAA, "");
1973 zassert_equal(array_b[1], 2 * 0xBB, "");
1974 zassert_equal(array_b[2], 2 * 0xCC, "");
1975 zassert_equal(array_b[3], 2 * 0xDD, "");
1976
1977 static const char * const array_c[] = {
1978 DT_FOREACH_PROP_ELEM(TEST_ARRAYS, c, BY_IDX_COMMA)
1979 };
1980
1981 zassert_equal(ARRAY_SIZE(array_c), 2, "");
1982 zassert_true(!strcmp(array_c[0], "bar"), "");
1983 zassert_true(!strcmp(array_c[1], "baz"), "");
1984
1985 static const char * const array_val[] = {
1986 DT_FOREACH_PROP_ELEM(TEST_ENUM_0, val, BY_IDX_COMMA)
1987 };
1988
1989 zassert_equal(ARRAY_SIZE(array_val), 1, "");
1990 zassert_true(!strcmp(array_val[0], "zero"), "");
1991
1992 static const char * const string_zephyr_user[] = {
1993 DT_FOREACH_PROP_ELEM(ZEPHYR_USER, string, BY_IDX_COMMA)
1994 };
1995
1996 zassert_equal(ARRAY_SIZE(string_zephyr_user), 1, "");
1997 zassert_true(!strcmp(string_zephyr_user[0], "foo"), "");
1998
1999 #undef BY_IDX_COMMA
2000
2001 #define PATH_COMMA(node_id, prop, idx) \
2002 DT_NODE_PATH(DT_PROP_BY_IDX(node_id, prop, idx)),
2003
2004 static const char * const array_ph[] = {
2005 DT_FOREACH_PROP_ELEM(TEST_PH, ph, PATH_COMMA)
2006 };
2007
2008 zassert_equal(ARRAY_SIZE(array_ph), 1, "");
2009 zassert_true(!strcmp(array_ph[0], DT_NODE_PATH(TEST_GPIO_1)), "");
2010
2011 static const char * const array_zephyr_user_ph[] = {
2012 DT_FOREACH_PROP_ELEM(ZEPHYR_USER, ph, PATH_COMMA)
2013 };
2014
2015 zassert_equal(ARRAY_SIZE(array_zephyr_user_ph), 1, "");
2016 zassert_true(!strcmp(array_zephyr_user_ph[0],
2017 DT_NODE_PATH(TEST_GPIO_1)), "");
2018
2019 static const char * const array_phs[] = {
2020 DT_FOREACH_PROP_ELEM(TEST_PH, phs, PATH_COMMA)
2021 };
2022
2023 zassert_equal(ARRAY_SIZE(array_phs), 2, "");
2024 zassert_true(!strcmp(array_phs[0], DT_NODE_PATH(TEST_I2C)), "");
2025 zassert_true(!strcmp(array_phs[1], DT_NODE_PATH(TEST_SPI)), "");
2026
2027 #undef PATH_COMMA
2028
2029 #define PIN_COMMA(node_id, prop, idx) DT_GPIO_PIN_BY_IDX(node_id, prop, idx),
2030
2031 int array_gpios[] = {
2032 DT_FOREACH_PROP_ELEM(TEST_PH, gpios, PIN_COMMA)
2033 };
2034
2035 zassert_equal(ARRAY_SIZE(array_gpios), 2, "");
2036 zassert_equal(array_gpios[0], 10, "");
2037 zassert_equal(array_gpios[1], 30, "");
2038
2039 #undef PATH_COMMA
2040
2041 int array_sep[] = {
2042 DT_FOREACH_PROP_ELEM_SEP(TEST_ARRAYS, a, DT_PROP_BY_IDX, (,))
2043 };
2044
2045 zassert_equal(ARRAY_SIZE(array_sep), 3, "");
2046 zassert_equal(array_sep[0], 1000, "");
2047 zassert_equal(array_sep[1], 2000, "");
2048 zassert_equal(array_sep[2], 3000, "");
2049
2050 #undef DT_DRV_COMPAT
2051 #define DT_DRV_COMPAT vnd_array_holder
2052
2053 int inst_array[] = {
2054 DT_INST_FOREACH_PROP_ELEM(0, a, TIMES_TWO)
2055 };
2056
2057 zassert_equal(ARRAY_SIZE(inst_array), ARRAY_SIZE(array_a), "");
2058 zassert_equal(inst_array[0], array_a[0], "");
2059 zassert_equal(inst_array[1], array_a[1], "");
2060 zassert_equal(inst_array[2], array_a[2], "");
2061
2062 int inst_array_sep[] = {
2063 DT_INST_FOREACH_PROP_ELEM_SEP(0, a, DT_PROP_BY_IDX, (,))
2064 };
2065
2066 zassert_equal(ARRAY_SIZE(inst_array_sep), ARRAY_SIZE(array_sep), "");
2067 zassert_equal(inst_array_sep[0], array_sep[0], "");
2068 zassert_equal(inst_array_sep[1], array_sep[1], "");
2069 zassert_equal(inst_array_sep[2], array_sep[2], "");
2070 #undef TIMES_TWO
2071 }
2072
ZTEST(devicetree_api,test_foreach_prop_elem_varg)2073 ZTEST(devicetree_api, test_foreach_prop_elem_varg)
2074 {
2075 #define TIMES_TWO_ADD(node_id, prop, idx, arg) \
2076 ((2 * DT_PROP_BY_IDX(node_id, prop, idx)) + arg),
2077
2078 int array[] = {
2079 DT_FOREACH_PROP_ELEM_VARGS(TEST_ARRAYS, a, TIMES_TWO_ADD, 3)
2080 };
2081
2082 zassert_equal(ARRAY_SIZE(array), 3, "");
2083 zassert_equal(array[0], 2003, "");
2084 zassert_equal(array[1], 4003, "");
2085 zassert_equal(array[2], 6003, "");
2086
2087 #define PROP_PLUS_ARG(node_id, prop, idx, arg) \
2088 (DT_PROP_BY_IDX(node_id, prop, idx) + arg)
2089
2090 int array_sep[] = {
2091 DT_FOREACH_PROP_ELEM_SEP_VARGS(TEST_ARRAYS, a, PROP_PLUS_ARG,
2092 (,), 3)
2093 };
2094
2095 zassert_equal(ARRAY_SIZE(array_sep), 3, "");
2096 zassert_equal(array_sep[0], 1003, "");
2097 zassert_equal(array_sep[1], 2003, "");
2098 zassert_equal(array_sep[2], 3003, "");
2099
2100 #undef DT_DRV_COMPAT
2101 #define DT_DRV_COMPAT vnd_array_holder
2102
2103 int inst_array[] = {
2104 DT_INST_FOREACH_PROP_ELEM_VARGS(0, a, TIMES_TWO_ADD, 3)
2105 };
2106
2107 zassert_equal(ARRAY_SIZE(inst_array), ARRAY_SIZE(array), "");
2108 zassert_equal(inst_array[0], array[0], "");
2109 zassert_equal(inst_array[1], array[1], "");
2110 zassert_equal(inst_array[2], array[2], "");
2111
2112 int inst_array_sep[] = {
2113 DT_INST_FOREACH_PROP_ELEM_SEP_VARGS(0, a, PROP_PLUS_ARG, (,),
2114 3)
2115 };
2116
2117 zassert_equal(ARRAY_SIZE(inst_array_sep), ARRAY_SIZE(array_sep), "");
2118 zassert_equal(inst_array_sep[0], array_sep[0], "");
2119 zassert_equal(inst_array_sep[1], array_sep[1], "");
2120 zassert_equal(inst_array_sep[2], array_sep[2], "");
2121 #undef TIMES_TWO
2122 }
2123
2124 struct test_gpio_info {
2125 uint32_t reg_addr;
2126 uint32_t reg_len;
2127 };
2128
2129 struct test_gpio_data {
2130 bool init_called;
2131 bool is_gpio_ctlr;
2132 };
2133
test_gpio_init(const struct device * dev)2134 static int test_gpio_init(const struct device *dev)
2135 {
2136 struct test_gpio_data *data = dev->data;
2137
2138 data->init_called = 1;
2139 return 0;
2140 }
2141
2142 #undef DT_DRV_COMPAT
2143 #define DT_DRV_COMPAT vnd_gpio_device
2144
2145 static DEVICE_API(gpio, test_api);
2146
2147 #define TEST_GPIO_INIT(num) \
2148 static struct test_gpio_data gpio_data_##num = { \
2149 .is_gpio_ctlr = DT_INST_PROP(num, \
2150 gpio_controller), \
2151 }; \
2152 static const struct test_gpio_info gpio_info_##num = { \
2153 .reg_addr = DT_INST_REG_ADDR(num), \
2154 .reg_len = DT_INST_REG_SIZE(num), \
2155 }; \
2156 DEVICE_DT_INST_DEFINE(num, \
2157 test_gpio_init, \
2158 NULL, \
2159 &gpio_data_##num, \
2160 &gpio_info_##num, \
2161 POST_KERNEL, \
2162 CONFIG_APPLICATION_INIT_PRIORITY, \
2163 &test_api);
2164
2165 DT_INST_FOREACH_STATUS_OKAY(TEST_GPIO_INIT)
2166
ZTEST(devicetree_api,test_devices)2167 ZTEST(devicetree_api, test_devices)
2168 {
2169 const struct device *devs[2] = { DEVICE_DT_INST_GET(0), DEVICE_DT_INST_GET(1) };
2170 const struct device *dev_abcd;
2171 struct test_gpio_data *data_dev0;
2172 struct test_gpio_data *data_dev1;
2173 const struct test_gpio_info *config_abdc;
2174
2175 zassert_equal(DT_NUM_INST_STATUS_OKAY(vnd_gpio_device), 2, "");
2176
2177 data_dev0 = devs[0]->data;
2178 data_dev1 = devs[1]->data;
2179
2180 zassert_not_null(devs[0], "");
2181 zassert_not_null(devs[1], "");
2182
2183 zassert_true(data_dev0->is_gpio_ctlr, "");
2184 zassert_true(data_dev1->is_gpio_ctlr, "");
2185 zassert_true(data_dev0->init_called, "");
2186 zassert_true(data_dev1->init_called, "");
2187
2188 dev_abcd = DEVICE_DT_GET(TEST_ABCD1234);
2189 config_abdc = dev_abcd->config;
2190 zassert_not_null(dev_abcd, "");
2191 zassert_equal(config_abdc->reg_addr, 0xabcd1234, "");
2192 zassert_equal(config_abdc->reg_len, 0x500, "");
2193 }
2194
ZTEST(devicetree_api,test_cs_gpios)2195 ZTEST(devicetree_api, test_cs_gpios)
2196 {
2197 zassert_equal(DT_SPI_HAS_CS_GPIOS(TEST_SPI_NO_CS), 0, "");
2198 zassert_equal(DT_SPI_NUM_CS_GPIOS(TEST_SPI_NO_CS), 0, "");
2199
2200 zassert_equal(DT_SPI_HAS_CS_GPIOS(TEST_SPI), 1, "");
2201 zassert_equal(DT_SPI_NUM_CS_GPIOS(TEST_SPI), 3, "");
2202
2203 zassert_equal(DT_DEP_ORD(DT_SPI_DEV_CS_GPIOS_CTLR(TEST_SPI_DEV_0)),
2204 DT_DEP_ORD(DT_NODELABEL(test_gpio_1)),
2205 "dev 0 cs gpio controller");
2206 zassert_equal(DT_SPI_DEV_CS_GPIOS_PIN(TEST_SPI_DEV_0), 0x10, "");
2207 zassert_equal(DT_SPI_DEV_CS_GPIOS_FLAGS(TEST_SPI_DEV_0), 0x20, "");
2208 }
2209
ZTEST(devicetree_api,test_chosen)2210 ZTEST(devicetree_api, test_chosen)
2211 {
2212 zassert_equal(DT_HAS_CHOSEN(ztest_xxxx), 0, "");
2213 zassert_equal(DT_HAS_CHOSEN(ztest_gpio), 1, "");
2214 zassert_true(!strcmp(TO_STRING(DT_CHOSEN(ztest_gpio)),
2215 "DT_N_S_test_S_gpio_deadbeef"), "");
2216 }
2217
2218 #define TO_MY_ENUM(token) TO_MY_ENUM_2(token) /* force another expansion */
2219 #define TO_MY_ENUM_2(token) MY_ENUM_ ## token
ZTEST(devicetree_api,test_enums)2220 ZTEST(devicetree_api, test_enums)
2221 {
2222 enum {
2223 MY_ENUM_zero = 0xff,
2224 MY_ENUM_ZERO = 0xaa,
2225 };
2226
2227 /* DT_ENUM_IDX and DT_ENUM_HAS_VALUE on string enum */
2228 zassert_equal(DT_ENUM_IDX(TEST_ENUM_0, val), 0, "0");
2229 zassert_true(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, zero), "");
2230 zassert_false(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, one), "");
2231 zassert_false(DT_ENUM_HAS_VALUE(TEST_ENUM_0, val, two), "");
2232
2233 /* DT_ENUM_IDX and DT_ENUM_HAS_VALUE on int enum */
2234 zassert_equal(DT_ENUM_IDX(DT_NODELABEL(test_enum_int_default_0), val), 0, "0");
2235 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 5), "");
2236 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 6), "");
2237 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_default_0), val, 7), "");
2238
2239 /* DT_ENUM_IDX_BY_IDX and DT_ENUM_HAS_VALUE_BY_IDX on string-array enum */
2240 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0), 0);
2241 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1), 3);
2242 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2), 0);
2243 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, foo));
2244 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, bar));
2245 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, baz));
2246 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 0, zoo));
2247 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, zoo));
2248 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, foo));
2249 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, bar));
2250 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 1, baz));
2251 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, foo));
2252 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, baz));
2253 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, bar));
2254 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_string_array), val, 2, zoo));
2255
2256 /* DT_ENUM_HAS_VALUE on string-array enum */
2257 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, foo));
2258 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, zoo));
2259 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, foo));
2260 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_string_array), val, baz));
2261
2262 /* DT_ENUM_IDX_BY_IDX and DT_ENUM_HAS_VALUE_BY_IDX on int-array enum */
2263 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0), 3);
2264 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1), 4);
2265 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2), 3);
2266 zassert_equal(DT_ENUM_IDX_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3), 7);
2267 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 4));
2268 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 5));
2269 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 0, 6));
2270 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 3));
2271 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 0));
2272 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 1, 1));
2273 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 4));
2274 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 3));
2275 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 2, 7));
2276 zassert_true(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 0));
2277 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 2));
2278 zassert_false(DT_ENUM_HAS_VALUE_BY_IDX(DT_NODELABEL(test_enum_int_array), val, 3, 1));
2279
2280 /* DT_ENUM_HAS_VALUE on int-array enum */
2281 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 0));
2282 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 1));
2283 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 2));
2284 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 3));
2285 zassert_true(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 4));
2286 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 5));
2287 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 6));
2288 zassert_false(DT_ENUM_HAS_VALUE(DT_NODELABEL(test_enum_int_array), val, 7));
2289 }
2290 #undef TO_MY_ENUM
2291 #undef TO_MY_ENUM_2
2292
ZTEST(devicetree_api,test_enums_required_false)2293 ZTEST(devicetree_api, test_enums_required_false)
2294 {
2295 /* DT_ENUM_IDX_OR on string value */
2296 zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_default_0), val, 2),
2297 1, "");
2298 zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_default_1), val, 2),
2299 2, "");
2300 /* DT_ENUM_IDX_OR on int value */
2301 zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_int_default_0),
2302 val, 4),
2303 0, "");
2304 zassert_equal(DT_ENUM_IDX_OR(DT_NODELABEL(test_enum_int_default_1),
2305 val, 4),
2306 4, "");
2307 /* DT_ENUM_IDX_OR on string-array value */
2308 zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_string_array), val, 0, 2),
2309 0, "");
2310 zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_string_array), val, 5, 2),
2311 2, "");
2312 /* DT_ENUM_IDX_OR on int-array value */
2313 zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_int_array),
2314 val, 0, 7),
2315 3, "");
2316 zassert_equal(DT_ENUM_IDX_BY_IDX_OR(DT_NODELABEL(test_enum_int_array),
2317 val, 4, 7),
2318 7, "");
2319 }
2320
ZTEST(devicetree_api,test_inst_enums)2321 ZTEST(devicetree_api, test_inst_enums)
2322 {
2323 #undef DT_DRV_COMPAT
2324 #define DT_DRV_COMPAT vnd_enum_holder_inst
2325 zassert_equal(DT_INST_ENUM_IDX(0, val), 0, "");
2326 zassert_equal(DT_INST_ENUM_IDX_OR(0, val, 2), 0, "");
2327 zassert_true(DT_INST_ENUM_HAS_VALUE(0, val, zero), "");
2328 zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, one), "");
2329 zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, two), "");
2330
2331 #undef DT_DRV_COMPAT
2332 #define DT_DRV_COMPAT vnd_enum_required_false_holder_inst
2333 zassert_equal(DT_INST_ENUM_IDX_OR(0, val, 2), 2, "");
2334 zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, zero), "");
2335 zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, one), "");
2336 zassert_false(DT_INST_ENUM_HAS_VALUE(0, val, two), "");
2337
2338 /* Also add tests for these:
2339 * DT_INST_ENUM_IDX_BY_IDX
2340 * DT_INST_ENUM_IDX_BY_IDX_OR
2341 * DT_INST_ENUM_HAS_VALUE_BY_IDX
2342 */
2343 #undef DT_DRV_COMPAT
2344 #define DT_DRV_COMPAT vnd_enum_string_array_holder
2345 zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 0), 0, "");
2346 zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 1), 3, "");
2347 zassert_true(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 0, foo), "");
2348 zassert_false(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 0, zoo), "");
2349 zassert_true(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 1, zoo), "");
2350 zassert_false(DT_INST_ENUM_HAS_VALUE_BY_IDX(0, val, 2, baz), "");
2351 zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 0, 10), 0, "");
2352 zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 4, 10), 10, "");
2353
2354 #undef DT_DRV_COMPAT
2355 #define DT_DRV_COMPAT vnd_enum_int_array_holder
2356 zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 0), 3, "");
2357 zassert_equal(DT_INST_ENUM_IDX_BY_IDX(0, val, 3), 7, "");
2358 zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 1, 10), 4, "");
2359 zassert_equal(DT_INST_ENUM_IDX_BY_IDX_OR(0, val, 123654, 10), 10, "");
2360 }
2361
2362 #undef DT_DRV_COMPAT
2363 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_clocks)2364 ZTEST(devicetree_api, test_clocks)
2365 {
2366 /* DT_CLOCKS_CTLR_BY_IDX */
2367 zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR_BY_IDX(TEST_TEMP, 1),
2368 DT_NODELABEL(test_fixed_clk)), "");
2369
2370 /* DT_CLOCKS_CTLR */
2371 zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR(TEST_TEMP),
2372 DT_NODELABEL(test_clk)), "");
2373
2374 /* DT_CLOCKS_CTLR_BY_NAME */
2375 zassert_true(DT_SAME_NODE(DT_CLOCKS_CTLR_BY_NAME(TEST_TEMP, clk_b),
2376 DT_NODELABEL(test_clk)), "");
2377
2378 /* DT_NUM_CLOCKS */
2379 zassert_equal(DT_NUM_CLOCKS(TEST_TEMP), 3, "");
2380
2381 /* DT_CLOCKS_HAS_IDX */
2382 zassert_true(DT_CLOCKS_HAS_IDX(TEST_TEMP, 2), "");
2383 zassert_false(DT_CLOCKS_HAS_IDX(TEST_TEMP, 3), "");
2384
2385 /* DT_CLOCKS_HAS_NAME */
2386 zassert_true(DT_CLOCKS_HAS_NAME(TEST_TEMP, clk_a), "");
2387 zassert_false(DT_CLOCKS_HAS_NAME(TEST_TEMP, clk_z), "");
2388
2389 /* DT_CLOCKS_CELL_BY_IDX */
2390 zassert_equal(DT_CLOCKS_CELL_BY_IDX(TEST_TEMP, 2, bits), 2, "");
2391 zassert_equal(DT_CLOCKS_CELL_BY_IDX(TEST_TEMP, 2, bus), 8, "");
2392
2393 /* DT_CLOCKS_CELL_BY_NAME */
2394 zassert_equal(DT_CLOCKS_CELL_BY_NAME(TEST_TEMP, clk_a, bits), 7, "");
2395 zassert_equal(DT_CLOCKS_CELL_BY_NAME(TEST_TEMP, clk_b, bus), 8, "");
2396
2397 /* DT_CLOCKS_CELL */
2398 zassert_equal(DT_CLOCKS_CELL(TEST_TEMP, bits), 7, "");
2399 zassert_equal(DT_CLOCKS_CELL(TEST_TEMP, bus), 3, "");
2400
2401 /* clock-freq on fixed clock */
2402 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_TEMP, clocks, 1,
2403 clock_frequency),
2404 25000000, "");
2405
2406 /* DT_INST */
2407 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
2408
2409 /* DT_INST_CLOCKS_CTLR_BY_IDX */
2410 zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR_BY_IDX(0, 1),
2411 DT_NODELABEL(test_fixed_clk)), "");
2412
2413 /* DT_INST_CLOCKS_CTLR */
2414 zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR(0),
2415 DT_NODELABEL(test_clk)), "");
2416
2417 /* DT_INST_CLOCKS_CTLR_BY_NAME */
2418 zassert_true(DT_SAME_NODE(DT_INST_CLOCKS_CTLR_BY_NAME(0, clk_b),
2419 DT_NODELABEL(test_clk)), "");
2420
2421 /* DT_INST_NUM_CLOCKS */
2422 zassert_equal(DT_INST_NUM_CLOCKS(0), 3, "");
2423
2424 /* DT_INST_CLOCKS_HAS_IDX */
2425 zassert_true(DT_INST_CLOCKS_HAS_IDX(0, 2), "");
2426 zassert_false(DT_INST_CLOCKS_HAS_IDX(0, 3), "");
2427
2428 /* DT_INST_CLOCKS_HAS_NAME */
2429 zassert_true(DT_INST_CLOCKS_HAS_NAME(0, clk_a), "");
2430 zassert_false(DT_INST_CLOCKS_HAS_NAME(0, clk_z), "");
2431
2432 /* DT_INST_CLOCKS_CELL_BY_IDX */
2433 zassert_equal(DT_INST_CLOCKS_CELL_BY_IDX(0, 2, bits), 2, "");
2434 zassert_equal(DT_INST_CLOCKS_CELL_BY_IDX(0, 2, bus), 8, "");
2435
2436 /* DT_INST_CLOCKS_CELL_BY_NAME */
2437 zassert_equal(DT_INST_CLOCKS_CELL_BY_NAME(0, clk_a, bits), 7, "");
2438 zassert_equal(DT_INST_CLOCKS_CELL_BY_NAME(0, clk_b, bus), 8, "");
2439
2440 /* DT_INST_CLOCKS_CELL */
2441 zassert_equal(DT_INST_CLOCKS_CELL(0, bits), 7, "");
2442 zassert_equal(DT_INST_CLOCKS_CELL(0, bus), 3, "");
2443
2444 /* clock-freq on fixed clock */
2445 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, clocks, 1,
2446 clock_frequency),
2447 25000000, "");
2448 }
2449
2450 #undef DT_DRV_COMPAT
2451 #define DT_DRV_COMPAT vnd_spi_device
ZTEST(devicetree_api,test_parent)2452 ZTEST(devicetree_api, test_parent)
2453 {
2454 zassert_true(DT_SAME_NODE(DT_PARENT(TEST_SPI_DEV_0), TEST_SPI_BUS_0), "");
2455
2456 /*
2457 * The parent's label for the first instance of vnd,spi-device,
2458 * child of TEST_SPI, is the same as TEST_SPI.
2459 */
2460 zassert_true(DT_SAME_NODE(DT_INST_PARENT(0), TEST_SPI), "");
2461 /*
2462 * We should be able to use DT_PARENT() even with nodes, like /test,
2463 * that have no matching compatible.
2464 */
2465 zassert_true(DT_SAME_NODE(DT_CHILD(DT_PARENT(TEST_SPI_BUS_0), spi_33334444),
2466 TEST_SPI_BUS_0), "");
2467 }
2468
2469 #undef DT_DRV_COMPAT
2470 #define DT_DRV_COMPAT vnd_parent_bindings
ZTEST(devicetree_api,test_parent_nodes_list)2471 ZTEST(devicetree_api, test_parent_nodes_list)
2472 {
2473 /* When traversing upwards, there are no fixed attributes and labels */
2474 #define TEST_FUNC(parent) { /* No operation */ }
2475 #define TEST_FUNC_AND_COMMA(parent) TEST_FUNC(parent),
2476
2477 struct vnd_parent_binding {
2478 int val;
2479 };
2480
2481 struct vnd_parent_binding vals_a[] = {
2482 DT_FOREACH_ANCESTOR(DT_NODELABEL(test_parent_a), TEST_FUNC_AND_COMMA)};
2483
2484 struct vnd_parent_binding vals_b[] = {
2485 DT_FOREACH_ANCESTOR(DT_NODELABEL(test_parent_b), TEST_FUNC_AND_COMMA)};
2486
2487 zassert_equal(ARRAY_SIZE(vals_a), 3, "");
2488 zassert_equal(ARRAY_SIZE(vals_b), 4, "");
2489
2490 #undef TEST_FUNC_AND_COMMA
2491 #undef TEST_FUNC
2492 }
2493
2494 #undef DT_DRV_COMPAT
2495 #define DT_DRV_COMPAT vnd_i2c_mux_controller
ZTEST(devicetree_api,test_gparent)2496 ZTEST(devicetree_api, test_gparent)
2497 {
2498 zassert_true(DT_SAME_NODE(DT_GPARENT(TEST_I2C_MUX_CTLR_1), TEST_I2C), "");
2499 zassert_true(DT_SAME_NODE(DT_INST_GPARENT(0), TEST_I2C), "");
2500 zassert_true(DT_SAME_NODE(DT_INST_GPARENT(1), TEST_I2C), "");
2501 }
2502
2503 #undef DT_DRV_COMPAT
2504 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_children)2505 ZTEST(devicetree_api, test_children)
2506 {
2507 zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_a),
2508 val), 0, "");
2509 zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_b),
2510 val), 1, "");
2511 zassert_equal(DT_PROP(DT_CHILD(DT_NODELABEL(test_children), child_c),
2512 val), 2, "");
2513
2514 zassert_equal(DT_PROP(DT_INST_CHILD(0, child_a), val), 0, "");
2515 zassert_equal(DT_PROP(DT_INST_CHILD(0, child_b), val), 1, "");
2516 zassert_equal(DT_PROP(DT_INST_CHILD(0, child_c), val), 2, "");
2517
2518 zassert_equal(DT_PROP(DT_CHILD_BY_UNIT_ADDR_INT(DT_NODELABEL(test_children), 10), val), 0);
2519 zassert_equal(DT_PROP(DT_CHILD_BY_UNIT_ADDR_INT(DT_NODELABEL(test_children), 11), val), 1);
2520 zassert_equal(DT_PROP(DT_CHILD_BY_UNIT_ADDR_INT(DT_NODELABEL(test_children), 12), val), 2);
2521
2522 zassert_equal(DT_PROP(DT_INST_CHILD_BY_UNIT_ADDR_INT(0, 10), val), 0);
2523 zassert_equal(DT_PROP(DT_INST_CHILD_BY_UNIT_ADDR_INT(0, 11), val), 1);
2524 zassert_equal(DT_PROP(DT_INST_CHILD_BY_UNIT_ADDR_INT(0, 12), val), 2);
2525 }
2526
2527 #undef DT_DRV_COMPAT
2528 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_list)2529 ZTEST(devicetree_api, test_child_nodes_list)
2530 {
2531 #define TEST_FUNC(child) { DT_PROP(child, val) }
2532 #define TEST_FUNC_AND_COMMA(child) TEST_FUNC(child),
2533 #define TEST_PARENT DT_PARENT(DT_NODELABEL(test_child_a))
2534
2535 struct vnd_child_binding {
2536 int val;
2537 };
2538
2539 struct vnd_child_binding vals[] = {
2540 DT_FOREACH_CHILD(TEST_PARENT, TEST_FUNC_AND_COMMA)
2541 };
2542
2543 struct vnd_child_binding vals_sep[] = {
2544 DT_FOREACH_CHILD_SEP(TEST_PARENT, TEST_FUNC, (,))
2545 };
2546
2547 struct vnd_child_binding vals_inst[] = {
2548 DT_INST_FOREACH_CHILD(0, TEST_FUNC_AND_COMMA)
2549 };
2550
2551 struct vnd_child_binding vals_inst_sep[] = {
2552 DT_INST_FOREACH_CHILD_SEP(0, TEST_FUNC, (,))
2553 };
2554
2555 struct vnd_child_binding vals_status_okay[] = {
2556 DT_FOREACH_CHILD_STATUS_OKAY(TEST_PARENT, TEST_FUNC_AND_COMMA)
2557 };
2558
2559 struct vnd_child_binding vals_status_okay_inst[] = {
2560 DT_INST_FOREACH_CHILD_STATUS_OKAY(0, TEST_FUNC_AND_COMMA)
2561 };
2562
2563 struct vnd_child_binding vals_status_okay_sep[] = {
2564 DT_FOREACH_CHILD_STATUS_OKAY_SEP(TEST_PARENT, TEST_FUNC, (,))
2565 };
2566
2567 struct vnd_child_binding vals_status_okay_inst_sep[] = {
2568 DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TEST_FUNC, (,))
2569 };
2570
2571 zassert_equal(ARRAY_SIZE(vals), 3, "");
2572 zassert_equal(ARRAY_SIZE(vals_sep), 3, "");
2573 zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
2574 zassert_equal(ARRAY_SIZE(vals_inst_sep), 3, "");
2575 zassert_equal(ARRAY_SIZE(vals_status_okay), 2, "");
2576 zassert_equal(ARRAY_SIZE(vals_status_okay_inst), 2, "");
2577 zassert_equal(ARRAY_SIZE(vals_status_okay_sep), 2, "");
2578 zassert_equal(ARRAY_SIZE(vals_status_okay_inst_sep), 2, "");
2579
2580 zassert_equal(vals[0].val, 0, "");
2581 zassert_equal(vals[1].val, 1, "");
2582 zassert_equal(vals[2].val, 2, "");
2583 zassert_equal(vals_sep[0].val, 0, "");
2584 zassert_equal(vals_sep[1].val, 1, "");
2585 zassert_equal(vals_sep[2].val, 2, "");
2586 zassert_equal(vals_inst[0].val, 0, "");
2587 zassert_equal(vals_inst[1].val, 1, "");
2588 zassert_equal(vals_inst[2].val, 2, "");
2589 zassert_equal(vals_inst_sep[0].val, 0, "");
2590 zassert_equal(vals_inst_sep[1].val, 1, "");
2591 zassert_equal(vals_inst_sep[2].val, 2, "");
2592 zassert_equal(vals_status_okay[0].val, 0, "");
2593 zassert_equal(vals_status_okay[1].val, 1, "");
2594 zassert_equal(vals_status_okay_inst[0].val, 0, "");
2595 zassert_equal(vals_status_okay_inst[1].val, 1, "");
2596 zassert_equal(vals_status_okay_sep[0].val, 0, "");
2597 zassert_equal(vals_status_okay_sep[1].val, 1, "");
2598 zassert_equal(vals_status_okay_inst_sep[0].val, 0, "");
2599 zassert_equal(vals_status_okay_inst_sep[1].val, 1, "");
2600
2601 #undef TEST_PARENT
2602 #undef TEST_FUNC_AND_COMMA
2603 #undef TEST_FUNC
2604 }
2605
2606 #undef DT_DRV_COMPAT
2607 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_list_varg)2608 ZTEST(devicetree_api, test_child_nodes_list_varg)
2609 {
2610 #define TEST_FUNC(child, arg) { DT_PROP(child, val) + arg }
2611 #define TEST_FUNC_AND_COMMA(child, arg) TEST_FUNC(child, arg),
2612 #define TEST_PARENT DT_PARENT(DT_NODELABEL(test_child_a))
2613
2614 struct vnd_child_binding {
2615 int val;
2616 };
2617
2618 struct vnd_child_binding vals[] = {
2619 DT_FOREACH_CHILD_VARGS(TEST_PARENT, TEST_FUNC_AND_COMMA, 1)
2620 };
2621
2622 struct vnd_child_binding vals_sep[] = {
2623 DT_FOREACH_CHILD_SEP_VARGS(TEST_PARENT, TEST_FUNC, (,), 1)
2624 };
2625
2626 struct vnd_child_binding vals_inst[] = {
2627 DT_INST_FOREACH_CHILD_VARGS(0, TEST_FUNC_AND_COMMA, 1)
2628 };
2629
2630 struct vnd_child_binding vals_inst_sep[] = {
2631 DT_INST_FOREACH_CHILD_SEP_VARGS(0, TEST_FUNC, (,), 1)
2632 };
2633
2634 struct vnd_child_binding vals_status_okay[] = {
2635 DT_FOREACH_CHILD_STATUS_OKAY_VARGS(TEST_PARENT, TEST_FUNC_AND_COMMA, 1)
2636 };
2637
2638 struct vnd_child_binding vals_status_okay_inst[] = {
2639 DT_INST_FOREACH_CHILD_STATUS_OKAY_VARGS(0, TEST_FUNC_AND_COMMA, 1)
2640 };
2641
2642 struct vnd_child_binding vals_status_okay_sep[] = {
2643 DT_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(TEST_PARENT, TEST_FUNC, (,), 1)
2644 };
2645
2646 struct vnd_child_binding vals_status_okay_inst_sep[] = {
2647 DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP_VARGS(0, TEST_FUNC, (,), 1)
2648 };
2649
2650 zassert_equal(ARRAY_SIZE(vals), 3, "");
2651 zassert_equal(ARRAY_SIZE(vals_sep), 3, "");
2652 zassert_equal(ARRAY_SIZE(vals_inst), 3, "");
2653 zassert_equal(ARRAY_SIZE(vals_inst_sep), 3, "");
2654 zassert_equal(ARRAY_SIZE(vals_status_okay), 2, "");
2655 zassert_equal(ARRAY_SIZE(vals_status_okay_inst), 2, "");
2656 zassert_equal(ARRAY_SIZE(vals_status_okay_sep), 2, "");
2657 zassert_equal(ARRAY_SIZE(vals_status_okay_inst_sep), 2, "");
2658
2659 zassert_equal(vals[0].val, 1, "");
2660 zassert_equal(vals[1].val, 2, "");
2661 zassert_equal(vals[2].val, 3, "");
2662 zassert_equal(vals_sep[0].val, 1, "");
2663 zassert_equal(vals_sep[1].val, 2, "");
2664 zassert_equal(vals_sep[2].val, 3, "");
2665 zassert_equal(vals_inst[0].val, 1, "");
2666 zassert_equal(vals_inst[1].val, 2, "");
2667 zassert_equal(vals_inst[2].val, 3, "");
2668 zassert_equal(vals_inst_sep[0].val, 1, "");
2669 zassert_equal(vals_inst_sep[1].val, 2, "");
2670 zassert_equal(vals_inst_sep[2].val, 3, "");
2671 zassert_equal(vals_status_okay[0].val, 1, "");
2672 zassert_equal(vals_status_okay[1].val, 2, "");
2673 zassert_equal(vals_status_okay_inst[0].val, 1, "");
2674 zassert_equal(vals_status_okay_inst[1].val, 2, "");
2675 zassert_equal(vals_status_okay_sep[0].val, 1, "");
2676 zassert_equal(vals_status_okay_sep[1].val, 2, "");
2677 zassert_equal(vals_status_okay_inst_sep[0].val, 1, "");
2678 zassert_equal(vals_status_okay_inst_sep[1].val, 2, "");
2679
2680 #undef TEST_PARENT
2681 #undef TEST_FUNC_AND_COMMA
2682 #undef TEST_FUNC
2683 }
2684
2685 #undef DT_DRV_COMPAT
2686 #define DT_DRV_COMPAT vnd_child_bindings
ZTEST(devicetree_api,test_child_nodes_number)2687 ZTEST(devicetree_api, test_child_nodes_number)
2688 {
2689 zassert_equal(DT_CHILD_NUM(TEST_CHILDREN), 3, "");
2690 zassert_equal(DT_INST_CHILD_NUM(0), 3, "");
2691 zassert_equal(DT_CHILD_NUM_STATUS_OKAY(TEST_CHILDREN), 2, "");
2692 zassert_equal(DT_INST_CHILD_NUM_STATUS_OKAY(0), 2, "");
2693 }
2694
ZTEST(devicetree_api,test_great_grandchild)2695 ZTEST(devicetree_api, test_great_grandchild)
2696 {
2697 zassert_equal(DT_PROP(DT_NODELABEL(test_ggc), ggc_prop), 42, "");
2698 }
2699
2700 #undef DT_DRV_COMPAT
2701 #define DT_DRV_COMPAT vnd_test_ranges_pcie
ZTEST(devicetree_api,test_ranges_pcie)2702 ZTEST(devicetree_api, test_ranges_pcie)
2703 {
2704 #define FLAGS(node_id, idx) \
2705 DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx),
2706 #define CHILD_BUS_ADDR(node_id, idx) \
2707 DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx),
2708 #define PARENT_BUS_ADDR(node_id, idx) \
2709 DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx),
2710 #define LENGTH(node_id, idx) DT_RANGES_LENGTH_BY_IDX(node_id, idx),
2711
2712 unsigned int count = DT_NUM_RANGES(TEST_RANGES_PCIE);
2713
2714 const uint64_t ranges_pcie_flags[] = {
2715 DT_FOREACH_RANGE(TEST_RANGES_PCIE, FLAGS)
2716 };
2717
2718 const uint64_t ranges_child_bus_addr[] = {
2719 DT_FOREACH_RANGE(TEST_RANGES_PCIE, CHILD_BUS_ADDR)
2720 };
2721
2722 const uint64_t ranges_parent_bus_addr[] = {
2723 DT_FOREACH_RANGE(TEST_RANGES_PCIE, PARENT_BUS_ADDR)
2724 };
2725
2726 const uint64_t ranges_length[] = {
2727 DT_FOREACH_RANGE(TEST_RANGES_PCIE, LENGTH)
2728 };
2729
2730 zassert_equal(count, 3, "");
2731
2732 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 0), 1, "");
2733 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 1), 1, "");
2734 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 2), 1, "");
2735 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_PCIE, 3), 0, "");
2736
2737 zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 0),
2738 1, "");
2739 zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 1),
2740 1, "");
2741 zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 2),
2742 1, "");
2743 zassert_equal(DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(TEST_RANGES_PCIE, 3),
2744 0, "");
2745
2746 zassert_equal(ranges_pcie_flags[0], 0x1000000, "");
2747 zassert_equal(ranges_pcie_flags[1], 0x2000000, "");
2748 zassert_equal(ranges_pcie_flags[2], 0x3000000, "");
2749 zassert_equal(ranges_child_bus_addr[0], 0, "");
2750 zassert_equal(ranges_child_bus_addr[1], 0x10000000, "");
2751 zassert_equal(ranges_child_bus_addr[2], 0x8000000000, "");
2752 zassert_equal(ranges_parent_bus_addr[0], 0x3eff0000, "");
2753 zassert_equal(ranges_parent_bus_addr[1], 0x10000000, "");
2754 zassert_equal(ranges_parent_bus_addr[2], 0x8000000000, "");
2755 zassert_equal(ranges_length[0], 0x10000, "");
2756 zassert_equal(ranges_length[1], 0x2eff0000, "");
2757 zassert_equal(ranges_length[2], 0x8000000000, "");
2758
2759 #undef FLAGS
2760 #undef CHILD_BUS_ADDR
2761 #undef PARENT_BUS_ADDR
2762 #undef LENGTH
2763 }
2764
ZTEST(devicetree_api,test_ranges_other)2765 ZTEST(devicetree_api, test_ranges_other)
2766 {
2767 #define HAS_FLAGS(node_id, idx) \
2768 DT_RANGES_HAS_CHILD_BUS_FLAGS_AT_IDX(node_id, idx)
2769 #define FLAGS(node_id, idx) \
2770 DT_RANGES_CHILD_BUS_FLAGS_BY_IDX(node_id, idx),
2771 #define CHILD_BUS_ADDR(node_id, idx) \
2772 DT_RANGES_CHILD_BUS_ADDRESS_BY_IDX(node_id, idx),
2773 #define PARENT_BUS_ADDR(node_id, idx) \
2774 DT_RANGES_PARENT_BUS_ADDRESS_BY_IDX(node_id, idx),
2775 #define LENGTH(node_id, idx) DT_RANGES_LENGTH_BY_IDX(node_id, idx),
2776
2777 unsigned int count = DT_NUM_RANGES(TEST_RANGES_OTHER);
2778
2779 const uint32_t ranges_child_bus_addr[] = {
2780 DT_FOREACH_RANGE(TEST_RANGES_OTHER, CHILD_BUS_ADDR)
2781 };
2782
2783 const uint32_t ranges_parent_bus_addr[] = {
2784 DT_FOREACH_RANGE(TEST_RANGES_OTHER, PARENT_BUS_ADDR)
2785 };
2786
2787 const uint32_t ranges_length[] = {
2788 DT_FOREACH_RANGE(TEST_RANGES_OTHER, LENGTH)
2789 };
2790
2791 zassert_equal(count, 2, "");
2792
2793 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 0), 1, "");
2794 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 1), 1, "");
2795 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 2), 0, "");
2796 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_OTHER, 3), 0, "");
2797
2798 zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 0), 0, "");
2799 zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 1), 0, "");
2800 zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 2), 0, "");
2801 zassert_equal(HAS_FLAGS(TEST_RANGES_OTHER, 3), 0, "");
2802
2803 zassert_equal(ranges_child_bus_addr[0], 0, "");
2804 zassert_equal(ranges_child_bus_addr[1], 0x10000000, "");
2805 zassert_equal(ranges_parent_bus_addr[0], 0x3eff0000, "");
2806 zassert_equal(ranges_parent_bus_addr[1], 0x10000000, "");
2807 zassert_equal(ranges_length[0], 0x10000, "");
2808 zassert_equal(ranges_length[1], 0x2eff0000, "");
2809
2810 #undef HAS_FLAGS
2811 #undef FLAGS
2812 #undef CHILD_BUS_ADDR
2813 #undef PARENT_BUS_ADDR
2814 #undef LENGTH
2815 }
2816
ZTEST(devicetree_api,test_ranges_empty)2817 ZTEST(devicetree_api, test_ranges_empty)
2818 {
2819 zassert_equal(DT_NODE_HAS_PROP(TEST_RANGES_EMPTY, ranges), 1, "");
2820
2821 zassert_equal(DT_NUM_RANGES(TEST_RANGES_EMPTY), 0, "");
2822
2823 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_EMPTY, 0), 0, "");
2824 zassert_equal(DT_RANGES_HAS_IDX(TEST_RANGES_EMPTY, 1), 0, "");
2825
2826 #define FAIL(node_id, idx) ztest_test_fail();
2827
2828 DT_FOREACH_RANGE(TEST_RANGES_EMPTY, FAIL);
2829
2830 #undef FAIL
2831 }
2832
ZTEST(devicetree_api,test_compat_get_any_status_okay)2833 ZTEST(devicetree_api, test_compat_get_any_status_okay)
2834 {
2835 zassert_true(
2836 DT_SAME_NODE(
2837 DT_COMPAT_GET_ANY_STATUS_OKAY(vnd_reg_holder),
2838 TEST_REG),
2839 "");
2840
2841 /*
2842 * DT_SAME_NODE requires that both its arguments are valid
2843 * node identifiers, so we can't pass it DT_INVALID_NODE,
2844 * which is what this DT_COMPAT_GET_ANY_STATUS_OKAY() expands to.
2845 */
2846 zassert_false(
2847 DT_NODE_EXISTS(
2848 DT_COMPAT_GET_ANY_STATUS_OKAY(this_is_not_a_real_compat)),
2849 "");
2850 }
2851
ord_in_array(unsigned int ord,unsigned int * array,size_t array_size)2852 static bool ord_in_array(unsigned int ord, unsigned int *array,
2853 size_t array_size)
2854 {
2855 size_t i;
2856
2857 for (i = 0; i < array_size; i++) {
2858 if (array[i] == ord) {
2859 return true;
2860 }
2861 }
2862
2863 return false;
2864 }
2865
2866 /* Magic numbers used by COMBINED_ORD_ARRAY. Must be invalid dependency
2867 * ordinals.
2868 */
2869 #define ORD_LIST_SEP 0xFFFF0000
2870 #define ORD_LIST_END 0xFFFF0001
2871 #define INJECTED_DEP_0 0xFFFF0002
2872 #define INJECTED_DEP_1 0xFFFF0003
2873
2874 #define DEP_ORD_AND_COMMA(node_id) DT_DEP_ORD(node_id),
2875 #define CHILD_ORDINALS(node_id) DT_FOREACH_CHILD(node_id, DEP_ORD_AND_COMMA)
2876
2877 #define COMBINED_ORD_ARRAY(node_id) \
2878 { \
2879 DT_DEP_ORD(node_id), \
2880 DT_DEP_ORD(DT_PARENT(node_id)), \
2881 CHILD_ORDINALS(node_id) \
2882 ORD_LIST_SEP, \
2883 DT_REQUIRES_DEP_ORDS(node_id) \
2884 INJECTED_DEP_0, \
2885 INJECTED_DEP_1, \
2886 ORD_LIST_SEP, \
2887 DT_SUPPORTS_DEP_ORDS(node_id) \
2888 ORD_LIST_END \
2889 }
2890
ZTEST(devicetree_api,test_dep_ord)2891 ZTEST(devicetree_api, test_dep_ord)
2892 {
2893 #define ORD_IN_ARRAY(ord, array) ord_in_array(ord, array, ARRAY_SIZE(array))
2894
2895 unsigned int root_ord = DT_DEP_ORD(DT_ROOT),
2896 test_ord = DT_DEP_ORD(DT_PATH(test)),
2897 root_requires[] = { DT_REQUIRES_DEP_ORDS(DT_ROOT) },
2898 test_requires[] = { DT_REQUIRES_DEP_ORDS(DT_PATH(test)) },
2899 root_supports[] = { DT_SUPPORTS_DEP_ORDS(DT_ROOT) },
2900 test_supports[] = { DT_SUPPORTS_DEP_ORDS(DT_PATH(test)) },
2901 children_ords[] = {
2902 DT_FOREACH_CHILD(TEST_CHILDREN, DEP_ORD_AND_COMMA)
2903 },
2904 children_combined_ords[] = COMBINED_ORD_ARRAY(TEST_CHILDREN),
2905 child_a_combined_ords[] =
2906 COMBINED_ORD_ARRAY(DT_NODELABEL(test_child_a));
2907 size_t i;
2908
2909 /* DT_DEP_ORD */
2910 zassert_equal(root_ord, 0, "");
2911 zassert_true(DT_DEP_ORD(DT_NODELABEL(test_child_a)) >
2912 DT_DEP_ORD(DT_NODELABEL(test_children)), "");
2913 zassert_true(DT_DEP_ORD(DT_NODELABEL(test_irq)) >
2914 DT_DEP_ORD(DT_NODELABEL(test_intc)), "");
2915 zassert_true(DT_DEP_ORD(DT_NODELABEL(test_phandles)) >
2916 DT_DEP_ORD(DT_NODELABEL(test_gpio_1)), "");
2917
2918 /* DT_REQUIRES_DEP_ORDS */
2919 zassert_equal(ARRAY_SIZE(root_requires), 0, "");
2920 zassert_true(ORD_IN_ARRAY(root_ord, test_requires), "");
2921
2922 /* DT_SUPPORTS_DEP_ORDS */
2923 zassert_true(ORD_IN_ARRAY(test_ord, root_supports), "");
2924 zassert_false(ORD_IN_ARRAY(root_ord, test_supports), "");
2925
2926 unsigned int children_combined_ords_expected[] = {
2927 /*
2928 * Combined ordinals for /test/test-children are from
2929 * these nodes in this order:
2930 */
2931 DT_DEP_ORD(TEST_CHILDREN), /* node */
2932 DT_DEP_ORD(DT_PATH(test)), /* parent */
2933 DT_DEP_ORD(DT_NODELABEL(test_child_a)), /* children */
2934 DT_DEP_ORD(DT_NODELABEL(test_child_b)),
2935 DT_DEP_ORD(DT_NODELABEL(test_child_c)),
2936 ORD_LIST_SEP, /* separator */
2937 DT_DEP_ORD(DT_PATH(test)), /* requires */
2938 INJECTED_DEP_0, /* injected
2939 * dependencies
2940 */
2941 INJECTED_DEP_1,
2942 ORD_LIST_SEP, /* separator */
2943 DT_DEP_ORD(DT_NODELABEL(test_child_a)), /* supports */
2944 DT_DEP_ORD(DT_NODELABEL(test_child_b)),
2945 DT_DEP_ORD(DT_NODELABEL(test_child_c)),
2946 ORD_LIST_END, /* terminator */
2947 };
2948 zassert_equal(ARRAY_SIZE(children_combined_ords),
2949 ARRAY_SIZE(children_combined_ords_expected),
2950 "%zu", ARRAY_SIZE(children_combined_ords));
2951 for (i = 0; i < ARRAY_SIZE(children_combined_ords); i++) {
2952 zassert_equal(children_combined_ords[i],
2953 children_combined_ords_expected[i],
2954 "test-children at %zu", i);
2955 }
2956
2957 unsigned int child_a_combined_ords_expected[] = {
2958 /*
2959 * Combined ordinals for /test/test-children/child-a
2960 * are from these nodes in this order:
2961 */
2962 DT_DEP_ORD(DT_NODELABEL(test_child_a)), /* node */
2963 DT_DEP_ORD(TEST_CHILDREN), /* parent */
2964 /* children (none) */
2965 ORD_LIST_SEP, /* separator */
2966 DT_DEP_ORD(TEST_CHILDREN), /* requires */
2967 INJECTED_DEP_0, /* injected
2968 * dependencies
2969 */
2970 INJECTED_DEP_1,
2971 ORD_LIST_SEP, /* separator */
2972 /* supports (none) */
2973 ORD_LIST_END, /* terminator */
2974 };
2975 zassert_equal(ARRAY_SIZE(child_a_combined_ords),
2976 ARRAY_SIZE(child_a_combined_ords_expected),
2977 "%zu", ARRAY_SIZE(child_a_combined_ords));
2978 for (i = 0; i < ARRAY_SIZE(child_a_combined_ords); i++) {
2979 zassert_equal(child_a_combined_ords[i],
2980 child_a_combined_ords_expected[i],
2981 "child-a at %zu", i);
2982 }
2983
2984 #undef DT_DRV_COMPAT
2985 #define DT_DRV_COMPAT vnd_child_bindings
2986
2987 /* DT_INST_DEP_ORD */
2988 zassert_equal(DT_INST_DEP_ORD(0),
2989 DT_DEP_ORD(DT_NODELABEL(test_children)), "");
2990
2991 /* DT_INST_REQUIRES_DEP_ORDS */
2992 unsigned int inst_requires[] = { DT_INST_REQUIRES_DEP_ORDS(0) };
2993
2994 zassert_equal(ARRAY_SIZE(inst_requires), 1, "");
2995 zassert_equal(inst_requires[0], test_ord, "");
2996
2997 /* DT_INST_SUPPORTS_DEP_ORDS */
2998 unsigned int inst_supports[] = { DT_INST_SUPPORTS_DEP_ORDS(0) };
2999
3000 zassert_equal(ARRAY_SIZE(inst_supports), 3, "");
3001 for (i = 0; i < ARRAY_SIZE(inst_supports); i++) {
3002 zassert_true(ORD_IN_ARRAY(inst_supports[i], children_ords), "");
3003 }
3004 }
3005
ZTEST(devicetree_api,test_dep_ord_str_sortable)3006 ZTEST(devicetree_api, test_dep_ord_str_sortable)
3007 {
3008 const char *root_ord = STRINGIFY(DT_DEP_ORD_STR_SORTABLE(DT_ROOT));
3009
3010 /* Root ordinal is always 0 */
3011 zassert_mem_equal(root_ord, "00000", 6);
3012
3013 /* Test string sortable versions equal decimal values.
3014 * We go through the STRINGIFY()->atoi conversion cycle to avoid
3015 * the C compiler treating the number as octal due to leading zeros.
3016 * atoi() simply ignores them.
3017 */
3018 zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(DT_ROOT))),
3019 DT_DEP_ORD(DT_ROOT), "Invalid sortable string");
3020 zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_DEADBEEF))),
3021 DT_DEP_ORD(TEST_DEADBEEF), "Invalid sortable string");
3022 zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_TEMP))),
3023 DT_DEP_ORD(TEST_TEMP), "Invalid sortable string");
3024 zassert_equal(atoi(STRINGIFY(DT_DEP_ORD_STR_SORTABLE(TEST_REG))),
3025 DT_DEP_ORD(TEST_REG), "Invalid sortable string");
3026 }
3027
ZTEST(devicetree_api,test_path)3028 ZTEST(devicetree_api, test_path)
3029 {
3030 zassert_true(!strcmp(DT_NODE_PATH(DT_ROOT), "/"), "");
3031 zassert_true(!strcmp(DT_NODE_PATH(TEST_DEADBEEF),
3032 "/test/gpio@deadbeef"), "");
3033 }
3034
ZTEST(devicetree_api,test_node_name)3035 ZTEST(devicetree_api, test_node_name)
3036 {
3037 zassert_true(!strcmp(DT_NODE_FULL_NAME(DT_ROOT), "/"), "");
3038 zassert_true(!strcmp(DT_NODE_FULL_NAME(TEST_DEADBEEF),
3039 "gpio@deadbeef"), "");
3040 zassert_true(!strcmp(DT_NODE_FULL_NAME(TEST_TEMP),
3041 "temperature-sensor"), "");
3042 zassert_true(strcmp(DT_NODE_FULL_NAME(TEST_REG),
3043 "reg-holder"), "");
3044 }
3045
ZTEST(devicetree_api,test_node_child_idx)3046 ZTEST(devicetree_api, test_node_child_idx)
3047 {
3048 zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_a)), 0, "");
3049 zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_b)), 1, "");
3050 zassert_equal(DT_NODE_CHILD_IDX(DT_NODELABEL(test_child_c)), 2, "");
3051 }
3052
ZTEST(devicetree_api,test_same_node)3053 ZTEST(devicetree_api, test_same_node)
3054 {
3055 zassert_true(DT_SAME_NODE(TEST_DEADBEEF, TEST_DEADBEEF), "");
3056 zassert_false(DT_SAME_NODE(TEST_DEADBEEF, TEST_ABCD1234), "");
3057 }
3058
ZTEST(devicetree_api,test_pinctrl)3059 ZTEST(devicetree_api, test_pinctrl)
3060 {
3061 #undef DT_DRV_COMPAT
3062 #define DT_DRV_COMPAT vnd_adc_temp_sensor
3063 /*
3064 * Tests when a node does have pinctrl properties.
3065 */
3066
3067 /*
3068 * node_id versions:
3069 */
3070
3071 zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_IDX(TEST_TEMP, 0, 1),
3072 DT_NODELABEL(test_pincfg_b)), "");
3073 zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_IDX(TEST_TEMP, 1, 0),
3074 DT_NODELABEL(test_pincfg_c)), "");
3075
3076 zassert_true(DT_SAME_NODE(DT_PINCTRL_0(TEST_TEMP, 0),
3077 DT_NODELABEL(test_pincfg_a)), "");
3078
3079 zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, default, 1),
3080 DT_NODELABEL(test_pincfg_b)), "");
3081 zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, sleep, 0),
3082 DT_NODELABEL(test_pincfg_c)), "");
3083 zassert_true(DT_SAME_NODE(DT_PINCTRL_BY_NAME(TEST_TEMP, f_o_o2, 0),
3084 DT_NODELABEL(test_pincfg_d)), "");
3085
3086 zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, default), 0, "");
3087 zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, sleep), 1, "");
3088 zassert_equal(DT_PINCTRL_NAME_TO_IDX(TEST_TEMP, f_o_o2), 2, "");
3089
3090 zassert_equal(DT_NUM_PINCTRLS_BY_IDX(TEST_TEMP, 0), 2, "");
3091
3092 zassert_equal(DT_NUM_PINCTRLS_BY_NAME(TEST_TEMP, default), 2, "");
3093 zassert_equal(DT_NUM_PINCTRLS_BY_NAME(TEST_TEMP, f_o_o2), 1, "");
3094
3095 zassert_equal(DT_NUM_PINCTRL_STATES(TEST_TEMP), 3, "");
3096
3097 zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 0), 1, "");
3098 zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 1), 1, "");
3099 zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 2), 1, "");
3100 zassert_equal(DT_PINCTRL_HAS_IDX(TEST_TEMP, 3), 0, "");
3101
3102 zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, default), 1, "");
3103 zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, sleep), 1, "");
3104 zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, f_o_o2), 1, "");
3105 zassert_equal(DT_PINCTRL_HAS_NAME(TEST_TEMP, bar), 0, "");
3106
3107 #undef MAKE_TOKEN
3108 #define MAKE_TOKEN(pc_idx) \
3109 _CONCAT(NODE_ID_ENUM_, \
3110 DT_PINCTRL_IDX_TO_NAME_TOKEN(TEST_TEMP, pc_idx))
3111 #undef MAKE_UPPER_TOKEN
3112 #define MAKE_UPPER_TOKEN(pc_idx) \
3113 _CONCAT(NODE_ID_ENUM_, \
3114 DT_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(TEST_TEMP, pc_idx))
3115 enum {
3116 MAKE_TOKEN(0) = 10,
3117 MAKE_TOKEN(1) = 11,
3118 MAKE_TOKEN(2) = 12,
3119 MAKE_TOKEN(3) = 13,
3120
3121 MAKE_UPPER_TOKEN(0) = 20,
3122 MAKE_UPPER_TOKEN(1) = 21,
3123 MAKE_UPPER_TOKEN(2) = 22,
3124 MAKE_UPPER_TOKEN(3) = 23,
3125 };
3126
3127 zassert_equal(NODE_ID_ENUM_default, 10, "");
3128 zassert_equal(NODE_ID_ENUM_sleep, 11, "");
3129 zassert_equal(NODE_ID_ENUM_f_o_o2, 12, "");
3130
3131 zassert_equal(NODE_ID_ENUM_DEFAULT, 20, "");
3132 zassert_equal(NODE_ID_ENUM_SLEEP, 21, "");
3133 zassert_equal(NODE_ID_ENUM_F_O_O2, 22, "");
3134
3135 /*
3136 * inst versions:
3137 */
3138
3139 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_IDX(0, 0, 1),
3140 DT_NODELABEL(test_pincfg_b)), "");
3141 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_IDX(0, 1, 0),
3142 DT_NODELABEL(test_pincfg_c)), "");
3143
3144 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_0(0, 0),
3145 DT_NODELABEL(test_pincfg_a)), "");
3146
3147 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, default, 1),
3148 DT_NODELABEL(test_pincfg_b)), "");
3149 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, sleep, 0),
3150 DT_NODELABEL(test_pincfg_c)), "");
3151 zassert_true(DT_SAME_NODE(DT_INST_PINCTRL_BY_NAME(0, f_o_o2, 0),
3152 DT_NODELABEL(test_pincfg_d)), "");
3153
3154 zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, default), 0, "");
3155 zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, sleep), 1, "");
3156 zassert_equal(DT_INST_PINCTRL_NAME_TO_IDX(0, f_o_o2), 2, "");
3157
3158 zassert_equal(DT_INST_NUM_PINCTRLS_BY_IDX(0, 0), 2, "");
3159
3160 zassert_equal(DT_INST_NUM_PINCTRLS_BY_NAME(0, default), 2, "");
3161 zassert_equal(DT_INST_NUM_PINCTRLS_BY_NAME(0, f_o_o2), 1, "");
3162
3163 zassert_equal(DT_INST_NUM_PINCTRL_STATES(0), 3, "");
3164
3165 zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 0), 1, "");
3166 zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 1), 1, "");
3167 zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 2), 1, "");
3168 zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 3), 0, "");
3169
3170 zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, default), 1, "");
3171 zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, sleep), 1, "");
3172 zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, f_o_o2), 1, "");
3173 zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, bar), 0, "");
3174
3175 #undef MAKE_TOKEN
3176 #define MAKE_TOKEN(pc_idx) \
3177 _CONCAT(INST_ENUM_, \
3178 DT_INST_PINCTRL_IDX_TO_NAME_TOKEN(0, pc_idx))
3179 #undef MAKE_UPPER_TOKEN
3180 #define MAKE_UPPER_TOKEN(pc_idx) \
3181 _CONCAT(INST_ENUM_, \
3182 DT_INST_PINCTRL_IDX_TO_NAME_UPPER_TOKEN(0, pc_idx))
3183 enum {
3184 MAKE_TOKEN(0) = 10,
3185 MAKE_TOKEN(1) = 11,
3186 MAKE_TOKEN(2) = 12,
3187
3188 MAKE_UPPER_TOKEN(0) = 20,
3189 MAKE_UPPER_TOKEN(1) = 21,
3190 MAKE_UPPER_TOKEN(2) = 22,
3191 };
3192
3193 zassert_equal(INST_ENUM_default, 10, "");
3194 zassert_equal(INST_ENUM_sleep, 11, "");
3195 zassert_equal(INST_ENUM_f_o_o2, 12, "");
3196
3197 zassert_equal(INST_ENUM_DEFAULT, 20, "");
3198 zassert_equal(INST_ENUM_SLEEP, 21, "");
3199 zassert_equal(INST_ENUM_F_O_O2, 22, "");
3200
3201 #undef DT_DRV_COMPAT
3202 #define DT_DRV_COMPAT vnd_reg_holder
3203 /*
3204 * Tests when a node does NOT have any pinctrl properties.
3205 */
3206
3207 /* node_id versions */
3208 zassert_equal(DT_NUM_PINCTRL_STATES(TEST_REG), 0, "");
3209 zassert_equal(DT_PINCTRL_HAS_IDX(TEST_REG, 0), 0, "");
3210 zassert_equal(DT_PINCTRL_HAS_NAME(TEST_REG, f_o_o2), 0, "");
3211
3212 /* inst versions */
3213 zassert_equal(DT_INST_NUM_PINCTRL_STATES(0), 0, "");
3214 zassert_equal(DT_INST_PINCTRL_HAS_IDX(0, 0), 0, "");
3215 zassert_equal(DT_INST_PINCTRL_HAS_NAME(0, f_o_o2), 0, "");
3216 }
3217
ZTEST(devicetree_api,test_mbox)3218 ZTEST(devicetree_api, test_mbox)
3219 {
3220 zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, tx), 1, "");
3221 zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, rx), 2, "");
3222
3223 zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, tx),
3224 DT_NODELABEL(test_mbox)), "");
3225 zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, rx),
3226 DT_NODELABEL(test_mbox)), "");
3227
3228 zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, tx), 1, "");
3229 zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, rx), 2, "");
3230
3231 zassert_equal(DT_MBOX_CHANNEL_BY_NAME(TEST_TEMP, zero), 0, "");
3232
3233 zassert_true(DT_SAME_NODE(DT_MBOX_CTLR_BY_NAME(TEST_TEMP, zero),
3234 DT_NODELABEL(test_mbox_zero_cell)), "");
3235 }
3236
ZTEST(devicetree_api,test_fixed_partitions)3237 ZTEST(devicetree_api, test_fixed_partitions)
3238 {
3239 /* Test finding fixed partitions by the 'label' property. */
3240 zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_0));
3241 zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_1));
3242 zassert_true(DT_HAS_FIXED_PARTITION_LABEL(test_partition_2));
3243
3244 zassert_true(DT_SAME_NODE(TEST_PARTITION_0,
3245 DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_0)));
3246 zassert_true(DT_SAME_NODE(TEST_PARTITION_1,
3247 DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_1)));
3248 zassert_true(DT_SAME_NODE(TEST_PARTITION_2,
3249 DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_2)));
3250
3251 zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_0));
3252 zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_1));
3253 zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_PARTITION_2));
3254
3255 /* There should not be a node with `label = "test_partition_3"`. */
3256 zassert_false(DT_HAS_FIXED_PARTITION_LABEL(test_partition_3));
3257 zassert_false(DT_NODE_EXISTS(DT_NODE_BY_FIXED_PARTITION_LABEL(test_partition_3)));
3258
3259 /* There is a node with `label = "FOO"`, but it is not a fixed partition. */
3260 zassert_false(DT_HAS_FIXED_PARTITION_LABEL(FOO));
3261 zassert_false(DT_NODE_EXISTS(DT_NODE_BY_FIXED_PARTITION_LABEL(FOO)));
3262
3263 /* Test DT_MTD_FROM_FIXED_PARTITION. */
3264 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3265 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3266 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3267
3268 zassert_true(DT_SAME_NODE(TEST_MTD_0, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3269 zassert_true(DT_SAME_NODE(TEST_MTD_0, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3270 zassert_true(DT_SAME_NODE(TEST_MTD_1, DT_MTD_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3271
3272 /* Test DT_MEM_FROM_FIXED_PARTITION. */
3273 zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3274 zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3275 zassert_false(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_2)));
3276
3277 zassert_true(DT_SAME_NODE(TEST_MEM_0, DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_0)));
3278 zassert_true(DT_SAME_NODE(TEST_MEM_0, DT_MEM_FROM_FIXED_PARTITION(TEST_PARTITION_1)));
3279
3280 /* Test DT_FIXED_PARTITION_ADDR. */
3281 zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_0), 0x20000000);
3282 zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_1), 0x200000c0);
3283 zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_PARTITION_2), 0x33291080);
3284
3285 /* Test that all DT_FIXED_PARTITION_ID are defined and unique. */
3286 #define FIXED_PARTITION_ID_COMMA(node_id) DT_FIXED_PARTITION_ID(node_id),
3287
3288 static const int ids[] = {
3289 DT_FOREACH_STATUS_OKAY_VARGS(fixed_partitions, DT_FOREACH_CHILD,
3290 FIXED_PARTITION_ID_COMMA)
3291 };
3292 bool found[ARRAY_SIZE(ids)] = { false };
3293
3294 for (int i = 0; i < ARRAY_SIZE(ids); i++) {
3295 zassert_between_inclusive(ids[i], 0, ARRAY_SIZE(ids) - 1, "");
3296 zassert_false(found[ids[i]]);
3297 found[ids[i]] = true;
3298 }
3299
3300 #undef FIXED_PARTITION_ID_COMMA
3301 }
3302
ZTEST(devicetree_api,test_fixed_subpartitions)3303 ZTEST(devicetree_api, test_fixed_subpartitions)
3304 {
3305 zassert_true(DT_FIXED_PARTITION_EXISTS(TEST_SUBPARTITION_COMBINED));
3306 zassert_true(DT_FIXED_SUBPARTITION_EXISTS(TEST_SUBPARTITION_0));
3307 zassert_true(DT_FIXED_SUBPARTITION_EXISTS(TEST_SUBPARTITION_1));
3308
3309 /* Test DT_MEM_FROM_FIXED_SUBPARTITION. */
3310 zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_PARTITION(TEST_SUBPARTITION_COMBINED)));
3311 zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_SUBPARTITION(TEST_SUBPARTITION_0)));
3312 zassert_true(DT_NODE_EXISTS(DT_MEM_FROM_FIXED_SUBPARTITION(TEST_SUBPARTITION_1)));
3313
3314 /* Test DT_MTD_FROM_FIXED_SUBPARTITION. */
3315 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_PARTITION(TEST_SUBPARTITION_COMBINED)));
3316 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_SUBPARTITION(TEST_SUBPARTITION_0)));
3317 zassert_true(DT_NODE_EXISTS(DT_MTD_FROM_FIXED_SUBPARTITION(TEST_SUBPARTITION_1)));
3318 zassert_true(DT_SAME_NODE(
3319 DT_MTD_FROM_FIXED_PARTITION(TEST_SUBPARTITION_COMBINED),
3320 DT_MTD_FROM_FIXED_SUBPARTITION(TEST_SUBPARTITION_1)));
3321
3322 /* Test DT_FIXED_SUBPARTITION_ADDR. */
3323 zassert_equal(DT_FIXED_PARTITION_ADDR(TEST_SUBPARTITION_COMBINED), 0x20000100);
3324 zassert_equal(DT_FIXED_SUBPARTITION_ADDR(TEST_SUBPARTITION_0),
3325 DT_FIXED_PARTITION_ADDR(TEST_SUBPARTITION_COMBINED));
3326 zassert_equal(DT_FIXED_SUBPARTITION_ADDR(TEST_SUBPARTITION_0), 0x20000100);
3327 zassert_equal(DT_FIXED_SUBPARTITION_ADDR(TEST_SUBPARTITION_1), 0x20000140);
3328
3329 /* Check sizes match */
3330 zassert_equal(DT_REG_SIZE(TEST_SUBPARTITION_COMBINED),
3331 (DT_REG_SIZE(TEST_SUBPARTITION_0) + DT_REG_SIZE(TEST_SUBPARTITION_1)));
3332 }
3333
ZTEST(devicetree_api,test_string_token)3334 ZTEST(devicetree_api, test_string_token)
3335 {
3336 #undef DT_DRV_COMPAT
3337 #define DT_DRV_COMPAT vnd_string_token
3338 enum {
3339 token_zero,
3340 token_one,
3341 token_two,
3342 token_no_inst,
3343 };
3344 enum {
3345 TOKEN_ZERO = token_no_inst + 1,
3346 TOKEN_ONE,
3347 TOKEN_TWO,
3348 TOKEN_NO_INST,
3349 };
3350 int i;
3351
3352 /* Test DT_INST_STRING_TOKEN */
3353 #define STRING_TOKEN_TEST_INST_EXPANSION(inst) \
3354 DT_INST_STRING_TOKEN(inst, val),
3355 int array_inst[] = {
3356 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_TEST_INST_EXPANSION)
3357 };
3358
3359 for (i = 0; i < ARRAY_SIZE(array_inst); i++) {
3360 zassert_between_inclusive(array_inst[i], token_zero, token_two, "");
3361 }
3362
3363 /* Test DT_INST_STRING_UPPER_TOKEN */
3364 #define STRING_UPPER_TOKEN_TEST_INST_EXPANSION(inst) \
3365 DT_INST_STRING_UPPER_TOKEN(inst, val),
3366 int array_inst_upper[] = {
3367 DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_TEST_INST_EXPANSION)
3368 };
3369
3370 for (i = 0; i < ARRAY_SIZE(array_inst_upper); i++) {
3371 zassert_between_inclusive(array_inst_upper[i], TOKEN_ZERO, TOKEN_TWO, "");
3372 }
3373
3374 /* Test DT_INST_STRING_TOKEN_OR when property is found */
3375 #define STRING_TOKEN_OR_TEST_INST_EXPANSION(inst) \
3376 DT_INST_STRING_TOKEN_OR(inst, val, token_no_inst),
3377 int array_inst_or[] = {
3378 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_OR_TEST_INST_EXPANSION)
3379 };
3380
3381 for (i = 0; i < ARRAY_SIZE(array_inst_or); i++) {
3382 zassert_between_inclusive(array_inst_or[i], token_zero, token_two, "");
3383 }
3384
3385 /* Test DT_INST_STRING_UPPER_TOKEN_OR when property is found */
3386 #define STRING_UPPER_TOKEN_OR_TEST_INST_EXPANSION(inst) \
3387 DT_INST_STRING_UPPER_TOKEN_OR(inst, val, TOKEN_NO_INST),
3388 int array_inst_upper_or[] = {
3389 DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_OR_TEST_INST_EXPANSION)
3390 };
3391
3392 for (i = 0; i < ARRAY_SIZE(array_inst_upper_or); i++) {
3393 zassert_between_inclusive(array_inst_upper_or[i], TOKEN_ZERO, TOKEN_TWO, "");
3394 }
3395
3396 /* Test DT_STRING_TOKEN_OR when property is found */
3397 zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_0),
3398 val, token_one), token_zero, "");
3399 zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3400 val, token_two), token_one, "");
3401
3402 /* Test DT_STRING_TOKEN_OR is not found */
3403 zassert_equal(DT_STRING_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3404 no_inst, token_zero), token_zero, "");
3405
3406 /* Test DT_STRING_UPPER_TOKEN_OR when property is found */
3407 zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_0),
3408 val, TOKEN_ONE), TOKEN_ZERO, "");
3409 zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3410 val, TOKEN_TWO), TOKEN_ONE, "");
3411
3412 /* Test DT_STRING_UPPER_TOKEN_OR is not found */
3413 zassert_equal(DT_STRING_UPPER_TOKEN_OR(DT_NODELABEL(test_string_token_1),
3414 no_inst, TOKEN_ZERO), TOKEN_ZERO, "");
3415
3416 /* Test DT_INST_STRING_TOKEN_OR when property is not found */
3417 #define STRING_TOKEN_TEST_NO_INST_EXPANSION(inst) \
3418 DT_INST_STRING_TOKEN_OR(inst, no_inst, token_no_inst),
3419 int array_no_inst_or[] = {
3420 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_TEST_NO_INST_EXPANSION)
3421 };
3422 for (i = 0; i < ARRAY_SIZE(array_no_inst_or); i++) {
3423 zassert_equal(array_no_inst_or[i], token_no_inst, "");
3424 }
3425
3426 /* Test DT_INST_STRING_UPPER_TOKEN_OR when property is not found */
3427 #define STRING_UPPER_TOKEN_TEST_NO_INST_EXPANSION(inst) \
3428 DT_INST_STRING_UPPER_TOKEN_OR(inst, no_inst, TOKEN_NO_INST),
3429 int array_no_inst_upper_or[] = {
3430 DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_TEST_NO_INST_EXPANSION)
3431 };
3432 for (i = 0; i < ARRAY_SIZE(array_no_inst_upper_or); i++) {
3433 zassert_equal(array_no_inst_upper_or[i], TOKEN_NO_INST, "");
3434 }
3435 }
3436
3437 #undef DT_DRV_COMPAT
3438 #define DT_DRV_COMPAT vnd_string_array_token
ZTEST(devicetree_api,test_string_idx_token)3439 ZTEST(devicetree_api, test_string_idx_token)
3440 {
3441 /* The enum has 7 values in total - thus invalid idx starts with 16 */
3442 enum token_string_idx {
3443 token_idx_default,
3444 /* Tokens */
3445 token_first_idx_zero,
3446 token_first_idx_one,
3447 token_first_idx_two,
3448 token_second_idx_zero,
3449 token_second_idx_one,
3450 token_second_idx_two,
3451 token_second_idx_three,
3452 /* Upper tokens */
3453 TOKEN_FIRST_IDX_ZERO,
3454 TOKEN_FIRST_IDX_ONE,
3455 TOKEN_FIRST_IDX_TWO,
3456 TOKEN_SECOND_IDX_ZERO,
3457 TOKEN_SECOND_IDX_ONE,
3458 TOKEN_SECOND_IDX_TWO,
3459 TOKEN_SECOND_IDX_THREE
3460 };
3461
3462 /* Test direct idx access */
3463 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 0),
3464 token_first_idx_zero, "");
3465 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 1),
3466 token_first_idx_one, "");
3467 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 2),
3468 token_first_idx_two, "");
3469 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 0),
3470 token_second_idx_zero, "");
3471 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 1),
3472 token_second_idx_one, "");
3473 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 2),
3474 token_second_idx_two, "");
3475 zassert_equal(DT_STRING_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 3),
3476 token_second_idx_three, "");
3477
3478 /* Index is in range */
3479 zassert_equal(DT_STRING_TOKEN_BY_IDX_OR(DT_NODELABEL(test_str_array_token_1), val, 3,
3480 token_idx_default),
3481 token_second_idx_three, "");
3482 /* Index is out of range */
3483 zassert_equal(DT_STRING_TOKEN_BY_IDX_OR(DT_NODELABEL(test_str_array_token_1), val, 42,
3484 token_idx_default),
3485 token_idx_default, "");
3486
3487 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 0),
3488 TOKEN_FIRST_IDX_ZERO, "");
3489 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 1),
3490 TOKEN_FIRST_IDX_ONE, "");
3491 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_0), val, 2),
3492 TOKEN_FIRST_IDX_TWO, "");
3493 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 0),
3494 TOKEN_SECOND_IDX_ZERO, "");
3495 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 1),
3496 TOKEN_SECOND_IDX_ONE, "");
3497 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 2),
3498 TOKEN_SECOND_IDX_TWO, "");
3499 zassert_equal(DT_STRING_UPPER_TOKEN_BY_IDX(DT_NODELABEL(test_str_array_token_1), val, 3),
3500 TOKEN_SECOND_IDX_THREE, "");
3501
3502 /* Test instances */
3503 #define STRING_TOKEN_BY_IDX_VAR(node_id) _CONCAT(var_token_, node_id)
3504 #define STRING_TOKEN_BY_IDX_TEST_INST_EXPANSION(inst) \
3505 enum token_string_idx STRING_TOKEN_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3506 DT_INST_STRING_TOKEN_BY_IDX(inst, val, 0), \
3507 DT_INST_STRING_TOKEN_BY_IDX(inst, val, 1), \
3508 DT_INST_STRING_TOKEN_BY_IDX(inst, val, 2) \
3509 };
3510 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_BY_IDX_TEST_INST_EXPANSION);
3511
3512 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[0],
3513 token_first_idx_zero, "");
3514 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[1],
3515 token_first_idx_one, "");
3516 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[2],
3517 token_first_idx_two, "");
3518 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[0],
3519 token_second_idx_zero, "");
3520 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[1],
3521 token_second_idx_one, "");
3522 zassert_equal(STRING_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[2],
3523 token_second_idx_two, "");
3524
3525 /* Test instances - index is in range */
3526 #define STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(node_id) _CONCAT(var_in_range_token_or_, node_id)
3527 #define STRING_TOKEN_BY_IDX_OR_TEST_INST_EXPANSION_IN_RANGE(inst) \
3528 enum token_string_idx STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_DRV_INST(inst))[] = { \
3529 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 0, token_idx_default), \
3530 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 1, token_idx_default), \
3531 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 2, token_idx_default)};
3532 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_BY_IDX_OR_TEST_INST_EXPANSION_IN_RANGE);
3533
3534 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[0],
3535 token_first_idx_zero, "");
3536 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[1],
3537 token_first_idx_one, "");
3538 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[2],
3539 token_first_idx_two, "");
3540 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[0],
3541 token_second_idx_zero, "");
3542 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[1],
3543 token_second_idx_one, "");
3544 zassert_equal(STRING_TOKEN_BY_IDX_OR_VAR_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[2],
3545 token_second_idx_two, "");
3546
3547 /* Test instances - index is out of range */
3548 #define STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(node_id) \
3549 _CONCAT(var_not_in_range_token_or_, node_id)
3550 #define STRING_TOKEN_BY_IDX_OR_TEST_INST_EXPANSION_NOT_IN_RANGE(inst) \
3551 enum token_string_idx STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_DRV_INST(inst))[] = { \
3552 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 15, token_idx_default), \
3553 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 16, token_idx_default), \
3554 DT_INST_STRING_TOKEN_BY_IDX_OR(inst, val, 17, token_idx_default)};
3555 DT_INST_FOREACH_STATUS_OKAY(STRING_TOKEN_BY_IDX_OR_TEST_INST_EXPANSION_NOT_IN_RANGE);
3556
3557 zassert_equal(
3558 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[0],
3559 token_idx_default, "");
3560 zassert_equal(
3561 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[1],
3562 token_idx_default, "");
3563 zassert_equal(
3564 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_0))[2],
3565 token_idx_default, "");
3566 zassert_equal(
3567 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[0],
3568 token_idx_default, "");
3569 zassert_equal(
3570 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[1],
3571 token_idx_default, "");
3572 zassert_equal(
3573 STRING_TOKEN_BY_IDX_OR_VAR_NOT_IN_RANGE(DT_NODELABEL(test_str_array_token_1))[2],
3574 token_idx_default, "");
3575
3576 #define STRING_UPPER_TOKEN_BY_IDX_VAR(node_id) _CONCAT(var_upper_token, node_id)
3577 #define STRING_UPPER_TOKEN_BY_IDX_TEST_INST_EXPANSION(inst) \
3578 enum token_string_idx STRING_UPPER_TOKEN_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3579 DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 0), \
3580 DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 1), \
3581 DT_INST_STRING_UPPER_TOKEN_BY_IDX(inst, val, 2) \
3582 };
3583 DT_INST_FOREACH_STATUS_OKAY(STRING_UPPER_TOKEN_BY_IDX_TEST_INST_EXPANSION);
3584
3585 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[0],
3586 TOKEN_FIRST_IDX_ZERO, "");
3587 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[1],
3588 TOKEN_FIRST_IDX_ONE, "");
3589 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_0))[2],
3590 TOKEN_FIRST_IDX_TWO, "");
3591 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[0],
3592 TOKEN_SECOND_IDX_ZERO, "");
3593 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[1],
3594 TOKEN_SECOND_IDX_ONE, "");
3595 zassert_equal(STRING_UPPER_TOKEN_BY_IDX_VAR(DT_NODELABEL(test_str_array_token_1))[2],
3596 TOKEN_SECOND_IDX_TWO, "");
3597 }
3598
3599 #undef DT_DRV_COMPAT
3600 #define DT_DRV_COMPAT vnd_string_unquoted
ZTEST(devicetree_api,test_string_unquoted)3601 ZTEST(devicetree_api, test_string_unquoted)
3602 {
3603 #define XA 12.0
3604 #define XB 34.0
3605 #define XPLUS +
3606 #define XSTR1 "one"
3607 #define XSTR2 "two"
3608 const double f0_expected = 0.1234;
3609 const double f1_expected = 0.9e-3;
3610 const double delta = 0.1e-4;
3611
3612 /* Test DT_STRING_UNQUOTED */
3613 zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_f0), val),
3614 f0_expected, delta, "");
3615 zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_f1), val),
3616 f1_expected, delta, "");
3617 zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_t), val),
3618 XA XPLUS XB, delta, "");
3619 zassert_within(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_esc_t), val), XA XPLUS XB,
3620 delta, "");
3621 zassert_str_equal(DT_STRING_UNQUOTED(DT_NODELABEL(test_str_unquoted_esc_s), val),
3622 "one plus two");
3623 /* Test DT_STRING_UNQUOTED_OR */
3624 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f0), val, (0.0)),
3625 f0_expected, delta, "");
3626 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f1), val, (0.0)),
3627 f1_expected, delta, "");
3628 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_t), val, (0.0)),
3629 XA XPLUS XB, delta, "");
3630 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_t), val, (0.0)),
3631 XA XPLUS XB, delta, "");
3632 zassert_str_equal(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_s), val, "nak"),
3633 "one plus two");
3634 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f0), nak, (0.0)),
3635 0.0, delta, "");
3636 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_f1), nak, (0.0)),
3637 0.0, delta, "");
3638 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_t), nak, (0.0)),
3639 0.0, delta, "");
3640 zassert_within(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_t), nak, (0.0)),
3641 0.0, delta, "");
3642 zassert_str_equal(DT_STRING_UNQUOTED_OR(DT_NODELABEL(test_str_unquoted_esc_s), nak, "nak"),
3643 "nak");
3644 /* Test DT_INST_STRING_UNQUOTED */
3645 #define STRING_UNQUOTED_VAR(node_id) _CONCAT(var_, node_id)
3646 #define STRING_UNQUOTED_TEST_INST_EXPANSION(inst) \
3647 double STRING_UNQUOTED_VAR(DT_DRV_INST(inst)) = DT_INST_STRING_UNQUOTED(inst, val);
3648 DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_TEST_INST_EXPANSION);
3649
3650 zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_f0)),
3651 f0_expected, delta, "");
3652 zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_f1)),
3653 f1_expected, delta, "");
3654 zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_t)), XA XPLUS XB,
3655 delta, "");
3656 zassert_within(STRING_UNQUOTED_VAR(DT_NODELABEL(test_str_unquoted_esc_t)), XA XPLUS XB,
3657 delta, "");
3658
3659 /* Test DT_INST_STRING_UNQUOTED_OR */
3660 #define STRING_UNQUOTED_OR_VAR(node_id) _CONCAT(var_or_, node_id)
3661 #define STRING_UNQUOTED_OR_TEST_INST_EXPANSION(inst) \
3662 double STRING_UNQUOTED_OR_VAR(DT_DRV_INST(inst))[2] = { \
3663 DT_INST_STRING_UNQUOTED_OR(inst, val, (1.0e10)), \
3664 DT_INST_STRING_UNQUOTED_OR(inst, dummy, (1.0e10)) \
3665 };
3666 DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_OR_TEST_INST_EXPANSION);
3667
3668 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f0))[0],
3669 f0_expected, delta, "");
3670 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f1))[0],
3671 f1_expected, delta, "");
3672 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_t))[0],
3673 XA XPLUS XB, delta, "");
3674 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_esc_t))[0],
3675 XA XPLUS XB, delta, "");
3676 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f0))[1],
3677 1.0e10, delta, "");
3678 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_f1))[1],
3679 1.0e10, delta, "");
3680 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_t))[1],
3681 1.0e10, delta, "");
3682 zassert_within(STRING_UNQUOTED_OR_VAR(DT_NODELABEL(test_str_unquoted_esc_t))[1], 1.0e10,
3683 delta, "");
3684 #undef XA
3685 #undef XB
3686 #undef XPLUS
3687 #undef XSTR1
3688 #undef XSTR2
3689 }
3690
3691 #undef DT_DRV_COMPAT
3692 #define DT_DRV_COMPAT vnd_string_array_unquoted
ZTEST(devicetree_api,test_string_idx_unquoted)3693 ZTEST(devicetree_api, test_string_idx_unquoted)
3694 {
3695 #define XA 12.0
3696 #define XB 34.0
3697 #define XC 56.0
3698 #define XD 78.0
3699 #define XPLUS +
3700 #define XMINUS -
3701 #define XSTR1 "one"
3702 #define XSTR2 "two"
3703 const double delta = 0.1e-4;
3704
3705 /* DT_STRING_UNQUOTED_BY_IDX */
3706 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 0),
3707 1.0e2, delta, "");
3708 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 1),
3709 2.0e2, delta, "");
3710 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 2),
3711 3.0e2, delta, "");
3712 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f0), val, 3),
3713 4.0e2, delta, "");
3714
3715 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 0),
3716 0.01, delta, "");
3717 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 1),
3718 0.1, delta, "");
3719 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 2),
3720 1.0, delta, "");
3721 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_f1), val, 3),
3722 10.0, delta, "");
3723
3724 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 0),
3725 XA XPLUS XB, delta, "");
3726 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 1),
3727 XC XPLUS XD, delta, "");
3728 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 2),
3729 XA XMINUS XB, delta, "");
3730 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_t), val, 3),
3731 XC XMINUS XD, delta, "");
3732
3733 zassert_within(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_esc), val, 0),
3734 XA XPLUS XB, delta, "");
3735 zassert_str_equal(DT_STRING_UNQUOTED_BY_IDX(DT_NODELABEL(test_stra_unquoted_esc), val, 1),
3736 "one plus two");
3737
3738 #define STRING_UNQUOTED_BY_IDX_VAR(node_id) _CONCAT(var_, node_id)
3739 #define STRING_UNQUOTED_BY_IDX_TEST_INST_EXPANSION(inst) \
3740 double STRING_UNQUOTED_BY_IDX_VAR(DT_DRV_INST(inst))[] = { \
3741 DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 0), \
3742 DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 1), \
3743 DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 2), \
3744 DT_INST_STRING_UNQUOTED_BY_IDX(inst, val, 3), \
3745 };
3746 DT_INST_FOREACH_STATUS_OKAY(STRING_UNQUOTED_BY_IDX_TEST_INST_EXPANSION);
3747
3748 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[0],
3749 1.0e2, delta, "");
3750 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[1],
3751 2.0e2, delta, "");
3752 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[2],
3753 3.0e2, delta, "");
3754 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f0))[3],
3755 4.0e2, delta, "");
3756
3757 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[0],
3758 0.01, delta, "");
3759 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[1],
3760 0.1, delta, "");
3761 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[2],
3762 1.0, delta, "");
3763 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_f1))[3],
3764 10.0, delta, "");
3765
3766 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[0],
3767 XA XPLUS XB, delta, "");
3768 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[1],
3769 XC XPLUS XD, delta, "");
3770 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[2],
3771 XA XMINUS XB, delta, "");
3772 zassert_within(STRING_UNQUOTED_BY_IDX_VAR(DT_NODELABEL(test_stra_unquoted_t))[3],
3773 XC XMINUS XD, delta, "");
3774 #undef XA
3775 #undef XB
3776 #undef XC
3777 #undef XD
3778 #undef XPLUS
3779 #undef XMINUS
3780 #undef XSTR1
3781 #undef XSTR2
3782 }
3783
3784 #undef DT_DRV_COMPAT
ZTEST(devicetree_api,test_string_escape)3785 ZTEST(devicetree_api, test_string_escape)
3786 {
3787 zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_0), val), "\a\b\f\n\r\t\v");
3788 zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_1), val), "\'single\' \"double\"");
3789 zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_2), val), "first\nsecond");
3790 zassert_str_equal(DT_PROP(DT_NODELABEL(test_str_escape_3), val), "\x01\x7F");
3791 }
3792
ZTEST(devicetree_api,test_string_array_escape)3793 ZTEST(devicetree_api, test_string_array_escape)
3794 {
3795 zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 0), "\a\b\f\n\r\t\v");
3796 zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 1),
3797 "\'single\' \"double\"");
3798 zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 2), "first\nsecond");
3799 zassert_str_equal(DT_PROP_BY_IDX(DT_NODELABEL(test_stra_escape), val, 3), "\x01\x7F");
3800 }
3801
3802 #undef DT_DRV_COMPAT
3803 #define DT_DRV_COMPAT vnd_adc_temp_sensor
ZTEST(devicetree_api,test_reset)3804 ZTEST(devicetree_api, test_reset)
3805 {
3806 /* DT_RESET_CTLR_BY_IDX */
3807 zassert_true(DT_SAME_NODE(DT_RESET_CTLR_BY_IDX(TEST_TEMP, 1),
3808 DT_NODELABEL(test_reset)), "");
3809
3810 /* DT_RESET_CTLR */
3811 zassert_true(DT_SAME_NODE(DT_RESET_CTLR(TEST_TEMP),
3812 DT_NODELABEL(test_reset)), "");
3813
3814 /* DT_RESET_CTLR_BY_NAME */
3815 zassert_true(DT_SAME_NODE(DT_RESET_CTLR_BY_NAME(TEST_TEMP, reset_b),
3816 DT_NODELABEL(test_reset)), "");
3817
3818 /* DT_RESET_CELL_BY_IDX */
3819 zassert_equal(DT_RESET_CELL_BY_IDX(TEST_TEMP, 1, id), 20, "");
3820 zassert_equal(DT_RESET_CELL_BY_IDX(TEST_TEMP, 0, id), 10, "");
3821
3822 /* DT_RESET_CELL_BY_NAME */
3823 zassert_equal(DT_RESET_CELL_BY_NAME(TEST_TEMP, reset_a, id), 10, "");
3824 zassert_equal(DT_RESET_CELL_BY_NAME(TEST_TEMP, reset_b, id), 20, "");
3825
3826 /* DT_RESET_CELL */
3827 zassert_equal(DT_RESET_CELL(TEST_TEMP, id), 10, "");
3828
3829 /* reg-width on reset */
3830 zassert_equal(DT_PROP_BY_PHANDLE_IDX(TEST_TEMP, resets, 1, reg_width), 4, "");
3831
3832 /* DT_INST */
3833 zassert_equal(DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT), 1, "");
3834
3835 /* DT_INST_RESET_CTLR_BY_IDX */
3836 zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR_BY_IDX(0, 1),
3837 DT_NODELABEL(test_reset)), "");
3838
3839 /* DT_INST_RESET_CTLR */
3840 zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR(0),
3841 DT_NODELABEL(test_reset)), "");
3842
3843 /* DT_INST_RESET_CTLR_BY_NAME */
3844 zassert_true(DT_SAME_NODE(DT_INST_RESET_CTLR_BY_NAME(0, reset_b),
3845 DT_NODELABEL(test_reset)), "");
3846
3847 /* DT_INST_RESET_CELL_BY_IDX */
3848 zassert_equal(DT_INST_RESET_CELL_BY_IDX(0, 1, id), 20, "");
3849 zassert_equal(DT_INST_RESET_CELL_BY_IDX(0, 0, id), 10, "");
3850
3851 /* DT_INST_RESET_CELL_BY_NAME */
3852 zassert_equal(DT_INST_RESET_CELL_BY_NAME(0, reset_a, id), 10, "");
3853 zassert_equal(DT_INST_RESET_CELL_BY_NAME(0, reset_b, id), 20, "");
3854
3855 /* DT_INST_RESET_CELL */
3856 zassert_equal(DT_INST_RESET_CELL(0, id), 10, "");
3857
3858 /* reg-width on reset */
3859 zassert_equal(DT_INST_PROP_BY_PHANDLE_IDX(0, resets, 1, reg_width), 4, "");
3860
3861 /* DT_RESET_ID_BY_IDX */
3862 zassert_equal(DT_RESET_ID_BY_IDX(TEST_TEMP, 0), 10, "");
3863 zassert_equal(DT_RESET_ID_BY_IDX(TEST_TEMP, 1), 20, "");
3864
3865 /* DT_RESET_ID */
3866 zassert_equal(DT_RESET_ID(TEST_TEMP), 10, "");
3867
3868 /* DT_INST_RESET_ID_BY_IDX */
3869 zassert_equal(DT_INST_RESET_ID_BY_IDX(0, 0), 10, "");
3870 zassert_equal(DT_INST_RESET_ID_BY_IDX(0, 1), 20, "");
3871
3872 /* DT_INST_RESET_ID */
3873 zassert_equal(DT_INST_RESET_ID(0), 10, "");
3874 }
3875
3876 #undef DT_DRV_COMPAT
3877 #define DT_DRV_COMPAT vnd_interrupt_holder_extended
ZTEST(devicetree_api,test_interrupt_controller)3878 ZTEST(devicetree_api, test_interrupt_controller)
3879 {
3880 /* DT_IRQ_INTC_BY_IDX */
3881 zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_IDX(TEST_IRQ_EXT, 0), TEST_INTC), "");
3882 zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_IDX(TEST_IRQ_EXT, 1), TEST_GPIO_4), "");
3883
3884 /* DT_IRQ_INTC_BY_NAME */
3885 zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_NAME(TEST_IRQ_EXT, int1), TEST_INTC), "");
3886 zassert_true(DT_SAME_NODE(DT_IRQ_INTC_BY_NAME(TEST_IRQ_EXT, int2), TEST_GPIO_4), "");
3887
3888 /* DT_IRQ_INTC */
3889 zassert_true(DT_SAME_NODE(DT_IRQ_INTC(TEST_IRQ_EXT), TEST_INTC), "");
3890
3891 /* DT_INST_IRQ_INTC_BY_IDX */
3892 zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_IDX(0, 0), TEST_INTC), "");
3893 zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_IDX(0, 1), TEST_GPIO_4), "");
3894
3895 /* DT_INST_IRQ_INTC_BY_NAME */
3896 zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_NAME(0, int1), TEST_INTC), "");
3897 zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC_BY_NAME(0, int2), TEST_GPIO_4), "");
3898
3899 /* DT_INST_IRQ_INTC */
3900 zassert_true(DT_SAME_NODE(DT_INST_IRQ_INTC(0), TEST_INTC), "");
3901 }
3902
ZTEST(devicetree_api,test_nvmem_devictree)3903 ZTEST(devicetree_api, test_nvmem_devictree)
3904 {
3905 zexpect_equal(DT_NVMEM_CELLS_HAS_IDX(DT_NODELABEL(test_nvmem_consumer), 0), 1);
3906 zexpect_equal(DT_NVMEM_CELLS_HAS_IDX(DT_NODELABEL(test_nvmem_consumer), 1), 1);
3907 zexpect_equal(DT_NVMEM_CELLS_HAS_IDX(DT_NODELABEL(test_nvmem_consumer), 2), 0);
3908
3909 zexpect_equal(DT_NVMEM_CELLS_HAS_NAME(DT_NODELABEL(test_nvmem_consumer), cell0), 1);
3910 zexpect_equal(DT_NVMEM_CELLS_HAS_NAME(DT_NODELABEL(test_nvmem_consumer), cell10), 1);
3911 zexpect_equal(DT_NVMEM_CELLS_HAS_NAME(DT_NODELABEL(test_nvmem_consumer), missing), 0);
3912
3913 zexpect_equal(DT_NUM_NVMEM_CELLS(DT_NODELABEL(test_nvmem_consumer)), 2);
3914
3915 zexpect_str_equal(DT_NODE_PATH(DT_NVMEM_CELL_BY_IDX(DT_NODELABEL(test_nvmem_consumer), 0)),
3916 "/test/test-nvmem-provider/nvmem-layout/cell@0");
3917 zexpect_str_equal(DT_NODE_PATH(DT_NVMEM_CELL_BY_IDX(DT_NODELABEL(test_nvmem_consumer), 1)),
3918 "/test/test-nvmem-provider/nvmem-layout/cell@10");
3919
3920 zexpect_str_equal(
3921 DT_NODE_PATH(DT_NVMEM_CELL_BY_NAME(DT_NODELABEL(test_nvmem_consumer), cell0)),
3922 "/test/test-nvmem-provider/nvmem-layout/cell@0");
3923 zexpect_str_equal(
3924 DT_NODE_PATH(DT_NVMEM_CELL_BY_NAME(DT_NODELABEL(test_nvmem_consumer), cell10)),
3925 "/test/test-nvmem-provider/nvmem-layout/cell@10");
3926
3927 zexpect_str_equal(DT_NODE_PATH(DT_MTD_FROM_NVMEM_CELL(
3928 DT_NVMEM_CELL(DT_NODELABEL(test_nvmem_consumer)))),
3929 "/test/test-nvmem-provider");
3930 }
3931
3932 #undef DT_DRV_COMPAT
3933 #define DT_DRV_COMPAT vnd_nvmem_consumer
ZTEST(devicetree_api,test_nvmem_devictree_inst)3934 ZTEST(devicetree_api, test_nvmem_devictree_inst)
3935 {
3936 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_IDX(0, 0), 1);
3937 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_IDX(0, 1), 1);
3938 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_IDX(0, 2), 0);
3939
3940 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_NAME(0, cell0), 1);
3941 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_NAME(0, cell10), 1);
3942 zexpect_equal(DT_INST_NVMEM_CELLS_HAS_NAME(0, missing), 0);
3943
3944 zexpect_equal(DT_INST_NUM_NVMEM_CELLS(0), 2);
3945
3946 zexpect_str_equal(DT_NODE_PATH(DT_INST_NVMEM_CELL_BY_IDX(0, 0)),
3947 "/test/test-nvmem-provider/nvmem-layout/cell@0");
3948 zexpect_str_equal(DT_NODE_PATH(DT_INST_NVMEM_CELL_BY_IDX(0, 1)),
3949 "/test/test-nvmem-provider/nvmem-layout/cell@10");
3950
3951 zexpect_str_equal(DT_NODE_PATH(DT_INST_NVMEM_CELL_BY_NAME(0, cell0)),
3952 "/test/test-nvmem-provider/nvmem-layout/cell@0");
3953 zexpect_str_equal(DT_NODE_PATH(DT_INST_NVMEM_CELL_BY_NAME(0, cell10)),
3954 "/test/test-nvmem-provider/nvmem-layout/cell@10");
3955
3956 zexpect_str_equal(DT_NODE_PATH(DT_MTD_FROM_NVMEM_CELL(DT_INST_NVMEM_CELL(0))),
3957 "/test/test-nvmem-provider");
3958 }
3959
3960 ZTEST_SUITE(devicetree_api, NULL, NULL, NULL, NULL, NULL);
3961