Skip to content

Commit ed7d56f

Browse files
jfischer-nojhedberg
authored andcommitted
tests: usb: add test for new USB device support
This is initial patch to add tests for new USB device support. The test uses USB host support and virtual USB bus by default, but should work on real hardware as well. For now, only the Get Configuration and Set Interface requests are tested by default. More tests will follow. Signed-off-by: Johann Fischer <[email protected]>
1 parent d18cb6c commit ed7d56f

File tree

6 files changed

+228
-0
lines changed

6 files changed

+228
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Copyright (c) 2023 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
cmake_minimum_required(VERSION 3.20.0)
5+
6+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
7+
project(test_usb_device_next)
8+
9+
target_include_directories(app PRIVATE ${ZEPHYR_BASE}/subsys/usb/host)
10+
11+
target_sources(app PRIVATE src/main.c)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright (c) 2023 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/delete-node/ &zephyr_udc0;
8+
9+
/ {
10+
zephyr_uhc0: uhc_vrt0 {
11+
compatible = "zephyr,uhc-virtual";
12+
13+
zephyr_udc0: udc_vrt0 {
14+
compatible = "zephyr,udc-virtual";
15+
num-bidir-endpoints = <8>;
16+
maximum-speed = "high-speed";
17+
};
18+
};
19+
};
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright (c) 2023 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/ {
8+
zephyr_uhc0: uhc_vrt0 {
9+
compatible = "zephyr,uhc-virtual";
10+
11+
zephyr_udc0: udc_vrt0 {
12+
compatible = "zephyr,udc-virtual";
13+
num-bidir-endpoints = <8>;
14+
maximum-speed = "high-speed";
15+
};
16+
};
17+
};

tests/subsys/usb/device_next/prj.conf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# Copyright (c) 2023 Nordic Semiconductor ASA
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
CONFIG_LOG=y
5+
CONFIG_ZTEST=y
6+
CONFIG_ZTEST_NEW_API=y
7+
8+
CONFIG_USB_DEVICE_STACK_NEXT=y
9+
CONFIG_USBD_LOOPBACK_CLASS=y
10+
11+
CONFIG_UHC_DRIVER=y
12+
CONFIG_USB_HOST_STACK=y
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
/*
2+
* Copyright (c) 2023 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/ztest.h>
8+
#include <zephyr/usb/usbd.h>
9+
#include <zephyr/usb/usbh.h>
10+
11+
#include "usbh_ch9.h"
12+
#include "usbh_device.h"
13+
14+
#include <zephyr/logging/log.h>
15+
LOG_MODULE_REGISTER(usb_test, LOG_LEVEL_INF);
16+
17+
#define TEST_DEFAULT_INTERFACE 0
18+
#define TEST_DEFAULT_ALTERNATE 1
19+
20+
USBD_CONFIGURATION_DEFINE(test_config,
21+
USB_SCD_SELF_POWERED | USB_SCD_REMOTE_WAKEUP,
22+
200);
23+
24+
USBD_DESC_LANG_DEFINE(test_lang);
25+
USBD_DESC_STRING_DEFINE(test_mfg, "ZEPHYR", 1);
26+
USBD_DESC_STRING_DEFINE(test_product, "Zephyr USB Test", 2);
27+
USBD_DESC_STRING_DEFINE(test_sn, "0123456789ABCDEF", 3);
28+
29+
USBD_DEVICE_DEFINE(test_usbd,
30+
DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0)),
31+
0x2fe3, 0xffff);
32+
33+
USBH_CONTROLLER_DEFINE(uhs_ctx, DEVICE_DT_GET(DT_NODELABEL(zephyr_uhc0)));
34+
35+
/* Get Configuration request test */
36+
ZTEST(device_next, test_get_configuration)
37+
{
38+
struct usb_device *udev;
39+
uint8_t cfg = 0;
40+
int err;
41+
42+
udev = usbh_device_get_any(&uhs_ctx);
43+
err = usbh_req_get_cfg(udev, &cfg);
44+
45+
switch (udev->state) {
46+
case USB_STATE_DEFAULT:
47+
/* Not specified, expect protocol error */
48+
zassert_equal(err, -EPIPE, "Transfer status is not a protocol error");
49+
break;
50+
case USB_STATE_ADDRESSED:
51+
/* TODO: Expect zero value */
52+
zassert_equal(err, 0, "Transfer status is an error");
53+
zassert_equal(cfg, 0, "Device not in address state");
54+
break;
55+
case USB_STATE_CONFIGURED:
56+
/* TODO: Expect non-zero valid configuration value */
57+
zassert_equal(err, 0, "Transfer status is an error");
58+
zassert_not_equal(cfg, 0, "Device not in configured state");
59+
break;
60+
default:
61+
break;
62+
}
63+
}
64+
65+
/* Set Interface request test */
66+
ZTEST(device_next, test_set_interface)
67+
{
68+
struct usb_device *udev;
69+
int err;
70+
71+
udev = usbh_device_get_any(&uhs_ctx);
72+
err = usbh_req_set_alt(udev, TEST_DEFAULT_INTERFACE,
73+
TEST_DEFAULT_ALTERNATE);
74+
75+
switch (udev->state) {
76+
case USB_STATE_DEFAULT:
77+
/* Not specified, expect protocol error */
78+
case USB_STATE_ADDRESSED:
79+
/* Expect protocol error */
80+
zassert_equal(err, -EPIPE, "Transfer status is not a protocol error");
81+
break;
82+
case USB_STATE_CONFIGURED:
83+
/* TODO */
84+
default:
85+
break;
86+
}
87+
}
88+
89+
static void *usb_test_enable(void)
90+
{
91+
struct usb_device *udev;
92+
int err;
93+
94+
err = usbh_init(&uhs_ctx);
95+
zassert_equal(err, 0, "Failed to initialize USB host");
96+
97+
err = usbh_enable(&uhs_ctx);
98+
zassert_equal(err, 0, "Failed to enable USB host");
99+
100+
err = uhc_bus_reset(uhs_ctx.dev);
101+
zassert_equal(err, 0, "Failed to signal bus reset");
102+
103+
err = uhc_bus_resume(uhs_ctx.dev);
104+
zassert_equal(err, 0, "Failed to signal bus resume");
105+
106+
err = uhc_sof_enable(uhs_ctx.dev);
107+
zassert_equal(err, 0, "Failed to enable SoF generator");
108+
109+
LOG_INF("Host controller enabled");
110+
111+
err = usbd_add_descriptor(&test_usbd, &test_lang);
112+
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
113+
114+
err = usbd_add_descriptor(&test_usbd, &test_mfg);
115+
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
116+
117+
err = usbd_add_descriptor(&test_usbd, &test_product);
118+
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
119+
120+
err = usbd_add_descriptor(&test_usbd, &test_sn);
121+
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
122+
123+
err = usbd_add_configuration(&test_usbd, &test_config);
124+
zassert_equal(err, 0, "Failed to add configuration (%d)");
125+
126+
err = usbd_register_class(&test_usbd, "loopback_0", 1);
127+
zassert_equal(err, 0, "Failed to register loopback_0 class (%d)");
128+
129+
err = usbd_init(&test_usbd);
130+
zassert_equal(err, 0, "Failed to initialize device support");
131+
132+
err = usbd_enable(&test_usbd);
133+
zassert_equal(err, 0, "Failed to enable device support");
134+
135+
LOG_INF("Device support enabled");
136+
udev = usbh_device_get_any(&uhs_ctx);
137+
udev->state = USB_STATE_DEFAULT;
138+
139+
return NULL;
140+
}
141+
142+
static void usb_test_shutdown(void *f)
143+
{
144+
int err;
145+
146+
err = usbd_disable(&test_usbd);
147+
zassert_equal(err, 0, "Failed to enable device support");
148+
149+
err = usbd_shutdown(&test_usbd);
150+
zassert_equal(err, 0, "Failed to shutdown device support");
151+
152+
LOG_INF("Device support disabled");
153+
154+
err = usbh_disable(&uhs_ctx);
155+
zassert_equal(err, 0, "Failed to disable USB host");
156+
157+
LOG_INF("Host controller disabled");
158+
}
159+
160+
ZTEST_SUITE(device_next, NULL, usb_test_enable, NULL, NULL, usb_test_shutdown);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
tests:
2+
usb.device_next:
3+
depends_on: usb_device
4+
tags: usb
5+
platform_allow:
6+
- native_posix
7+
- qemu_cortex_m3
8+
integration_platforms:
9+
- native_posix

0 commit comments

Comments
 (0)