¿Dónde está exactamente la especificación USB que explica qué hacer cuando el cable se conecta por primera vez?


15

Entonces sé sobre la especificación USB 2.0 ubicada en el sitio USB.org .

Soy un poco flojo e impaciente. ¿Alguien puede decirme a dónde ir para averiguar exactamente qué se espera de mi dispositivo periférico cuando el cable USB está conectado?

Por ejemplo, si mi dispositivo periférico es una impresora, ¿cómo le digo a la computadora en el otro extremo que se acaba de conectar una impresora (con una descripción específica del modelo)? Entonces, en la computadora, ¿cómo sabe el controlador de la impresora qué puerto USB estaba conectado a la impresora?

Mi aplicación es en realidad USB MIDI. También obtuve este documento USB-MIDI , pero soy deficiente con el protocolo USB más fundamental.

Solo para información de la gente, el chip USB que estoy usando es el FTDI FT220x y está conectado al SPI de un ADSP-21479 SHArC. Ahora lo usamos simplemente para comunicaciones de texto usando la PC (ejecutando TeraTerm) como una "consola" . Tengo acceso al código que configura el puerto SPI y se conecta al chip FTDI, pero no hay ningún código que realice ninguna comunicación inicial. No sé qué hace el FT220x cuando se conecta por primera vez a la PC.

No soy infeliz para leer y aprender, pero me gustaría saber dónde comenzar a leer, y una especificación USB de 100 MB es un objetivo demasiado grande para disparar. Un sincero agradecimiento a cualquiera por su ayuda práctica.


1
Entonces tienes curiosidad por saber qué está haciendo el FTDI FT220x detrás de escena, ¿verdad? Dado que FTDI se encarga de muchas cosas de USB por usted, también hay algunos límites a lo que le permitirá hacer. He usado la familia FT2232H por un tiempo, trataré de explicar lo que sé ...
MarkU

lo que finalmente intento hacer es usar este puerto USB que ya es lo suficientemente inteligente como para enviar texto de un lado a otro a la PC que ejecuta TeraTerm, lo que esperaba hacer es usar el mismo conector USB para hacer USB MIDI. Necesito entender cómo "empaquetar" los datos en paquetes de 32 bits, pero pensé (y sigo pensando) que debe haber algún protocolo que le diga al otro extremo que este es un dispositivo USB MIDI. (hasta ahora, simplemente no entiendo lo esencial de USB y su respuesta parece muy útil para ponerme en marcha.)
robert bristow-johnson

Respuestas:


21

USB tiene varias capas, que se describen en la especificación USB 2.0 . Si está familiarizado con el modelo de red en capas OSI, puede pensarlo así:

  • Capa de sesión = Capítulo 10 Hardware y software de host USB (controladores de dispositivo)
  • Capa de transporte = Capítulo 9 Marco del dispositivo USB
  • Capa de red = Capítulo 8 Capa de protocolo (flujo de bits)
  • Capa de enlace de datos = Capítulo 7 Eléctrico (circuito)
  • Capa física = Capítulo 6 Mecánico (cable y conector)

Conceptualmente, el USB se basa en flujos de datos, denominados puntos finales , que pueden ser IN (para el host) o OUT (desde el host). Cada dispositivo tiene Endpoint 0, que se usa para control y estado. Un dispositivo puede tener puntos finales adicionales para los datos de la aplicación. Cada punto final se comporta como un búfer FIFO.

Los datos se transfieren en un punto final ya sea en forma masiva (como TCP / IP, garantizado que llegue cada byte y en el orden correcto), o isócrono (como UDP / IP, garantizado que es nuevo pero puede descartar paquetes). Hay un tipo de transferencia " Interrumpir " engañosamente llamado , que en realidad solo es sondeado por el host.

USB 2.0 utiliza un par diferencial para el enlace de datos. No voy a entrar en muchos detalles ya que esto está cubierto por el capítulo 7 de especificaciones de USB 2.0. Generalmente, en el diseño de PCB, tratamos esto como un par diferencial de longitud coincidente, y colocamos las resistencias en serie requeridas por cualquier USB PHY (físico Interfaz) se está utilizando. El periférico USB utiliza una resistencia de alto valor en una de las líneas D + o D- para notificar al host que es un periférico de alta o baja velocidad.

Poco después de que el host USB descubre que hay un dispositivo presente, el host solicita un montón de descriptores del dispositivo. El chip FTDI se encarga de esto detrás de escena. Los descriptos se describen en el Capítulo 9.5 . Estos incluyen dispositivos de descriptores , de configuración de descriptores , Interfaz de descriptores , punto final descriptores , Cadena descriptores , tal vez incluso HID Informe descriptores .

El Descriptor de dispositivo incluye los números USB VID (identificación del proveedor) y PID (identificación del producto). El sistema operativo utiliza este par de números, VID_PID, para determinar qué controlador de dispositivo se utilizará para este dispositivo. Tenga en cuenta que el número VID se emite al ser miembro del foro de implementadores USB, por lo que es un problema si es un inventor individual.

Además, existe el controlador de clase HID (Dispositivo de interfaz humana), que proporciona una entrada algo genérica para teclado / mouse / etc, así como cualquier entrada / salida genérica. Una ventaja de HID es que no requiere proporcionar un controlador de dispositivo personalizado, pero su rendimiento es algo limitado en comparación con un controlador masivo personalizado. Existe otro documento de especificación sobre los descriptores HID; y un documento de la tabla de uso de HID que detalla todos los números de código que describen las diversas funciones disponibles en un dispositivo con interfaz humana dado.

El chip FTDI como la hoja de datos FT220X proporciona el "motor de interfaz en serie" USB (que no debe confundirse con el serial SPI o el serial RS232). Esto se encarga de la mayoría de las cosas de bajo nivel descritas en los capítulos 6, 7 y 8.

FTDI usa una EEPROM (chip en el FT2232H, en chip en el FT220X) para contener un poco de la información que entra en los descriptores. Puede personalizar los valores VID / PID y proporcionar cadenas de descripción personalizadas.


66
Me gustó el resumen. Tuve que leer la especificación THE ENTIRE 2.0 (más de 1000 páginas, según recuerdo) durante un período de varias semanas porque tuve que resolver toda esta mierda por mí mismo. No fue una experiencia agradable, debo decir. (No pude usar HID en mi caso). Tampoco hay buenos libros sobre el tema. Yo odiaba el libro de Jan Axelson en USB y considero su libro "casi totalmente inútil" para alguien que intenta hacer este trabajo como un micro incorporado desde el principio. En realidad, en su mayoría no tiene valor, de lo contrario. Si conoces un buen libro para un implementador (hardware personalizado), ¡me encantaría escuchar un título! +1
jonk

1
Dependiendo del mercado potencial de Op, el VID / PID es el mayor desafío. El uso de la metodología de Axelson funciona en el sentido de que puede usar su VID (que cuesta $ 3.5k para el suyo) y solicitar uno o más de sus PID de forma gratuita. También puede solicitar PID a organizaciones como Microchip / Atmel, FTDI y TI (según su VID). El mejor libro de la OMI es Intels "USB design by example", es un poco largo, pero bueno para USB 2.x. Desafortunadamente, muchos de los ejemplos de código se rompen debido a cambios en Visual Studio a través de sus revisiones.
Jack Creasey el

1
La mejor manera de obtener acceso a VID / PID para aficionados es utilizar LUFA (que es gratuito): fourwalledcubicle.com/files/LUFA/Doc/130303/html/… ..... estos no pueden usarse en productos comerciales, pero son buenos para uso doméstico / de demostración donde puede controlar colisiones en gran medida.
Jack Creasey

1
PD. Una gran introducción es usar el "diseño USB incorporado por ejemplo: que FTDI lanzó: ftdichip.com/Support/Documents/TechnicalPublications/… ... esto tiene muchos ejemplos útiles (basados ​​en dispositivos FTDI, por supuesto) y todos los asociados archivos de trabajo, incluido el uso de controladores PSOC.
Jack Creasey

1
Tenga en cuenta que si el dispositivo USB es autoalimentado, debe esperar hasta que se detecte el voltaje VBUS antes de aplicar la resistencia pull-up D + o D-. He fallado la certificación sobre esto.
Adam Haun

4

El comportamiento y la interacción de los "socios" USB (un host y un dispositivo) se encuentran dispersos en las especificaciones USB. La mejor manera de obtener algunas bases es mirar el "marco del dispositivo", Capítulo 9, que describe los posibles estados (obligatorios) del dispositivo (Figura 9-1) y el marco del Host (y Hub), en los Capítulos 10 y 11. Ignorar detalles del protocolo (tuberías / tipos de transacción / capas de protocolo OSI abstractas, diseño de PCB, etc.), se puede lograr un mejor control de la interacción inicial estudiando el diagrama del estado del puerto (Figura 11-10).

En esencia, si el cable no está conectado entre el host y el dispositivo, los puertos del host están en "estado alimentado" (VBUS está encendido), pero "desconectado". Los cables D + y D- se mantienen bajos con 15k desplegables.

Cuando el cable está conectado, el VBUS entra en el dispositivo. El dispositivo reconoce que se está conectando y señala un evento de "conexión" tirando ALTO uno de los cables D, D + si es un dispositivo FS / HS y D- si es un dispositivo LS.

Tire de los cables D +/- en un determinado puerto da una interrupción al software del host, informando "cambio de estado del puerto". El software del host (generalmente ehci.sys) luego inicia la secuencia de "restablecimiento de puerto" en ese puerto en particular . Al completar con éxito el "restablecimiento del puerto USB", el puerto host se habilita para la comunicación USB. El puerto se activa (los paquetes de trama comienzan a fluir).

Con el protocolo USB, el host asigna una dirección única a este dispositivo y lee el "descriptor del dispositivo". Esto inicia el proceso de "enumeración de dispositivos". El descriptor del dispositivo contiene información sobre a qué clase de dispositivo pertenece (HID, COM, MIDI, Impresora, etc.) y VID / PID de ese dispositivo en particular, además de un montón de otra información, consulte la Tabla 9-8.

Después de obtener la clase de dispositivo y el VID / PID, el software del host intenta hacer coincidir esta información en el registro del dispositivo y carga el controlador del DISPOSITIVO correspondiente, ya sea genérico o específico del proveedor (si existe). El controlador del dispositivo finaliza el proceso de enumeración seleccionando la interfaz del dispositivo que termina con la configuración de "configuración del dispositivo". Obviamente, toda la comunicación USB se reconoce detrás de este puerto en particular , incluso si todos los paquetes se transmiten a todos los puertos habilitados.

Lo anterior es el marco general del protocolo de conexión USB. Empaquetar datos para cualquier propósito particular (como MIDI) es una historia diferente, y se maneja ya sea a nivel de aplicación o a nivel de controlador de dispositivo, si el sistema obtiene la clase de dispositivo adecuada. Para obtener comunicación MIDI nativa, el dispositivo debe tener esta clase en su descriptor y seguir todas las definiciones de clase MIDI .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.