gofayao
驱动牛犊
驱动牛犊
  • 注册日期2005-01-11
  • 最后登录2007-04-15
  • 粉丝0
  • 关注0
  • 积分210分
  • 威望21点
  • 贡献值0点
  • 好评度21点
  • 原创分1分
  • 专家分0分
阅读:16991回复:87

写了一点自己学习USB的感受,欢迎大侠指正...

楼主#
更多 发布于:2007-04-05 20:34
胡言乱语话USB

首先,要明白两个观点。第一,USB总线上所有的事务(数据流传输)都是由USB Host主动发起,而USB设备永远永远都是只是被动地接收然后处理USB Host发来的各种各样的命令(要求)。第二,中断是USB Host和USB设备之间的信令员,USB Host所有的要求都是通过这个信令员即中断来通知USB设备。
. 我们可以将整个USB数据通信过程看成是由一个一个的数据包构成,而这些数据包又分很多类,比如:令牌包,数据包,握手包,帧起始包。令牌包又分In包,Out包,Setup包。有一点我觉得对于刚开始接触USB的人来说,一定要弄清楚这么多包,哪些是由硬件自动来处理,哪些是要由驱动程序去处理的,如果这点没有弄清楚,写或者看驱动代码时往往会摸不着头脑.
下面通过分析USB Host读取USB设备描述符整个过程来说明这个问题:
 

图片:QQ图片20160618054436.png



1.上图中粉红色的Packet#表示是主机发出,设备接收包;淡青色的Packet#表示是设备发出,主机接收包。如果区分不了这两种颜色,可以根据箭头的方向来区分,“->”这个表示是主机发出,设备接收的包;”<-” 表示是设备发出,主机接收的包。
2.图中灰色的部分表示,这些包在写驱动的时候是不太需要关心的地方,但是要了解有这么一个过程,这些灰色的部分都是由硬件自动处理.
3.那设备驱动要做的是什么呢?就是根据设备产生的中断来读取、解析、回应相应的数据包,注意上图中土黄色和淡蓝色两个数据包。
4. 下面详细分析整个过程,以及设备驱动该干些什么?
1) 在控制传输阶段,任何一个传输都是由Setup包发起(Packet#96)
2) 当USB设备接收到这个包,并识别出这是一个Setup包时,USB设备会产生一个Setup中断,有的称之为控制端点/端点0中断,以便通知MCU主机有任务下来啦,准备开始做事啦,这个动作都是由硬件自动完成
3) 紧接着Setup包的是,USB主机下达给USB设备具体是什么任务了,我们可以认为这个过程几乎是和Setup中断同时完成. (Packet#97)
4) 既然发生了Setup中断,USB设备驱动就可以认为主机有命令下达,USB设备收到主机下达命令后,由USB设备驱动发送一个Setup应答包,表示说“长官,命令已经收到” &#61514;(Packet#98)
5) 设备已经接收到了主机的命令,那么USB设备驱动现在就要解析这个命令,来得知USB主机到底下达的是什么命令,在这里通过解析黄色数据 ” 80 06 00 01 00 00 40 00”可以得知该命令的意思是主机要求设备发送设备描述符,具体解析过程就是协议规范的内容了…
6) 既然USB设备已经成功得知了USB主机的命令是要发送设备描述符,那USB设备就赶紧去查找这些设备描述符在哪里?
7) 那驱动已经找到了设备描述符了,驱动是不是该把这个设备描述符发给USB主机呢?答案是No,No,No,原因就是开篇就提到的,所有的传输都是有主机主动发起,设备被动响应。现在虽然USB主机通知设备主机要设备描述符信息,但是主机目前并没有要求主机将这些信息发回去,所以,设备就算已经找到了描述符,也不能主动给主机发这些信息。打一个不太恰当的比喻,就好比一场足球比赛,教练让你”活动活动,准备上场”,现在你准备活动已经做完了,那你可不能立马就冲到场上去踢球,即使你活动完了,你还得等待教练的下一步指示,因为教练还得安排决定让谁下场,什么时候下场比较合适…. 等到教练说”上场吧”,那你就可以上场了… 好像比较扯了….哈哈 &#61514;
8) USB主机下一个IN包通知USB设备回应刚才的命令,相当于教练喊”上场”,当USB设备收到这个IN包时,产生一个IN中断来通知MCU,那这时表示设备收到了”上场”的命令了。(Packet#103)
9) 这时,USB设备驱动把找到的设备描述符发送给USB主机。(Packet#104)
10) 主机收到设备回应的设备描述符后,给设备发一个握手包,表示已经收到设备的回应包了。(Packet#105) 11) 接下来,USB主机会发送一个0字节的数据包来作为状态响应,并且设备发一个握手包来结束整个过程,这是由硬件自动完成. (Packet#108/109/110)
由此可见,在控制传输过程中,USB设备驱动比较关心的应该是4,5,6,8,9这些步骤,其他的差不多都由硬件自动完成了。
今天就写了这么多,有时间再写.. :)
追求卓越...
houhaijun
驱动牛犊
驱动牛犊
  • 注册日期2007-03-11
  • 最后登录2007-07-26
  • 粉丝0
  • 关注0
  • 积分640分
  • 威望65点
  • 贡献值0点
  • 好评度64点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-04-05 21:59
 希望继续写下去,很好,写的生动,最好把驱动程序的内容也写以下.
wjt810907
驱动中牛
驱动中牛
  • 注册日期2004-08-18
  • 最后登录2011-04-16
  • 粉丝0
  • 关注0
  • 积分86分
  • 威望409点
  • 贡献值1点
  • 好评度402点
  • 原创分2分
  • 专家分0分
板凳#
发布于:2007-04-06 09:20
不错的
mcu_boy
skysun2006
驱动牛犊
驱动牛犊
  • 注册日期2007-03-14
  • 最后登录2007-04-09
  • 粉丝0
  • 关注0
  • 积分160分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-04-06 10:40
赞一个
ppqqwe56
驱动牛犊
驱动牛犊
  • 注册日期2007-02-14
  • 最后登录2008-08-12
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-09 11:09
,多谢
heflying
驱动小牛
驱动小牛
  • 注册日期2005-07-24
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分607分
  • 威望67点
  • 贡献值0点
  • 好评度48点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-09 14:53
"USB主机会发送一个0字节的数据包来作为状态响应,并且设备发一个握手包来结束整个过程,这是由硬件自动完成. "这个动作是USB2.0协议规定的吗?
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-04-09 20:04
写的8错,多谢楼主
但偶跟楼上有同样的疑问,认为没有发送 packet 108 109 110
[url]http://sniper167.bokee.com[/url]
onizuka2070
驱动牛犊
驱动牛犊
  • 注册日期2006-10-18
  • 最后登录2007-08-07
  • 粉丝0
  • 关注0
  • 积分430分
  • 威望44点
  • 贡献值0点
  • 好评度43点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-09 22:48
哈哈,“胡言乱语”都把USB说得那么清楚啊,谢谢!顿悟~
daydream1
驱动牛犊
驱动牛犊
  • 注册日期2005-05-30
  • 最后登录2010-05-12
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望97点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-04-11 09:23
写的很好,谢谢!孔子曰:诲人不倦;希望楼主继续!!!
swordfish6
驱动牛犊
驱动牛犊
  • 注册日期2007-04-11
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分60分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-04-11 10:03
写得太好了
刚接触usb,还以为和串口一样交互
现在茅塞顿开了
驱网无线,快乐无限
xq20051221
驱动牛犊
驱动牛犊
  • 注册日期2007-03-27
  • 最后登录2010-03-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-04-11 14:26
牛啊,有没有打算建个qq群啊,我们找你啊
spxwh
驱动牛犊
驱动牛犊
  • 注册日期2005-07-06
  • 最后登录2009-11-07
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-04-12 12:36
好文!!!
yuanchengjun
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2008-01-08
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望9点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-04-17 09:38
好文!
AdolfGyeNyame
驱动牛犊
驱动牛犊
  • 注册日期2007-04-08
  • 最后登录2010-04-30
  • 粉丝0
  • 关注0
  • 积分113分
  • 威望42点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-04-17 17:40
还是好人多 ,呵呵。超级顶
jiaxin
驱动牛犊
驱动牛犊
  • 注册日期2007-04-26
  • 最后登录2007-05-11
  • 粉丝0
  • 关注0
  • 积分150分
  • 威望16点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-04-26 10:39
恩 恩  大侠 厉害!!
再继续说吧  我也是刚开始接触USB的 现在急需你这样的 人士帮助啊 !!
我是小强我怕谁!
chyan413
驱动牛犊
驱动牛犊
  • 注册日期2007-05-20
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-05-24 21:15
听君一席话,胜读十年书,实在是踏破铁鞋无觅处得经典之作!
学习
gloryice
驱动牛犊
驱动牛犊
  • 注册日期2007-05-28
  • 最后登录2008-12-07
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-05-28 10:21
精彩!期待下一篇~
imjacob
驱动牛犊
驱动牛犊
  • 注册日期2006-09-29
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望109点
  • 贡献值0点
  • 好评度88点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-05-28 21:41
好文章
mfzg
驱动牛犊
驱动牛犊
  • 注册日期2007-05-29
  • 最后登录2009-06-13
  • 粉丝0
  • 关注0
  • 积分90分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-05-30 09:39
"packet 108 109 "这些动作是USB2.0协议规定的,它是控制传输中的状态阶段.而且必需的这一个阶段,
驱网无线,快乐无限
xjtusdbzh
禁止发言
禁止发言
  • 注册日期2005-04-22
  • 最后登录2018-07-10
  • 粉丝1
  • 关注0
  • 积分-812分
  • 威望44点
  • 贡献值1点
  • 好评度124点
  • 原创分1分
  • 专家分0分
19楼#
发布于:2007-06-05 15:57
用户被禁言,该主题自动屏蔽!
上一页
游客

返回顶部