注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载)U盘枚举过程  

2014-05-26 13:10:19|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

U盘枚举过程 发布时间:2014-05-22 18:53:25

技术类别:接口电路     个人分类:接口

浅析插到PC上的usb-U盘_生命的开始阶段[软硬]--枚举过程(gliethttp)


文章来源:http://gliethttp.cublog.cn[转载请声明出处]


对于插到pc主板usb接口上的usb设备,是怎样顺利的被pc识别的呢,这里有一个交互过程,需要由host和slave两端严格配合,

以U盘为例:

1)把U盘插到pc主板的USB接口,U盘内置软件将D+数据线拉高,以提示pc主板上的usb host主控制器,有USB设备接入,

  U盘固件驱动等待host发送reset复位信号.

  [注:gliethttp

   PDIUSBD12芯片采用SoftConnec技术,内置了软件指令,来开关D+数据线上的1.5k上拉电阻;

   AT91RM9200没有直接提供,需要一个io口专门控制DP(D+)上拉,进而完成与pc主机host的连接与断开.

  ]

2)host主控制器检测到D+数据线拉高之后,中断通知pc驱动,pc驱动控制host主机控制芯片,发送reset信号,复位这个准设备.

3)U盘的硬件检测到来自host主机的reset信号,中断通知U盘固件驱动,U盘固件驱动将usb通信硬件地址设置为0

  [注:gliethttp

   因为在没有被pc驱动软件通过host主机发送"设置地址"命令之前,U盘的usb通信硬件和pc驱动软件

   都是以0地址作为大家的通信基础地址.

  ]

4)pc驱动软件在她认为足够的复位时间之后,开始第1次发送"读取设备描述符"setup事务指令,

  对windows系统而言,第1次发送的"读取设备描述符"setup事务指令的数据长度域值为0x40,即:64字节,

  也就是说windows驱动会等待64字节的"设备描述符"的到来,她永远也等不到,因为"设备描述符"的大小规定,仅仅为18字节,

  而windows驱动故意多读取一些字节,目的在于让pc主板上的host主机控制芯片,因为指定的64字节长度

  不能在硬件规定的时间内到达,而使host主机控制芯片触发一个"超时"中断通知windows底层usb驱动,

  "超时"中断有两种情况引起:

  1>usb设备,如:U盘,确实没有按照协议,在IN事务中上发1个字节的"设备描述符",

  2>usb设备,如:U盘,发送了"设备描述符",因为u盘内置的usb控制器控制端点endp0,端点0的数据区大小为8字节

    或16字节或64字节,导致U盘的固件驱动相应的发送"设备描述符"的前8个字节、前16个字节或者18个字节全部发送完毕.

  windows被"超时"中断唤醒之后,windows驱动程序通过读取host主机控制芯片的寄存器获得,是否真的有数据从

  那个准usb设备,如:U盘,发送过来,如果真的有字节数据发生了传递,不管是8字节也好、16字节也好、甚至18字节也好,

  说明一点,这个准usb设备,真的就是一个usb设备,并且上发的最少8字节"设备描述符"中,第8字节刚好描述了

  usb设备,如:u盘,控制端点endp0端点0数据区大小,这为"地址设置"完成之后,按照正常的管道大小通信做了基础.

5)pc驱动软件确认接入的确实是一个usb设备之后,开始发送"地址设置"setup事务指令包,用地址0,

  给这个新接入的usb设备分配一个唯一的,在(0,127]范围内的地址.

6)usb设备,如:U盘,接收到"地址设置"setup事务指令后,将地址提取出来,将地址写入U盘的usb控制器,

  以后的通信,pc驱动程序和usb设备的嵌入式软件都将以该地址为目的地址,而不再使用0地址做通信地址.

7)现在pc驱动程序认为一切都正常了,usb设备的地址已经分配了,usb设备控制端点endp0端点0的管道大小也在第4)步中间接

  获得了,那么pc驱动程序就会以正确的端点0管道大小来切割收、发的数据了,

  pc驱动将第2次发送"读取设备描述符"setup事务指令,这次,pc驱动程序将严格按照控制管道端点0的数据

  缓冲区的大小来切割收、发数据包,并指定正确的接收长度:18字节

  举一个例子:

  假如usb设备,如:U盘,她在第4)步骤中,上传了自己真实的控制管道endp0端点0的缓冲区大小为8字节,

  那么pc驱动程序在第2次,即:此次,发送完"读取设备描述符"setup事务指令之后,pc驱动会根据这个8字节控制管道大小,

  切割接收数据次数,也就是IN事务的个数,(18+ (8-1)) / 8 = 3[gliethttp],所以在

  第2次发送完"读取设备描述符"setup事务指令之后,pc驱动程序将从usb设备中按8、8和2字节的大小,先后读取3次数据,

  也就是产生3次IN事务.

8)usb设备,如:U盘,收到"读取设备描述符"setup事务指令之后,把控制端点0收到的这个setup事务指令数据拷贝出来,

  解析出下一个事务所要传送的数据大小,同时根据bmRequestType&0x80的最高位来判断,下一个通信事务对pc[gliethttp]

  驱动host主机而言是用在OUT事务上,还是用在IN事务上,usb设备只要按照指定大小发送setup事务中指定的相应请求即可.

9)之后就是重复性工作了,"读取配置描述符","设置配置描述符"","读取接口描述符"","设置接口描述符"等等.


  评论这张
 
阅读(579)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017