Chinaunix首页 | 论坛 | 博客
  • 博客访问: 762206
  • 博文数量: 790
  • 博客积分: 40560
  • 博客等级: 大将
  • 技术积分: 5065
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 16:29
文章分类

全部博文(790)

文章存档

2011年(1)

2008年(789)

我的朋友

分类: LINUX

2008-08-28 17:14:00

 
把模块编程之keyboard中断替换弄掉了..

只40几行代码...不过得重启才能恢复原来的keyboard中断了..

先注册中断处理函数.

然后在中断处理函数中用tasklet处理.

当然还有读键盘的函数

要注意函数的原形匹配问题.内核各版本有的有差异的.可以差头文件.

/*theinterruptmodule,repalcethekeyboardinterrupt
*editbybo-liu
*07-5-21
*/

#include
#include
#include
#include
#include

MODULE_AUTHOR("BO-LIU");
MODULE_LICENSE("GPL");

staticunsignedcharscancode;
staticvoidkbd_do_tasklet(unsignedlongunused);
DECLARE_TASKLET(kbd_tasklet,kbd_do_tasklet,0);

staticvoidkbd_handler(intirq,void*dev_id,structpt_regs*regs){
//while(!(inb(0x64)&1));
wait:
if(!(inb(0x64)&1))
gotowait;
scancode=inb(0x60);
tasklet_schedule(&kbd_tasklet);
}

staticvoidkbd_do_tasklet(unsignedlongunused){
printk("scancode%x%s.",scancode&0x7f,(scancode&0x80)?"released":"pressed");
}

staticintkbd_init(void){
free_irq(1,NULL);
request_irq(1,kbd_handler,0,"keyboard",NULL);

}

staticvoidkbd_cleanup(void){
free_irq(1,NULL);
}


module_init(kbd_init);
module_exit(kbd_cleanup);

阅读(589) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~