23 #include "sw/device/lib/testing/pinmux_testutils.h"
24 #include "sw/device/lib/testing/test_framework/check.h"
26 #include "sw/device/lib/testing/usb_testutils.h"
27 #include "sw/device/lib/testing/usb_testutils_controlep.h"
28 #include "sw/device/lib/testing/usb_testutils_diags.h"
29 #include "sw/device/lib/testing/usb_testutils_streams.h"
35 #define NUM_STREAMS USBUTILS_STREAMS_MAX
38 #define TRANSFER_BYTES_SILICON (8U << 20)
43 #define TRANSFER_BYTES_FPGA (0x10U << 16)
46 #define TRANSFER_BYTES_VERILATOR 0x2400U
49 #define TRANSFER_BYTES_DVSIM 0x800U
57 static const uint8_t config_descriptors[] = {
58 USB_CFG_DSCR_HEAD(USB_CFG_DSCR_LEN + NUM_STREAMS * (USB_INTERFACE_DSCR_LEN +
64 VEND_INTERFACE_DSCR(0, 2, 0x50, 1),
65 USB_BULK_EP_DSCR(0, 1U, USBDEV_MAX_PACKET_SIZE, 0),
66 USB_BULK_EP_DSCR(1, 1U, USBDEV_MAX_PACKET_SIZE, 0),
68 VEND_INTERFACE_DSCR(1, 2, 0x50, 1),
69 USB_BULK_EP_DSCR(0, 2U, USBDEV_MAX_PACKET_SIZE, 0),
70 USB_BULK_EP_DSCR(1, 2U, USBDEV_MAX_PACKET_SIZE, 0),
72 VEND_INTERFACE_DSCR(2, 2, 0x50, 1),
73 USB_BULK_EP_DSCR(0, 3U, USBDEV_MAX_PACKET_SIZE, 0),
74 USB_BULK_EP_DSCR(1, 3U, USBDEV_MAX_PACKET_SIZE, 0),
76 VEND_INTERFACE_DSCR(3, 2, 0x50, 1),
77 USB_BULK_EP_DSCR(0, 4U, USBDEV_MAX_PACKET_SIZE, 0),
78 USB_BULK_EP_DSCR(1, 4U, USBDEV_MAX_PACKET_SIZE, 0),
80 VEND_INTERFACE_DSCR(4, 2, 0x50, 1),
81 USB_BULK_EP_DSCR(0, 5U, USBDEV_MAX_PACKET_SIZE, 0),
82 USB_BULK_EP_DSCR(1, 5U, USBDEV_MAX_PACKET_SIZE, 0),
84 VEND_INTERFACE_DSCR(5, 2, 0x50, 1),
85 USB_BULK_EP_DSCR(0, 6U, USBDEV_MAX_PACKET_SIZE, 0),
86 USB_BULK_EP_DSCR(1, 6U, USBDEV_MAX_PACKET_SIZE, 0),
88 VEND_INTERFACE_DSCR(6, 2, 0x50, 1),
89 USB_BULK_EP_DSCR(0, 7U, USBDEV_MAX_PACKET_SIZE, 0),
90 USB_BULK_EP_DSCR(1, 7U, USBDEV_MAX_PACKET_SIZE, 0),
92 VEND_INTERFACE_DSCR(7, 2, 0x50, 1),
93 USB_BULK_EP_DSCR(0, 8U, USBDEV_MAX_PACKET_SIZE, 0),
94 USB_BULK_EP_DSCR(1, 8U, USBDEV_MAX_PACKET_SIZE, 0),
96 VEND_INTERFACE_DSCR(8, 2, 0x50, 1),
97 USB_BULK_EP_DSCR(0, 9U, USBDEV_MAX_PACKET_SIZE, 0),
98 USB_BULK_EP_DSCR(1, 9U, USBDEV_MAX_PACKET_SIZE, 0),
100 VEND_INTERFACE_DSCR(9, 2, 0x50, 1),
101 USB_BULK_EP_DSCR(0, 10U, USBDEV_MAX_PACKET_SIZE, 0),
102 USB_BULK_EP_DSCR(1, 10U, USBDEV_MAX_PACKET_SIZE, 0),
104 VEND_INTERFACE_DSCR(10, 2, 0x50, 1),
105 USB_BULK_EP_DSCR(0, 11U, USBDEV_MAX_PACKET_SIZE, 0),
106 USB_BULK_EP_DSCR(1, 11U, USBDEV_MAX_PACKET_SIZE, 0),
112 static usbdev_stream_flags_t test_flags;
117 static uint8_t test_descriptor[USB_TESTUTILS_TEST_DSCR_LEN];
128 static dif_pinmux_t pinmux;
140 static const bool kVerbose =
false;
148 static const bool kSending =
true;
153 static const bool kGenerating =
true;
159 static const bool kRetrying =
true;
164 static const bool kRecving =
true;
171 static const bool kMaxPackets =
false;
176 static const unsigned nstreams = NUM_STREAMS;
178 OTTF_DEFINE_TEST_CONFIG();
184 LOG_INFO(
"Running USBDEV Stream Test");
190 uint32_t transfer_bytes = TRANSFER_BYTES_FPGA;
193 transfer_bytes = TRANSFER_BYTES_VERILATOR;
196 transfer_bytes = TRANSFER_BYTES_DVSIM;
199 transfer_bytes = TRANSFER_BYTES_SILICON;
207 transfer_bytes = (transfer_bytes + nstreams - 1) / nstreams;
208 LOG_INFO(
" - %u stream(s), 0x%x bytes each", nstreams, transfer_bytes);
210 CHECK_DIF_OK(dif_pinmux_init(
212 pinmux_testutils_init(&pinmux);
218 test_flags = (kSending ? kUsbdevStreamFlagRetrieve : 0U) |
219 (kGenerating ? kUsbdevStreamFlagCheck : 0U) |
220 (kRetrying ? kUsbdevStreamFlagRetry : 0U) |
221 (kRecving ? kUsbdevStreamFlagSend : 0U) |
223 (kMaxPackets ? kUsbdevStreamFlagMaxPackets : 0U);
227 const uint8_t desc[] = {
228 USB_TESTUTILS_TEST_DSCR(1, NUM_STREAMS | (uint8_t)test_flags, 0, 0, 0)};
229 memcpy(test_descriptor, desc,
sizeof(test_descriptor));
237 CHECK_STATUS_OK(usb_testutils_init(ctx->
usbdev,
false,
240 CHECK_STATUS_OK(usb_testutils_controlep_init(
241 &usbdev_control, ctx->
usbdev, 0, config_descriptors,
242 sizeof(config_descriptors), test_descriptor,
sizeof(test_descriptor)));
247 usb_testutils_controlep_config_wait(&usbdev_control, &usbdev));
252 usb_testutils_transfer_type_t xfr_types[USBUTILS_STREAMS_MAX];
253 for (
unsigned s = 0U; s < nstreams; s++) {
254 xfr_types[s] = kUsbTransferTypeBulk;
258 CHECK_STATUS_OK(usb_testutils_streams_init(
259 ctx, nstreams, xfr_types, transfer_bytes, test_flags, kVerbose));
261 USBUTILS_USER_PROMPT(
"Start host-side streaming software");
267 CHECK_STATUS_OK(usb_testutils_streams_service(ctx));
270 done = usb_testutils_streams_completed(ctx);
274 uint32_t tx_bytes = 0U;
275 uint32_t rx_bytes = 0U;
276 for (uint8_t s = 0U; s < nstreams; s++) {
278 CHECK_STATUS_OK(usb_testutils_stream_status(ctx, s, NULL, &tx, &rx));
283 LOG_INFO(
"USB sent 0x%x byte(s), received and checked 0x%x byte(s)", tx_bytes,
287 CHECK(tx_bytes == nstreams * transfer_bytes,
288 "Unexpected count of byte(s) sent to USB host");
291 CHECK(rx_bytes == nstreams * transfer_bytes,
292 "Unexpected count of byte(s) received from USB host");