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())
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
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)
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)
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)
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)
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())