// Copyright (C) Ellisys. All rights reserved. // // This code is provided "as is" without warranty of any kind, // either expressed or implied. // // Please read the license agreement for more information. // // This script emulates both a host and a device to demonstate the traffic // sequence of an invalid DPH. The related document with full explanations // is available online at: // www.ellisys.com/technology/een_ss01.pdf // // To use this script please connect a generator to an analyzer using two // cables. Both generator's connectors must be connected to both analyzer's // connectors using a crossed connection. include "UsbExplorer280.u30sinc" void Main() { ConfigureGenerator( in mode => GeneratorMode.Hub, in rxScramblerBypassed => false, in rx8b10bBypassed => false, in rxLanePolarity => LanePolarity.Normal, in txEnableTransceivers => false, in txScramblerBypassed => false, in tx8b10bBypassed => false, in txLanePolarity => LanePolarity.Normal, in txAutoComputeCrcs => true, in txAutoGenerateSkip => true); BringLinkUp(); // -> DPH (HSN=0, SeqNum=0, Invalid CRC-16) / DPP Usb30PushPacket( RawData => [ 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x90, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x23, 0x46, 0xFC ], Lane => Downstream, ComputeHeaderCrc => false, ComputeLcwCrc => true, ComputeDataCrc => true); Usb30CommitData( Lane => Downstream ); // <- LBAD Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LBAD, Lane => Upstream ); // -> LRTY Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LRTY, Lane => Downstream ); // -> DPH (HSN=0, SeqNum=0, DL=1) Usb30SendPacket( RawData => [ 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE3, 0x00, 0x92 ], Lane => Downstream); // <- LGOOD_0 Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LGOOD_0, Lane => Upstream ); // <- LCRD_A Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LCRD_A, Lane => Upstream ); // <- ACK TP (HSN=0, SeqNum=0, Retry=1) Usb30SendPacket( RawData => [ 0x04, 0x00, 0x00, 0x00, 0x41, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x3C, 0x00, 0xD0 ], Lane => Upstream); // -> LGOOD_0 Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LGOOD_0, Lane => Downstream ); // -> LCRD_A Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LCRD_A, Lane => Downstream ); // -> DPH (HSN=1, SeqNum=0) / DPP Usb30SendPacket( RawData => [ 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE3, 0x01, 0x90, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x23, 0x46, 0xFC ], Lane => Downstream); // <- LGOOD_1 Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LGOOD_1, Lane => Upstream ); // <- LCRD_B Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LCRD_B, Lane => Upstream ); // <- ACK TP (HSN=1, SeqNum=1, Retry=0) Usb30SendPacket( RawData => [ 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0x3C, 0x01, 0xD0 ], Lane => Upstream); // -> LGOOD_1 Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LGOOD_1, Lane => Downstream ); // -> LCRD_B Usb30SendLinkCommand( LinkCommandWord => Usb30LinkCommand.LCRD_B, Lane => Downstream ); Sleep(10ms); Sleep(10ms); } void BringLinkUp() { WaitTerms( lane => Both ); // // Send Polling.LFPS // repeat { GenerateLfps( in tBurst => LfpsPollingBurstTime, in tRepeat => 0); if(MatchOccurred) { exit; } } // // Send Training Sequence // ConfigureGenerator( in txEnableTransceivers => true); ConfigureGenerator( in txAutoGenerateSkip => false); Usb30SendTseqOrderedSet( in lane => Both, in count => 5000); Usb30SendTseqOrderedSet( in lane => Both); ConfigureGenerator( in txAutoGenerateSkip => true); Usb30SendTs1OrderedSet( in linkFunctionality => TsLinkConfigDefault, in lane => Both, in count => 32); Usb30SendTs1OrderedSet( in linkFunctionality => TsLinkConfigDefault, in lane => Both); Usb30SendTs2OrderedSet( in linkFunctionality => TsLinkConfigDefault, in lane => Both, in count => 32); Usb30SendTs2OrderedSet( in linkFunctionality => TsLinkConfigDefault, in lane => Both); // // Send Link Advertisement // Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LGOOD_7 & 0xFF, Usb30LinkCommand.LGOOD_7 >> 8 ], Lane => Upstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_A & 0xFF, Usb30LinkCommand.LCRD_A >> 8 ], Lane => Upstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_B & 0xFF, Usb30LinkCommand.LCRD_B >> 8 ], Lane => Upstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_C & 0xFF, Usb30LinkCommand.LCRD_C >> 8 ], Lane => Upstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_D & 0xFF, Usb30LinkCommand.LCRD_D >> 8 ], Lane => Upstream); Usb30CommitData( Lane => Upstream ); Usb30CommitData( Lane => Upstream ); Usb30CommitData( Lane => Upstream ); Usb30CommitData( Lane => Upstream ); Usb30CommitData( Lane => Upstream ); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LGOOD_7 & 0xFF, Usb30LinkCommand.LGOOD_7 >> 8 ], Lane => Downstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_A & 0xFF, Usb30LinkCommand.LCRD_A >> 8 ], Lane => Downstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_B & 0xFF, Usb30LinkCommand.LCRD_B >> 8 ], Lane => Downstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_C & 0xFF, Usb30LinkCommand.LCRD_C >> 8 ], Lane => Downstream); Usb30PushLinkCommand( RawData => [ Usb30LinkCommand.LCRD_D & 0xFF, Usb30LinkCommand.LCRD_D >> 8 ], Lane => Downstream); Usb30CommitData( Lane => Downstream ); Usb30CommitData( Lane => Downstream ); Usb30CommitData( Lane => Downstream ); Usb30CommitData( Lane => Downstream ); Usb30CommitData( Lane => Downstream ); }