¿Cómo se lee un teclado PS2?

Foro dedicado a la programación en todo tipo de sistemas clásicos.
jepalza

¿Cómo se lee un teclado PS2?

Mensajepor jepalza » 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:

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.
Adjuntos
fallo_stm32_spectrum.JPG
fallo_stm32_spectrum.JPG (70.24 KiB) Visto 5490 veces

Avatar de Usuario
PabloMarmol
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 171
Registrado: 03 Sep 2012, 17:32
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
Primera consola: Nintendo NES/Clónica
Ubicación: León, España
Gracias dadas: 16 veces
Gracias recibidas: 18 veces

Re: ¿Cómo se lee un teclado PS2?

Mensajepor PabloMarmol » 01 Ene 2013, 12:57

Imagino que ya habrás visto esto, pero por si acaso....
http://wiki.osdev.org/PS/2_Keyboard

Avatar de Usuario
flopping
Amiga 1200
Amiga 1200
Mensajes: 1141
Registrado: 20 Jul 2010, 01:26
Ubicación: Valencia
Contactar:

Re: ¿Cómo se lee un teclado PS2?

Mensajepor flopping » 01 Ene 2013, 18:47

Supongo que ya lo habrás visto y no se si te servirá, pero en el trastero tienes esto:

http://www.trastero.speccy.org/cosas/dr ... mar3_s.htm

Hay algunos enlaces también y quizá te sirva para ver como se lee el teclado, salu2.
Expulsado por violación reiterada de las normas.

jepalza

Re: ¿Cómo se lee un teclado PS2?

Mensajepor jepalza » 01 Ene 2013, 18:55

Acabo de entrar desde que he escrito el mensaje. (ya sabéis, :christmashello: los excesos de año nuevo). Voy a mirar esos dos enlaces, a ver si alguno me aclara como funcionan los PS2 de PC.

Avatar de Usuario
mcleod_ideafix
Amiga 2500
Amiga 2500
Mensajes: 5316
Registrado: 06 Oct 2009, 04:12
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Vectrex
Primera consola: TV Games/Pong Clone
Ubicación: Jerez de la Frontera
Gracias dadas: 12 veces
Gracias recibidas: 53 veces
Contactar:

Re: ¿Cómo se lee un teclado PS2?

Mensajepor mcleod_ideafix » 01 Ene 2013, 21:56

jepalza escribió:¿o solo enviar un reset y empezar a leer en los tiempos correspondientes?


Si el teclado es PS/2 "pata negra" (es decir, no es dual USB/PS2), no te haría siquiera falta resetearlo, ya que al darle alimentación se resetea él solo. La implementación de teclado PS/2 que hice en Verilog no envía absolutamente nada de la FPGA al teclado, así que sólo funcionará con teclados que por defecto funcionen en PS/2.

Si es un teclado USB que puede funcionar como PS/2, es necesario enviarle un comando de reset (FFh) para que se ponga en modo PS/2.
En cualquier caso, tras un reset y su correspondiente confirmación, sólo es necesario atender a los flancos de la señal de reloj, leer el dato y enviar el ACK correspondiente.

Después de esto, es conveniente seleccionar el scan code con el que vas trabajar. Es "obligatorio" que de los tres scancodes, tengan implementado al menos el 2, y es de hecho con el que arrancan por defecto. Lo ideal es que pudieras usar el 3, que sólo usa 1 byte por tecla y no envía secuencias largas, pero no todos los teclados lo soportan. El scan code 1 es para compatibilidad XT y raramente se incluye hoy día.

Al final de esta página:
http://www.atc.us.es/~rodriguj/interface_ps2_speccy/

Puse varios enlaces de interés que encontré cuando hice el adaptador de teclado PS/2 - Spectrum, que me enseñaron todo lo que necesité para poder hacerlo :)
Recuerda: cada vez que se implementa un sistema clásico en FPGA, Dios mata a un purista

jepalza

Re: ¿Cómo se lee un teclado PS2?

Mensajepor jepalza » 02 Ene 2013, 07:49

mcleod_ideafix escribió:Después de esto, es conveniente seleccionar el scan code con el que vas trabajar.


El fallo me da que va a estar aquí. Como no selecciono el tipo de teclado (por desconocimiento), al estar en modo 2 envía tantos datos, que me lío, y cojo solo lo que "creo" que es una tecla, y sigo hasta vaciar la matriz, pero son pulsaciones falsas.
Ademas, he leído en uno de los vínculos que me han puesto arriba los compañeros, que el teclado envía un 0xF0 (240) cuando una tecla es liberada, y yo eso no lo sabía, y lo interpretaba como una pulsación, eliminando los bits mas altos, y así con todo.

Luego lo miro con mas detenimiento. Gracias a los tres.


Volver a “Programación”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados