usb驱动开发之USB协议枚举过程详解

当usb插入之后,主机是如何识别usb的,并且对它做了什么?这个过程专业术语就叫枚举。本文把usb的枚举过程通过文字、程序和图形三种形式描述出来,并形成对照。

 枚举过程之文字描述

         •主机集线器监视着每个端口的信号电压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15kΩ的下拉电阻,而每一个设备在D+都有一个1.5kΩ的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)

   • 连接了设备的 HUB在 HOST 查询其状态改变端点时返回对应的 bitmap,告知HOST 某个PORT状态发生了改变。 
   • 主机向 HUB查询该PORT的状态,得知有设备连接,并知道了该设备的基本特性。  
   • 主机等待(至少 100mS)设备上电稳定,然后向 HUB 发送请求,复位并使能该PORT。 
   • HUB执行PORT复位操作,复位完成后该PORT就使能了。现在设备进入到defalut状态,可以从Vbus获取不超过 100mA 的电流。主机可以通过 0地址与其通讯。 
   1 主机通过0地址向该设备发送get_device_descriptor标准请求,获取设备的描述符。目的是取得却缺省控制管道所支持的最大数据包长度,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,主机读取64字节,但实际不一定能读到,因为这时候还不知道一次能读取的最大长度,但是肯定能读到前8个字节,因为可能的值为(8,16,32,64).
   • 主机再次向 HUB发送请求,复位该PORT。 
   2 主机通过标准请求 set_address给设备分配地址。 
   3 主机通过新地址向设备发送 get_device_descriptor标准请求,获取设备的描述符。 
   4 主机通过新地址向设备发送其他 get_configuration请求,获取设备的配置描述符。

   5 根据配置描述符的wTotalLength字段(地址偏移为2,总共两个字节,即偏移地址3表示高8位,偏移地址2表示低8位),表示该配置描述符及其包含的接口描述符、端点描述符和供应商描述等的总长度。英文原文:Total length of data returned for this configuration.Includesthe combined length of all descriptors (configuration, interface,endpoint,and class- or vendor-specific)returned for this configuration. 再次发送get_configuration请求,获取数据长度为wTotalLength。

   6 根据配置信息,主机选择合适配置,通过 set_configuration请求对设备而进行配置。这时设备方可正常使用。

二 枚举过程之程序描述

这是uboot中usb_hub.c和usb.c中精简之后的代码,可以大致看出整个过程。文字描述中的1-6都有对应的函数,前面几项描述由于uboot和linux内核的实现稍有差别,就不列出来了,只简单描述,读者自己可以查看源码。uboot是通过在命令行usb start,调用到do_usb()->usb_init()->usb_scan_devices()->usb_new_device(dev)->usb_hub_probe()->usb_hub_configure()->usb_hub_port_connect_change()。也

  • 10
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值