¿Cómo se lee un teclado PS2?
Publicado: 01 Ene 2013, 12:29
La pregunta viene por el emulador de Spectrum 16k de ESTE HILO.
Me he puesto a meterle soporte PS2, ya que este dispositivo no lo lleva. En internet solo he encontrado un par de fuentes que hablan sobre ello, pero una está en ruso y la otra en polaco, y la traducción de google es muy mala en este caso. Y los fuentes que les acompañan llevan los comentarios en ese idioma.
He tratado de convertir los fuentes a mi dispositivo (tan simple como cambiar las GPIO para que apunten a los pines que yo quiero) y cambiar las llamadas "tool chain" a las mias propias, y he logrado que el teclado PS2 Funcione, pero lo hace tan malamente, que dudo que esté bien hecho. Probablemente se deba a que no inicializo bien las llamadas al teclado y que no leo bien las respuestas (ni a tiempo). He mirado en documentos PDF que hablan del estándar PS2, pero me lían mas que ayudar.
Por eso pregunto: ¿es necesario inicializar el PS2 con comandos suyos? ¿o solo enviar un reset y empezar a leer en los tiempos correspondientes?
Al principio envío un reset al Teclado, y una órden de lectura para que quede preparado. Leo el estado del mismo (que debe ser 0xFA) pero me da error. Me salto el error, y funciona, el teclado "escupe" datos (pulsaciones) que guardo en una matriz. Luego leo la matriz, envio las pulsaciones al Spectrum virtual, vacio la matriz, y vuelta a empezar, pero me ocurre que la matriz, se llena de nuevo con las "viejas" pulsaciones (ya que el teclado sigue enviando datos) y el Spectrum repite la misma tecla sin parar.
Aqui una porción de como inicializo el teclado de forma "bruta", sin hacer caso a errores:
Aqui la misma porción, pero intentando hacer caso a errores, lo que provoca que no funcione, y se salga sin inicializarlo:
Vamos, que si envío la secuencia supuestamente correcta según la documentación oficial, no responde y da error. En cambio, si simplemente lo reseteo, y me salto los errores, funciona, lee teclas, pero funciona errático.
Me he puesto a meterle soporte PS2, ya que este dispositivo no lo lleva. En internet solo he encontrado un par de fuentes que hablan sobre ello, pero una está en ruso y la otra en polaco, y la traducción de google es muy mala en este caso. Y los fuentes que les acompañan llevan los comentarios en ese idioma.
He tratado de convertir los fuentes a mi dispositivo (tan simple como cambiar las GPIO para que apunten a los pines que yo quiero) y cambiar las llamadas "tool chain" a las mias propias, y he logrado que el teclado PS2 Funcione, pero lo hace tan malamente, que dudo que esté bien hecho. Probablemente se deba a que no inicializo bien las llamadas al teclado y que no leo bien las respuestas (ni a tiempo). He mirado en documentos PDF que hablan del estándar PS2, pero me lían mas que ayudar.
Por eso pregunto: ¿es necesario inicializar el PS2 con comandos suyos? ¿o solo enviar un reset y empezar a leer en los tiempos correspondientes?
Al principio envío un reset al Teclado, y una órden de lectura para que quede preparado. Leo el estado del mismo (que debe ser 0xFA) pero me da error. Me salto el error, y funciona, el teclado "escupe" datos (pulsaciones) que guardo en una matriz. Luego leo la matriz, envio las pulsaciones al Spectrum virtual, vacio la matriz, y vuelta a empezar, pero me ocurre que la matriz, se llena de nuevo con las "viejas" pulsaciones (ya que el teclado sigue enviando datos) y el Spectrum repite la misma tecla sin parar.
Aqui una porción de como inicializo el teclado de forma "bruta", sin hacer caso a errores:
Código: Seleccionar todo
PS2_Init();
delay_ms(800);
PS2_Status=CMDMODE;
PS2_Send_Cmd(PS_RESET);
PS2_Get_Byte();// lee byte 0xAA, que significa "entendido"
PS2_Get_Byte();// y el 0x00 seguido
PS2_Status=KEYBOARD; // seleccionamos el teclado a lo "bruto"
Aqui la misma porción, pero intentando hacer caso a errores, lo que provoca que no funcione, y se salga sin inicializarlo:
Código: Seleccionar todo
PS2_Init();
delay_ms(800); // antes de enviar nada, esperamos un rato
PS2_Status=CMDMODE; // nos ponemos en modo envio de comandos
t=PS2_Send_Cmd(PS_RESET); // reset
if(t!=0) return 1; // error
t=PS2_Get_Byte();
if(t!=0XFA) return 1; // teclado responde OK?
t=0;
while((PS2_Status&0x80)==0)// esperamos a que el teclado este preparado
{
t++;
delay_ms(10);
if(t>50) return 1; // no hay respuesta desde el teclado, salimos con error
}
PS2_Get_Byte();// codigo 0xAA (preparado) nos lo saltamos
PS2_Get_Byte();// codigo 0x00 nos lo saltamos
PS2_Send_Cmd(GET_DEVICE_ID); // pedimos al teclado su ID
if(PS2_Get_Byte()!=0XFA) return 1;// error
KEYB_ID=PS2_Get_Byte();// si no hay error, cogemos la ID del teclado
PS2_Send_Cmd(EN_DATA_REPORT); // nos damos por entendidos
if(PS2_Get_Byte()!=0XFA)return 1; // error
PS2_Status=KEYBOARD; /7 si hemos pasado los errores, lo seleccionamos
return 0; // y volvemos sin errores
Vamos, que si envío la secuencia supuestamente correcta según la documentación oficial, no responde y da error. En cambio, si simplemente lo reseteo, y me salto los errores, funciona, lee teclas, pero funciona errático.