I've been working on this for a while now, but I still cant get it to work reliably. I have tried installing a interrupt handler and using code based on serio/parkbd.c. This tries to read 1 bit every interrupt and doesn't work very well.I've also tried polling the entire bitstream after the first interrupt, this works better, but still gives false data. If I press a key (e.g. space), I expect to get:
0x4b // scancode for space 0xf0 // key released 0x4b // scancode for space
But I hardly every get the 2nd 0x4b, and I don't always get the first 2 bytes correctly either. I think this is because I am missing some bits due to the interrupt processing latency. Cliff Lawson said in an earlier post that the bit stream is clocked at about 70kHz and apparently the 5910 can only handle about 13k ints/second on linux.
Cliff said that Amstrad used a FIQ handler to read the keyboard in the 2.4 kernel source. There does not seem to he a FIQ handler for omap in the 2.6 kernel but we do have most of the amstrad code available under GPL. (it's in arch/arm/kernel/fiq-qwerty.S and arch/arm/kernel/irq.c). As far as I can tell, this works as follows:
* fiq handler is installed * gpio interrupt is changed to be a fiq * fiq handler is invoked when a gpio interrupt is raised (in the E3 this may be either modem of mailboard) * If it's a modem interrupt, pass is on (more of that later) * If it's a mailboard interrupt, process the next bit in the bitstream, once a full character is recived, pass it on
The fiq handler passes requests to irq context by faking a 32kHz interrupt (this means that the 32kHz timer interrupt cannot be used for it's orginal purpose). The 32kHz interrupt handler then reads some shared memory to determine which gpio interrupt(s) occured and invokes the appropriate handler.
The end result is that a modem interrupt generates one fiq and one irq, whilst a mailboard interrupt generates one fiq for every bit in the keyboard data but an irq is only generated when a character has been recieved.
There is also some code (in irq.c) to check if the fiq handler is stuck, and inject a gpio interrupt if it is.
So, I'm begining to think that I'll need to re-implement most of this to get the mailboard to work. What do other people think? It looks like it's going to be a fair bit of work, but, I don't really see any other way of sucessfully capturing the serial keyboard data.
Matt