Hi. I`m sorry if this isn`t the right place to post my question, but first I tried posting it on forum.kernelnewbies.org and nobody answered. Here`s my question: I have a Gembird kb-9140l keyboard with some multimedia keys which are not working on linux. I thought about writing my own driver for it, so as a start, I wrote a small module, which registers an interrupt handler on irq 1 with the IRQF_SHARED flag. In the handler function I put a simple printk with the scancode read from the keyboard. The problem is, that the handler never gets executed. I searched on google, and found that because the native driver doesn`t share its interrupt with another modules, before I call request_irq I have to free the original interrupt handler from the native driver. This would make my computer practically unusable until I reboot, but at least I would see, it works, but it doesn`t. The original driver works fine after I insert my module, and the interrupt handler still doesn`t get called. The weird thing is, when I remove my module, my handler executes ones, and the scancode is 0xFE. The code is the following: #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/interrupt.h> #include <asm/io.h> MODULE_LICENSE("Dual BSD/GPL"); static int gembirdkb_init(void); static void gembirdkb_exit(void); irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs) { static unsigned char scancode; scancode = inb (0x60); printk("gembirdkb: irq handled... scancode: %d\n",scancode); return (irq_handler_t) IRQ_HANDLED; } static int gembirdkb_init(void) { int ret; /* free original interrupt handler */ // free_irq(1, NULL); ret = request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "gembirdkb", (void *)&irq_handler); printk("gembirdkb: request_irq result: %d\n", ret); return ret; } static void gembirdkb_exit(void) { free_irq(1, (void *)&irq_handler); } module_init(gembirdkb_init); module_exit(gembirdkb_exit); Is there any way I can remove the native driver, or I need to recompile the kernel without it, and insert mine? P.s.: Why every topic on the forum is full with questions about mac, iphone, samsung galaxy etc.?
If your keyboard is not USB based, then perhaps article like this is possibly your answer: http://www.computer-engineering.org/ps2keyboard/ http://eduunix.ccut.edu.cn/index2/html/linux/Sybex%20Linux%20Power%20Tools%2... http://freeworld.thc.org/papers/writing-linux-kernel-keylogger.txt Since your KB is usb-based, u can look here for internal info: http://www.emntech.com/docs/USB_KeyBoard_Driver_eMNTech.pdf Inside there is a picture on the overall flow. Essentially is the usb_kbd_probe() function. Your problem of linking/delinking the KB may also be answered by: http://unix.stackexchange.com/questions/12005/how-to-use-linux-kernel-driver... Another good ref is: http://www.linux.it/~rubini/docs/usb/usb.html as it simplified the complex flow of USB processing in the kernel for HID part in particular. A good analogy to your problem is the apple keyboard: http://www.cyberciti.biz/faq/linux-apple-usb-keyboard-driver-installation/ and looking into implementation drivers/hid/hid-apple.c (kernel source) perhaps can give u some insight. Another thing is the non-kernel processing of scancode: http://eduunix.ccut.edu.cn/index2/html/linux/Sybex%20Linux%20Power%20Tools%2... As describe within, X windows keymap may also be used to change the mapping. http://www.in-ulm.de/~mascheck/X11/xmodmap.html http://bochs.sourceforge.net/doc/docbook/user/keymap.html http://madduck.net/docs/extending-xkb/ http://www.pixelbeat.org/docs/xkeyboard/ On Fri, Jan 4, 2013 at 2:17 AM, Racz Zoli <racz.zoli@gmail.com> wrote:
Hi.
I`m sorry if this isn`t the right place to post my question, but first I tried posting it on forum.kernelnewbies.org and nobody answered. Here`s my question:
I have a Gembird kb-9140l keyboard with some multimedia keys which are not working on linux. I thought about writing my own driver for it, so as a start, I wrote a small module, which registers an interrupt handler on irq 1 with the IRQF_SHARED flag. In the handler function I put a simple printk with the scancode read from the keyboard. The problem is, that the handler never gets executed. I searched on google, and found that because the native driver doesn`t share its interrupt with another modules, before I call request_irq I have to free the original interrupt handler from the native driver. This would make my computer practically unusable until I reboot, but at least I would see, it works, but it doesn`t. The original driver works fine after I insert my module, and the interrupt handler still doesn`t get called. The weird thing is, when I remove my module, my handler executes ones, and the scancode is 0xFE.
The code is the following:
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/interrupt.h> #include <asm/io.h>
MODULE_LICENSE("Dual BSD/GPL");
static int gembirdkb_init(void); static void gembirdkb_exit(void);
irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs) { static unsigned char scancode;
scancode = inb (0x60);
printk("gembirdkb: irq handled... scancode: %d\n",scancode);
return (irq_handler_t) IRQ_HANDLED; }
static int gembirdkb_init(void) { int ret;
/* free original interrupt handler */ // free_irq(1, NULL);
ret = request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "gembirdkb", (void *)&irq_handler);
printk("gembirdkb: request_irq result: %d\n", ret);
return ret; }
static void gembirdkb_exit(void) { free_irq(1, (void *)&irq_handler); }
module_init(gembirdkb_init); module_exit(gembirdkb_exit);
Is there any way I can remove the native driver, or I need to recompile the kernel without it, and insert mine?
P.s.: Why every topic on the forum is full with questions about mac, iphone, samsung galaxy etc.?
_______________________________________________ Kernelnewbies mailing list Kernelnewbies@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
-- Regards, Peter Teoh
participants (2)
-
Peter Teoh -
Racz Zoli