Oct 22, 2023
DisplayPort: Den Altmode zähmen
Der DisplayPort-Altmodus ist halb-proprietär, kann aber durchaus auseinandergenommen werden, wenn wir es versuchen. Letztes Mal haben wir eine coole Appnote gefunden, die den DisplayPort-Altmodus im Detail beschreibt, in den der FUSB302 geschaltet wurde
Der DisplayPort-Altmodus ist halb-proprietär, kann aber durchaus auseinandergenommen werden, wenn wir es versuchen. Letztes Mal haben wir eine coole Appnote gefunden, die den DisplayPort-Altmodus im Detail beschreibt, den FUSB302 in den Paket-Sniffing-Modus geschaltet und Paketerfassungen erhalten, etwas über PD-VDMs (herstellerdefinierte Nachrichten) erfahren und die erfassten Nachrichten erfolgreich abgespielt, um einen USB-C zu wechseln Port in den DisplayPort-Altmodus. Heute gehen wir die sieben Meldungen durch, die den DisplayPort-Altmodus aufrufen, implementieren sie und binden sie alle in eine Bibliothek ein – und ermitteln dann die Hardware, die wir benötigen, damit DisplayPort in freier Wildbahn funktioniert.
Zunächst einmal kann ein einzelner Befehl, wie Sie vielleicht anhand des Diagramms gesehen haben, entweder eine Anfrage oder eine Antwort sein. Wenn Sie beispielsweise eine Discover Identity REQ (Anfrage) erhalten, antworten Sie darauf mit einer Discover Identity ACK (Antwort) und fügen dabei Ihre Identitätsdaten zu Ihrer Antwort hinzu. Bei einigen Befehlen fügt die DP-Quelle einige Daten hinzu, die Sie verwenden können. Bei den meisten Befehlen muss stattdessen Ihre DP-Senke Informationen bereitstellen – und genau das tun wir, ausgerüstet mit der bereitgestellten PDF-Datei und den Paketerfassungen.
Wir haben sieben Befehle, die wir verarbeiten müssen, um DisplayPort über einen kompatiblen USB-C-Anschluss zu erhalten. Wenn Sie eine Auffrischung dieser Befehle benötigen, finden Sie auf Seite 13 des ST-PDF zum DP-Altmodus die Meldungssequenz. Diese Befehle sind: Identität erkennen, SVIDs erkennen, Modi erkennen, Modus eingeben, DP-Statusaktualisierung, DP-Konfiguration und Achtung. Davon sind die ersten vier bereits teilweise im Basis-USB-PD-Standard beschrieben, die beiden DP-Befehle danach sind DisplayPort-Altmode-spezifisch, aber in der uns vorliegenden PDF ausreichend beschrieben, und der Attention-Befehl stammt ebenfalls aus dem Basisstandard. Hilft vor allem bei der Meldung des Status des HPD-Pins. Beginnen wir mit den ersten beiden!
Die ersten beiden Befehle sind überhaupt nicht DisplayPort-spezifisch. Insbesondere die Discover Identity-Botschaft ist allgegenwärtig. Genau wie bei der Source_Capabilities-Nachricht, die wir nicht einmal vom Netzteil anfordern mussten, erhalten Sie eine Discover Identity-Befehlsnachricht, wenn Sie sie an einen USB-C-Anschluss eines Laptops anschließen, der DP oder sogar Thunderbolt unterstützt. Wenn Ihr Gerät jeden Altmode verarbeiten kann, kündigen Sie diese Fähigkeit an, indem Sie auf diese Nachricht antworten.
Ihre Discover Identity-Antwort muss eine Reihe von Daten über Ihr Gerät enthalten – die meisten dieser Daten können Sie völlig fälschen. Diese Daten besagen, dass Sie ein Alternate-Mode-Adapter sind. Es gibt zwei Bits, die angeben, ob Sie zum USB-Host- oder USB-Gerätebetrieb fähig sind, ein „Zertifizierungs“-Feld, das vollständig leer gelassen werden kann, sowie USB-VID und -PID. Meines Wissens werden VID und PID nicht für funktionsbezogene Zwecke verwendet, im Gegensatz zu regulären USB-Verbindungs-PID und VID, von denen wir wissen, dass sie für die Treiberauswahl in Betriebssystemen verwendet werden. Der Adapter, den ich habe, hat die Hersteller-ID 0xBDA, die Produkt-ID 0x2172 und die bcdDevice-Nummer 0x201. Diese Werte werden einmal gesendet und erscheinen in keiner weiteren USB-C-Kommunikation.
Der zweite Befehl lautet Discover SVIDs – SVIDs sind im Wesentlichen Zwei-Byte-Codes für die Altmodi, die Ihr Gerät unterstützt. Wenn Ihre Antwort 0xFF01 ist (antworten Sie also mit 0xFF010000 als zusätzliche Daten), erhalten Sie ein Cookie in Form einer Erkennung als DisplayPort-Altmode-fähiges Gerät. Eines der Geräte, die ich besitze, antwortet mit 0xFF01, fügt aber auch 0x25A4 hinzu – ich vermute, dass es sich hierbei um eine Firmware-Update-Schnittstelle handelt. Wenn Sie also jemals USB-C-Geräte für Pentestzwecke testen wollten, wäre dies auf jeden Fall ein Vektor prüfen.
Indem wir die 0xFF01-Antwort auf die Anfrage „Discover SVIDs“ geben, behaupten wir, dass unser Gerät den DisplayPort-Altmode unterstützt – auch wenn wir, um ehrlich zu sein, mit der richtigen Implementierung schon halb fertig sind und es vortäuschen, bis wir es schaffen. Aber keine Sorge, wir sind auf dem richtigen Weg – jetzt sprechen wir über DisplayPort-Besonderheiten. Unser dritter Befehl ist „Discover Modes“, mit dem wir der DP-Quelle mitteilen, wie genau unser DisplayPort dem USB-C-Anschluss zugeordnet werden muss.
Erinnern Sie sich daran, wie Sie über einen USB-C-Anschluss volle 4 Lanes DP erhalten oder einen 2-Lane-Kompromiss eingehen, aber USB3 nutzen können? Nun, unsere Discover Modes-Antwort bestimmt genau das. Erstens definiert unsere Antwort, ob wir eine DP-Quelle oder eine DP-Senke sind – offenbar ermöglicht das Protokoll den Aufbau bidirektionaler DP-Geräte, was sicherlich zu Ideen anregt! Außerdem wird explizit die Verwendung der USB 2.0-Signalisierung definiert, ob der von uns angeforderte USB3-Anschluss USB3 Gen 2 unterstützen würde und ob unser Gerät einen USB-C-Stecker oder eine USB-C-Buchse verwendet. Am wichtigsten ist jedoch, dass es um die Pin-Zuordnung geht.
Der DisplayPort-Altmodus kann sechs Pin-Zuordnungen haben, im Falle einer USB-C-Buchse fünf. Zwei davon sind Dual-Lane-DP mit USB3 und drei davon sind Vier-Lane-DP. Anscheinend haben sie alle unterschiedliche Lane-Anordnungen, aber zumindest eine davon sollte für uns funktionieren, solange wir unseren Mux-Chip gemäß dem Datenblatt verkabeln. Mir ist nicht klar, was die bemerkenswerten Unterschiede sind oder warum die Aufgaben so erledigt werden, wie sie erledigt werden – vielleicht würde die nicht verfügbare vollständige Spezifikation einige Erkenntnisse liefern. Dieses PDF liefert uns vorerst die Zuordnungen, die wir verwenden können, und die Bits, die wir entsprechend der von uns gewählten Zuordnung setzen sollten.
Nachdem wir die Discover Modes-Nachricht mit Informationen zu unserer bevorzugten Pinbelegung beantwortet haben, erhalten wir in Kürze eine Enter Mode-Nachricht – die wir einfach mit einer Enter Mode-Antwort bestätigen, es sind keine zusätzlichen Daten erforderlich. Jetzt, mit Hacker-Stimme, sind wir dabei.
Die drei letzten Befehle kommen dem eigentlichen DisplayPort noch näher. Die erste ist die DP-Statusaktualisierung und folgt direkt nach dem Befehl „Enter Mode“. Wir können diesen Befehl immer dann erhalten, wenn die DP-Senke ein Update erhalten möchte, und wir müssen ihn mit unserem aktuellen Verbindungsstatus beantworten. Die Bits in diesem Befehl, wie auf Seite 11 unserer inzwischen beliebten PDF-Datei beschrieben, kommunizieren den aktuellen Status des DP-Altmode-Links. Der Inhalt der DP-Statusaktualisierung ist ein Bericht über den gesamten Verbindungsstatus, sowohl aus Downstream-Sicht (DP-Quelle) als auch aus Upstream-Sicht (DP-Senke, auch bekannt als unser Gerät). Hier können wir bei Bedarf den Altmode verlassen, in den USB-Modus oder vielleicht in den Energiesparmodus wechseln und müssen hier auch den HPD-Pin-Status melden. All das passt in neun Datenbits – nicht viel, worüber man sich besonders freuen könnte, aber man muss es betonen.
Das allererste Auftreten einer DP-Statusaktualisierung verlief ereignislos, wir überflügelten es einfach und sagten, dass HPD niedrig sei und so weiter. Darauf folgt die DP-Configure-Meldung – an diesem Punkt erhalten wir nun Zugriff auf das rohe DisplayPort-Signal auf der SBU und die Hochgeschwindigkeits-Pins des USB-C-Ports. Die DP-Configure-Meldung teilt uns mit, auf welche DP-Altmode-Pinzuordnung wir unsere Hardware umstellen sollen. Dies ist nützlich, wenn wir in unserer Discover Modes-Antwort behauptet haben, mehrere Zuordnungen zu unterstützen – wenn wir nur behaupten, eine zu unterstützen, gibt es keine Überraschungen, es sei denn Die DP-Quelle unterstützt nicht die gewünschte Zuordnung.
Zu guter Letzt gibt es noch die Aufmerksamkeitsbotschaft – im wahrsten Sinne des Wortes die Aufmerksamkeit auf ein Ereignis auf unserer Seite lenken. Die Daten dafür sind die gleichen wie bei der DP-Statusaktualisierungsnachricht – stellen Sie sich „Attention“ als eine DP-Statusaktualisierungsnachricht vor, die wir freiwillig senden können, wenn sich auf unserer Seite etwas ändert. Wenn Sie also über einen USB-C-zu-DisplayPort-Buchsenadapter verfügen, ist die Achtung-Meldung die allerletzte Meldung des DP-Altmode-Beschwörungsprozesses und teilt der DP-Quelle mit, dass die Quelle angeschlossen wurde. Dies wird insbesondere durch den HPD-Pin bestimmt, der als Hotplug-Erkennungspin in DisplayPort verwendet wird, aber auch für Interrupts als Seitenband zum AUX-Kommunikationskanal verwendet wird – als pseudodifferentielles Diffpair, ähnlich wie USB 1.1 und 2.0, das Gerät am anderen Ende erwartet, abgefragt zu werden, und unsere Aufmerksamkeitsnachrichten übertragen die HPD-Schreie des Geräts, das etwas zu sagen hat, aber noch nicht zum Sprechen aufgefordert wurde.
Jetzt sind wir fertig – das sind alle sieben Nachrichten, die wir beschrieben und dabei in den Code implementiert haben. Der gesamte Altmode-Verhandlungsablauf muss innerhalb einer Sekunde abgeschlossen sein, sonst wird der Prozess irgendwann angehalten. Das heißt, wenn Sie Berechnungen durchführen oder Daten ausdrucken möchten, sollten Sie schnell sein! Hier ist ein Beispiel-MicroPython-Code für Sie – irgendwie ist es mir gelungen, das Parsen und die Befehlserstellung schnell genug zu gestalten.
Wohlgemerkt, das ist die Softwareseite. Lassen Sie uns neben dem, was wir gerade gemacht haben, ein typisches selbst entwickeltes DP-Altmode-Design und seine Anforderungen durchgehen.
Zunächst möchten Sie den FUSB302 in Ihren Schaltplan einbauen und eine MCU hinzufügen, um damit zu arbeiten. Normalerweise wähle ich einen RP2040, aber auch ein ESP12-Modul sollte genügen – Sie benötigen I2C, ein paar GPIOs für die Mux-Steuerung und etwas RAM für PD-Paketmanipulation. Dann verwenden Sie natürlich eine USB-C-Buchse mit verfügbaren Hochgeschwindigkeitsspuren – normale USB-2.0-Anschlüsse mit 16 Pins legen die benötigten TX/RX-Pins nicht frei. Wenn es um DisplayPort-Diffpairs geht, wählen Sie eine sechsschichtige Platine – Sie benötigen zwei äußere Schichten für DisplayPort-Diffpairs, zwei darunter liegende Schichten für Referenzmasseebenen und zwei innerste Schichten zum Herausführen der VBUS-, USB2-, CC- und SBU-Pins – Zum Glück haben sowohl Aisler als auch JLCPCB jetzt anständige und günstige Sechs-Schicht-Angebote!
Wir können USB-C-Captive-Kabel leider nicht ganz günstig kaufen – aber der Einbau einer USB-C-Buchse in unser Board ist die nächstbeste Lösung! Sie benötigen jedoch etwas zusätzliche Hardware. Auch hier besteht der Vorteil eines unverlierbaren Kabels darin, dass kein Mux erforderlich ist – was bedeutet, dass wir einen Mux für die Handhabung unserer Steckdose benötigen. Als ich nach USB-C-Multiplexern suchte, bin ich auf den VL170-Chip gestoßen und habe seine Spezifikationen anhand von Online-Screenshots zusammengestellt. Später fand ich heraus, dass der VL170 ein Klon des HD3SS460 von TI (Datenblatt) ist, und ich empfehle Ihnen, ihn zu verwenden – egal, ob Sie 4-Lane-DisplayPort oder eine USB3- und DisplayPort-Kombination, nur USB3, oder sogar DisplayPort kombinieren möchten Aus zwei Quellen wird der HD3SS460-Mux für Sie funktionieren, und er verfügt über ein richtiges Datenblatt mit Beispielschaltungen.
Erden Sie die Abschirmung nicht – sie ist in der Regel am Host-Ende geerdet und wird daher angesichts der hohen Geschwindigkeiten von DisplayPort kontraproduktiv sein. Fügen Sie stattdessen ein oder zwei 0805-Fußabdrücke hinzu, die von der Abschirmung zur Erde führen. Später können Sie dort einen Ferrit oder eine Kombination aus Widerstand und Kondensator anbringen. Bei Hochgeschwindigkeitssignalen übernimmt die Abschirmung die Funktion, Ihre Signale vor externen Störungen abzuschirmen. Wenn Sie es jedoch an beiden Enden erden, führt es letztendlich auch einen Teil des VBUS-Stroms, was seine Abschirmungseigenschaften erheblich verringert. Oh, und was VBUS betrifft – es liegt an Ihnen, was Sie damit machen, schließlich liegt der Teil „PD-Controller“ von Anfang an vollständig in Ihrer Reichweite; Ob Sie 5 V beschaffen, 5 V bereitstellen, vielleicht 20 V anfordern, wenn Sie irgendwie einen leistungsstarken und DP-fähigen Anschluss gefunden haben, das liegt ganz bei Ihnen.
Erinnern Sie sich an die DisplayPort-Trace-Routing-Regeln? Nun ja, der VL170 macht es einem nicht gerade leicht. Aufgrund der Polarität des USB-C-Anschlusspaars auf der Pinbelegung können nur zwei seiner Diffpairs auf einfache Weise verbunden werden – die anderen beiden Paare müssen vor der Verbindung vertauscht werden. Denken Sie daran, dass Sie immer noch die Längen zwischen den Spuren anpassen müssen, also müssen Sie den Teil zwischen dem Mux und dem USB-C-Anschluss sowie den Teil zwischen Ihrem Gerät und Ihrem Mux anpassen. Allerdings ist es mir in einem meiner Referenzdesigns gelungen, den Connector-Mux-Bereich auf etwa einen Zentimeter Länge zu begrenzen, sodass er für Sie kein allzu großer Platzfresser sein dürfte. Was die After-Mux-Seite betrifft, würden Sie die DisplayPort-Verbindung auf die gleiche Weise weiterleiten, wie Sie es normalerweise tun würden, hier gibt es keinen großen Unterschied.
Gibt es weitere Erziehungsaspekte, die Sie möglicherweise benötigen? Absolut! Beispielsweise müssen Sie möglicherweise die Gleichtaktspannungen vor und nach dem Mux mithilfe einiger sorgfältig abgestimmter Widerstände abstimmen. Wenn Sie Ihrem Gerät jedoch schon immer eine DisplayPort-Verbindung über einen USB-C-Anschluss geben wollten, sind Sie jetzt dafür bestens gerüstet, ohne dass Geheimhaltungsvereinbarungen oder proprietäre Dokumentenerfassung erforderlich sind.