| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | #include "sw/device/lib/dif/dif_usbdev.h" | 
 |  | 
 | #include "gtest/gtest.h" | 
 | #include "sw/device/lib/base/mmio.h" | 
 | #include "sw/device/lib/base/mock_mmio.h" | 
 | #include "sw/device/lib/base/multibits.h" | 
 | #include "sw/device/lib/dif/dif_base.h" | 
 | #include "sw/device/lib/dif/dif_test_base.h" | 
 |  | 
 | #include "usbdev_regs.h"  // Generated. | 
 |  | 
 | namespace dif_usbdev_unittest { | 
 | namespace { | 
 | using mock_mmio::MmioTest; | 
 | using mock_mmio::MockDevice; | 
 | using testing::Test; | 
 |  | 
 | class UsbdevTest : public Test, public MmioTest { | 
 |  protected: | 
 |   dif_usbdev_t usbdev_ = { | 
 |       .base_addr = dev().region(), | 
 |   }; | 
 | }; | 
 |  | 
 | TEST_F(UsbdevTest, NullArgsTest) { | 
 |   dif_usbdev_config_t config; | 
 |   dif_usbdev_buffer_pool_t buffer_pool; | 
 |   bool bool_arg; | 
 |   dif_usbdev_rx_packet_info_t packet_info; | 
 |   dif_usbdev_buffer_t buffer; | 
 |   uint8_t uint8_arg; | 
 |   size_t size_arg; | 
 |   dif_usbdev_endpoint_id_t endpoint_id; | 
 |   dif_usbdev_tx_status_t tx_status; | 
 |   uint16_t uint16_arg; | 
 |   dif_usbdev_link_state_t link_state; | 
 |   dif_usbdev_wake_status_t wake_status; | 
 |   dif_usbdev_phy_pins_sense_t phy_pins_status; | 
 |   dif_usbdev_phy_pins_drive_t phy_pins_drive; | 
 |  | 
 |   EXPECT_DIF_BADARG(dif_usbdev_configure(nullptr, &buffer_pool, config)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_configure(&usbdev_, nullptr, config)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_fill_available_fifo(nullptr, &buffer_pool)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_fill_available_fifo(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_endpoint_setup_enable(nullptr, /*endpoint=*/0, | 
 |                                                      kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_endpoint_out_enable(nullptr, /*endpoint=*/0, | 
 |                                                    kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_endpoint_set_nak_out_enable( | 
 |       nullptr, /*endpoint=*/0, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_endpoint_stall_enable(nullptr, endpoint_id, | 
 |                                                      kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_endpoint_stall_get(nullptr, endpoint_id, &bool_arg)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_endpoint_stall_get(&usbdev_, endpoint_id, nullptr)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_endpoint_iso_enable(nullptr, endpoint_id, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_endpoint_enable(nullptr, endpoint_id, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_interface_enable(nullptr, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_recv(nullptr, &packet_info, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_recv(&usbdev_, nullptr, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_recv(&usbdev_, &packet_info, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_read( | 
 |       nullptr, &buffer_pool, &buffer, &uint8_arg, /*dst_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_read( | 
 |       &usbdev_, nullptr, &buffer, &uint8_arg, /*dst_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_read( | 
 |       &usbdev_, &buffer_pool, nullptr, &uint8_arg, /*dst_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_read(&usbdev_, &buffer_pool, &buffer, | 
 |                                            nullptr, /*dst_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_read(&usbdev_, &buffer_pool, &buffer, | 
 |                                            &uint8_arg, /*dst_len=*/1, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_return(nullptr, &buffer_pool, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_return(&usbdev_, nullptr, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_return(&usbdev_, &buffer_pool, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_request(nullptr, &buffer_pool, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_request(&usbdev_, nullptr, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_request(&usbdev_, &buffer_pool, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_write(nullptr, &buffer, &uint8_arg, | 
 |                                             /*src_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_write(&usbdev_, nullptr, &uint8_arg, | 
 |                                             /*src_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_write(&usbdev_, &buffer, nullptr, | 
 |                                             /*src_len=*/1, &size_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_write(&usbdev_, &buffer, &uint8_arg, | 
 |                                             /*src_len=*/1, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_send(nullptr, /*endpoint=*/0, &buffer)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_send(&usbdev_, /*endpoint=*/0, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_tx_sent(nullptr, &uint16_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_tx_sent(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_clear_tx_status(nullptr, &buffer_pool, /*endpoint=*/0)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_clear_tx_status(&usbdev_, nullptr, /*endpoint=*/0)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_get_tx_status(nullptr, /*endpoint=*/0, &tx_status)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_get_tx_status(&usbdev_, /*endpoint=*/0, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_address_set(nullptr, /*addr=*/1)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_address_get(nullptr, &uint8_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_address_get(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_clear_data_toggle(nullptr, /*endpoint=*/1)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_frame(nullptr, &uint16_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_frame(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_host_lost(nullptr, &bool_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_host_lost(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_link_state(nullptr, &link_state)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_link_state(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_sense(nullptr, &bool_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_sense(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_status_get_available_fifo_depth(nullptr, &uint8_arg)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_status_get_available_fifo_depth(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_status_get_available_fifo_full(nullptr, &bool_arg)); | 
 |   EXPECT_DIF_BADARG( | 
 |       dif_usbdev_status_get_available_fifo_full(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_rx_fifo_depth(nullptr, &uint8_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_rx_fifo_depth(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_rx_fifo_empty(nullptr, &bool_arg)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_status_get_rx_fifo_empty(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_set_osc_test_mode(nullptr, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_set_wake_enable(nullptr, kDifToggleEnabled)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_wake_status(nullptr, &wake_status)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_wake_status(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_resume_link_to_active(nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_phy_pins_status(nullptr, &phy_pins_status)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_get_phy_pins_status(&usbdev_, nullptr)); | 
 |   EXPECT_DIF_BADARG(dif_usbdev_set_phy_pins_state(nullptr, kDifToggleEnabled, | 
 |                                                   phy_pins_drive)); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, PhyConfig) { | 
 |   dif_usbdev_buffer_pool_t buffer_pool; | 
 |   dif_usbdev_config_t phy_config = { | 
 |       .have_differential_receiver = kDifToggleEnabled, | 
 |       .use_tx_d_se0 = kDifToggleDisabled, | 
 |       .single_bit_eop = kDifToggleDisabled, | 
 |       .pin_flip = kDifToggleEnabled, | 
 |       .clock_sync_signals = kDifToggleEnabled, | 
 |   }; | 
 |   EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_configure(&usbdev_, &buffer_pool, phy_config)); | 
 |  | 
 |   dif_usbdev_phy_pins_sense_t phy_pins_status; | 
 |   EXPECT_READ32(USBDEV_PHY_PINS_SENSE_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_PHY_PINS_SENSE_RX_DP_I_BIT, 1}, | 
 |                     {USBDEV_PHY_PINS_SENSE_RX_DN_I_BIT, 0}, | 
 |                     {USBDEV_PHY_PINS_SENSE_RX_D_I_BIT, 1}, | 
 |                     {USBDEV_PHY_PINS_SENSE_TX_DP_O_BIT, 0}, | 
 |                     {USBDEV_PHY_PINS_SENSE_TX_DN_O_BIT, 1}, | 
 |                     {USBDEV_PHY_PINS_SENSE_TX_D_O_BIT, 0}, | 
 |                     {USBDEV_PHY_PINS_SENSE_TX_SE0_O_BIT, 0}, | 
 |                     {USBDEV_PHY_PINS_SENSE_TX_OE_O_BIT, 1}, | 
 |                     {USBDEV_PHY_PINS_SENSE_PWR_SENSE_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_phy_pins_status(&usbdev_, &phy_pins_status)); | 
 |   EXPECT_TRUE(phy_pins_status.rx_dp); | 
 |   EXPECT_FALSE(phy_pins_status.rx_dn); | 
 |   EXPECT_TRUE(phy_pins_status.rx_d); | 
 |   EXPECT_FALSE(phy_pins_status.tx_dp); | 
 |   EXPECT_TRUE(phy_pins_status.tx_dn); | 
 |   EXPECT_FALSE(phy_pins_status.tx_d); | 
 |   EXPECT_FALSE(phy_pins_status.tx_se0); | 
 |   EXPECT_TRUE(phy_pins_status.output_enable); | 
 |   EXPECT_TRUE(phy_pins_status.vbus_sense); | 
 |  | 
 |   dif_usbdev_phy_pins_drive_t overrides = { | 
 |       .dp = 0, | 
 |       .dn = 1, | 
 |       .data = 0, | 
 |       .se0 = 1, | 
 |       .output_enable = 1, | 
 |       .diff_receiver_enable = 0, | 
 |       .dp_pullup_en = 1, | 
 |       .dn_pullup_en = 0, | 
 |   }; | 
 |   EXPECT_WRITE32( | 
 |       USBDEV_PHY_PINS_DRIVE_REG_OFFSET, | 
 |       { | 
 |           {USBDEV_PHY_PINS_DRIVE_DP_O_BIT, overrides.dp}, | 
 |           {USBDEV_PHY_PINS_DRIVE_DN_O_BIT, overrides.dn}, | 
 |           {USBDEV_PHY_PINS_DRIVE_D_O_BIT, overrides.data}, | 
 |           {USBDEV_PHY_PINS_DRIVE_SE0_O_BIT, overrides.se0}, | 
 |           {USBDEV_PHY_PINS_DRIVE_OE_O_BIT, overrides.output_enable}, | 
 |           {USBDEV_PHY_PINS_DRIVE_RX_ENABLE_O_BIT, | 
 |            overrides.diff_receiver_enable}, | 
 |           {USBDEV_PHY_PINS_DRIVE_DP_PULLUP_EN_O_BIT, overrides.dp_pullup_en}, | 
 |           {USBDEV_PHY_PINS_DRIVE_DN_PULLUP_EN_O_BIT, overrides.dn_pullup_en}, | 
 |           {USBDEV_PHY_PINS_DRIVE_EN_BIT, 1}, | 
 |       }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_set_phy_pins_state(&usbdev_, kDifToggleEnabled, overrides)); | 
 |  | 
 |   EXPECT_WRITE32(USBDEV_PHY_PINS_DRIVE_REG_OFFSET, 0); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_set_phy_pins_state(&usbdev_, kDifToggleDisabled, overrides)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                     {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1}, | 
 |                     {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_set_osc_test_mode(&usbdev_, kDifToggleEnabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                     {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1}, | 
 |                     {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                     {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_PINFLIP_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_TX_OSC_TEST_MODE_BIT, 0}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_set_osc_test_mode(&usbdev_, kDifToggleDisabled)); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, ConnectAndConfig) { | 
 |   // Connect the interface. | 
 |   EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, 0); | 
 |   EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET, {{USBDEV_USBCTRL_ENABLE_BIT, 1}}); | 
 |   EXPECT_DIF_OK(dif_usbdev_interface_enable(&usbdev_, kDifToggleEnabled)); | 
 |  | 
 |   // Disconnect the interface. | 
 |   EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                     {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 127}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_USBCTRL_ENABLE_BIT, 0}, | 
 |                      {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 127}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_interface_enable(&usbdev_, kDifToggleDisabled)); | 
 |  | 
 |   dif_usbdev_endpoint_id_t endpoint = { | 
 |       .number = 2, | 
 |       .direction = 1, | 
 |   }; | 
 |   EXPECT_READ32(USBDEV_EP_IN_ENABLE_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_EP_IN_ENABLE_ENABLE_0_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_EP_IN_ENABLE_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_EP_IN_ENABLE_ENABLE_0_BIT, 1}, | 
 |                      {USBDEV_EP_IN_ENABLE_ENABLE_2_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_enable(&usbdev_, endpoint, kDifToggleEnabled)); | 
 |  | 
 |   endpoint.number = 6; | 
 |   endpoint.direction = 0; | 
 |   EXPECT_READ32(USBDEV_EP_OUT_ENABLE_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_EP_OUT_ENABLE_ENABLE_5_BIT, 1}, | 
 |                     {USBDEV_EP_OUT_ENABLE_ENABLE_6_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_EP_OUT_ENABLE_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_EP_OUT_ENABLE_ENABLE_5_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_enable(&usbdev_, endpoint, kDifToggleDisabled)); | 
 |  | 
 |   endpoint.number = 11; | 
 |   endpoint.direction = 0; | 
 |   EXPECT_READ32(USBDEV_OUT_ISO_REG_OFFSET, { | 
 |                                                {USBDEV_OUT_ISO_ISO_5_BIT, 1}, | 
 |                                            }); | 
 |   EXPECT_WRITE32(USBDEV_OUT_ISO_REG_OFFSET, { | 
 |                                                 {USBDEV_OUT_ISO_ISO_5_BIT, 1}, | 
 |                                                 {USBDEV_OUT_ISO_ISO_11_BIT, 1}, | 
 |                                             }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_iso_enable(&usbdev_, endpoint, kDifToggleEnabled)); | 
 |  | 
 |   endpoint.number = 7; | 
 |   endpoint.direction = 1; | 
 |   EXPECT_READ32(USBDEV_IN_ISO_REG_OFFSET, { | 
 |                                               {USBDEV_IN_ISO_ISO_1_BIT, 1}, | 
 |                                               {USBDEV_IN_ISO_ISO_7_BIT, 1}, | 
 |                                           }); | 
 |   EXPECT_WRITE32(USBDEV_IN_ISO_REG_OFFSET, { | 
 |                                                {USBDEV_IN_ISO_ISO_1_BIT, 1}, | 
 |                                            }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_iso_enable(&usbdev_, endpoint, kDifToggleDisabled)); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, OutEndpointConfig) { | 
 |   EXPECT_READ32(USBDEV_RXENABLE_SETUP_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_0_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_11_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_RXENABLE_SETUP_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_0_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_11_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_setup_enable(&usbdev_, /*endpoint=*/9, | 
 |                                                  kDifToggleEnabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_RXENABLE_SETUP_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_8_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_SETUP_SETUP_10_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_RXENABLE_SETUP_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_8_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_SETUP_SETUP_9_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_setup_enable(&usbdev_, /*endpoint=*/10, | 
 |                                                  kDifToggleDisabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_RXENABLE_OUT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXENABLE_OUT_OUT_0_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_OUT_OUT_2_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_OUT_OUT_9_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_RXENABLE_OUT_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_RXENABLE_OUT_OUT_0_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_OUT_OUT_2_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_OUT_OUT_5_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_OUT_OUT_9_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_out_enable(&usbdev_, /*endpoint=*/5, | 
 |                                                kDifToggleEnabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_RXENABLE_OUT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXENABLE_OUT_OUT_1_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_OUT_OUT_3_BIT, 1}, | 
 |                     {USBDEV_RXENABLE_OUT_OUT_7_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_RXENABLE_OUT_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_RXENABLE_OUT_OUT_1_BIT, 1}, | 
 |                      {USBDEV_RXENABLE_OUT_OUT_7_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_out_enable(&usbdev_, /*endpoint=*/3, | 
 |                                                kDifToggleDisabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_SET_NAK_OUT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_SET_NAK_OUT_ENABLE_10_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_SET_NAK_OUT_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1}, | 
 |                      {USBDEV_SET_NAK_OUT_ENABLE_10_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_set_nak_out_enable(&usbdev_, /*endpoint=*/9, | 
 |                                                        kDifToggleEnabled)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_SET_NAK_OUT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_SET_NAK_OUT_ENABLE_8_BIT, 1}, | 
 |                     {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_SET_NAK_OUT_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_SET_NAK_OUT_ENABLE_9_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_set_nak_out_enable(&usbdev_, /*endpoint=*/8, | 
 |                                                        kDifToggleDisabled)); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, StallConfig) { | 
 |   dif_usbdev_endpoint_id_t endpoint = { | 
 |       .number = 1, | 
 |       .direction = 1, | 
 |   }; | 
 |   EXPECT_READ32(USBDEV_IN_STALL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_IN_STALL_ENDPOINT_0_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_IN_STALL_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_IN_STALL_ENDPOINT_0_BIT, 1}, | 
 |                      {USBDEV_IN_STALL_ENDPOINT_1_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_stall_enable(&usbdev_, endpoint, kDifToggleEnabled)); | 
 |  | 
 |   endpoint.number = 3; | 
 |   endpoint.direction = 0; | 
 |   EXPECT_READ32(USBDEV_OUT_STALL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_OUT_STALL_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_OUT_STALL_ENDPOINT_3_BIT, 1}, | 
 |                      {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_endpoint_stall_enable(&usbdev_, endpoint, kDifToggleEnabled)); | 
 |  | 
 |   bool enabled; | 
 |   endpoint.number = 5; | 
 |   endpoint.direction = 1; | 
 |   EXPECT_READ32(USBDEV_IN_STALL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_IN_STALL_ENDPOINT_5_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_stall_get(&usbdev_, endpoint, &enabled)); | 
 |   EXPECT_TRUE(enabled); | 
 |  | 
 |   endpoint.number = 11; | 
 |   endpoint.direction = 0; | 
 |   EXPECT_READ32(USBDEV_OUT_STALL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_OUT_STALL_ENDPOINT_5_BIT, 1}, | 
 |                     {USBDEV_OUT_STALL_ENDPOINT_9_BIT, 1}, | 
 |                     {USBDEV_OUT_STALL_ENDPOINT_10_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_endpoint_stall_get(&usbdev_, endpoint, &enabled)); | 
 |   EXPECT_FALSE(enabled); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, OutPacket) { | 
 |   constexpr uint32_t kMaxAvBuffers = 4; | 
 |   dif_usbdev_buffer_pool_t buffer_pool; | 
 |   dif_usbdev_config_t phy_config = { | 
 |       .have_differential_receiver = kDifToggleEnabled, | 
 |       .use_tx_d_se0 = kDifToggleDisabled, | 
 |       .single_bit_eop = kDifToggleDisabled, | 
 |       .pin_flip = kDifToggleDisabled, | 
 |       .clock_sync_signals = kDifToggleEnabled, | 
 |   }; | 
 |   EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_PINFLIP_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_configure(&usbdev_, &buffer_pool, phy_config)); | 
 |  | 
 |   // Add buffers to the AV FIFO to receive. | 
 |   for (uint32_t i = 0; i < kMaxAvBuffers; i++) { | 
 |     int top = buffer_pool.top; | 
 |     EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                   { | 
 |                       {USBDEV_USBSTAT_FRAME_OFFSET, 10}, | 
 |                       {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                        USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                       {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                       {USBDEV_USBSTAT_AV_DEPTH_OFFSET, i}, | 
 |                       {USBDEV_USBSTAT_AV_FULL_BIT, 0}, | 
 |                   }); | 
 |     EXPECT_WRITE32( | 
 |         USBDEV_AVBUFFER_REG_OFFSET, | 
 |         {{USBDEV_AVBUFFER_BUFFER_OFFSET, buffer_pool.buffers[top - i]}}); | 
 |   } | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 10}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, kMaxAvBuffers}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_fill_available_fifo(&usbdev_, &buffer_pool)); | 
 |  | 
 |   // No read data available yet. | 
 |   dif_usbdev_rx_packet_info_t rx_packet_info; | 
 |   dif_usbdev_buffer_t buffer; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 15}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, kMaxAvBuffers}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_EQ(dif_usbdev_recv(&usbdev_, &rx_packet_info, &buffer), | 
 |             kDifUnavailable); | 
 |  | 
 |   // Receive OUT packet all at once. | 
 |   uint32_t expected_data[4], recvd_data[4]; | 
 |   for (size_t i = 0; i < sizeof(expected_data) / sizeof(expected_data[0]); | 
 |        i++) { | 
 |     expected_data[i] = i * 1023; | 
 |   } | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 15}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, kMaxAvBuffers - 1}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 0}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_READ32(USBDEV_RXFIFO_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXFIFO_EP_OFFSET, 1}, | 
 |                     {USBDEV_RXFIFO_SETUP_BIT, 0}, | 
 |                     {USBDEV_RXFIFO_SIZE_OFFSET, sizeof(expected_data)}, | 
 |                     {USBDEV_RXFIFO_BUFFER_OFFSET, 0}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_recv(&usbdev_, &rx_packet_info, &buffer)); | 
 |   EXPECT_EQ(rx_packet_info.endpoint, 1); | 
 |   EXPECT_EQ(rx_packet_info.length, sizeof(expected_data)); | 
 |   EXPECT_FALSE(rx_packet_info.is_setup); | 
 |   EXPECT_EQ(buffer.id, 0); | 
 |   EXPECT_EQ(buffer.offset, 0); | 
 |   EXPECT_EQ(buffer.remaining_bytes, sizeof(expected_data)); | 
 |   EXPECT_EQ(buffer.type, kDifUsbdevBufferTypeRead); | 
 |  | 
 |   size_t bytes_written; | 
 |   for (size_t i = 0; i < sizeof(expected_data) / sizeof(expected_data[0]); | 
 |        i++) { | 
 |     EXPECT_READ32(USBDEV_BUFFER_REG_OFFSET + buffer.id * 64 + 4 * i, | 
 |                   expected_data[i]); | 
 |   } | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_read(&usbdev_, &buffer_pool, &buffer, | 
 |                                        reinterpret_cast<uint8_t *>(recvd_data), | 
 |                                        sizeof(recvd_data), &bytes_written)); | 
 |   EXPECT_EQ(bytes_written, sizeof(recvd_data)); | 
 |   EXPECT_EQ(memcmp(expected_data, recvd_data, sizeof(expected_data)), 0); | 
 |  | 
 |   // One more received packet to test other offsets. | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 25}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, kMaxAvBuffers - 2}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_READ32(USBDEV_RXFIFO_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_RXFIFO_EP_OFFSET, 0}, | 
 |                     {USBDEV_RXFIFO_SETUP_BIT, 1}, | 
 |                     {USBDEV_RXFIFO_SIZE_OFFSET, sizeof(expected_data) - 1}, | 
 |                     {USBDEV_RXFIFO_BUFFER_OFFSET, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_recv(&usbdev_, &rx_packet_info, &buffer)); | 
 |   EXPECT_EQ(rx_packet_info.endpoint, 0); | 
 |   EXPECT_EQ(rx_packet_info.length, sizeof(expected_data) - 1); | 
 |   EXPECT_TRUE(rx_packet_info.is_setup); | 
 |   EXPECT_EQ(buffer.id, 1); | 
 |   EXPECT_EQ(buffer.offset, 0); | 
 |   EXPECT_EQ(buffer.remaining_bytes, sizeof(expected_data) - 1); | 
 |   EXPECT_EQ(buffer.type, kDifUsbdevBufferTypeRead); | 
 |  | 
 |   memset(recvd_data, 0, sizeof(recvd_data)); | 
 |   for (size_t i = 0; i < sizeof(expected_data) / sizeof(expected_data[0]); | 
 |        i++) { | 
 |     EXPECT_READ32(USBDEV_BUFFER_REG_OFFSET + buffer.id * 64 + 4 * i, | 
 |                   expected_data[i]); | 
 |   } | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_read(&usbdev_, &buffer_pool, &buffer, | 
 |                                        reinterpret_cast<uint8_t *>(recvd_data), | 
 |                                        4, &bytes_written)); | 
 |   EXPECT_EQ(bytes_written, 4); | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_read( | 
 |       &usbdev_, &buffer_pool, &buffer, | 
 |       reinterpret_cast<uint8_t *>(recvd_data) + bytes_written, | 
 |       sizeof(recvd_data) - bytes_written, &bytes_written)); | 
 |   EXPECT_EQ(bytes_written, sizeof(recvd_data) - 4 - 1); | 
 |   EXPECT_EQ(memcmp(expected_data, recvd_data, sizeof(expected_data)), 0); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, InPacket) { | 
 |   dif_usbdev_buffer_pool_t buffer_pool; | 
 |   dif_usbdev_config_t phy_config = { | 
 |       .have_differential_receiver = kDifToggleEnabled, | 
 |       .use_tx_d_se0 = kDifToggleDisabled, | 
 |       .single_bit_eop = kDifToggleDisabled, | 
 |       .pin_flip = kDifToggleDisabled, | 
 |       .clock_sync_signals = kDifToggleEnabled, | 
 |   }; | 
 |   EXPECT_WRITE32(USBDEV_PHY_CONFIG_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_PHY_CONFIG_USE_DIFF_RCVR_BIT, 1}, | 
 |                      {USBDEV_PHY_CONFIG_TX_USE_D_SE0_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_EOP_SINGLE_BIT_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_PINFLIP_BIT, 0}, | 
 |                      {USBDEV_PHY_CONFIG_USB_REF_DISABLE_BIT, 0}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_configure(&usbdev_, &buffer_pool, phy_config)); | 
 |  | 
 |   dif_usbdev_buffer_t buffer; | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_request(&usbdev_, &buffer_pool, &buffer)); | 
 |   EXPECT_EQ(buffer.type, kDifUsbdevBufferTypeWrite); | 
 |  | 
 |   uint32_t data[16]; | 
 |   uint8_t *bytes = reinterpret_cast<uint8_t *>(data); | 
 |   size_t bytes_written; | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_return(&usbdev_, &buffer_pool, &buffer)); | 
 |   EXPECT_EQ(buffer.type, kDifUsbdevBufferTypeStale); | 
 |   // Can't return a stale buffer. | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_return(&usbdev_, &buffer_pool, &buffer)); | 
 |   // Can't submit a stale buffer. | 
 |   EXPECT_DIF_BADARG(dif_usbdev_buffer_write(&usbdev_, &buffer, bytes, | 
 |                                             sizeof(data), &bytes_written)); | 
 |  | 
 |   // Request the buffer. | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_request(&usbdev_, &buffer_pool, &buffer)); | 
 |   for (size_t i = 0; i < sizeof(data); i++) { | 
 |     bytes[i] = i; | 
 |     if (i % 4 == 3) { | 
 |       EXPECT_WRITE32(USBDEV_BUFFER_REG_OFFSET + buffer.id * 64 + i - 3, | 
 |                      data[i / 4]); | 
 |     } | 
 |   } | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_write(&usbdev_, &buffer, bytes, sizeof(data), | 
 |                                         &bytes_written)); | 
 |   EXPECT_EQ(bytes_written, sizeof(data)); | 
 |  | 
 |   // Queue up the buffer for transmission. | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.id}, | 
 |                      {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, bytes_written}, | 
 |                  }); | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.id}, | 
 |                      {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, bytes_written}, | 
 |                      {USBDEV_CONFIGIN_5_RDY_5_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_send(&usbdev_, /*endpoint=*/5, &buffer)); | 
 |  | 
 |   // Get TX status for a buffer with a transmission that had to be canceled. The | 
 |   // buffer is returned to the free pool. | 
 |   dif_usbdev_tx_status_t tx_status; | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_0_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_0_BUFFER_0_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_0_SIZE_0_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_0_RDY_0_BIT, 0}, | 
 |                     {USBDEV_CONFIGIN_0_PEND_0_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, { | 
 |                                                {USBDEV_IN_SENT_SENT_0_BIT, 0}, | 
 |                                            }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_tx_status(&usbdev_, /*endpoint=*/0, &tx_status)); | 
 |   EXPECT_EQ(tx_status, kDifUsbdevTxStatusCancelled); | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_0_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_0_BUFFER_0_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_0_SIZE_0_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_0_RDY_0_BIT, 0}, | 
 |                     {USBDEV_CONFIGIN_0_PEND_0_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_0_REG_OFFSET, | 
 |                  {{USBDEV_CONFIGIN_0_PEND_0_BIT, 1}}); | 
 |   EXPECT_WRITE32(USBDEV_IN_SENT_REG_OFFSET, {{USBDEV_IN_SENT_SENT_0_BIT, 1}}); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_clear_tx_status(&usbdev_, &buffer_pool, /*endpoint=*/0)); | 
 |  | 
 |   // Request a new buffer. | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_request(&usbdev_, &buffer_pool, &buffer)); | 
 |   for (size_t i = 0; i < sizeof(data); i++) { | 
 |     bytes[i] = i; | 
 |     if (i % 4 == 3) { | 
 |       EXPECT_WRITE32(USBDEV_BUFFER_REG_OFFSET + buffer.id * 64 + i - 3, | 
 |                      data[i / 4]); | 
 |     } | 
 |   } | 
 |   EXPECT_DIF_OK(dif_usbdev_buffer_write(&usbdev_, &buffer, bytes, sizeof(data), | 
 |                                         &bytes_written)); | 
 |  | 
 |   // Queue the buffer for transmission. | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_4_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_CONFIGIN_4_BUFFER_4_OFFSET, buffer.id}, | 
 |                      {USBDEV_CONFIGIN_4_SIZE_4_OFFSET, sizeof(data)}, | 
 |                  }); | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_4_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_CONFIGIN_4_BUFFER_4_OFFSET, buffer.id}, | 
 |                      {USBDEV_CONFIGIN_4_SIZE_4_OFFSET, sizeof(data)}, | 
 |                      {USBDEV_CONFIGIN_4_RDY_4_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_send(&usbdev_, /*endpoint=*/4, &buffer)); | 
 |  | 
 |   // Get status of an endpoint without a buffer queued for transmission. | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_7_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_7_BUFFER_7_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_7_SIZE_7_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_7_RDY_7_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, { | 
 |                                                {USBDEV_IN_SENT_SENT_7_BIT, 0}, | 
 |                                            }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_tx_status(&usbdev_, /*endpoint=*/7, &tx_status)); | 
 |   EXPECT_EQ(tx_status, kDifUsbdevTxStatusNoPacket); | 
 |  | 
 |   // Get TX status for a queued, but not sent buffer. | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_8_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_8_BUFFER_8_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_8_SIZE_8_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_8_RDY_8_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_tx_status(&usbdev_, /*endpoint=*/8, &tx_status)); | 
 |   EXPECT_EQ(tx_status, kDifUsbdevTxStatusPending); | 
 |  | 
 |   // Buffer was transmitted successfully. | 
 |   uint16_t endpoints_done; | 
 |   EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, { | 
 |                                                {USBDEV_IN_SENT_SENT_3_BIT, 1}, | 
 |                                                {USBDEV_IN_SENT_SENT_5_BIT, 1}, | 
 |                                            }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_tx_sent(&usbdev_, &endpoints_done)); | 
 |   EXPECT_EQ(endpoints_done, (1u << 3) | (1u << 5)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_5_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_5_RDY_5_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_READ32(USBDEV_IN_SENT_REG_OFFSET, { | 
 |                                                {USBDEV_IN_SENT_SENT_3_BIT, 1}, | 
 |                                                {USBDEV_IN_SENT_SENT_5_BIT, 1}, | 
 |                                            }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_tx_status(&usbdev_, /*endpoint=*/5, &tx_status)); | 
 |   EXPECT_EQ(tx_status, kDifUsbdevTxStatusSent); | 
 |   EXPECT_EQ(buffer.type, kDifUsbdevBufferTypeStale); | 
 |  | 
 |   EXPECT_READ32(USBDEV_CONFIGIN_5_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_CONFIGIN_5_BUFFER_5_OFFSET, buffer.id}, | 
 |                     {USBDEV_CONFIGIN_5_SIZE_5_OFFSET, sizeof(data)}, | 
 |                     {USBDEV_CONFIGIN_5_RDY_5_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_CONFIGIN_5_REG_OFFSET, | 
 |                  {{USBDEV_CONFIGIN_5_PEND_5_BIT, 1}}); | 
 |   EXPECT_WRITE32(USBDEV_IN_SENT_REG_OFFSET, {{USBDEV_IN_SENT_SENT_5_BIT, 1}}); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_clear_tx_status(&usbdev_, &buffer_pool, /*endpoint=*/5)); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, DeviceAddresses) { | 
 |   uint8_t address = 101; | 
 |   EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                     {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 0}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                      {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, address}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_address_set(&usbdev_, address)); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                     {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 58}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_address_get(&usbdev_, &address)); | 
 |   EXPECT_EQ(address, 58); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, Status) { | 
 |   EXPECT_WRITE32(USBDEV_DATA_TOGGLE_CLEAR_REG_OFFSET, | 
 |                  {{USBDEV_DATA_TOGGLE_CLEAR_CLEAR_3_BIT, 1}}); | 
 |   EXPECT_DIF_OK(dif_usbdev_clear_data_toggle(&usbdev_, /*endpoint=*/3)); | 
 |   EXPECT_WRITE32(USBDEV_DATA_TOGGLE_CLEAR_REG_OFFSET, | 
 |                  {{USBDEV_DATA_TOGGLE_CLEAR_CLEAR_9_BIT, 1}}); | 
 |   EXPECT_DIF_OK(dif_usbdev_clear_data_toggle(&usbdev_, /*endpoint=*/9)); | 
 |  | 
 |   uint16_t frame; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 92}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 2}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_frame(&usbdev_, &frame)); | 
 |   EXPECT_EQ(frame, 92); | 
 |  | 
 |   bool host_lost; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 18}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 2}, | 
 |                     {USBDEV_USBSTAT_HOST_LOST_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_host_lost(&usbdev_, &host_lost)); | 
 |   EXPECT_TRUE(host_lost); | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 18}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 2}, | 
 |                     {USBDEV_USBSTAT_HOST_LOST_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_host_lost(&usbdev_, &host_lost)); | 
 |   EXPECT_FALSE(host_lost); | 
 |  | 
 |   bool vbus_sense; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 31}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_sense(&usbdev_, &vbus_sense)); | 
 |   EXPECT_TRUE(vbus_sense); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 31}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_sense(&usbdev_, &vbus_sense)); | 
 |   EXPECT_FALSE(vbus_sense); | 
 |  | 
 |   uint8_t av_fifo_depth; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 11}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 3}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_status_get_available_fifo_depth(&usbdev_, &av_fifo_depth)); | 
 |   EXPECT_EQ(av_fifo_depth, 3); | 
 |  | 
 |   bool av_fifo_full; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 12}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 4}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK( | 
 |       dif_usbdev_status_get_available_fifo_full(&usbdev_, &av_fifo_full)); | 
 |   EXPECT_TRUE(av_fifo_full); | 
 |  | 
 |   uint8_t rx_fifo_depth; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 12}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 4}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 0}, | 
 |                     {USBDEV_USBSTAT_RX_DEPTH_OFFSET, 2}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_rx_fifo_depth(&usbdev_, &rx_fifo_depth)); | 
 |   EXPECT_EQ(rx_fifo_depth, 2); | 
 |  | 
 |   bool rx_fifo_empty; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 12}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 4}, | 
 |                     {USBDEV_USBSTAT_AV_FULL_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_RX_EMPTY_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_rx_fifo_empty(&usbdev_, &rx_fifo_empty)); | 
 |   EXPECT_TRUE(rx_fifo_empty); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, LinkState) { | 
 |   dif_usbdev_link_state_t link_state; | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_FRAME_OFFSET, 27}, | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE}, | 
 |                     {USBDEV_USBSTAT_AV_DEPTH_OFFSET, 2}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStateActive); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_DISCONNECTED}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStateDisconnected); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStatePowered); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_POWERED_SUSPENDED}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStatePoweredSuspended); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_SUSPENDED}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStateSuspended); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_ACTIVE_NOSOF}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStateActiveNoSof); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBSTAT_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBSTAT_SENSE_BIT, 1}, | 
 |                     {USBDEV_USBSTAT_LINK_STATE_OFFSET, | 
 |                      USBDEV_USBSTAT_LINK_STATE_VALUE_RESUMING}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_status_get_link_state(&usbdev_, &link_state)); | 
 |   EXPECT_EQ(link_state, kDifUsbdevLinkStateResuming); | 
 | } | 
 |  | 
 | TEST_F(UsbdevTest, WakeFromSleep) { | 
 |   EXPECT_WRITE32(USBDEV_WAKE_CONTROL_REG_OFFSET, | 
 |                  {{USBDEV_WAKE_CONTROL_SUSPEND_REQ_BIT, 1}}); | 
 |   EXPECT_DIF_OK(dif_usbdev_set_wake_enable(&usbdev_, kDifToggleEnabled)); | 
 |  | 
 |   dif_usbdev_wake_status_t wake_status; | 
 |   EXPECT_READ32(USBDEV_WAKE_EVENTS_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_WAKE_EVENTS_MODULE_ACTIVE_BIT, 1}, | 
 |                     {USBDEV_WAKE_EVENTS_DISCONNECTED_BIT, 0}, | 
 |                     {USBDEV_WAKE_EVENTS_BUS_RESET_BIT, 1}, | 
 |                 }); | 
 |   EXPECT_DIF_OK(dif_usbdev_get_wake_status(&usbdev_, &wake_status)); | 
 |   EXPECT_TRUE(wake_status.active); | 
 |   EXPECT_FALSE(wake_status.disconnected); | 
 |   EXPECT_TRUE(wake_status.bus_reset); | 
 |  | 
 |   EXPECT_READ32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                 { | 
 |                     {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                     {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 88}, | 
 |                     {USBDEV_USBCTRL_RESUME_LINK_ACTIVE_BIT, 0}, | 
 |                 }); | 
 |   EXPECT_WRITE32(USBDEV_USBCTRL_REG_OFFSET, | 
 |                  { | 
 |                      {USBDEV_USBCTRL_ENABLE_BIT, 1}, | 
 |                      {USBDEV_USBCTRL_DEVICE_ADDRESS_OFFSET, 88}, | 
 |                      {USBDEV_USBCTRL_RESUME_LINK_ACTIVE_BIT, 1}, | 
 |                  }); | 
 |   EXPECT_DIF_OK(dif_usbdev_resume_link_to_active(&usbdev_)); | 
 |  | 
 |   EXPECT_WRITE32(USBDEV_WAKE_CONTROL_REG_OFFSET, | 
 |                  {{USBDEV_WAKE_CONTROL_WAKE_ACK_BIT, 1}}); | 
 |   EXPECT_DIF_OK(dif_usbdev_set_wake_enable(&usbdev_, kDifToggleDisabled)); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace dif_usbdev_unittest |