Host USB vs. Detección de dispositivo

0

Aquí hay un problema para el cual la respuesta obvia es "usar un interruptor", pero eso no está permitido en el diseño. ;)

Estoy escribiendo un software para una aplicación de audio USB que se supone que puede reproducir audio desde iP {od, ad, hone} s, dispositivos Android y también Samsung Audio desde dispositivos Samsung.

(nota rápida: Dispositivo USB con mayúscula D = USB Periférico = dispositivo con conector B)

No tendría que hacer esta pregunta si todos estos dispositivos funcionaran bien y fueran solo dispositivos USB. Los dispositivos iPxx y Android son dispositivos USB, pero los dispositivos Samsung que reproducen Samsung Audio actúan como hosts USB (pero también pueden ser dispositivos USB que no reproducen Samsung Audio, sino dispositivos Android habituales).

Todos los dispositivos tienen que conectarse a un único conector tipo Standard-A en nuestro sistema integrado que se ejecuta en un PIC32. Sí, ya sé que eso no es legal por USB, pero esos son los requisitos.

Dado que ambos Dispositivos USB y tienen que conectarse a nuestro dispositivo integrado, necesito una forma de detectar cuándo un dispositivo está conectado si es un Host USB o un Dispositivo USB, para que mi sistema USB se cierra / aparece con el rol correcto dependiendo del dispositivo conectado.

He leído el On-The-Go y Embedded Host Supplement en la revisión de USB 2.0 espec. Lo más cercano que obtuve fue adjuntar el protocolo de detección. Eso ayuda con la detección general de los dispositivos conectados pero no ayuda a detectar la función del dispositivo (host o dispositivo). Nuestro diseño de hardware aún no es definitivo, por lo que puedo considerar cualquier solución de hardware que ayude a que no sea ... bueno ... un interruptor. ;)

Esperamos la opinión de la comunidad.

    
pregunta Skateboarder

1 respuesta

2

Creo que deberías poder detectarlo de manera bastante confiable al conocer las propiedades eléctricas de los pines. Los hosts USB eliminan las líneas de datos DP y DN con una resistencia de 15 kOhm. Los dispositivos USB tiran de la línea DP (línea DN si es un dispositivo de velocidad lenta) a 3 voltios con una resistencia de 1.5K. Si el dispositivo en el otro extremo se levanta y usted también lo hace, no sucedería nada porque el dispositivo no reacciona al levantamiento adicional. Por lo tanto, podría usar esto para verificar si el otro extremo comienza a enviar paquetes al bus.

Sugiero un procedimiento como este:

Puedes comenzar tirando de la línea DN débilmente alta (con algo como una resistencia de 200K a 1M). Podría detectar un menú desplegable en la línea DN para dar un primer indicio de que hay un host en el otro lado.

Luego mida el VBUS, si es alto, es una indicación más de que hay un host en el otro lado. Si es así, active un pull-up de 1.5k (a 3 voltios) en la línea DP y escuche los paquetes entrantes. Si realmente hay un host en el otro lado, emitirá un restablecimiento de bus y enviará un paquete GET_DESCRIPTOR al bus. Si esto sucede, sabes que el otro chip es un host. Le sugiero que lo haga en este orden, ya que si hay un dispositivo en el otro lado, no reaccionará ante el despliegue de DP.

Si no sucede nada, puede haber un dispositivo en el otro lado. Suelte el pull-up DP y vea si todavía está tirado hacia arriba en el otro lado. Si es así, entonces probablemente hay un dispositivo autoalimentado en el otro lado. Si no, entonces comience a conducir la línea VBUS a 5 voltios. En este momento, a más tardar, debería ver los 1.5k pull-up tp 3 voltios en la línea DP. Si en cambio ve 3 voltios en la línea DN, entonces hay un dispositivo de baja velocidad como un teclado o un mouse en el otro lado.

Ahora actúe como anfitrión y emita un RESET DE BUS Y OBTENGA EL DESCRIPTOR: DESCRIPTOR DEL DISPOSITIVO a la dirección 0, punto final 0. El dispositivo ahora debe responder y, finalmente, en este punto, debe saber con seguridad que hay un dispositivo USB en el otro extremo . Si no ha habilitado su unidad de 5 V a VBUS hasta ahora, le sugiero que lo habilite ahora. Pruebe con todos los dispositivos que pretende admitir.

Ok, esto es un truco, y el bus oficial no funciona de esta manera porque si ambos extremos funcionaran así, sería una cuestión de suerte (sincronización) si se detecta correctamente o no. Pero si el otro extremo es una entidad USB de buen comportamiento, entonces creo que debería funcionar. He hecho un poco de trabajo en el USB, pero no exactamente esto.

    
respondido por el PkP

Lea otras preguntas en las etiquetas