Saturday, November 26, 2005

Debugování komunikace s klávesnicí

Momentálně si hraju s vylepšováním svojí klávesnice, akorát mi to moc nejde. Už jsem strávil tejdny různým zkoušením (no, nemám na hraní celý dny, proto tolik), až jsem uznal, že je nutný vědět, co se mezi klávesnicí a PC vlastně děje, protože podle teorie to prostě nefungovalo.


Takže jsem vyštrachal obvod MAX232, 5 kondenzátorů a napojil klávesnici na sériový port.

schema


fotka


Šmírovací program jsem obšlehl od sitha. V C totiž vůbec neumím a připadá mi jako totálně nepohodlný a nepřehledný jazyk, takže - vím, že je to napsaný prasácky, ale je to jednoúčelová věc a stačí mi:

#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <time.h>
#define SERIAK "/dev/ttyS0"
int openserial ();
void closeserial ();
float mereni ();
int fd;
int
openserial ()   //otevrit seriak
{
if ((fd = open (SERIAK, O_RDWR)) == -1)
{
return 0;
}
return 1;
}
void
closeserial ()   //zavrit seriak
{
close (fd);
}
float
mereni ()   //hlavni fce, mereni napeti
{
int status, hodnota1 = 2, hodnota2 = 3;
while (1!=2)
{
ioctl (fd, TIOCMGET, &status);
hodnota1 = (status & TIOCM_CTS)/TIOCM_CTS; //clock
hodnota2 = (status & TIOCM_RI)/TIOCM_RI; //data
printf ("%i,", hodnota1);
printf ("%i\n", hodnota2);
}
// return (hodnota1);
}
int
main ()
{
if (!openserial ())
{
printf ("Nelze inicializovat port \"s\".", SERIAK);
return 0;
}
mereni();
closeserial ();
return 0;
}

Prostě to vypisuje dvě hodnoty oddělený čárkou, první je stav CLOCK a druhý je stav DATA. Protože PS/2 jede jen na 9600 baudů, stíhá se to krásně:

...
1,0
1,0
1,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,0
0,1
0,1
0,1
...

Update:

A když se to nacpe do OpenOffice, tak se to dá krásně zvizualizovat:


graf



English summary: Spying on the PS/2 keyboard protocol using serial port.


No comments:

Post a Comment