赞
踩
当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()。也
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。