您的位置:首页 > 其它

LDD3字符设备驱动pipe提示No such device or address

2012-07-26 11:24 337 查看
在学习LDD3的时候,学习到字符设备驱动scull

使用scull驱动的设备有三类设备文件,分别是scull、scullp、sculla,使用scul.init start加载驱动,创建设备文件后,cat /proc/devices如下:

203 cpu/cpuid

249 scull

249 scullp

249 sculla

250 hidraw

设备文件如下:

crw-r--r--. 1 root root 249, 0 Jul 26 11:17 scull0

crw-r--r--. 1 root root 249, 1 Jul 26 11:17 scull1

crw-r--r--. 1 root root 249, 2 Jul 26 11:17 scull2

crw-r--r--. 1 root root 249, 3 Jul 26 11:17 scull3

crw-r--r--. 1 root root 249, 32 Jul 26 11:17 scullpipe0

crw-r--r--. 1 root root 249, 33 Jul 26 11:17 scullpipe1

crw-r--r--. 1 root root 249, 34 Jul 26 11:17 scullpipe2

crw-r--r--. 1 root root 249, 35 Jul 26 11:17 scullpipe3

crw-r--r--. 1 root root 249, 16 Jul 26 11:17 scullpriv

crw-r--r--. 1 root root 249, 48 Jul 26 11:17 scullsingle

crw-r--r--. 1 root root 249, 64 Jul 26 11:17 sculluid

crw-r--r--. 1 root root 249, 80 Jul 26 11:17 scullwuid

在cat /dev/scull0时没有任何问题,但是在cat /dev/scullpipe0时提示No such device or address!

通过调试发现没有调用相应的scull_p_open函数,通过上网查阅资料(http://blog.chinaunix.net/space.php?uid=13321460&do=blog&id=2902417),分析可能是在查找设备对应的open函数时失败,看到查找过程中有如下

new = container_of(kobj, struct cdev, kobj); //从kobj的位置倒算出cdev的内存地址.获得包含相应kobj的cdev

inode->i_cdev
= p = new; //到这里p已经为我们要的设备cdev了

filp->f_op = fops_get(p->ops); //终于拿到了梦寐以求的cdev操作集,至此~ 以后read,write操作都通过file->f_op直接与我们要的设备操作集挂钩了

分析可能是在驱动调用cdev_add时存在问题,err = cdev_add (&dev->cdev, devno, 1);看到devno,分析devno存在问题,因为需要通过主设备号、从设备号得到dev_t devno;但是代码中使用firstdev
+ index,感觉此处不对,改为MKDEV(major, 32+index);后成功。cat /dev/scullpipe0不在提示错误,而且dmesg看到了scull_p_open打印。注:32为pipe从设备号起始值,可以再scull.init脚本中修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐