7 #include "gtest/gtest.h"
9 #include "sw/device/lib/base/mock_mmio.h"
10 #include "sw/device/lib/base/multibits.h"
14 #include "usbdev_regs.h"
16 namespace dif_usbdev_unittest {
24 dif_usbdev_t usbdev_ = {
25 .base_addr = dev().region(),
32 bool bool_arg, bool_arg2;
35 uint8_t uint8_arg, uint8_arg2;
70 nullptr, &buffer_pool, &buffer, &uint8_arg, 1, &size_arg));
72 &usbdev_,
nullptr, &buffer, &uint8_arg, 1, &size_arg));
74 &usbdev_, &buffer_pool,
nullptr, &uint8_arg, 1, &size_arg));
76 nullptr, 1, &size_arg));
78 &uint8_arg, 1,
nullptr));
118 nullptr, &uint8_arg, &uint8_arg2));
120 &usbdev_,
nullptr, &uint8_arg));
122 &usbdev_, &uint8_arg,
nullptr));
124 nullptr, &bool_arg, &bool_arg2));
144 TEST_F(UsbdevTest, PhyConfig) {
153 EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET,
155 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
156 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
157 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
158 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1},
159 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
164 EXPECT_READ32(USBDEV_PHY_PINS_SENSE_REG_OFFSET,
166 {USBDEV_PHY_PINS_SENSE_RX_DP_I_BIT, 1},
167 {USBDEV_PHY_PINS_SENSE_RX_DN_I_BIT, 0},
168 {USBDEV_PHY_PINS_SENSE_RX_D_I_BIT, 1},
169 {USBDEV_PHY_PINS_SENSE_TX_DP_O_BIT, 0},
170 {USBDEV_PHY_PINS_SENSE_TX_DN_O_BIT, 1},
171 {USBDEV_PHY_PINS_SENSE_TX_D_O_BIT, 0},
172 {USBDEV_PHY_PINS_SENSE_TX_SE0_O_BIT, 0},
173 {USBDEV_PHY_PINS_SENSE_TX_OE_O_BIT, 1},
174 {USBDEV_PHY_PINS_SENSE_PWR_SENSE_BIT, 1},
177 EXPECT_TRUE(phy_pins_status.
rx_dp);
178 EXPECT_FALSE(phy_pins_status.
rx_dn);
179 EXPECT_TRUE(phy_pins_status.
rx_d);
180 EXPECT_FALSE(phy_pins_status.
tx_dp);
181 EXPECT_TRUE(phy_pins_status.
tx_dn);
182 EXPECT_FALSE(phy_pins_status.
tx_d);
183 EXPECT_FALSE(phy_pins_status.
tx_se0);
193 .diff_receiver_enable = 0,
198 USBDEV_PHY_PINS_DRIVE_REG_OFFSET,
200 {USBDEV_PHY_PINS_DRIVE_DP_O_BIT, overrides.
dp},
201 {USBDEV_PHY_PINS_DRIVE_DN_O_BIT, overrides.
dn},
202 {USBDEV_PHY_PINS_DRIVE_D_O_BIT, overrides.
data},
203 {USBDEV_PHY_PINS_DRIVE_SE0_O_BIT, overrides.
se0},
205 {USBDEV_PHY_PINS_DRIVE_RX_ENABLE_O_BIT,
207 {USBDEV_PHY_PINS_DRIVE_DP_PULLUP_EN_O_BIT, overrides.
dp_pullup_en},
208 {USBDEV_PHY_PINS_DRIVE_DN_PULLUP_EN_O_BIT, overrides.
dn_pullup_en},
209 {USBDEV_PHY_PINS_DRIVE_EN_BIT, 1},
214 EXPECT_WRITE32(USBDEV_PHY_PINS_DRIVE_REG_OFFSET, 0);
218 EXPECT_READ32(USBDEV_PHY_CONFIG_REG_OFFSET,
220 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
221 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
222 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
223 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1},
224 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
225 {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 0},
227 EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET,
229 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
230 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
231 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
232 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1},
233 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
234 {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 1},
238 EXPECT_READ32(USBDEV_PHY_CONFIG_REG_OFFSET,
240 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
241 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
242 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
243 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1},
244 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
245 {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 1},
247 EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET,
249 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
250 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
251 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
252 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1},
253 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
254 {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 0},
259 TEST_F(UsbdevTest, ConnectAndConfig) {
261 EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, 0);
262 EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET, {{USBDEV_USBCTRL_ENABLE_BIT, 1}});
266 EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET,
268 {USBDEV_USBCTRL_ENABLE_BIT, 1},
269 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 127},
271 EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET,
273 {USBDEV_USBCTRL_ENABLE_BIT, 0},
274 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 127},
282 EXPECT_READ32(USBDEV_EP_IN_ENABLE_REG_OFFSET,
284 {USBDEV_EP_IN_ENABLE_ENABLE_0_BIT, 1},
286 EXPECT_WRITE32(USBDEV_EP_IN_ENABLE_REG_OFFSET,
288 {USBDEV_EP_IN_ENABLE_ENABLE_0_BIT, 1},
289 {USBDEV_EP_IN_ENABLE_ENABLE_2_BIT, 1},
296 EXPECT_READ32(USBDEV_EP_OUT_ENABLE_REG_OFFSET,
298 {USBDEV_EP_OUT_ENABLE_ENABLE_5_BIT, 1},
299 {USBDEV_EP_OUT_ENABLE_ENABLE_6_BIT, 1},
301 EXPECT_WRITE32(USBDEV_EP_OUT_ENABLE_REG_OFFSET,
303 {USBDEV_EP_OUT_ENABLE_ENABLE_5_BIT, 1},
310 EXPECT_READ32(USBDEV_OUT_ISO_REG_OFFSET, {
311 {USBDEV_OUT_ISO_ISO_5_BIT, 1},
313 EXPECT_WRITE32(USBDEV_OUT_ISO_REG_OFFSET, {
314 {USBDEV_OUT_ISO_ISO_5_BIT, 1},
315 {USBDEV_OUT_ISO_ISO_11_BIT, 1},
322 EXPECT_READ32(USBDEV_IN_ISO_REG_OFFSET, {
323 {USBDEV_IN_ISO_ISO_1_BIT, 1},
324 {USBDEV_IN_ISO_ISO_7_BIT, 1},
326 EXPECT_WRITE32(USBDEV_IN_ISO_REG_OFFSET, {
327 {USBDEV_IN_ISO_ISO_1_BIT, 1},
333 TEST_F(UsbdevTest, OutEndpointConfig) {
334 EXPECT_READ32(USBDEV_RXENABLE_SETUP_REG_OFFSET,
336 {USBDEV_RXENABLE_SETUP_SETUP_0_BIT, 1},
337 {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1},
338 {USBDEV_RXENABLE_SETUP_SETUP_11_BIT, 1},
340 EXPECT_WRITE32(USBDEV_RXENABLE_SETUP_REG_OFFSET,
342 {USBDEV_RXENABLE_SETUP_SETUP_0_BIT, 1},
343 {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1},
344 {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1},
345 {USBDEV_RXENABLE_SETUP_SETUP_11_BIT, 1},
350 EXPECT_READ32(USBDEV_RXENABLE_SETUP_REG_OFFSET,
352 {USBDEV_RXENABLE_SETUP_SETUP_8_BIT, 1},
353 {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1},
354 {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1},
356 EXPECT_WRITE32(USBDEV_RXENABLE_SETUP_REG_OFFSET,
358 {USBDEV_RXENABLE_SETUP_SETUP_8_BIT, 1},
359 {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1},
364 EXPECT_READ32(USBDEV_RXENABLE_OUT_REG_OFFSET,
366 {USBDEV_RXENABLE_OUT_OUT_0_BIT, 1},
367 {USBDEV_RXENABLE_OUT_OUT_2_BIT, 1},
368 {USBDEV_RXENABLE_OUT_OUT_9_BIT, 1},
370 EXPECT_WRITE32(USBDEV_RXENABLE_OUT_REG_OFFSET,
372 {USBDEV_RXENABLE_OUT_OUT_0_BIT, 1},
373 {USBDEV_RXENABLE_OUT_OUT_2_BIT, 1},
374 {USBDEV_RXENABLE_OUT_OUT_5_BIT, 1},
375 {USBDEV_RXENABLE_OUT_OUT_9_BIT, 1},
380 EXPECT_READ32(USBDEV_RXENABLE_OUT_REG_OFFSET,
382 {USBDEV_RXENABLE_OUT_OUT_1_BIT, 1},
383 {USBDEV_RXENABLE_OUT_OUT_3_BIT, 1},
384 {USBDEV_RXENABLE_OUT_OUT_7_BIT, 1},
386 EXPECT_WRITE32(USBDEV_RXENABLE_OUT_REG_OFFSET,
388 {USBDEV_RXENABLE_OUT_OUT_1_BIT, 1},
389 {USBDEV_RXENABLE_OUT_OUT_7_BIT, 1},
394 EXPECT_READ32(USBDEV_SET_NAK_OUT_REG_OFFSET,
396 {USBDEV_SET_NAK_OUT_ENABLE_10_BIT, 1},
398 EXPECT_WRITE32(USBDEV_SET_NAK_OUT_REG_OFFSET,
400 {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1},
401 {USBDEV_SET_NAK_OUT_ENABLE_10_BIT, 1},
406 EXPECT_READ32(USBDEV_SET_NAK_OUT_REG_OFFSET,
408 {USBDEV_SET_NAK_OUT_ENABLE_8_BIT, 1},
409 {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1},
411 EXPECT_WRITE32(USBDEV_SET_NAK_OUT_REG_OFFSET,
413 {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1},
419 TEST_F(UsbdevTest, StallConfig) {
424 EXPECT_READ32(USBDEV_IN_STALL_REG_OFFSET,
426 {USBDEV_IN_STALL_ENDPOINT_0_BIT, 1},
428 EXPECT_WRITE32(USBDEV_IN_STALL_REG_OFFSET,
430 {USBDEV_IN_STALL_ENDPOINT_0_BIT, 1},
431 {USBDEV_IN_STALL_ENDPOINT_1_BIT, 1},
438 EXPECT_READ32(USBDEV_OUT_STALL_REG_OFFSET,
440 {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1},
442 EXPECT_WRITE32(USBDEV_OUT_STALL_REG_OFFSET,
444 {USBDEV_OUT_STALL_ENDPOINT_3_BIT, 1},
445 {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1},
453 EXPECT_READ32(USBDEV_IN_STALL_REG_OFFSET,
455 {USBDEV_IN_STALL_ENDPOINT_5_BIT, 1},
458 EXPECT_TRUE(enabled);
462 EXPECT_READ32(USBDEV_OUT_STALL_REG_OFFSET,
464 {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1},
465 {USBDEV_OUT_STALL_ENDPOINT_9_BIT, 1},
466 {USBDEV_OUT_STALL_ENDPOINT_10_BIT, 1},
469 EXPECT_FALSE(enabled);
472 TEST_F(UsbdevTest, OutPacket) {
476 constexpr uint32_t kMaxAvSetupBuffers = 2u;
477 constexpr uint32_t kMaxAvOutBuffers = 8u;
486 EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET,
488 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
489 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
490 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
491 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 0},
492 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
497 for (uint32_t i = 0u; i < kMaxAvSetupBuffers + kMaxAvOutBuffers; ++i) {
498 uint8_t setup_depth = (i >= kMaxAvSetupBuffers) ? kMaxAvSetupBuffers : i;
500 (i >= kMaxAvSetupBuffers) ? (i - kMaxAvSetupBuffers) : 0u;
501 int top = buffer_pool.top;
502 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
504 {USBDEV_USBSTAT_FRAME_OFFSET, 10},
505 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
506 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
507 {USBDEV_USBSTAT_SENSE_BIT, 1},
508 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, out_depth},
509 {USBDEV_USBSTAT_AV_SETUP_DEPTH_OFFSET, setup_depth},
510 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 0},
511 {USBDEV_USBSTAT_AV_SETUP_FULL_BIT, 0},
513 if (i >= kMaxAvSetupBuffers) {
515 USBDEV_AVOUTBUFFER_REG_OFFSET,
516 {{USBDEV_AVOUTBUFFER_BUFFER_OFFSET, buffer_pool.buffers[top - i]}});
519 USBDEV_AVSETUPBUFFER_REG_OFFSET,
520 {{USBDEV_AVSETUPBUFFER_BUFFER_OFFSET, buffer_pool.buffers[top - i]}});
524 USBDEV_USBSTAT_REG_OFFSET,
526 {USBDEV_USBSTAT_FRAME_OFFSET, 10},
527 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
528 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
529 {USBDEV_USBSTAT_SENSE_BIT, 1},
530 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, kMaxAvOutBuffers},
531 {USBDEV_USBSTAT_AV_SETUP_DEPTH_OFFSET, kMaxAvSetupBuffers},
532 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 1},
533 {USBDEV_USBSTAT_AV_SETUP_FULL_BIT, 0},
540 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
542 {USBDEV_USBSTAT_FRAME_OFFSET, 15},
543 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
544 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
545 {USBDEV_USBSTAT_SENSE_BIT, 1},
546 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, kMaxAvOutBuffers},
547 {USBDEV_USBSTAT_AV_SETUP_DEPTH_OFFSET, kMaxAvSetupBuffers},
548 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 1},
549 {USBDEV_USBSTAT_AV_SETUP_FULL_BIT, 0},
550 {USBDEV_USBSTAT_RX_EMPTY_BIT, 1},
556 uint32_t expected_data[4], recvd_data[4];
557 for (
size_t i = 0; i <
sizeof(expected_data) /
sizeof(expected_data[0]);
559 expected_data[i] = i * 1023;
561 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
563 {USBDEV_USBSTAT_FRAME_OFFSET, 15},
564 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
565 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
566 {USBDEV_USBSTAT_SENSE_BIT, 1},
567 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, kMaxAvOutBuffers - 1},
568 {USBDEV_USBSTAT_AV_SETUP_DEPTH_OFFSET, kMaxAvSetupBuffers},
569 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 0},
570 {USBDEV_USBSTAT_AV_SETUP_FULL_BIT, 0},
571 {USBDEV_USBSTAT_RX_EMPTY_BIT, 0},
573 EXPECT_READ32(USBDEV_RXFIFO_REG_OFFSET,
575 {USBDEV_RXFIFO_EP_OFFSET, 1},
576 {USBDEV_RXFIFO_SETUP_BIT, 0},
577 {USBDEV_RXFIFO_SIZE_OFFSET,
sizeof(expected_data)},
578 {USBDEV_RXFIFO_BUFFER_OFFSET, 0},
581 EXPECT_EQ(rx_packet_info.
endpoint, 1);
582 EXPECT_EQ(rx_packet_info.
length,
sizeof(expected_data));
583 EXPECT_FALSE(rx_packet_info.
is_setup);
584 EXPECT_EQ(buffer.
id, 0);
585 EXPECT_EQ(buffer.
offset, 0);
589 size_t bytes_written;
590 for (
size_t i = 0; i <
sizeof(expected_data) /
sizeof(expected_data[0]);
592 EXPECT_READ32(USBDEV_BUFFER_REG_OFFSET + buffer.
id * 64 + 4 * i,
596 reinterpret_cast<uint8_t *
>(recvd_data),
597 sizeof(recvd_data), &bytes_written));
598 EXPECT_EQ(bytes_written,
sizeof(recvd_data));
599 EXPECT_EQ(
memcmp(expected_data, recvd_data,
sizeof(expected_data)), 0);
603 USBDEV_USBSTAT_REG_OFFSET,
605 {USBDEV_USBSTAT_FRAME_OFFSET, 25},
606 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
607 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
608 {USBDEV_USBSTAT_SENSE_BIT, 1},
609 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, kMaxAvOutBuffers - 1},
610 {USBDEV_USBSTAT_AV_SETUP_DEPTH_OFFSET, kMaxAvSetupBuffers - 1},
611 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 0},
612 {USBDEV_USBSTAT_AV_SETUP_FULL_BIT, 0},
613 {USBDEV_USBSTAT_RX_EMPTY_BIT, 0},
615 EXPECT_READ32(USBDEV_RXFIFO_REG_OFFSET,
617 {USBDEV_RXFIFO_EP_OFFSET, 0},
618 {USBDEV_RXFIFO_SETUP_BIT, 1},
619 {USBDEV_RXFIFO_SIZE_OFFSET,
sizeof(expected_data) - 1},
620 {USBDEV_RXFIFO_BUFFER_OFFSET, 1},
623 EXPECT_EQ(rx_packet_info.
endpoint, 0);
624 EXPECT_EQ(rx_packet_info.
length,
sizeof(expected_data) - 1);
625 EXPECT_TRUE(rx_packet_info.
is_setup);
626 EXPECT_EQ(buffer.
id, 1);
627 EXPECT_EQ(buffer.
offset, 0);
631 memset(recvd_data, 0,
sizeof(recvd_data));
632 for (
size_t i = 0; i <
sizeof(expected_data) /
sizeof(expected_data[0]);
634 EXPECT_READ32(USBDEV_BUFFER_REG_OFFSET + buffer.
id * 64 + 4 * i,
638 reinterpret_cast<uint8_t *
>(recvd_data),
640 EXPECT_EQ(bytes_written, 4);
642 &usbdev_, &buffer_pool, &buffer,
643 reinterpret_cast<uint8_t *
>(recvd_data) + bytes_written,
644 sizeof(recvd_data) - bytes_written, &bytes_written));
645 EXPECT_EQ(bytes_written,
sizeof(recvd_data) - 4 - 1);
646 EXPECT_EQ(
memcmp(expected_data, recvd_data,
sizeof(expected_data)), 0);
649 TEST_F(UsbdevTest, InPacket) {
658 EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET,
660 {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1},
661 {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0},
662 {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0},
663 {USBDEV_PHY_CONFIG_PINFLIP_BIT, 0},
664 {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0},
673 uint8_t *bytes =
reinterpret_cast<uint8_t *
>(data);
674 size_t bytes_written;
681 sizeof(data), &bytes_written));
685 for (
size_t i = 0; i <
sizeof(data); i++) {
688 EXPECT_WRITE32(USBDEV_BUFFER_REG_OFFSET + buffer.
id * 64 + i - 3,
694 EXPECT_EQ(bytes_written,
sizeof(data));
697 EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET,
699 {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.
id},
700 {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, bytes_written},
702 EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET,
704 {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.
id},
705 {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, bytes_written},
706 {USBDEV_CONFIGIN_5_RDY_5_BIT, 1},
713 EXPECT_READ32(USBDEV_CONFIGIN_0_REG_OFFSET,
715 {USBDEV_CONFIGIN_0_BUFFER_0_OFFSET, buffer.
id},
716 {USBDEV_CONFIGIN_0_SIZE_0_OFFSET,
sizeof(data)},
717 {USBDEV_CONFIGIN_0_RDY_0_BIT, 0},
718 {USBDEV_CONFIGIN_0_PEND_0_BIT, 1},
720 EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, {
721 {USBDEV_IN_SENT_SENT_0_BIT, 0},
725 EXPECT_READ32(USBDEV_CONFIGIN_0_REG_OFFSET,
727 {USBDEV_CONFIGIN_0_BUFFER_0_OFFSET, buffer.
id},
728 {USBDEV_CONFIGIN_0_SIZE_0_OFFSET,
sizeof(data)},
729 {USBDEV_CONFIGIN_0_RDY_0_BIT, 0},
730 {USBDEV_CONFIGIN_0_PEND_0_BIT, 1},
732 EXPECT_WRITE32(USBDEV_CONFIGIN_0_REG_OFFSET,
733 {{USBDEV_CONFIGIN_0_PEND_0_BIT, 1}});
734 EXPECT_WRITE32(USBDEV_IN_SENT_REG_OFFSET, {{USBDEV_IN_SENT_SENT_0_BIT, 1}});
740 for (
size_t i = 0; i <
sizeof(data); i++) {
743 EXPECT_WRITE32(USBDEV_BUFFER_REG_OFFSET + buffer.
id * 64 + i - 3,
751 EXPECT_WRITE32(USBDEV_CONFIGIN_4_REG_OFFSET,
753 {USBDEV_CONFIGIN_4_BUFFER_4_OFFSET, buffer.
id},
754 {USBDEV_CONFIGIN_4_SIZE_4_OFFSET,
sizeof(data)},
756 EXPECT_WRITE32(USBDEV_CONFIGIN_4_REG_OFFSET,
758 {USBDEV_CONFIGIN_4_BUFFER_4_OFFSET, buffer.
id},
759 {USBDEV_CONFIGIN_4_SIZE_4_OFFSET,
sizeof(data)},
760 {USBDEV_CONFIGIN_4_RDY_4_BIT, 1},
765 EXPECT_READ32(USBDEV_CONFIGIN_7_REG_OFFSET,
767 {USBDEV_CONFIGIN_7_BUFFER_7_OFFSET, buffer.
id},
768 {USBDEV_CONFIGIN_7_SIZE_7_OFFSET,
sizeof(data)},
769 {USBDEV_CONFIGIN_7_RDY_7_BIT, 0},
771 EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, {
772 {USBDEV_IN_SENT_SENT_7_BIT, 0},
778 EXPECT_READ32(USBDEV_CONFIGIN_8_REG_OFFSET,
780 {USBDEV_CONFIGIN_8_BUFFER_8_OFFSET, buffer.
id},
781 {USBDEV_CONFIGIN_8_SIZE_8_OFFSET,
sizeof(data)},
782 {USBDEV_CONFIGIN_8_RDY_8_BIT, 1},
788 uint16_t endpoints_done;
789 EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, {
790 {USBDEV_IN_SENT_SENT_3_BIT, 1},
791 {USBDEV_IN_SENT_SENT_5_BIT, 1},
794 EXPECT_EQ(endpoints_done, (1u << 3) | (1u << 5));
796 EXPECT_READ32(USBDEV_CONFIGIN_5_REG_OFFSET,
798 {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.
id},
799 {USBDEV_CONFIGIN_5_SIZE_5_OFFSET,
sizeof(data)},
800 {USBDEV_CONFIGIN_5_RDY_5_BIT, 0},
802 EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, {
803 {USBDEV_IN_SENT_SENT_3_BIT, 1},
804 {USBDEV_IN_SENT_SENT_5_BIT, 1},
810 EXPECT_READ32(USBDEV_CONFIGIN_5_REG_OFFSET,
812 {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.
id},
813 {USBDEV_CONFIGIN_5_SIZE_5_OFFSET,
sizeof(data)},
814 {USBDEV_CONFIGIN_5_RDY_5_BIT, 0},
816 EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET,
817 {{USBDEV_CONFIGIN_5_PEND_5_BIT, 1}});
818 EXPECT_WRITE32(USBDEV_IN_SENT_REG_OFFSET, {{USBDEV_IN_SENT_SENT_5_BIT, 1}});
823 TEST_F(UsbdevTest, DeviceAddresses) {
824 uint8_t address = 101;
825 EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET,
827 {USBDEV_USBCTRL_ENABLE_BIT, 1},
828 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 0},
830 EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET,
832 {USBDEV_USBCTRL_ENABLE_BIT, 1},
833 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, address},
837 EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET,
839 {USBDEV_USBCTRL_ENABLE_BIT, 1},
840 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 58},
843 EXPECT_EQ(address, 58);
846 TEST_F(UsbdevTest, Status) {
848 EXPECT_WRITE32(USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
850 {USBDEV_OUT_DATA_TOGGLE_STATUS_OFFSET, 0u},
851 {USBDEV_OUT_DATA_TOGGLE_MASK_OFFSET, 1u << 3},
853 EXPECT_WRITE32(USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
855 {USBDEV_IN_DATA_TOGGLE_STATUS_OFFSET, 0u},
856 {USBDEV_IN_DATA_TOGGLE_MASK_OFFSET, 1u << 3},
859 EXPECT_WRITE32(USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
861 {USBDEV_OUT_DATA_TOGGLE_STATUS_OFFSET, 0u},
862 {USBDEV_OUT_DATA_TOGGLE_MASK_OFFSET, 1u << 9},
864 EXPECT_WRITE32(USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
866 {USBDEV_IN_DATA_TOGGLE_STATUS_OFFSET, 0u},
867 {USBDEV_IN_DATA_TOGGLE_MASK_OFFSET, 1u << 9},
872 const uint16_t even_endpoints = (0x40000000u / 3) & all_endpoints;
873 const uint16_t odd_endpoints = even_endpoints << 1;
874 EXPECT_WRITE32(USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
876 {USBDEV_OUT_DATA_TOGGLE_STATUS_OFFSET, even_endpoints},
877 {USBDEV_OUT_DATA_TOGGLE_MASK_OFFSET, all_endpoints},
881 EXPECT_WRITE32(USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
883 {USBDEV_IN_DATA_TOGGLE_STATUS_OFFSET, odd_endpoints},
884 {USBDEV_IN_DATA_TOGGLE_MASK_OFFSET, all_endpoints},
889 uint16_t out_toggles;
890 EXPECT_READ32(USBDEV_OUT_DATA_TOGGLE_REG_OFFSET,
892 {USBDEV_OUT_DATA_TOGGLE_STATUS_OFFSET, odd_endpoints},
893 {USBDEV_OUT_DATA_TOGGLE_MASK_OFFSET, 0u},
896 EXPECT_EQ(out_toggles, odd_endpoints);
898 EXPECT_READ32(USBDEV_IN_DATA_TOGGLE_REG_OFFSET,
900 {USBDEV_IN_DATA_TOGGLE_STATUS_OFFSET, even_endpoints},
901 {USBDEV_OUT_DATA_TOGGLE_MASK_OFFSET, 0u},
904 EXPECT_EQ(in_toggles, even_endpoints);
907 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
909 {USBDEV_USBSTAT_FRAME_OFFSET, 92},
910 {USBDEV_USBSTAT_SENSE_BIT, 1},
911 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
912 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
913 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 2},
916 EXPECT_EQ(frame, 92);
919 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
921 {USBDEV_USBSTAT_FRAME_OFFSET, 18},
922 {USBDEV_USBSTAT_SENSE_BIT, 1},
923 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
924 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF},
925 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 2},
926 {USBDEV_USBSTAT_HOST_LOST_BIT, 1},
929 EXPECT_TRUE(host_lost);
930 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
932 {USBDEV_USBSTAT_FRAME_OFFSET, 18},
933 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
934 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF},
935 {USBDEV_USBSTAT_SENSE_BIT, 1},
936 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 2},
937 {USBDEV_USBSTAT_HOST_LOST_BIT, 0},
940 EXPECT_FALSE(host_lost);
943 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
945 {USBDEV_USBSTAT_FRAME_OFFSET, 31},
946 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
947 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF},
948 {USBDEV_USBSTAT_SENSE_BIT, 1},
951 EXPECT_TRUE(vbus_sense);
953 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
955 {USBDEV_USBSTAT_FRAME_OFFSET, 31},
956 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
957 USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED},
958 {USBDEV_USBSTAT_SENSE_BIT, 0},
961 EXPECT_FALSE(vbus_sense);
963 uint8_t av_setup_fifo_depth;
964 uint8_t av_out_fifo_depth;
965 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
967 {USBDEV_USBSTAT_FRAME_OFFSET, 11},
968 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
969 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
970 {USBDEV_USBSTAT_SENSE_BIT, 1},
971 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 3},
972 {USBDEV_USBSTAT_RX_EMPTY_BIT, 1},
975 &usbdev_, &av_setup_fifo_depth, &av_out_fifo_depth));
976 EXPECT_EQ(av_out_fifo_depth, 3);
978 bool av_setup_fifo_full;
979 bool av_out_fifo_full;
980 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
982 {USBDEV_USBSTAT_FRAME_OFFSET, 12},
983 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
984 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
985 {USBDEV_USBSTAT_SENSE_BIT, 1},
986 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 4},
987 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 1},
988 {USBDEV_USBSTAT_RX_EMPTY_BIT, 1},
991 &usbdev_, &av_setup_fifo_full, &av_out_fifo_full));
992 EXPECT_TRUE(av_out_fifo_full);
994 uint8_t rx_fifo_depth;
995 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
997 {USBDEV_USBSTAT_FRAME_OFFSET, 12},
998 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
999 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
1000 {USBDEV_USBSTAT_SENSE_BIT, 1},
1001 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 4},
1002 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 1},
1003 {USBDEV_USBSTAT_RX_EMPTY_BIT, 0},
1004 {USBDEV_USBSTAT_RX_DEPTH_OFFSET, 2},
1007 EXPECT_EQ(rx_fifo_depth, 2);
1010 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1012 {USBDEV_USBSTAT_FRAME_OFFSET, 12},
1013 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1014 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
1015 {USBDEV_USBSTAT_SENSE_BIT, 1},
1016 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 4},
1017 {USBDEV_USBSTAT_AV_OUT_FULL_BIT, 1},
1018 {USBDEV_USBSTAT_RX_EMPTY_BIT, 1},
1021 EXPECT_TRUE(rx_fifo_empty);
1024 TEST_F(UsbdevTest, LinkState) {
1026 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1028 {USBDEV_USBSTAT_FRAME_OFFSET, 27},
1029 {USBDEV_USBSTAT_SENSE_BIT, 1},
1030 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1031 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE},
1032 {USBDEV_USBSTAT_AV_OUT_DEPTH_OFFSET, 2},
1035 EXPECT_EQ(link_state, kDifUsbdevLinkStateActive);
1037 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1039 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1040 USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED},
1043 EXPECT_EQ(link_state, kDifUsbdevLinkStateDisconnected);
1045 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1047 {USBDEV_USBSTAT_SENSE_BIT, 1},
1048 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1049 USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED},
1052 EXPECT_EQ(link_state, kDifUsbdevLinkStatePowered);
1054 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1056 {USBDEV_USBSTAT_SENSE_BIT, 1},
1057 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1058 USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED_SUSPENDED},
1061 EXPECT_EQ(link_state, kDifUsbdevLinkStatePoweredSuspended);
1063 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1065 {USBDEV_USBSTAT_SENSE_BIT, 1},
1066 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1067 USBDEV_USBSTAT_LINK_STATE_VALUE_SUSPENDED},
1070 EXPECT_EQ(link_state, kDifUsbdevLinkStateSuspended);
1072 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1074 {USBDEV_USBSTAT_SENSE_BIT, 1},
1075 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1076 USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF},
1079 EXPECT_EQ(link_state, kDifUsbdevLinkStateActiveNoSof);
1081 EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET,
1083 {USBDEV_USBSTAT_SENSE_BIT, 1},
1084 {USBDEV_USBSTAT_LINK_STATE_OFFSET,
1085 USBDEV_USBSTAT_LINK_STATE_VALUE_RESUMING},
1088 EXPECT_EQ(link_state, kDifUsbdevLinkStateResuming);
1091 TEST_F(UsbdevTest, WakeFromSleep) {
1092 EXPECT_WRITE32(USBDEV_WAKE_CONTROL_REG_OFFSET,
1093 {{USBDEV_WAKE_CONTROL_SUSPEND_REQ_BIT, 1}});
1097 EXPECT_READ32(USBDEV_WAKE_EVENTS_REG_OFFSET,
1099 {USBDEV_WAKE_EVENTS_MODULE_ACTIVE_BIT, 1},
1100 {USBDEV_WAKE_EVENTS_DISCONNECTED_BIT, 0},
1101 {USBDEV_WAKE_EVENTS_BUS_RESET_BIT, 1},
1104 EXPECT_TRUE(wake_status.
active);
1108 EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET,
1110 {USBDEV_USBCTRL_ENABLE_BIT, 1},
1111 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 88},
1112 {USBDEV_USBCTRL_RESUME_LINK_ACTIVE_BIT, 0},
1114 EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET,
1116 {USBDEV_USBCTRL_ENABLE_BIT, 1},
1117 {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 88},
1118 {USBDEV_USBCTRL_RESUME_LINK_ACTIVE_BIT, 1},
1122 EXPECT_WRITE32(USBDEV_WAKE_CONTROL_REG_OFFSET,
1123 {{USBDEV_WAKE_CONTROL_WAKE_ACK_BIT, 1}});