3.USB详解(枚举)

1.简介

  枚举就是主机获取从机的信息(各种描述符)用来加载不同的驱动,告诉主机要怎么控制、通信,主机检测到从机上线之后会进行枚举的流程,枚举在USB中最重要也最复杂,前面说到USB传输有四种模式,控制传输最繁琐但能够保证枚举的正确性。

2.描述符

  USB1.1中标准描述符有设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)、字符串描述符(String Descriptor),USB中描述符是层层递进描述设备的,设备描述符->配置描述符->接口描述符->端点描述符,一个USB设备只有一个设备描述符,设备描述符里决定了该设备有多少种配置,每种配置都有一个配置描述符;在配置描述中定义了该配置有多少个接口,每个接口有一个接口描述符。在接口描述符中定义了该接口有多少个端点,每个端点都有一个端点描述符。一个端点不可以存在于相同配置的不同接口中,因为端点相当于资源,不能够同时使用。主机先获取设备描述符,然后获取配置描述符,根据配置描述符中的长度,可以把剩余的描述符(接口、端点)全部获取到,各种描述中可能有个字符串索引,主机可以通过这个索引来获取字符串描述符。
  设备描述符定义了USB协议版本、设备类型、端点0最大包长、厂商id、产品id、字符串索引和配置数。(注:USB改动一些驱动或者参数的时候最后是卸载掉全部驱动,因为设备描述符中厂商id、产品id还是一样会有意想不到的问题)。配置描述符定义了除了设备描述符的总长度(配置、接口、类描述、端点)、接口数量、配置序号、字符串索引、属性。(在配置描述符中有总长度,读完配置描述符之后就可以一次性读出剩余的描述符)。接口描述符定义了接口序号、可选配置、端点数、类型、字符串索引。端点描述符定义了端点地址、属性、最大包大小、轮询间隔。

3.枚举流程

3.1 USB设备请求

  USB定义了一个设备请求,在枚举的过程中通过标准请求与设备通信。
设备请求格式如下所示:
在这里插入图片描述
标准请求有如下所示:
在这里插入图片描述

3.2 流程

1.主机检测到USB设备插入后,对设备进行复位,复位之后读取设备描述符(使用地址0),如果端点大小小于18(标准描述符大小)则只发一次(即8字节)。
2.主机对设备又一次复位,对设备进行地址设置。
3.主机再次获取设备描述符,这次需要获取全部(18字节)。
4.主机获取配置描述符,先获取9字节的配置描述符,然后就可以得到除设备描述符的描述符长度,一次性获取。
5.主机获取其他描述符,例如字符串描述符、hid有报告描述符。

4.枚举伪代码(从机)

//控制传输流程
void usb_control_transmit()
{
	usb_ctl_req req;
	static int state;
	
	if(state == 建立过程){
		//读8个字节长度请求
		usb_read_ep0(&req, 8);
		
		switch(req.bmRequestType & 0x1f){
			case DEVICE:
				SET_ADDRESS:
					结束流程,没有数据过程;
					break;					
				GET_DESCRIPTOR:
					设备、配置、接口描述符;
					state = 数据过程;
				break;
				
			case INTERFACE:
				break;
				
			case ENDPOINT:
				break;
		}	
	}else if(数据过程){
		发送数据/接收数据;
		数据发送完成/接收完成结束;
	}
}

5.参考文档

usb官网:https://www.usb.org/
usb_20.pdf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值