¿Por qué GET_REPORT en mis teclados HID a veces devuelve un paquete vacío?

4

Estoy escribiendo firmware de arranque en una placa PowerPC, y tengo un problema con la repetición del teclado USB falso. Mi firmware se basa en u-boot: después de la enumeración, coloca el teclado en el protocolo de arranque y, a continuación, los envía enviando los paquetes de control GET_REPORT. Desde mi lectura de la especificación HID, el teclado simplemente debería enviar los estados clave y dejar que mi firmware detecte los cambios clave.

Esto devuelve los estados clave correctamente casi todo el tiempo, pero cada teclado que he probado también envía paquetes vacíos ocasionales, que el firmware interrumpe como un evento clave. En el peor de los casos, esto sucede cada 7 ms. Aquí hay un rastro del analizador:

En la imagen de arriba, las transferencias 76 y 78 muestran el código clave correcto (estoy presionando 'a' por completo), pero la transferencia 77 es todo ceros.

¿Falta alguna configuración aquí o es la única solución para ignorar los informes vacíos a menos que vea dos en una fila?

    
pregunta Adrian Cox

2 respuestas

3

Interesante. Como desarrollador de firmware de teclado, supongo que estas placas reconstruyen internamente el informe de cada ciclo de escaneo de matriz de clave sin bloquear las interrupciones mientras lo hacen. Esto funcionaría bien si el controlador de teclado inicia el envío del informe (solo escribirá el nuevo informe en el búfer de la tubería de entrada), pero podría generar paquetes vacíos si el informe se lee de forma asíncrona a través de GET_REPORT (el controlador EP0 es invocado por un interrumpir.)

    
respondido por el Detlef M.
1

Después de más investigaciones, llegué a la conclusión de que los teclados USB no se pueden usar de manera confiable al sondear el punto final de control. Los mismos teclados funcionan de manera 100% confiable a través del punto final de interrupción, tal como lo usa el BIOS de la PC.

Mi solución ha sido solucionar los errores de U-Boot que nos impidieron usar el modo de interrupción.

    
respondido por el Adrian Cox

Lea otras preguntas en las etiquetas