1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > USB协议与Windows USB设备驱动程序笔记

USB协议与Windows USB设备驱动程序笔记

时间:2018-12-06 12:24:49

相关推荐

USB协议与Windows USB设备驱动程序笔记

USB概述

USB主控制器负责数据处理,USB根集线器(ROOT HUB)提供一个连接USB主控制器与USB设备之间的接口和通路。USB集线器(USB HUB)可以对原有的USB端口在数量上进行扩展。一个USB主控制器下面一定有一个USB根集线器,而USB根集线器下面可以有0个或多个USB集线器或USB设备。多个USB设备共享一个USB主控制器的带宽。所以一个USB根集线器下面连接了多个USB设备的系统,与一个USB根集线器下面只连接了一个USB设备的系统相比,后者USB设备将工作地更快。USB集线器中包括上行端口和下行端口(也称上游端口和下游端口),上行端口连接主机或集线器的下行端口,下行端口连接USB设备或集线器的上行端口。USB设备地址是7位,理论上一个USB主控制器下面可以接128个USB设备,地址范围为0~127,其中地址0作为刚接入系统的USB设备的默认地址。

一个具体的端点,只能工作在一种传输模式下。通常把工作在什么模式下的端点,叫做什么端点。例如,控制端点,批量(bulk)传输端点等。

USB一次传输(如一次bulk读)包括1个或多个事务,1个事务包括3个包:令牌包、数据包、握手包(等时传输没有)。USB传输包括控制传输、批量(bulk)传输、中断传输、等时传输。一次控制传输分为3个过程:建立过程、可选的数据过程、状态过程。这里只提建立过程和状态过程。建立过程为一个事务,其令牌包的类型为SETUP,数据包类型为DATA0,握手包类型为ACK(出错则不应答,而不能使用NAK或STALL来应答)。状态过程为一个事务,其令牌包类型为IN或OUT,其数据包类型为DATA1。低速和全速USB每隔1ms传输一帧,高速USB每隔125us传输一帧。每个帧以PID为SOF的令牌包作为起始包。每个帧可以容纳多个事务,注意事务中的令牌包的PID只能是IN、OUT或SETUP。

Windows USB设备驱动程序

USB设备驱动程序高度依赖USB总线驱动程序(在Windows系统中USB总线驱动程序是USBD.sys),而不直接使用HAL函数与硬件通信。USB设备驱动程序为了向其硬件设备发送一个请求,首先创建一个USB请求块(URB),然后把URB提交到USB总线驱动程序。例如,为了配置一个USB设备,USB设备驱动程序需要提交几个URB来读取各种描述符或发送命令,最后由总线驱动程序把请求送到总线上。

USB主控制器与其它I/O设备接口一样直接连接到系统总线(PCI总线)上。操作系统与USB主控制器通信使用I/O口或内存寄存器(即USB主控制器映射到I/O空间或内存空间,CPU通过I/O指令或内存访问指令与USB主控制器通信),通过普通的中断信号,系统可以接受USB主控制器的事件通知。USB主控制器连接一棵USB设备树。一种称为hub的设备作为其它设备的连接点。多个hub能以菊链方式连接,可以连接到USB规范中定义的最大深度。其它设备,如照相机、麦克风、键盘等等,直接连到hub上。为了精确地表达概念,USB使用术语function来描述非hub设备。

当一个USB设备第一次接入时,它使用默认的设备地址(为0)。然后,某个电子信号通知USB总线驱动程序有一个新设备插入总线,于是USB总线驱动程序找出一个未用的设备地址并发送一个控制事务告诉“0号设备”什么才是它的真实地址。这之后,设备就放弃使用默认地址0,而用真实地址来应答。

当客户程序通过USB管道发送或接收数据时,它首先调用Win32 API,调用最终将使function的驱动程序(即USB设备驱动程序)收到一个IRP。而驱动程序的工作就是把客户的请求引导到有正确端点的管道上。它把请求提交到总线驱动程序,总线驱动程序再把请求分解成多个事务(transaction),然后这些事务被送往总线。

与传统PC总线(如PCI总线)设备的驱动程序相比,USB设备驱动程序从不直接与硬件对话。相反,它仅靠创建URB(USB请求块)并把URB提交到USB总线驱动程序就可完成硬件操作。因而,在USB设备驱动程序的IRP_MN_START_DEVICE处理函数中,我们不需要写与硬件资源有关的代码,而只需要配置USB设备。

USB配置提供一个或多个接口,每个接口具有零个或多个端点描述符。接口描述符和端点描述符始终作为配置描述符的一部分返回,无法使用GET_DESCRIPTOR或SET_DESCRIPTOR请求直接访问接口描述符或端点描述符。接口可以包括备用设置(Alternate Setting),接口描述符中的bAlternateSetting字段用于在同一个接口中的多个描述符中进行切换,以实现在配置设备之后改变端点或它们的特性。接口的默认设置始终为备用设置0。

如果一个接口具有两个备用设置,则具有两个接口描述符。配置描述符后面是一个接口描述符,其中bInterfaceNumber和bAlternateSetting字段为0,然后是该设置的端点描述符,后跟另一个接口描述符及其关联的端点描述。第二个接口描述符的bInterfaceNumber字段也为0,但第二个接口描述符的bAlternateSetting字段为1。如下图所示:

如果接口仅使用端点0,则接口描述符后面不会紧接有端点描述符。在这种情况下,接口描述符中的bNumEndpoints字段必须设置为0。接口描述符永远不包括端点数量中的端点0。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。