首先言明,linux-2.6.35.3 driver/usb/usb-skeleton.c gadget/f_loopback.c均存在bug。
实验过程:
内核源码用linux-2.6.35.3是周立功MX287提供的。但上述两个源文件应该不是周立功公司提供的。
编译usb-skeleton.c,生成usb-skeleton.ko
编译gadget/zero.c 生成zero.ko.
准备两台设备,均为周立功MX287开发板A, B,A的otg口 和B的host口互联。
设备A insmod usb-skeleton.ko
设备B :上insmod zero.ko loopdefault=1 。
设备A 以阻塞的方式打开/dev/skel0, 先写一个一个hello world! 成功,然后去读直接卡死了,没有一点反应。开源的好处就是有源代码可以研究。分析源代码,通过加输出语句,发现第一次读就卡死在297行。
skel_read(....)
{
292 if (!dev->processed_urb) {
293 /*
294 * the URB hasn't been processed
295 * do it now
296 */
297 wait_for_completion(&dev->bulk_in_completion);
298 dev->bulk_in_copied = 0;
299 dev->processed_urb = 1;
300 }
..
}
这个判断语句,意思是还有urb没有处理,我第一次读,哪里来的urb?这个processed_urb仅存在于struct usb_skel这个结构体中,并在是在probe中创建struct usb_skel dev, 当时全部初始化成0.而这个变量也仅仅在skel_read()中出现,问题那就简单了,在probe中把他初始化成1,在测试,OK,可以回读。这个问题在Linux4.0中的usb-skeleton.c中不存在,processed_urb这个成员变量直接就不存在了。OK, 排了第一个雷。