Ejemplo n.º 1
0
def test_control_transfer_in_out_in(dut):
    """This transaction is pretty much the first thing any OS will do"""
    harness = get_harness(dut)
    harness.max_packet_size = model.deviceDescriptor.bMaxPacketSize0
    yield harness.reset()
    yield harness.wait(1e3, units="us")

    yield harness.port_reset(10e3)
    yield harness.connect()
    yield harness.wait(1e3, units="us")
    # After waiting (bus inactivity) let's start with SOF
    yield harness.host_send_sof(0x01)

    device_address = 0  # After reset
    yield harness.control_transfer_in(
        device_address,
        # Get device descriptor
        getDescriptorRequest(Descriptor.Types.DEVICE,
                             descriptor_index=0,
                             lang_id=0,
                             length=0x40),
        model.deviceDescriptor.get())

    device_address = 11
    yield harness.set_device_address(
        device_address)  # This utilizes an OUT control transfer

    yield harness.control_transfer_in(
        device_address,
        # Get device descriptor
        getDescriptorRequest(Descriptor.Types.DEVICE,
                             descriptor_index=0,
                             lang_id=0,
                             length=0x40),
        model.deviceDescriptor.get())
Ejemplo n.º 2
0
def test_control_transfer_in_out(dut):
    harness = get_harness(dut)
    harness.max_packet_size = model.deviceDescriptor.bMaxPacketSize0
    yield harness.reset()
    yield harness.wait(1e3, units="us")

    yield harness.port_reset(10e3)
    yield harness.connect()
    yield harness.wait(1e3, units="us")
    # After waiting (bus inactivity) let's start with SOF
    yield harness.host_send_sof(0x01)

    DEVICE_ADDRESS = 20
    yield harness.set_device_address(DEVICE_ADDRESS)

    yield harness.control_transfer_in(
        DEVICE_ADDRESS,
        # Get device descriptor
        getDescriptorRequest(Descriptor.Types.DEVICE,
                             descriptor_index=0,
                             lang_id=0,
                             length=0x40),
        model.deviceDescriptor.get())

    yield harness.set_device_address(
        11)  # This utilizes an OUT control transfer
Ejemplo n.º 3
0
    def get_device_descriptor(self, response, length=18):
        """Read the device descriptor from DUT.

        Args:
            response: Expected descriptor contents as list of bytes.
        """
        self.dut._log.info("[Getting device descriptor]")
        request = getDescriptorRequest(descriptor_type=Descriptor.Types.DEVICE,
                                       descriptor_index=0,
                                       lang_id=Descriptor.LangId.UNSPECIFIED,
                                       length=length)
        yield self.control_transfer_in(self.address, request, response)
Ejemplo n.º 4
0
    def get_device_qualifier(self, length, response):
        """Read a device qualifier descriptor from DUT.

        Args:
            length (int): Number of bytes to be read.
            response: Expected descriptor contents as list of bytes.
        """
        self.dut._log.info("[Getting device qualifier descriptor]")
        request = getDescriptorRequest(
            descriptor_type=Descriptor.Types.DEVICE_QUALIFIER,
            descriptor_index=0,
            lang_id=Descriptor.LangId.UNSPECIFIED,
            length=length)

        yield self.control_transfer_in(self.address, request, response)
Ejemplo n.º 5
0
    def get_configuration_descriptor(self, length, response):
        """Read a configuration descriptor from DUT.

        Args:
            length (int): Number of bytes to be read.
            response: Expected descriptor contents as list of bytes.
        """
        self.dut._log.info("[Getting config descriptor]")
        request = getDescriptorRequest(
            descriptor_type=Descriptor.Types.CONFIGURATION,
            descriptor_index=0,
            lang_id=Descriptor.LangId.UNSPECIFIED,
            length=length)

        yield self.control_transfer_in(self.address, request, response)
Ejemplo n.º 6
0
    def get_string_descriptor(self, lang_id, idx, response, length=255):
        """Read a string descriptor from DUT.

        Args:
            lang_id (int): Language ID of descriptor.
            idx (int): Descriptor index.
            response: Expected descriptor contents as list of bytes.
        """
        self.dut._log.info("[Getting string descriptor {} of langId {:#x}]"
                           .format(idx, lang_id))
        request = getDescriptorRequest(descriptor_type=Descriptor.Types.STRING,
                                       descriptor_index=idx,
                                       lang_id=lang_id,
                                       length=length)

        yield self.control_transfer_in(self.address, request, response)
Ejemplo n.º 7
0
def test_sof_is_ignored(dut):
    harness = get_harness(dut)
    harness.max_packet_size = model.deviceDescriptor.bMaxPacketSize0
    yield harness.reset()
    yield harness.wait(1e3, units="us")

    yield harness.port_reset(10e3)
    yield harness.connect()
    yield harness.wait(1e3, units="us")
    # After waiting (bus inactivity) let's start with SOF
    yield harness.host_send_sof(0x01)

    DEVICE_ADDRESS = 0x20
    epaddr_out = EndpointType.epaddr(0, EndpointType.OUT)
    yield harness.set_device_address(DEVICE_ADDRESS)

    data = getDescriptorRequest(descriptor_type=Descriptor.Types.STRING,
                                descriptor_index=0,
                                lang_id=0,
                                length=10)
    # Send SOF packet
    yield harness.host_send_sof(2)

    # Setup stage
    # ------------------------------------------
    # Send SETUP packet
    yield harness.host_send_token_packet(PID.SETUP, DEVICE_ADDRESS,
                                         EndpointType.epnum(epaddr_out))
    harness.request_deadline = get_sim_time("us") + harness.MAX_REQUEST_TIME

    # Send another SOF packet
    yield harness.host_send_sof(3)

    # Data stage
    # ------------------------------------------
    # Send DATA packet
    harness.packet_deadline = get_sim_time("us") + harness.MAX_PACKET_TIME
    yield harness.host_send_data_packet(PID.DATA1, data)
    yield harness.host_expect_ack()

    # Send another SOF packet
    yield harness.host_send_sof(4)

    # # Status stage
    # # ------------------------------------------
    harness.packet_deadline = get_sim_time("us") + harness.MAX_PACKET_TIME
    yield harness.transaction_status_out(DEVICE_ADDRESS, epaddr_out)
def test_invalid_request(dut):
    """Request invalid descriptor (Device with index 1)"""
    harness = get_harness(dut)
    harness.max_packet_size = model.deviceDescriptor.bMaxPacketSize0
    yield harness.reset()
    yield harness.wait(1e3, units="us")

    yield harness.port_reset(10e3)
    yield harness.connect()
    yield harness.wait(1e3, units="us")
    # After waiting (bus inactivity) let's start with SOF
    yield harness.host_send_sof(0x01)
    DEVICE_ADDRESS = 20
    yield harness.set_device_address(DEVICE_ADDRESS)
    yield harness.control_transfer_in(
        DEVICE_ADDRESS,
        getDescriptorRequest(descriptor_type=Descriptor.Types.DEVICE,
                             descriptor_index=1,
                             lang_id=0,
                             length=18), model.deviceDescriptor.get())