storage R&D guy.
全部博文(1000)
分类: LINUX
2015-05-29 14:42:18
原文地址:USB设备驱动开发-USB协议相关(一) 作者:visualfan
一、USB设备模型
USB设备模型从物理上分为两个部分:主机(host)控制端作为主机端,驱动的设备是USB Host Controller;外设端被称为设备端,驱动的设备是USB Device Controller。因此,USB设备驱动应该分为主机端驱动和设备端驱动两部分,只是由于USB协议的主从定位思想,从设备只需要响应主机控制器的请求,不能主动发起请求,通常所说的USB驱动都是指主机端的驱动程序。但近年来随着嵌入式设备的广泛使用,运行Linux系统嵌入式设备也需要通过USB协议与主机端通信,因此从设备端的Linux也需要进行USB设备驱动程序开发,为了避免和主机端的USB设备驱动开发混淆,就将运行Linux的从设备驱动开发成为USB gadget driver,进入与device driver区分开。
二、与驱动开发相关的USB协议规范
1. USB设备被分为三层:
usb host controller:最底层,也是总线接口层,负责传输和接收数据包;
usb core:USB核心层,Linux系统已经根据USB协议规范实现的通用接口。作为中间层,主要完成总线与设备上端点的通信,端点是数据最终的生产者和消费者,一个设备可以有多个端点。因此,这一层其实就是总线和端点的路由。
usb function:USB功能层,调用下层的接口实现不同的功能,如USB鼠标、USB键盘、USB话筒。通常的USB驱动开发指的都是这层的工作。
2. USB设备的状态和状态机转换
Attached:USB设备接入或拔出,USB协议规范只定义了USB设备接入时的状态;
Powered:USB设备的供电分为两种,从USB总线取电的称为总线供电,USB设备从外部取电的称为自供电。即时是自供电设备在插入前已经接通电源仍不能认为其处于Powered状态,只有插入Attached加电后才处于Powered状态;
支持两种供电模式的设备可以通过配置描述符来向主机报告它当前的供电模式。
Default:当设备处于Powered状态后,仍不能相应任何总线通信,只有设备手段总线的reset请求后,设备才能通过默认地址进行通信。设备被成功reset后,可以相应配置描述符请求并返回相应的信息;
Addess:在设备被reset后,每个USB设备将被分配一个独一无二的地址,USB设备在其挂起期间仍拥有这个地址。不论USB被分配了独一无二的地址或使用的默认地址,都能通过默认的通道(pipe,即每个设备的0号端点)进行通信;
Configured:在设备的功能被正常使用前,设备必须被配置。从设备端来讲,配置就是正常处理一个带有非0参数的SetConfiguration()请求。包括将每个端点的数据包默认类型设为DATA0;
Suspended:电源管理相关,在没有总线传输的一段时间后,USB设备将自动进入suspend状态。在suspend状态,USB设备自身维护它分配的地址和配置。当有一个总线激活信号后,设备从suspend状态返回。USB设备也可以支持远程唤醒(Remote Wakeup)来唤醒处于suspend状态的主机控制器,但需支持host可以使能或关闭这个功能。
3. 总线枚举
当一个USB设备接入或拔出时,主机需要通过总线枚举功能来管理设备的状态。当设备接入时,将采取下面的措施:
1. 当设备接入后,接入的HUB通过一个状态改变通道通知主机这个事件,这时USB设备处于Powered状态并且其连接的端口是disabled的;
2. 主机询问HUB这次事件的类型等信息;
3. 当主机了解这是个插入事件后,将enable设备接入的端口并等待100ms,让设备的供电稳定,然后向这个端口发出reset命令;
4. HUB执行这次reset操作,USB设备将处于default状态,同时可以从Vbus获取不超过100ma的电源。当前设备的寄存器和状态都被reset了,并且可以通过默认地址进行响应;
5. 主机将给USB设备分配一个独一无二的地址,设备将进入address状态;
6. 在USB设备获取独一无二的地址之间,通过默认地址的默认控制通道仍然可以访问,host获取设备描述符来决定默认控制通道的最大数据载荷;
7. 主机将从设备获取全部配置信息,从0到n-1的配置描述符,即设备所拥有的所有配置描述符;这将花费几毫秒;
8. 通过获取的配置信息来决定设备将被如何使用,主机将分配各设备一个配置值,这时设备处于configured状态同时所有的端点也就具有这个配置下的特性,USB设备也将获取在其所指定的配置中的电流值。设备处于可用状态了;