Dragonfly大哥帮忙:驱动程序模块出错
系统:Redhat 9内核:2.4.20-8
我写了一个ps/2的鼠标驱动程序,是作为模块插入内核当中的。而内核中原有的ps/2 mouse support已经被我编译出内核。
问题是这个样子的,我在模块的初始化当中,申请了12号IRQ,并且申请了从0x300开始的3个ioports,insmod时显示申请成功,注册miscdevice成功。在/dev中mknod一个c设备mknod ps2mousec c 10 1也没有出错。cat /proc/interrupts显示中断号也申请成功。这个时候我的驱动程序应该和设备文件ps2mouse挂接起来了的,但是为什么lsmod仍然显示我的模块为unused?????
而且在我rmmod时并未打印我在cleanup_module中定义的打印信息。在rmmod后再insmod我的模块,系统出错。我怀疑是我的cleanup没有作用,irq和ioports都没有被释放。按理说cleanup应该不会出错啊,而且就算释放资源出错,也应该给我个打印信息啊!但是现在什么都没有,为什么???
请Dragonfly大哥指点一下!! u can try to open the file /dev/ps2mouse by uself to see if the used count increases.
u create a ps2mouse file, but who will use that file as u mouse device?
u rmmod code is strangce, have u run dmesg to check? after u run rmmod, cat /proc/interrupts to see if it is cleared? 我mknod了一个minor为1的ps2mouse misc设备文件,而我的驱动里面也申请一个minor为一的miscdevice啊,那么在系统里面它们应该关联起来了的。
我在console下面挂gpm: gpm -m /dev/ps2mouse -t imps2,有两种结果:一个就是cann't open the device,我的理解是不是说无法调用我的file_operation()里面的open函数?还有一个就是说ps2mouse init fail,但是我在init_module里面并没有干什么啊!而且used count也一直显示unused!!
init_module():
int init_module(void)
{
if(request_irq(MOUSE_IRQ, mouse_interrupt, 0, "ps2mouse", NULL))
{
printk(KERN_ERR "ps2mouse:request_irq failed.\n");
return -EBUSY;
}
printk("ps2mouse:request_irq success.\n");
if(request_region(MOUSE_BASE, 3, "ps2mouse") < 0)
{
printk(KERN_ERR "ps2mouse: request_region failed.\n");
return -ENODEV;
}
printk("ps2mouse:request_region success.\n");
if(misc_register(&mouse_dev) < 0)
{
printk(KERN_ERR "ps2mouse: cannot register misc device.\n");
release_region(MOUSE_BASE, 3);
return -EBUSY;
}
printk("register misc device success.\n");
return 0;
}
只是申请irq,io, 注册miscdevice,而且insmod的时候都显示申请成功了的啊:cat /proc/interrupts 显示irq12是我的ps2mouse, cat /proc/misc 显示minor为1的ps2mouse,应该都是没有问题了的,但是就是不知道为什么不能init and open!!!
我的cleanup_module()也有问题,rmmod之后,cat /proc/interrupts显示出错,再insmod时就报错,说是资源忙
cleanup_module()
void cleanup_moduel(void)
{
printk("cleanup module begin.\n");
misc_deregister(&mouse_dev);
printk("deregister miscdevice success.\n");
release_region(MOUSE_BASE, 3);
printk("release_region success.\n");
free_irq(MOUSE_IRQ, NULL);
printk("free_irq success.\n");
}
而且连第一句都没有打印!!
重启之后就能insmod了,虽然情况和前面一样!
现在我暂时不管释放资源的问题我想先让我的鼠标动起来啊
但是现在............................
劳Dragonfly大哥帮我看看了
这几天一直在麻烦Dragonfly大哥,不好意思了!! no that can not open or init fail happend why try to call u open function. u init_module is called when insmod
did u use dmesg to monitor the output? a low level may not allow all msg printed on u screen. dmesg showed what the screen shows, just some printks, no more!
i dont know what wrong with my initialize
while i cannt init my driver, i cannt go down for other func, like interrupt, and so on!!
i dont know how to do!
maybe i cannt finish it before next monday!(my project asked me to finish that before then.)
555555......................... can u read that qpmouse.c? it is base on ps/2 mouse code. and it is a module. maybe u can try to learn that code first? 我现在已经把pc_keyb.c模块化了
在我把内核中的ps/2 mouse support编译出来之后,我把我的pc_keyb模块插入内核,可以正常工作
我现在就是想让它跑起来,已经可以了!然后我在把pc_keyb.o中的键盘支持拿出来(内核里面已经有了),再来研究里面的鼠标支持
相信把pc_keyb和qpmouse合起来看应该能比较快的搞定吧(但愿如此)!!!!!
谢谢Dragonfly大哥(你在学校呆了21年,我呆了16年,呵呵,还是要喊你大哥才好!)
btw:你现在是在攻读博士学位吗!加油!! nose_roxete在文中写到:
cleanup_module()
void cleanup_moduel(void)
{
printk("cleanup module begin.\n");
misc_deregister(&mouse_dev);
printk("deregister miscdevice success.\n");
release_region(MOUSE_BASE, 3);
printk("release_region success.\n");
free_irq(MOUSE_IRQ, NULL);
printk("free_irq success.\n");
}
我想rmmod 的时候没出来打印信息是不是因为你把"module"写成了"moduel" 呵呵
笔误,已经纠正过来了
thanx! yes, i think u can modularize it. and u shoudl be able to figure out teh problem with these two code.
yes, i am trying to get my doctor degree. but too tough for me. 只要你想,你就能做到的,我相信你
很多事情不是因为难而使你没有信心,往往是因为你没有信心所以才变得难
加油!
页:
[1]