1 /*
2  * Copyright (c) 2022 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #include <zephyr/ztest.h>
8 #include <zephyr/drivers/usb/udc.h>
9 #include <zephyr/sys/byteorder.h>
10 #include <zephyr/usb/usb_ch9.h>
11 
12 #include <zephyr/logging/log.h>
13 LOG_MODULE_REGISTER(udc_test, LOG_LEVEL_INF);
14 
15 /*
16  * Simple test for API rules, allocation, queue, and dequeu
17  * of the endpoint requests. USB device controller should not be
18  * connected to the host as this state is not covered by this test.
19  */
20 
21 #define BULK_OUT_EP_ADDR	0x01U
22 #define BULK_IN_EP_ADDR		0x81U
23 #define FALSE_EP_ADDR		0x0FU
24 
25 K_MSGQ_DEFINE(test_msgq, sizeof(struct udc_event), 8, sizeof(uint32_t));
26 static K_KERNEL_STACK_DEFINE(test_udc_stack, 512);
27 static struct k_thread test_udc_thread_data;
28 static K_SEM_DEFINE(ep_queue_sem, 0, 1);
29 static uint8_t last_used_ep;
30 static uint8_t test_event_ctx;
31 
test_udc_event_handler(const struct device * dev,const struct udc_event * const event)32 static int test_udc_event_handler(const struct device *dev,
33 				  const struct udc_event *const event)
34 {
35 	return k_msgq_put(&test_msgq, event, K_NO_WAIT);
36 }
37 
event_ep_request(const struct device * dev,struct udc_event event)38 static void event_ep_request(const struct device *dev, struct udc_event event)
39 {
40 	struct udc_buf_info *bi;
41 	int err;
42 
43 	bi = udc_get_buf_info(event.buf);
44 
45 	err = udc_ep_buf_free(dev, event.buf);
46 	zassert_ok(err, "Failed to free request buffer");
47 
48 	if (bi->err == -ECONNABORTED && bi->ep == last_used_ep) {
49 		k_sem_give(&ep_queue_sem);
50 	}
51 }
52 
test_udc_thread(void * p1,void * p2,void * p3)53 static void test_udc_thread(void *p1, void *p2, void *p3)
54 {
55 	ARG_UNUSED(p2);
56 	ARG_UNUSED(p3);
57 
58 	const struct device *dev = p1;
59 	struct udc_event event;
60 
61 	while (true) {
62 		k_msgq_get(&test_msgq, &event, K_FOREVER);
63 
64 		zassert_equal(udc_get_event_ctx(event.dev), &test_event_ctx,
65 			      "Wrong pointer to higher layer context");
66 
67 		switch (event.type) {
68 		case UDC_EVT_VBUS_REMOVED:
69 			LOG_DBG("VBUS remove event");
70 			break;
71 		case UDC_EVT_VBUS_READY:
72 			LOG_DBG("VBUS detected event");
73 			break;
74 		case UDC_EVT_SUSPEND:
75 			LOG_DBG("Suspend event");
76 			break;
77 		case UDC_EVT_RESUME:
78 			LOG_DBG("Resume event");
79 			break;
80 		case UDC_EVT_RESET:
81 			LOG_DBG("Reset event");
82 			break;
83 		case UDC_EVT_SOF:
84 			LOG_DBG("SoF event");
85 			break;
86 		case UDC_EVT_EP_REQUEST:
87 			event_ep_request(dev, event);
88 			break;
89 		case UDC_EVT_ERROR:
90 			LOG_DBG("Error event");
91 			break;
92 		default:
93 			break;
94 		};
95 	}
96 }
97 
test_udc_ep_try_config(const struct device * dev,struct usb_ep_descriptor * ed)98 static void test_udc_ep_try_config(const struct device *dev,
99 				   struct usb_ep_descriptor *ed)
100 {
101 	uint16_t mps = sys_le16_to_cpu(ed->wMaxPacketSize);
102 	int err;
103 
104 	err = udc_ep_try_config(dev, ed->bEndpointAddress,
105 				ed->bmAttributes, &mps,
106 				ed->bInterval);
107 	zassert_equal(err, 0, "Failed to test endpoint configuration");
108 
109 	if (ed->bmAttributes == USB_EP_TYPE_CONTROL ||
110 	    ed->bmAttributes == USB_EP_TYPE_ISO) {
111 		/*
112 		 * Skip subsequent test since udc_ep_try_config() does not
113 		 * update mps argument for control and iso endpoints.
114 		 */
115 		return;
116 	}
117 
118 	mps = 0;
119 	err = udc_ep_try_config(dev, ed->bEndpointAddress,
120 				ed->bmAttributes, &mps,
121 				ed->bInterval);
122 	zassert_equal(err, 0, "Failed to test endpoint configuration");
123 	zassert_not_equal(mps, 0, "Failed to test endpoint configuration");
124 }
125 
test_udc_ep_enable(const struct device * dev,struct usb_ep_descriptor * ed)126 static void test_udc_ep_enable(const struct device *dev,
127 			       struct usb_ep_descriptor *ed)
128 {
129 	uint8_t ctrl_ep = USB_EP_DIR_IS_IN(ed->bEndpointAddress) ?
130 			  USB_CONTROL_EP_IN : USB_CONTROL_EP_OUT;
131 	/* Possible return values 0, -EINVAL, -ENODEV, -EALREADY, -EPERM. */
132 	int err1, err2, err3;
133 
134 	err1 = udc_ep_enable(dev, ed->bEndpointAddress, ed->bmAttributes,
135 			     sys_le16_to_cpu(ed->wMaxPacketSize),
136 			     ed->bInterval);
137 	err2 = udc_ep_enable(dev, ed->bEndpointAddress, ed->bmAttributes,
138 			     sys_le16_to_cpu(ed->wMaxPacketSize),
139 			     ed->bInterval);
140 	err3 = udc_ep_enable(dev, ctrl_ep, ed->bmAttributes,
141 			     sys_le16_to_cpu(ed->wMaxPacketSize),
142 			     ed->bInterval);
143 
144 	if (!udc_is_initialized(dev) && !udc_is_enabled(dev)) {
145 		zassert_equal(err1, -EPERM, "Not failed to enable endpoint");
146 		zassert_equal(err2, -EPERM, "Not failed to enable endpoint");
147 		zassert_equal(err3, -EINVAL, "Not failed to enable endpoint");
148 	} else if (udc_is_initialized(dev) && !udc_is_enabled(dev)) {
149 		zassert_equal(err1, -EPERM, "Not failed to enable endpoint");
150 		zassert_equal(err2, -EPERM, "Not failed to enable endpoint");
151 		zassert_equal(err3, -EINVAL, "Not failed to enable endpoint");
152 	} else {
153 		zassert_equal(err1, 0, "Failed to enable endpoint");
154 		zassert_equal(err2, -EALREADY, "Not failed to enable endpoint");
155 		zassert_equal(err3, -EINVAL, "Not failed to enable endpoint");
156 	}
157 }
158 
test_udc_ep_disable(const struct device * dev,struct usb_ep_descriptor * ed)159 static void test_udc_ep_disable(const struct device *dev,
160 				struct usb_ep_descriptor *ed)
161 {
162 	uint8_t ctrl_ep = USB_EP_DIR_IS_IN(ed->bEndpointAddress) ?
163 			  USB_CONTROL_EP_IN : USB_CONTROL_EP_OUT;
164 	/* Possible return values 0, -EINVAL, -ENODEV, -EALREADY, -EPERM. */
165 	int err1, err2, err3;
166 
167 	err1 = udc_ep_disable(dev, ed->bEndpointAddress);
168 	err2 = udc_ep_disable(dev, ed->bEndpointAddress);
169 	err3 = udc_ep_disable(dev, ctrl_ep);
170 
171 	if (!udc_is_initialized(dev) && !udc_is_enabled(dev)) {
172 		zassert_equal(err1, -EPERM, "Not failed to disable endpoint");
173 		zassert_equal(err2, -EPERM, "Not failed to disable endpoint");
174 		zassert_equal(err3, -EINVAL, "Not failed to disable endpoint");
175 	} else if (udc_is_initialized(dev) && !udc_is_enabled(dev)) {
176 		zassert_equal(err1, -EALREADY, "Failed to disable endpoint");
177 		zassert_equal(err2, -EALREADY, "Not failed to disable endpoint");
178 		zassert_equal(err3, -EINVAL, "Not failed to disable endpoint");
179 	} else {
180 		zassert_equal(err1, 0, "Failed to disable endpoint");
181 		zassert_equal(err2, -EALREADY, "Not failed to disable endpoint");
182 		zassert_equal(err3, -EINVAL, "Not failed to disable endpoint");
183 	}
184 }
185 
test_udc_ep_buf_alloc(const struct device * dev,struct usb_ep_descriptor * ed)186 static struct net_buf *test_udc_ep_buf_alloc(const struct device *dev,
187 					     struct usb_ep_descriptor *ed)
188 {
189 	struct net_buf *buf;
190 
191 	buf = udc_ep_buf_alloc(dev, ed->bEndpointAddress,
192 			       USB_MPS_TO_TPL(sys_le16_to_cpu(ed->wMaxPacketSize)));
193 
194 	zassert_not_null(buf, "Failed to allocate request");
195 
196 	return buf;
197 }
198 
test_udc_ep_buf_free(const struct device * dev,struct net_buf * buf)199 static void test_udc_ep_buf_free(const struct device *dev,
200 				 struct net_buf *buf)
201 {
202 	int err;
203 
204 	if (buf == NULL) {
205 		return;
206 	}
207 
208 	err = udc_ep_buf_free(dev, buf);
209 	zassert_ok(err, "Failed to free request");
210 }
211 
test_udc_ep_halt(const struct device * dev,struct usb_ep_descriptor * ed)212 static void test_udc_ep_halt(const struct device *dev,
213 			     struct usb_ep_descriptor *ed)
214 {
215 	/* Possible return values 0, -ENODEV, -ENOTSUP, -EPERM. */
216 	int err1, err2;
217 
218 	err1 = udc_ep_set_halt(dev, ed->bEndpointAddress);
219 	err2 = udc_ep_set_halt(dev, FALSE_EP_ADDR);
220 
221 	if (udc_is_enabled(dev)) {
222 		if (ed->bmAttributes == USB_EP_TYPE_ISO) {
223 			zassert_equal(err1, -ENOTSUP, "Not failed to set halt");
224 		} else {
225 			zassert_equal(err1, 0, "Failed to set halt");
226 		}
227 
228 		zassert_equal(err2, -ENODEV, "Not failed to set halt");
229 	} else {
230 		zassert_equal(err1, -EPERM, "Not failed to set halt");
231 		zassert_equal(err2, -EPERM, "Not failed to set halt");
232 	}
233 
234 	err1 = udc_ep_clear_halt(dev, ed->bEndpointAddress);
235 	err2 = udc_ep_clear_halt(dev, FALSE_EP_ADDR);
236 
237 	if (udc_is_enabled(dev)) {
238 		if (ed->bmAttributes == USB_EP_TYPE_ISO) {
239 			zassert_equal(err1, -ENOTSUP, "Not failed to clear halt");
240 		} else {
241 			zassert_equal(err1, 0, "Failed to clear halt ");
242 		}
243 
244 		zassert_equal(err2, -ENODEV, "Not failed to clear halt");
245 	} else {
246 		zassert_equal(err1, -EPERM, "Not failed to clear halt");
247 		zassert_equal(err2, -EPERM, "Not failed to clear halt");
248 	}
249 }
250 
test_udc_ep_enqueue(const struct device * dev,struct net_buf * buf)251 static void test_udc_ep_enqueue(const struct device *dev,
252 				struct net_buf *buf)
253 {
254 	/* Possible return values 0, -EPERM, -ENODEV, -EACCES(TBD), -EBUSY (TBD) */
255 	int err1, err2 = 0;
256 	struct net_buf *false_buf = NULL;
257 
258 	err1 = udc_ep_enqueue(dev, buf);
259 	if (udc_is_enabled(dev)) {
260 		false_buf = udc_ep_buf_alloc(dev, FALSE_EP_ADDR, 64);
261 		zassert_not_null(false_buf, "Failed to allocate request");
262 		err2 = udc_ep_enqueue(dev, false_buf);
263 	}
264 
265 	if (udc_is_enabled(dev)) {
266 		zassert_equal(err1, 0, "Failed to queue request");
267 		zassert_equal(err2, -ENODEV, "Not failed to queue request");
268 	} else {
269 		zassert_equal(err1, -EPERM, "Not failed to queue request");
270 	}
271 
272 	test_udc_ep_buf_free(dev, false_buf);
273 }
274 
test_udc_ep_dequeue(const struct device * dev,struct usb_ep_descriptor * ed)275 static void test_udc_ep_dequeue(const struct device *dev,
276 				struct usb_ep_descriptor *ed)
277 {
278 	/* Possible return values 0, -EPERM, -ENODEV, -EACCES(TBD) */
279 	int err;
280 
281 	err = udc_ep_dequeue(dev, ed->bEndpointAddress);
282 
283 	if (!udc_is_initialized(dev)) {
284 		zassert_equal(err, -EPERM, "Not failed to dequeue");
285 	} else {
286 		zassert_equal(err, 0, "Failed to dequeue");
287 	}
288 }
289 
test_udc_wakeup(const struct device * dev)290 static void test_udc_wakeup(const struct device *dev)
291 {
292 	int err;
293 
294 	err = udc_host_wakeup(dev);
295 
296 	if (!udc_is_enabled(dev)) {
297 		zassert_equal(err, -EPERM, "Not failed to request host wakeup");
298 	}
299 }
300 
test_udc_set_address(const struct device * dev,uint8_t addr)301 static void test_udc_set_address(const struct device *dev, uint8_t addr)
302 {
303 	int err;
304 
305 	err = udc_set_address(dev, addr);
306 
307 	if (!udc_is_enabled(dev)) {
308 		zassert_equal(err, -EPERM, "Not failed to set address");
309 	}
310 }
311 
test_udc_ep_api(const struct device * dev,struct usb_ep_descriptor * ed)312 static void test_udc_ep_api(const struct device *dev,
313 			    struct usb_ep_descriptor *ed)
314 {
315 	const int num_of_iterations = 10;
316 	struct net_buf *buf;
317 	int err;
318 
319 	last_used_ep = ed->bEndpointAddress;
320 
321 	for (int i = 0; i < num_of_iterations; i++) {
322 		err = udc_ep_enable(dev, ed->bEndpointAddress, ed->bmAttributes,
323 				    sys_le16_to_cpu(ed->wMaxPacketSize),
324 				    ed->bInterval);
325 		zassert_ok(err, "Failed to enable endpoint");
326 
327 		/* It needs a little reserve for memory management overhead. */
328 		for (int n = 0; n < (CONFIG_UDC_BUF_COUNT - 4); n++) {
329 			buf = udc_ep_buf_alloc(dev, ed->bEndpointAddress,
330 				USB_MPS_TO_TPL(sys_le16_to_cpu(ed->wMaxPacketSize)));
331 			zassert_not_null(buf,
332 					 "Failed to allocate request (%d) for 0x%02x",
333 					 n, ed->bEndpointAddress);
334 
335 			udc_ep_buf_set_zlp(buf);
336 			err = udc_ep_enqueue(dev, buf);
337 			zassert_ok(err, "Failed to queue request");
338 			k_yield();
339 		}
340 
341 		err = udc_ep_disable(dev, ed->bEndpointAddress);
342 		zassert_ok(err, "Failed to disable endpoint");
343 
344 		err = udc_ep_dequeue(dev, ed->bEndpointAddress);
345 		zassert_ok(err, "Failed to dequeue endpoint");
346 
347 		err = k_sem_take(&ep_queue_sem, K_MSEC(100));
348 		zassert_ok(err, "Timeout to dequeue endpoint %x %d", last_used_ep, err);
349 	}
350 }
351 
test_udc_ep_mps(uint8_t type)352 static void test_udc_ep_mps(uint8_t type)
353 {
354 	uint16_t mps[] = {8, 16, 32, 64, 512, 1024};
355 	struct usb_ep_descriptor ed = {
356 		.bLength = sizeof(struct usb_ep_descriptor),
357 		.bDescriptorType = USB_DESC_ENDPOINT,
358 		.bEndpointAddress = 0x01,
359 		.bmAttributes = type,
360 		.wMaxPacketSize = sys_cpu_to_le16(0),
361 		.bInterval = 0,
362 	};
363 	const struct device *dev;
364 	uint16_t supported = 0;
365 	int err;
366 
367 	dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
368 	zassert_true(device_is_ready(dev), "UDC device not ready");
369 
370 	err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
371 	zassert_ok(err, "Failed to initialize UDC driver");
372 
373 	err = udc_enable(dev);
374 	zassert_ok(err, "Failed to enable UDC driver");
375 
376 	if (type == USB_EP_TYPE_INTERRUPT) {
377 		ed.bInterval = 1;
378 	}
379 
380 	for (uint8_t i = 1; i < 16U; i++) {
381 		err = udc_ep_try_config(dev, i,
382 					ed.bmAttributes, &supported,
383 					ed.bInterval);
384 		if (!err) {
385 			ed.bEndpointAddress = i;
386 			break;
387 		}
388 	}
389 
390 	zassert_ok(err, "Failed to determine MPS");
391 
392 	for (int i = 0; i < ARRAY_SIZE(mps); i++) {
393 		if (mps[i] > supported) {
394 			continue;
395 		}
396 
397 		ed.wMaxPacketSize = sys_cpu_to_le16(mps[i]);
398 		test_udc_ep_api(dev, &ed);
399 
400 		ed.bEndpointAddress |= USB_EP_DIR_IN;
401 		test_udc_ep_api(dev, &ed);
402 	}
403 
404 	err = udc_disable(dev);
405 	zassert_ok(err, "Failed to disable UDC driver");
406 
407 	err = udc_shutdown(dev);
408 	zassert_ok(err, "Failed to shoot-down UDC driver");
409 }
410 
test_udc_device_get(void)411 static void *test_udc_device_get(void)
412 {
413 	struct udc_device_caps caps;
414 	const struct device *dev;
415 
416 	dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
417 	zassert_true(device_is_ready(dev), "UDC device not ready");
418 
419 	caps = udc_caps(dev);
420 	LOG_INF("UDC device HS: %u", caps.hs);
421 
422 	k_thread_create(&test_udc_thread_data, test_udc_stack,
423 			K_KERNEL_STACK_SIZEOF(test_udc_stack),
424 			test_udc_thread,
425 			(void *)dev, NULL, NULL,
426 			K_PRIO_COOP(9), 0, K_NO_WAIT);
427 
428 	k_thread_name_set(&test_udc_thread_data, "test-udc");
429 
430 	return (void *)dev;
431 }
432 
433 static struct usb_ep_descriptor ed_ctrl_out = {
434 	.bLength = sizeof(struct usb_ep_descriptor),
435 	.bDescriptorType = USB_DESC_ENDPOINT,
436 	.bEndpointAddress = USB_CONTROL_EP_OUT,
437 	.bmAttributes = USB_EP_TYPE_CONTROL,
438 	.wMaxPacketSize = sys_cpu_to_le16(64),
439 	.bInterval = 0,
440 };
441 
442 static struct usb_ep_descriptor ed_ctrl_in = {
443 	.bLength = sizeof(struct usb_ep_descriptor),
444 	.bDescriptorType = USB_DESC_ENDPOINT,
445 	.bEndpointAddress = USB_CONTROL_EP_IN,
446 	.bmAttributes = USB_EP_TYPE_CONTROL,
447 	.wMaxPacketSize = sys_cpu_to_le16(64),
448 	.bInterval = 0,
449 };
450 
451 static struct usb_ep_descriptor ed_bulk_out = {
452 	.bLength = sizeof(struct usb_ep_descriptor),
453 	.bDescriptorType = USB_DESC_ENDPOINT,
454 	.bEndpointAddress = BULK_OUT_EP_ADDR,
455 	.bmAttributes = USB_EP_TYPE_BULK,
456 	.wMaxPacketSize = sys_cpu_to_le16(64),
457 	.bInterval = 0,
458 };
459 
460 static struct usb_ep_descriptor ed_bulk_in = {
461 	.bLength = sizeof(struct usb_ep_descriptor),
462 	.bDescriptorType = USB_DESC_ENDPOINT,
463 	.bEndpointAddress = BULK_IN_EP_ADDR,
464 	.bmAttributes = USB_EP_TYPE_BULK,
465 	.wMaxPacketSize = sys_cpu_to_le16(64),
466 	.bInterval = 0,
467 };
468 
ZTEST(udc_driver_test,test_udc_not_initialized)469 ZTEST(udc_driver_test, test_udc_not_initialized)
470 {
471 	const struct device *dev;
472 	struct net_buf *buf;
473 	int err;
474 
475 	dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
476 	zassert_true(device_is_ready(dev), "UDC device not ready");
477 
478 	err = udc_init(dev, NULL, NULL);
479 	zassert_equal(err, -EINVAL, "Not failed to initialize UDC");
480 
481 	err = udc_shutdown(dev);
482 	zassert_equal(err, -EALREADY, "Not failed to shutdown UDC");
483 
484 	err = udc_enable(dev);
485 	zassert_equal(err, -EPERM, "Not failed to enable UDC driver");
486 
487 	test_udc_set_address(dev, 0);
488 	test_udc_set_address(dev, 1);
489 	test_udc_wakeup(dev);
490 
491 	test_udc_ep_try_config(dev, &ed_ctrl_out);
492 	test_udc_ep_try_config(dev, &ed_ctrl_in);
493 	test_udc_ep_try_config(dev, &ed_bulk_out);
494 	test_udc_ep_try_config(dev, &ed_bulk_in);
495 
496 	buf = test_udc_ep_buf_alloc(dev, &ed_bulk_out);
497 	test_udc_ep_enable(dev, &ed_bulk_out);
498 	test_udc_ep_enqueue(dev, buf);
499 	test_udc_ep_halt(dev, &ed_bulk_out);
500 	test_udc_ep_disable(dev, &ed_bulk_out);
501 	test_udc_ep_dequeue(dev, &ed_bulk_out);
502 	test_udc_ep_buf_free(dev, buf);
503 
504 	err = udc_disable(dev);
505 	zassert_equal(err, -EALREADY, "Not failed to disable UDC driver");
506 }
507 
ZTEST(udc_driver_test,test_udc_initialized)508 ZTEST(udc_driver_test, test_udc_initialized)
509 {
510 	const struct device *dev;
511 	struct net_buf *buf;
512 	int err;
513 
514 	dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
515 	zassert_true(device_is_ready(dev), "UDC device not ready");
516 
517 	err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
518 	zassert_ok(err, "Failed to initialize UDC driver");
519 
520 	test_udc_set_address(dev, 0);
521 	test_udc_set_address(dev, 1);
522 	test_udc_wakeup(dev);
523 
524 	test_udc_ep_try_config(dev, &ed_ctrl_out);
525 	test_udc_ep_try_config(dev, &ed_ctrl_in);
526 	test_udc_ep_try_config(dev, &ed_bulk_out);
527 	test_udc_ep_try_config(dev, &ed_bulk_in);
528 
529 	buf = test_udc_ep_buf_alloc(dev, &ed_bulk_out);
530 	test_udc_ep_enable(dev, &ed_bulk_out);
531 	test_udc_ep_enqueue(dev, buf);
532 	test_udc_ep_halt(dev, &ed_bulk_out);
533 	test_udc_ep_disable(dev, &ed_bulk_out);
534 	test_udc_ep_dequeue(dev, &ed_bulk_out);
535 	test_udc_ep_buf_free(dev, buf);
536 
537 	err = udc_shutdown(dev);
538 	zassert_ok(err, "Failed to shootdown UDC driver");
539 }
540 
ZTEST(udc_driver_test,test_udc_enabled)541 ZTEST(udc_driver_test, test_udc_enabled)
542 {
543 	const struct device *dev;
544 	struct net_buf *buf;
545 	int err;
546 
547 	dev = DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0));
548 	zassert_true(device_is_ready(dev), "UDC device not ready");
549 
550 	err = udc_init(dev, test_udc_event_handler, &test_event_ctx);
551 	zassert_ok(err, "Failed to initialize UDC driver");
552 
553 	err = udc_enable(dev);
554 	zassert_ok(err, "Failed to enable UDC driver");
555 
556 	err = udc_enable(dev);
557 	zassert_equal(err, -EALREADY, "Not failed to enable UDC driver");
558 
559 	err = udc_disable(dev);
560 	zassert_ok(err, "Failed to disable UDC driver");
561 
562 	err = udc_enable(dev);
563 	zassert_ok(err, "Failed to enable UDC driver");
564 
565 	test_udc_set_address(dev, 0);
566 	test_udc_set_address(dev, 1);
567 
568 	test_udc_ep_try_config(dev, &ed_ctrl_out);
569 	test_udc_ep_try_config(dev, &ed_ctrl_in);
570 	test_udc_ep_try_config(dev, &ed_bulk_out);
571 	test_udc_ep_try_config(dev, &ed_bulk_in);
572 
573 	buf = test_udc_ep_buf_alloc(dev, &ed_bulk_out);
574 	test_udc_ep_enable(dev, &ed_bulk_out);
575 	test_udc_ep_enqueue(dev, buf);
576 	test_udc_ep_halt(dev, &ed_bulk_out);
577 	test_udc_ep_disable(dev, &ed_bulk_out);
578 	test_udc_ep_dequeue(dev, &ed_bulk_out);
579 
580 	err = udc_shutdown(dev);
581 	zassert_equal(err, -EBUSY, "Not failed to shoot-down UDC driver");
582 
583 	err = udc_disable(dev);
584 	zassert_ok(err, "Failed to disable UDC driver");
585 
586 	err = udc_shutdown(dev);
587 	zassert_ok(err, "Failed to shoot-down UDC driver");
588 }
589 
ZTEST(udc_driver_test,test_udc_ep_buf)590 ZTEST(udc_driver_test, test_udc_ep_buf)
591 {
592 	test_udc_ep_mps(USB_EP_TYPE_BULK);
593 }
594 
ZTEST(udc_driver_test,test_udc_ep_int)595 ZTEST(udc_driver_test, test_udc_ep_int)
596 {
597 	test_udc_ep_mps(USB_EP_TYPE_INTERRUPT);
598 }
599 
ZTEST(udc_driver_test,test_udc_ep_iso)600 ZTEST(udc_driver_test, test_udc_ep_iso)
601 {
602 	test_udc_ep_mps(USB_EP_TYPE_ISO);
603 }
604 
605 ZTEST_SUITE(udc_driver_test, NULL, test_udc_device_get, NULL, NULL, NULL);
606