1 /*
2  * Copyright (c) 2020 Libre Solar Technologies GmbH
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 
8 #include <zephyr/drivers/dac.h>
9 #include <zephyr/kernel.h>
10 #include <zephyr/ztest.h>
11 
12 #if defined(CONFIG_BOARD_NUCLEO_F091RC) || \
13 	defined(CONFIG_BOARD_NUCLEO_F207ZG) || \
14 	defined(CONFIG_BOARD_STM32F3_DISCO) || \
15 	defined(CONFIG_BOARD_NUCLEO_F429ZI) || \
16 	defined(CONFIG_BOARD_NUCLEO_F439ZI) || \
17 	defined(CONFIG_BOARD_NUCLEO_F746ZG) || \
18 	defined(CONFIG_BOARD_NUCLEO_F767ZI) || \
19 	defined(CONFIG_BOARD_NUCLEO_F722ZE) || \
20 	defined(CONFIG_BOARD_NUCLEO_G071RB) || \
21 	defined(CONFIG_BOARD_NUCLEO_G431RB) || \
22 	defined(CONFIG_BOARD_NUCLEO_G474RE) || \
23 	defined(CONFIG_BOARD_NUCLEO_H743ZI) || \
24 	defined(CONFIG_BOARD_NUCLEO_L073RZ) || \
25 	defined(CONFIG_BOARD_NUCLEO_L152RE) || \
26 	defined(CONFIG_BOARD_DISCO_L475_IOT1) || \
27 	defined(CONFIG_BOARD_NUCLEO_L552ZE_Q) || \
28 	defined(CONFIG_BOARD_STM32L562E_DK) || \
29 	defined(CONFIG_BOARD_STM32H573I_DK) || \
30 	defined(CONFIG_BOARD_STM32U083C_DK) || \
31 	defined(CONFIG_BOARD_B_U585I_IOT02A) || \
32 	defined(CONFIG_BOARD_NUCLEO_U083RC) || \
33 	defined(CONFIG_BOARD_NUCLEO_U385RG_Q) || \
34 	defined(CONFIG_BOARD_NUCLEO_U575ZI_Q) || \
35 	defined(CONFIG_BOARD_NUCLEO_U5A5ZJ_Q) || \
36 	defined(CONFIG_BOARD_NUCLEO_WL55JC) || \
37 	defined(CONFIG_BOARD_RONOTH_LODEV)
38 
39 #define DAC_DEVICE_NODE		DT_NODELABEL(dac1)
40 #define DAC_CHANNEL_ID		1
41 #define DAC_RESOLUTION		12
42 
43 #elif defined(CONFIG_BOARD_NUCLEO_H563ZI)
44 
45 #define DAC_DEVICE_NODE		DT_NODELABEL(dac1)
46 #define DAC_CHANNEL_ID		2
47 #define DAC_RESOLUTION		12
48 
49 /* Note external DAC MCP4725 is not populated on BL652_DVK, BL653_DVK and
50  * BL654_DVK at factory
51  */
52 #elif defined(CONFIG_BOARD_TWR_KE18F) || \
53 	defined(CONFIG_BOARD_FRDM_K64F) || \
54 	defined(CONFIG_BOARD_FRDM_K22F) || \
55 	defined(CONFIG_BOARD_FRDM_MCXN947) || \
56 	defined(CONFIG_BOARD_MCX_N9XX_EVK) || \
57 	defined(CONFIG_BOARD_FRDM_MCXA156) || \
58 	defined(CONFIG_BOARD_SEEEDUINO_XIAO) || \
59 	defined(CONFIG_BOARD_ARDUINO_MKRZERO) || \
60 	defined(CONFIG_BOARD_ARDUINO_ZERO) || \
61 	defined(CONFIG_BOARD_LPCXPRESSO55S36) || \
62 	defined(CONFIG_BOARD_SAME54_XPRO) || \
63 	defined(CONFIG_BOARD_BL652_DVK) || \
64 	defined(CONFIG_BOARD_BL653_DVK) || \
65 	defined(CONFIG_BOARD_BL654_DVK) || \
66 	defined(CONFIG_BOARD_BL5340_DVK) || \
67 	DT_HAS_COMPAT_STATUS_OKAY(renesas_ra_dac)
68 
69 #define DAC_DEVICE_NODE		DT_NODELABEL(dac0)
70 #define DAC_RESOLUTION		12
71 #define DAC_CHANNEL_ID		0
72 
73 #elif defined(CONFIG_BOARD_ESP32_DEVKITC) || \
74 	defined(CONFIG_BOARD_ESP_WROVER_KIT) || \
75 	defined(CONFIG_BOARD_ESP32S2_SAOLA) || \
76 	defined(CONFIG_BOARD_ESP32S2_DEVKITC) || \
77 	defined(CONFIG_BOARD_GD32A503V_EVAL) || \
78 	defined(CONFIG_BOARD_GD32E103V_EVAL) || \
79 	defined(CONFIG_BOARD_GD32F450I_EVAL) || \
80 	defined(CONFIG_BOARD_GD32F450Z_EVAL) || \
81 	defined(CONFIG_BOARD_GD32F470I_EVAL) || \
82 	defined(CONFIG_BOARD_YD_ESP32)       || \
83 	defined(CONFIG_BOARD_MIMXRT1170_EVK) || \
84 	defined(CONFIG_BOARD_MIMXRT1180_EVK)
85 
86 #define DAC_DEVICE_NODE		DT_NODELABEL(dac)
87 #define DAC_RESOLUTION		12
88 #define DAC_CHANNEL_ID		0
89 
90 #elif defined(CONFIG_SOC_FAMILY_ATMEL_SAM) && \
91 	!defined(CONFIG_SOC_SERIES_SAM4L)
92 
93 #define DAC_DEVICE_NODE		DT_NODELABEL(dacc)
94 #define DAC_RESOLUTION		12
95 #define DAC_CHANNEL_ID		0
96 
97 #elif defined(CONFIG_BOARD_RD_RW612_BGA) || \
98 	defined(CONFIG_BOARD_FRDM_RW612)
99 
100 #define DAC_DEVICE_NODE		DT_NODELABEL(dac0)
101 #define DAC_RESOLUTION		10
102 #define DAC_CHANNEL_ID		0
103 
104 #elif defined(CONFIG_SOC_FAMILY_SILABS_S2)
105 
106 #define DAC_DEVICE_NODE		DT_NODELABEL(vdac0)
107 #define DAC_RESOLUTION		12
108 #define DAC_CHANNEL_ID		0
109 
110 #else
111 #error "Unsupported board."
112 #endif
113 
114 static const struct dac_channel_cfg dac_ch_cfg = {
115 	.channel_id = DAC_CHANNEL_ID,
116 	.resolution = DAC_RESOLUTION,
117 #if defined(CONFIG_DAC_BUFFER_NOT_SUPPORT)
118 	.buffered = false,
119 #else
120 	.buffered = true,
121 #endif /* CONFIG_DAC_BUFFER_NOT_SUPPORT */
122 };
123 
get_dac_device(void)124 const struct device *get_dac_device(void)
125 {
126 	return DEVICE_DT_GET(DAC_DEVICE_NODE);
127 }
128 
init_dac(void)129 static const struct device *init_dac(void)
130 {
131 	int ret;
132 	const struct device *const dac_dev = DEVICE_DT_GET(DAC_DEVICE_NODE);
133 
134 	zassert_true(device_is_ready(dac_dev), "DAC device is not ready");
135 
136 	ret = dac_channel_setup(dac_dev, &dac_ch_cfg);
137 	zassert_ok(ret, "Setting up of the first channel failed with code %d", ret);
138 
139 	return dac_dev;
140 }
141 
142 /*
143  * test_dac_write_value
144  */
ZTEST(dac,test_task_write_value)145 ZTEST(dac, test_task_write_value)
146 {
147 	int ret;
148 
149 	const struct device *dac_dev = init_dac();
150 
151 	/* write a value of half the full scale resolution */
152 	ret = dac_write_value(dac_dev, DAC_CHANNEL_ID,
153 						(1U << DAC_RESOLUTION) / 2);
154 	zassert_ok(ret, "dac_write_value() failed with code %d", ret);
155 }
156 
dac_setup(void)157 static void *dac_setup(void)
158 {
159 	k_object_access_grant(get_dac_device(), k_current_get());
160 
161 	return NULL;
162 }
163 
164 ZTEST_SUITE(dac, NULL, dac_setup, NULL, NULL, NULL);
165