sorry for the slow update.
my controller is indeed the i8042. however, the current version of ubuntu
has kernel 2.6.31 which does not have the i8042_filter() function yet. the
advantige of keeping the kernel with ubutu's configuration is that all the
tuning they've done to get esoteric hardware to work out of the box remains.
as my laptop is mostly esoteric hardware (HP tx2000), it made more sense
then to try a new kernel and both try to debug my changes and the kernel
config options at the same time.
after some useful information from this
articlehttp://gunnarwrobel.de/wiki/Linux-and-the-keyboard.html and
the specification links it led to, i concluded that the scancode in my
system for caps lock is 0x3a, and placed the following code near the
beginning of the function i8042_interrupt().
if(data == 0x3a)
goto out;
while this fixed the caps-lock, it made the mouse and tablet go crazy. upon
further thought, i changed it to this:
if(data == 0x3a port_no == I8042_KBD_PORT_NO)
goto out;
a vast improvement. still, some special keys acted wrong, so i ended up
moving it to near the end of the code.
and thanks to rami for pointing me in the right direction.
On Sat, Mar 20, 2010 at 13:49, Rami Rosen rosenr...@gmail.com wrote:
Hi, Boaz,
I suggest that you'll look at the interrupt handler of the keyboard.
Usually, the i8042 chip family is the keyboard controller in desktops
and laptops.
First make sure that i8042 is indeed the driver you are using; run cat
/proc/interrupts and see whether
interrupt number 1 (the keyboard interrupt) is handled by i8042.
Then goto drivers/input/serio/i8042.c; i8042_interrupt() is the
handler for keyboard interrupts. You can try add a filter there for
Caps Lock.
Even better is try to add code in i8042_filter() method, which is
called from i8042_interrupt(); this way you can be sure about locking.
I think that you should **not** try to write a simple module which
hookskeyboard interrupts. While this solution is usually better (you
don't change kernel code), I think it won't work in this case.
Namely, if you try something like this, in a kernel module:
free_irq (1, NULL);
res = request_irq (1, mykbdhandler, IRQF_SHARED, mykbd, dev_id);
I think you will get an error, since
interrupt 1 (the PC keyboard interrupt) is edge-triggered (see cat
/proc/interrupts;
for interrupt 1 it says:IO-APIC-edge ). In
case of level-triggered interrupts this might have been OK.
Rgs,
Rami Rosen
On Sat, Mar 20, 2010 at 3:19 AM, boazg boaz.ge...@gmail.com wrote:
hi,
i have a laptop in which due to a hardware problem, computer thinks the
caps
lock key is pressed about 5 times a second, at random. i've disabled caps
lock at the X11 level, and it's now usable. however, a few programs still
have problems with the fact that a key is pressed (regardless of it being
caps lock). also, i can't use the consoles at ctrl+alt+f[1..6].
i wanted to have the kernel filter out caps lock and have the userland
never
see that is was pressed. to this end i edited drivers/char/keyboard.c and
added a few spots where i return if the key is caps lock. this doesn't
seem
to work.
anyone have any better ideas as to where i should be looking?
thanks
boazg
___
Haifux mailing list
Haifux@haifux.org
http://hamakor.org.il/cgi-bin/mailman/listinfo/haifux
___
Haifux mailing list
Haifux@haifux.org
http://hamakor.org.il/cgi-bin/mailman/listinfo/haifux