DisplayPort: Domando el modo Alt
El modo alternativo DisplayPort es semi-propietario, pero se puede desmontar por completo si lo intentamos. La última vez, encontramos una nota interesante que describe en detalle el modo alternativo DisplayPort, cambiamos el FUSB302 al modo de rastreo de paquetes y obtuvimos capturas de paquetes, aprendimos sobre PD VDM (mensajes definidos por el proveedor) y reproducimos con éxito los mensajes capturados para cambiar un USB-C. puerto en el modo alternativo DisplayPort. Hoy, repasaremos los siete mensajes que invocan el modo alternativo de DisplayPort, los implementaremos y los vincularemos todos en una biblioteca; luego, descubriremos el hardware que necesitamos para que DisplayPort funcione en estado salvaje.
Para empezar, como habrás visto en el diagrama, un solo comando puede ser una solicitud o una respuesta. Por ejemplo, si recibe una REQ (solicitud) de Discover Identity, la responde con un ACK (respuesta) de Discover Identity, agregando sus datos de identidad a su respuesta a lo largo del camino. Con algunos comandos, la fuente DP agregará algunos datos para que usted los use; para la mayoría de los comandos, su receptor DP tendrá que proporcionar información, y eso es precisamente lo que haremos, armados con el PDF proporcionado y las capturas de paquetes.
Tenemos siete comandos que debemos manejar para sacar DisplayPort de un puerto USB-C compatible; si necesita un repaso de estos comandos, la página 13 del PDF de ST en el modo alternativo DP le mostrará la secuencia de mensajes. Estos comandos son: Descubrir identidad, Descubrir SVID, Descubrir modos, Entrar en modo, Actualización de estado de DP, Configuración de DP y Atención. De estos, los primeros cuatro ya están parcialmente descritos en el estándar USB PD base, los dos comandos DP posteriores son específicos del modo alternativo DisplayPort pero están suficientemente descritos en el PDF que tenemos, y el comando Atención también es del estándar base. sobre todo útil para informar el estado del pin HPD. ¡Empecemos por los dos primeros!
Los dos primeros comandos no son específicos de DisplayPort en absoluto. En particular, el mensaje Discover Identity es omnipresente. Al igual que con el mensaje Source_Capabilities que ni siquiera tuvimos que solicitar a la fuente de alimentación, si se conecta a un puerto USB-C de una computadora portátil con capacidad para DP o incluso Thunderbolt, recibirá un mensaje de comando Discover Identity. Si su dispositivo es capaz de manejar cualquier modo alternativo, responder a este mensaje es la forma de anunciar esta capacidad.
Su respuesta de Discover Identity tendrá que contener una gran cantidad de datos sobre su dispositivo; la mayoría de estos datos, puede falsificarlos por completo. Estos datos dicen que es un adaptador de modo alternativo, hay dos bits que indican si es capaz de operar con un host USB o con un dispositivo USB, un campo de "certificación" que se puede dejar completamente vacío, así como USB VID y PID. Hasta donde yo sé, el VID y el PID no se usan para nada relacionado con las funciones, a diferencia del PID y VID de la conexión USB normal, que sabemos que se usan para la selección de controladores en los sistemas operativos. El adaptador que tengo tiene el ID de proveedor 0xBDA, el ID de producto 0x2172 y el número de bcdDevice 0x201. Estos valores se envían una vez y no aparecen en ninguna otra comunicación USB-C.
El segundo comando es Descubrir SVID: los SVID son, esencialmente, códigos de dos bytes para los modos alternativos que admite su dispositivo. Si su respuesta es 0xFF01 (por lo tanto, responda con 0xFF010000 como datos adicionales), obtendrá una cookie, en forma de reconocimiento como un dispositivo con capacidad de modo alternativo DisplayPort. Uno de los dispositivos que tengo responde con 0xFF01, pero también le agrega 0x25A4. Sospecho que se trata de una interfaz de actualización de firmware, por lo que si alguna vez quisiera probar dispositivos USB-C con fines de pentesting, esto sería absolutamente un vector. buscar en.
Al dar la respuesta 0xFF01 a la solicitud Discover SVID, afirmamos que nuestro dispositivo admite el modo alternativo DisplayPort, incluso si, a decir verdad, estamos a la mitad de implementarlo correctamente, fingiendo hasta lograrlo. Pero no te preocupes, ya que estamos en el camino correcto: ahora estamos hablando de detalles específicos de DisplayPort. Nuestro tercer comando es Descubrir modos, donde le informamos a la fuente DP cómo exactamente nuestras necesidades DisplayPort se asignan al conector USB-C.
¿Recuerda cómo puede obtener 4 carriles completos de DP desde un conector USB-C, o hacer un compromiso de 2 carriles pero obtener USB3? Bueno, nuestra respuesta de Discover Modes determina exactamente eso. Primero, nuestra respuesta define si somos una fuente DP o un sumidero DP; aparentemente, el protocolo permite construir dispositivos DP bidireccionales, ¡lo cual sin duda da que pensar! También define explícitamente el uso de la señalización USB 2.0, si el puerto USB3 que podríamos solicitar sería compatible con USB3 Gen 2 y si nuestro dispositivo utiliza un enchufe USB-C o un enchufe USB-C. Sin embargo, lo más importante es que habla del mapeo de pines.
El modo alternativo DisplayPort puede tener asignaciones de seis pines, cinco en el caso de un conector USB-C. Dos de ellos son DP de doble carril con USB3 y tres de ellos son DP de cuatro carriles. Aparentemente, todos tienen diferentes disposiciones de carriles, pero al menos uno de ellos debería funcionar para nosotros siempre que conectemos nuestro chip mux de acuerdo con la hoja de datos. No me queda claro cuáles son las diferencias notables o por qué las tareas se realizan de la forma en que se hacen; tal vez, la especificación completa no disponible podría dar algunas ideas. Por ahora, este PDF nos proporciona los mapeos que podemos usar y los bits que debemos configurar según el mapeo que hayamos elegido.
Después de responder el mensaje de Descubrir Modos con información sobre nuestro pinout preferido, pronto recibiremos un mensaje de Modo de Ingreso, que simplemente reconocemos con una respuesta de Modo de Ingreso, no se requieren datos adicionales. Ahora, con voz de hacker, estamos dentro.
Los tres últimos comandos están aún más cerca del meollo de la cuestión de DisplayPort. El primero es Actualización de estado de DP, que sigue justo después del comando Entrar en modo. Podemos obtener este comando siempre que el receptor DP quiera obtener una actualización y tendremos que responder con nuestro estado de enlace actual. Los bits de este comando, como se describe en la página 11 de nuestro PDF ahora favorito, comunican el estado actual del enlace de modo alternativo DP. El contenido de la Actualización de estado de DP es un informe sobre el estado general de la conexión, tanto desde el punto de vista descendente (fuente DP) como desde el punto de vista ascendente (sumidero DP, también conocido como nuestro dispositivo). Aquí podemos salir del modo alt si lo deseamos, cambiar al modo USB, o quizás al modo de bajo consumo, y también debemos informar aquí el estado del pin HPD. Todo eso cabe en nueve bits de datos: no hay mucho que destacar, pero es necesario hacerlo.
La primera aparición de la Actualización de estado de DP transcurre sin incidentes, simplemente improvisamos, diciendo que HPD es bajo y todo eso. Le seguirá el mensaje DP Configure; ahora, este punto es donde obtenemos acceso a la señal DisplayPort sin procesar en la SBU y a los pines de alta velocidad del puerto USB-C. El mensaje DP Configure nos indica a qué asignación de pines del modo alternativo de DP debemos cambiar nuestro hardware, lo cual es útil en caso de que afirmemos admitir múltiples asignaciones en nuestra respuesta de Modos de descubrimiento; si solo afirmamos que admitimos una, no habrá sorpresas, a menos que la fuente DP no admite el mapeo que queríamos.
Por último, pero no menos importante, está el mensaje de Atención, que literalmente llama la atención sobre algún evento de nuestro lado. Los datos correspondientes son los mismos que los del mensaje de actualización de estado de DP: piense en Atención como un mensaje de actualización de estado de DP que podemos enviar voluntariamente cada vez que algo cambia de nuestro lado. Por lo tanto, si tiene un adaptador de conector USB-C a DisplayPort, el mensaje de Atención será el último mensaje del proceso de invocación del modo alternativo de DP, lo que permitirá a la fuente DP saber que la fuente se ha conectado. Esto, en particular, está determinado por el pin HPD, algo que se usa como pin de detección de conexión en caliente en DisplayPort, pero que también se usa para interrupciones como banda lateral para el canal de comunicación AUX, como un par diferencial pseudodiferencial similar a USB 1.1 y 2.0, el dispositivo. en el otro extremo espera ser sondeado y nuestros mensajes de Atención transferirán los gritos de HPD del dispositivo que tiene algo que decir pero aún no se le ha pedido que hable.
Ahora hemos terminado: son los siete mensajes descritos e implementados en el código mientras lo hacíamos. Todo el flujo de negociación en modo alternativo debe completarse en un segundo, o de lo contrario el proceso se detendrá en algún paso. Es decir, si deseas realizar algunos cálculos o imprimir datos, ¡será mejor que seas rápido! Aquí hay un ejemplo de código MicroPython para usted: de alguna manera, logré que el análisis y la creación de comandos fueran lo suficientemente rápidos.
Eso sí, este es el lado del software. Aparte de lo que acabamos de hacer, repasemos un diseño típico de modo alternativo DP de cosecha propia y lo que necesita.
En primer lugar, querrás colocar el FUSB302 en tu esquema y agregar una MCU para trabajar con él. Por lo general, elijo un RP2040, pero incluso un módulo ESP12 debería funcionar: necesita I2C, algunos GPIO para el control mux y un poco de RAM para la manipulación de paquetes PD. Luego, por supuesto, utilice una toma USB-C con carriles de alta velocidad disponibles: los puertos USB 2.0 normales con 16 pines no exponen los pines TX/RX que necesitamos. Cuando se trata de pares de diferencias DisplayPort, elija una placa de seis capas: querrá dos capas externas para los pares de diferencias DisplayPort, dos capas debajo de cada una para los planos de tierra de referencia y dos capas más internas para enrutar los pines VBUS, USB2, CC y SBU. – ¡Afortunadamente, tanto Aisler como JLCPCB ahora tienen ofertas de seis capas decentes y económicas!
Lamentablemente, no podemos comprar cables cautivos USB-C a bajo precio; sin embargo, ¡colocar una toma USB-C en nuestra placa es la mejor opción! Sin embargo, necesitas un poco de hardware adicional. Nuevamente, la ventaja de un cable cautivo es que no necesita un mux, lo que significa que necesitaremos un mux para manejar nuestro enchufe. Cuando buscaba muxes USB-C, me topé con el chip VL170 y reconstruí sus especificaciones a partir de capturas de pantalla en línea. Más tarde, descubrí que el VL170 es un clon del HD3SS460 de TI (hoja de datos), y eso es lo que recomiendo que uses, ya sea que quieras usar un DisplayPort de 4 carriles o una combinación de USB3 y DisplayPort, solo USB3 o incluso combinar DisplayPort. De dos fuentes, el mux HD3SS460 funcionará para usted y tiene una hoja de datos adecuada con circuitos de ejemplo.
No conecte a tierra el escudo; por regla general, está conectado a tierra en el extremo del host, por lo que será contraproducente dadas las altas velocidades de DisplayPort. En su lugar, agregue una o dos huellas 0805 que vayan desde el escudo a tierra; Más adelante, puedes colocar allí una ferrita o una combinación de resistencia y condensador. Cuando se trata de señales de alta velocidad, el escudo realizará la función de proteger sus señales de interferencias externas; sin embargo, si lo conecta a tierra en ambos extremos, también terminará transportando parte de la corriente VBUS, lo que reducirá significativamente sus propiedades de blindaje. Ah, y sobre VBUS: depende de usted lo que hará con él; después de todo, la parte del “controlador PD” estará completamente a su alcance para empezar; Ya sea que convoque 5 V, proporcione 5 V, tal vez solicite 20 V si de alguna manera ha encontrado un puerto de alta potencia y compatible con DP, todo eso depende completamente de usted.
¿Recuerda las reglas de enrutamiento de seguimiento de DisplayPort? Bueno, el VL170 no te lo pone fácil. Debido a la polaridad del par del lado del conector USB-C en su configuración de pines, solo dos de sus pares diferenciales se conectan de manera sencilla; los otros dos pares deben invertirse antes de conectarse. Recuerde, aún necesita hacer coincidir las longitudes entre las pistas, por lo que deberá ajustar la parte entre el mux y el conector USB-C, y también la parte entre su dispositivo y su mux. Dicho esto, en un diseño mío de referencia, logré mantener la sección del conector-mux en aproximadamente un centímetro de longitud, por lo que no debería ser demasiado espacio para ti. En cuanto al lado posterior al mux, enrutaría el enlace DisplayPort de la misma manera que lo haría normalmente, no hay mucha diferencia aquí.
¿Hay más aspectos a mencionar que puedas necesitar? ¡Absolutamente! Por ejemplo, es posible que necesites ajustar los voltajes de modo común antes y después del mux usando algunas resistencias cuidadosamente combinadas. Aún así, si alguna vez quiso darle a su dispositivo un enlace DisplayPort a través de un conector USB-C, ahora está bien equipado para hacerlo, sin necesidad de acuerdos de confidencialidad ni adquisición de documentos de propiedad.