- 论坛徽章:
- 0
|
最近想学习下usb驱动,刚好手头有《圈圈教你学usb》书和实验板,有一章自定义设备和 usb-skeleton 驱动大致吻合。实践出真知嘛,当然得搞一搞。固件程序大概改了下,只用了批量端点2,中断端点1代码全部干掉,简单起见,主机发数据,跑马灯;主机读取数据,用户按下键盘就返回8字节数据,当然抬起也会发(固件基本不需要改)。当然不按就不干活。skeleton驱动改了VENDOR_ID和PRODUCT_ID,基本就可以匹配了。
测试环境:
[linux@localhost ~]$ cat /etc/issue
CentOS Linux release 6.0 (Final)
Kernel \r on an \m
[linux@localhost ~]$ cat /proc/version
Linux version 2.6.38 (linux@localhost.ada) (gcc version 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC) ) #1 SMP Tue Sep 13 09:03:59 EDT 2011
用户执行操作:
[root@localhost hid_test]# gcc skeleton_test_01.c
[root@localhost hid_test]# ./a.out
Open /dev/skel0 success!
^C
[root@localhost hid_test]# ./a.out
Open /dev/skel0 success!
read.len = -1. errno = 5
read: Input/output error
[root@localhost hid_test]#
内核打印显示(只显示问题所在,其他见附件):
……
Mar 1 21:29:17 localhost kernel: Now leave skel_read: rv = -512 //用户ctrl+c之后返回。(正常)
Mar 1 21:29:17 localhost kernel: Now in skel_read_bulk_callback. //你怎么也返回了,哥没按键盘呀。
Mar 1 21:29:17 localhost kernel: read_callback_times = 0 urb->status = -2 //提交urb的回调也执行了? 好快呀!而且还返回个错误(必须得,因为没按键盘)。
Mar 1 21:29:17 localhost kernel: Now leave skel_read_bulk_callback.
Mar 1 21:29:17 localhost kernel: Now in skel_release.
……
Mar 1 21:29:19 localhost kernel: usb_skeleton: skel_do_read_io - failed submitting read urb, error -22 //再次打开设备读,提交urb直接失败,不会吧
Mar 1 21:29:19 localhost kernel: Now leave skel_do_read_io: rv = -5 //IO error. 用户层返回 read: Input/output error.
……
调试中的问题:
processed_urb 这玩意没用上嘛,而且probe中也没初始化为1.导致第一次读直接挂死在wait_for_completion(&dev->bulk_in_completion)。
如果有兄弟知道这玩意有什么特殊用途,告知下!
重点疑问:
用户程序结束后只要有预读,则批量输入也直接结束,返回-2; 而且下次重新填充提交urb就会失败,返回-22。也就是说读一次失败,设备就没法工作了。当然也会返回-75,-5 之类。简单说下预读,驱动作者意图,假设缓存中有8字节,如果本次要求读8字节,够了读取8字节直接返回,不需要启动IO(在这里就是提交urb);如果读4字节,当然剩下4字节,也无需启动IO;如果用户要求读12字节,直接以8字节返回,并且开启IO(此时应该不管应用程序结束不结束,我都要读,和应用程序无关)。
测试写没有问题,中途干死,也可以继续流水灯。
测试读的时候,没有预读,程序一切正常,用户态阻塞,直到我按键。程序正常结束,也可以再次启动。一切完好(每次读8字节)。
如果有预读,则就是上面看到的结果,也可以改用户程序每次读取8个以上字节,关闭应用程序也能保证驱动有预读,同样下次再次开启失败。
所以不太明白,为什么有预读,用户程序结束了,提交的urb立马也返回出错了。退一步讲,即使这一次出错,下次再次填充,提交urb也不该提交不上呀。是否有兄弟对此有熟悉,指点一二。
附件:
skele_test.rar
(11.62 KB, 下载次数: 67)
|
|