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脚本中修改。
使用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脚本中修改。
相关文章推荐
- ASM Diskgroup Creation Failed with "IBM AIX RISC system/6000: 6:no such device or address" [ID 12634
- losetup: /dev/loop0: failed to set up loop device: No such device or address
- losetup: /dev/loop0: failed to set up loop device: No such device or address
- 卸载驱动模块时,提示出错: rmmod: chdir(/lib/modules): No such file or directory
- [Errno 6] No such device or address: '/dev/tty'
- losetup: /dev/loop0: failed to set up loop device: No such device or address
- linux下,移除驱动模块时提示chdir(3.6.5-Broadcom Linux): No such file or directory
- Can't open /dev/tty: No such device or address Error (Linux)
- losetup: /dev/loop0: failed to set up loop device: No such device or address
- Can't open /dev/tty: No such device or address Error (Linux)
- losetup: /dev/loop0: failed to set up loop device: No such device or address
- mount error(6): No such device or address
- 新增分区格式化时提示设备文件不存在:--- No such file or directory的处理方法
- 如何开启真机Log设备_Unable to open log device ‘/dev/log/main’: No such file or directory
- 新增分区格式化时提示设备文件不存在:--- No such file or directory的处理方法
- retrying with upper case share name mount error 6 = No such device or address
- 安卓应用程序在真机上调试时无打印信息,提示Unable to open log device ‘/dev/log/main’: No such file or directory在我们使用真机进行An
- can't open /dev/ttyAMA0: No such device or address
- Ubuntu 64系统执行二进制文件提示No such file or directory
- Linux执行.sh文件时提示No such file or directory该怎么办(三种解决办法)