Velocidad de sondeo de punto final de interrupción de USB

0

He capturado el tráfico USB entre el host y el dispositivo que funciona a velocidad máxima. Entonces estoy filtrando en un punto final de interrupción. bEl valor de intervalo es 9 para este punto final. En la captura, veo el token de IN del host al dispositivo en este punto final cada 35 ms.

Según mis lecturas, estaba pensando que, considerando el funcionamiento a velocidad máxima, el host enviará los tokens de IN cada 9 milisegundos. ¿Por qué veo una demora de 35 segundos entre cada paquete IN?

    
pregunta mathedi

2 respuestas

1

Primer problema: las transacciones de IN van de dispositivo a host, no de host a dispositivo. El host los busca, ciertamente, pero la transacción da como resultado que los datos van en al host. Aunque supongo que el token en sí sí va de "host a dispositivo" ... pero de todos modos.

Ahora, supongo que por qué es posible que no vea un token cada 9 milisegundos: es posible que el dispositivo no tenga datos preparados y tenga la solicitud NAK. Esto no es irrecuperable y el host simplemente sondeará nuevamente después de bInterval , pero no se reciben los datos. Probablemente sea por eso que solo ve un token IN cada 35 ms: el dispositivo solo tiene datos listos para enviar cada 35 ms (en cuanto a una idea de por qué su analizador puede no mostrarle los tokens NAK'd IN, permanezca sintonizado). La configuración bInterval le da la oportunidad para enviar datos cada 9 ms, pero no está obligado a hacerlo. Esto proporciona la función de "latencia garantizada" de los puntos finales de INTERRUPT.

NAK es así, es completamente normal y, de hecho, muchos dispositivos NAK continuarán la solicitud hasta que algo suceda (especialmente en el caso de HID).

Ahora para un poco de especulación: si está utilizando un analizador de protocolo de software, probablemente solo capturará las transacciones completadas , lo que significaría que sus tokens IN solo aparecerían una vez que el dispositivo envíe datos. . Es probable que no pueda ver los NAK, a menos que haya interconectado bastante profundamente con el controlador USB del host o al menos la parte más oscura del sistema operativo. Es probable que un analizador de protocolo de hardware (como un TotalPhase Beagle o uno de esos dispositivos Teledyne LeCroy Voyager / Mercury / Advisor) le muestre los NAK, por lo que si está usando uno de esos, puede configurarlo para que se lo muestre y verifique que ¿El dispositivo en realidad está DESCONECTADO cada 3 o 4 encuestas?

Ahora, si en realidad estás viendo NAK'd IN tokens y solo aparecen cada 35 ms, estoy completamente equivocado. Debería ver un NAK cada 9 ms (en un analizador de hardware) si mi suposición es correcta.

    
respondido por el Los Frijoles
0

La especificación de USB dice (§ 5.7.4):

  

Un punto final para una tubería de interrupción especifica su período de acceso al bus deseado. Un punto final de velocidad completa puede especificar un período deseado de 1 ms a 255 ms. […] El software del sistema USB usará esta información durante la configuración para determinar un período que puede ser sostenido. El período provisto por el sistema puede ser más corto que el deseado por el dispositivo hasta el período más corto definido por el USB (microforma de 125 µs o marco de 1 ms). El software y el dispositivo cliente solo pueden depender del hecho de que el host se asegurará de que la duración del tiempo entre dos intentos de transacción con el punto final no sea mayor que el período deseado.

Por lo tanto, el intervalo real podría ser inferior a 9 ms, pero no debería ser mayor.

(En la práctica, la mayoría de los controladores del controlador host lo redondearán a una potencia de dos, es decir, 8 ms.)

Sin embargo:

  

Tenga en cuenta que los errores en el bus pueden evitar que una transacción de interrupción se entregue con éxito a través del bus y, en consecuencia, exceda el período deseado. Además, el punto final solo se sondea cuando el cliente de software tiene un IRP para una transferencia de interrupción pendiente. Si llega la hora del bus para realizar una transferencia de interrupción y no hay un IRP pendiente, el punto final no tendrá la oportunidad de transferir datos en ese momento. Una vez que haya un IRP disponible, sus datos se transferirán en el próximo período asignado.

("IRP" significa "paquete de solicitud de E / S" y es una estructura de software que el controlador utiliza para solicitar datos).

Por lo tanto, el controlador del controlador de host no controla este intervalo correctamente o el controlador de este dispositivo no solicita datos nuevos. En cualquier caso, el dispositivo no está haciendo nada mal; esto es completamente causado por el software en el host.

    
respondido por el CL.

Lea otras preguntas en las etiquetas