USB是主从模式,设备和设备,主机与主机之间不能连接,为了解决这个问题出现了USB OTG,同一设备在不同场合可以在主机或从机之间切换。
主机如何识别到有设备通过USB插入了?
插头的D+,D-下拉了15k电阻接到地,高速设备的D+上还接了上拉1.5k电阻,低速设备D-接了上拉1.5k,到时间插头一查到接口,有上拉的D+或D-就有电压了,电脑就知道有设笔还能分高速还是低速设备.
USB是通用总线,端口统一,设备却不统一,主机如何识别不同的设备?
对设备进行枚举,所谓枚举就是从设备读取一些信息,主机就知道是什么设备,如何通信,主机通过这些信息来加载合适的驱动.
枚举过程都是使用控制传输,控制过程是什么?
控制过程分为建立过程,可选的数据过程,状态过程
建立过程由主机发出,它开始于一个Setup令牌包,后面紧跟着一个DATA0包.
如果是控制输入传输,那么数据过程就是输入数据;如果是控制输出过程,那么数据过程是输出数据.如果在设置过程中,指定了数据长度为0,则没有数据过程.
数据过程后是状态过程,状态过程和数据过程数据传输方向相反;状态阶段用来确认所有的数据已经正确传输.
USB主机检测到设备后,先对设备复位,设备复位过,USB主机会对地址为0的设备发送获取设备描述符的标准请求.复位后所有和直接连接的设备地址都为0,这样主机就可以跟那么学刚刚插入的设备就可以通过地址0通信.
发送完获取设备描述符的标准请求?
先获取设备描述符,成功就返回设备一个0长度的状态包
然后设置地址,
然后再次获取设备描述符,
最后获取配置描述符,根据里面的配置集合长度,再获取配置集合。配置集合包括配置描述符,接口描述符,端点描述符等
最后有字符串描述符再获取一下
描述符之间的关系?
描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符
设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
端点是什么?
每个USB设备都有一个唯一的设备地址,设备地址是设备连接上的主机时,主机分配的.主机依靠这个地址对USB设备进行访问.但是在设备内部地址会被分的更细,设备会分出一些端点来,每个端点在设备都会有唯一的端点号,这个端点号是设计设备时给定的。如端点0,端点1等。一个设备最多可以包含16个端点,每个端点的地址为0-15。(网上也有说几十个的,有待考究)
其中每个端点地址对应一个方向。例如端点3-IN,端点3-OUT,这两个含义完全不同。但是需要注意其中的一个特殊端点--端点0,每个USB设备必须要有一个端点0,其作用为对设备枚举和对设备进行一些基本的控制功能,端点0也被称为控制端点。并且它与其他的端点还有一个不同之处在于端点0的数据传输方向是双向的,即端点0既可以给主机发送数据,也可以接收主机发送过来的数据,而其它端点均为单向。
虽然有16个端点,但通常我们只用到3个,如下:
1)、EP0:做传输配置和控制信息;
2)、EP1:做数据输入IN_EP;
3)、EP2:做数据输出OUT_EP。
注意:除了端点0,其余的端点在设备配置之前不能与主机通信,只有向主机报告这些端点的特性并被确认后才能被激活。
详细见:http://www.360doc.com/content/20/0313/08/69027866_898811010.shtml
每种描述符都有自己独立的编号,如下
#define DEVICE_DESCRIPTOR 0x01//设备描述符
#define CONFIGURATION_DESCRIPTOR 0x02//配置描述符
#define STRING_DESCRIPTOP 0x03//字符串描述符
#define INTERFACE_DESCRIPTOR 0x04//接口描述符
#define ENDPOINT_DESCRIPTOR 0x05//端点描述符
网友评论