读Linux那些事儿之我是U盘笔记(三)
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-05
Linux中同步机制的一个很重要的结构体;
用法:我们要用init_completion初始化一个struct completion的结构体变量,然后调用wait_for_completion()这样当前进程就会进入睡眠,处于一种等待状态,而另一个进程可能会去做某事,当它做完了某件事情之后,它会调用complete()函数,一旦它调用这个complete函数,那么刚才睡眠的这个进程就会被唤醒.这样就实现了一种同步机制,或者叫等待机制
代码用法如下:
struct completion urb_done;
/* set up data structures for the wakeup system */
init_completion(&urb_done);
设置定时器后
198 /* wait for the completion of the URB */
199 wait_for_completion(&urb_done);
使进程休眠
用completion();函数去唤醒,这个函数在usb_fill_control_urb()中的入参里面可以看到;还记得在调用usb_fill_control_urb()填充 urb的时候咱们设置了一个urb->complete指针吗?当时咱们就看到了,urb->complete=usb_stor_blocking_completion,这相当于向usb host controller driver传达了一个信息.,当urb传输完成了之后,usb host controller会唤醒她,但不会直接唤醒她,而是通过执行之前设定的urb的 complete函数指针所指向的函数;
16、 usb_stor_clear_halt函数讲解
Halt是endpoint的feature; CLEAR FEATURE那是所有的usb设备都通用的,它是usb spec所规定的
实际上usb spec 规定了,对于设备的bulk端点,每当设备在reset 之后,需要清除halt这个feature然后端点才能正常工作;
注释里说得很清楚,有些变态的设备,它就是不跟你按常理出牌,人家能正常响应GetMaxLUN这个request,它偏要耍个性,就是不认spec,你发送GetMaxLUN请求过来,它不予回复,它出现STALL的特点,
什么是STALL?
其实就是Halt,端点挂起,或者通俗一点理解,就是死机了.,毫无疑问,我们要把这个halt给清掉,否则设别没有办法工作了.
拥有帝国一切,皆有可能。欢迎访问phome.net 本文出自 “Paul玩嵌入式Linux” 博客,请务必保留此出处http://zyg0227.blog.51cto.com/1043164/550307 拥有帝国一切,皆有可能。欢迎访问phome.net |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于读Linux那些事儿之我是U盘笔记(三)的所有评论