《电子技术应用》
您所在的位置:首页 > 其他 > 设计应用 > USB协议浅析和USB设备设计简介
USB协议浅析和USB设备设计简介
姚成虎 王 磊
上海同济大学电信学院(200092)
摘要: 从实用的角度出发,对USB协议进行了简单的解释,并对实际设计USB设备时必须考虑的一些关键问题作了比较全面的讨论。
关键词: USB协议
Abstract:
Key words :
</a>

摘   要: 从实用的角度出发,对USB协议" title="USB协议">USB协议" title="USB协议">USB协议进行了简单的解释,并对实际设计USB设备时必须考虑的一些关键问题作了比较全面的讨论。
关键词: USB  端点  描述符

   USB(Universal Serial Bus)是近年来应用在PC领域的新型接口技术,它是由一些PC大厂商如Microsoft、Intel等为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种通用串行接口。USB接口具有许多优点,如接口简单、速度快、支持即插即用和热插拔等。本文从实用的角度出发,对USB协议和USB设备的设计(Windows环境下)进行了通俗的说明。由于USB协议的复杂性,许多具体问题不可能在一篇文章中讲清楚,所以本文只能起到抛砖引玉的作用。
1  USB协议的一些关键概念和问题的说明
1.1 USB主机和USB设备
  USB通信中居于核心地位的是主机(Host),常见的USB主机是PC机。任何一次USB的数据传输都必须由主机发起和控制;所有的USB外设都只能和主机建立连接;任何二个外设之间或是二个主机之间都无法直接通信。所以,USB主机和USB设备的功能是不同的。
  USB主机的功能有:(1)如果需要,通过USB接口给外设提供电源(因为外设也可以自带电源)。(2)检测和配置设备(即设备的枚举)。如:它必须检测出设备的连接和拔除,了解设备的功能,给设备分配地址等。(3)错误检查和管理数据的传输。这些由USB接口硬件保证,不必编程处理。(4)根据设定的传输方式与外设交换数据。
  USB设备的功能有:(1)管理电源。设备可以由USB接口获取电源,也可能有自己的电源。设备在USB接口无通信作用超过3ms后应进入低耗电的暂停状态。(2)检测通信。每一个设备都要检测通信信息包中的地址是否和本设备的地址相符,如果不符,设备就会忽略本次通信,这由USB接口硬件自动进行处理。在设备一开始连上USB接口时,使用固定的默认地址0,然后USB主机在检测阶段会给设备分配一个地址,以后的通信都按这个地址进行。(3)通信数据的错误检查。由USB接口硬件保证,不必编程处理。(4)响应请求。主机在检测到有设备连接上以后,会按USB协议发送相应的设备请求来了解设备的类型和能力,并对设备进行一些配置(如设定地址和配置描述符),设备应能响应这些请求,并返回相应的应答数据。(5)根据设定的传输方式与主机交换数据。
1.2 USB主机和USB设备之间数据的传输方式
  目前,USB协议规定了四种数据传输方式:(1)控制传输。主要用于主机对设备的检测和配置。(2)中断传输。用来支持那些偶然需要数据通信,但服务时间受限制的设备。中断传输常常用在键盘、鼠标和游戏杆等设备上。(3)批量传输。适合使用在时间不重要的场合。批量传输可以传输大量的数据而不会阻塞总线,因为它会让其他类型的传输先执行,以等待可以传输的时间,如用于磁盘操作。(4)同步传输。适合用于以固定速率进行的传输,而且可以容忍偶尔的错误,如实时语音传输。
1.3 设备的端点
  任何的数据传输都是传递到一个USB设备(确切地说是USB接口器件)的端点(Endpoint),或是由一个USB设备的端点发出。可以把端点简单地理解成USB接口器件中的一个缓存器,用来作为数据的缓冲区,它由相应的控制寄存器和状态寄存器来管理。储存设备端点中储存的可能是接收到的数据,也可能是等待要送出的数据。主机也有接收与传送数据的缓冲区,不过主机并没有把它定义成端点,而是当作与设备端点通信的出发点(Starting Point)。一个USB设备可能有好几个端点,每个端点可以设置成输出或输入方向以及控制、中断、批量或同步传输方式中的一种。因为主机一开始是通过端点0来检测和配置设备的,所以每个设备都必须有一个端点0,而且其传输方式必须是控制传输(一般USB接口器件默认支持)。除此之外,设备很少需要其他的控制端点。USB协议定义了11个标准请求命令,用于在端点0以控制传输方式来检测和配置设备。
1.4 设备的描述符
  USB主机是通过请求USB设备的一系列描述符来获取设备的信息的。描述符是一种定义好的数据结构,其中可能包含整个设备的信息,或是设备中的一个组件的信息。主机请求描述符,设备回复描述符。目前,USB协议定义了三种类型的描述符:(1)标准类型。用于提供设备的基本信息。标准类型的描述符主要有:设备描述符、配置描述符、接口描述符、端点描述符以及字符串描述符等。(2)设备类别特定描述符。用于提供设备更详细的信息。如HID类(人机接口类)设备的类别特定描述符中的HID描述符和报表描述符,就可以用来描述设备究竟是一个鼠标还是一个键盘。如果是鼠标,则报表描述符的数据就是鼠标的按键和位移。(3)厂商特定描述符。也是用于提供设备的一些更详细信息,不过它是由厂商自己定义的,不像设备类别特定描述符那样是USB规范定义的。标准类型的描述符如图1所示。下面介绍其中5种常用描述符,其他描述符请参考相关的资料。

  如图1所示,每个设备只能有一个设备描述符,每个设备描述符可以有多个配置描述符,每个配置描述符可以有多个接口描述符,每个接口描述符可以有多个端点描述符。字符串描述符(可选)定义了可能用到的字符串,其他的描述符可以根据字符串描述符中相应的索引值来引用相应的字符串。USB主机在一个控制传输的USB设置事务的数据信息包中,用GET_DESCRIPTOR标准请求(对应的请求码为0x06)来请求各种标准描述符;设备通过相应的字段识别出主机请求的到底是哪一种描述符,并返回相应的描述符和联络信号。这是USB设备的固件编程所要做的工作之一。
1.5 USB数据信息包的格式
  信息包(Packet)是USB传输数据组织的基本形式,其具体意义和实际内容通过相应的一系列字段来表示,有的字段在USB协议中有定义好的关键字。信息包的字段类型有:
   (1)SYNC字段,用于信息包的开始与同步,它由硬件自动处理。
   (2)PID字段,信息包标识符(Packet Identifier,PID),信息包共有四种类型:令牌、数据、联络和特殊,四种类型共对应16个PID码。
   (3)地址字段,用于指明USB主机究竟是要和哪个设备通信,设备的地址初始默认为0,主机会在设备检测阶段给设备分配一个地址。
   (4)端点字段,用于指明USB主机究竟是要和设备的哪个端点进行通信。如前所述,一个设备可以有多个端点。
   (5)帧号码字段,USB主机把USB总线上的实际数据传输按时间分割成一块块的帧(Frame)或微帧(Micro Frame)。对于全速和低速的设备,主机将传输分成1毫秒的帧,对于高速设备主机将传输分成125微秒的微帧。帧号码字段就是用于识别特定的帧或微帧,它由硬件自动处理。
   (6)数据字段,为实际要传输的数据。
   (7)校验字段,用于信息包的数据校验,它由硬件自动处理。
  下面对PID字段作进一步的说明,因为这个字段对于理解信息包的概念至关重要。USB协议规定数据传输由事务(Transaction)(事务的概念见1.6的介绍)组成,而事务由信息包组成。一般来说,大多数事务包含三个信息包:令牌信息包、数据信息包和联络信息包。信息包根据PID字段(USB协议定义了16个PID码)来区分不同的类型。令牌信息包有四种类型:
   (1)OUT,表示主机输出数据到设备;
   (2)IN,表示主机从设备读取数据;
   (3)SOF,表示帧标号开始;
   (4)SETUP,专门用于控制传输的设置事务。
   数据信息包和联络信息包也有各自的PID码,这里不再细述。其中,只有OUT、IN和SETUP类型的令牌信息包中需要指定地址字段和端点字段。这也容易理解,因为既然称为“令牌”,当然首先要确定和哪个设备以及设备的哪个端点进行通信。由此也可以看出,USB在数据传输中使用的是软件联络方式,所以大大简化了接口形式。而常用的RS-232串行通信还有一些硬件的联络方式,如RTS和CTS信号线。虽然RS-232串行通信中也可以使用一些简单的软件联络方式,如XON和XOFF码,但与USB的软件联络方式相比就显得太简单了。
1.6  事  务
  USB协议规范将事务定义为“将一个服务传送到一个端点”,这里的服务指的是主机传送信息给设备,或是主机从设备接收信息。每一个传输可以包含一笔或多笔事务,而每一笔事务可以包含一个、二个或三个信息包,可以把信息包理解为数据传输物理上的基本单位。大部分事务都包含三个信息包:令牌信息包、数据信息包和联络信息包。根据令牌信息包的PID标识,事务一般分为三种类型:输入(IN)事务、输出(OUT)事务和设置(SETUP)事务。每一种传输类型(控制、中断、批量以及同步)包含一个或多个阶段,而每一个阶段包含一个或多个事务。具体说来,在控制传输中,一般包含设置事务阶段(对应于设置事务类型)、数据阶段(对应于输入或输出事务类型)以及状态阶段(对应于输入或输出事务类型),而中断、批量以及同步传输中只包含数据阶段。这其中,设置阶段包含一个设置事务(由令牌信息包、数据信息包和联络信息包组成);数据阶段可能由多个事务组成,一般每个事务也是由令牌信息包、数据信息包和联络信息包组成的(只有同步传输的数据阶段的事务中不包含联络信息包);状态阶段包含一个事务,该事务也是由令牌信息包、数据信息包和联络信息包组成,不过数据信息包的内容为空,状态阶段只用于控制传输,以表明整个控制传输是否成功。
1.7 USB设备驱动程序的加载
  在主机从设备描述符了解到设备的信息后,它会寻找一个最合适的驱动程序来管理主机和设备的通信。在选择驱动程序时,Windows会试图将系统的.inf文件内的信息与从设备内读出的厂商和产品ID以及版本号作比较,如果相符,就根据相应的.inf文件加载驱动程序。如果Windows找不到合适的.inf文件,它会显示一个“添加新硬件向导”来让用户指定驱动程序。
2  USB设备的设计
2.1 USB设备的设计概述
  USB规范定义了许多设备类型,用不同的设备类别码和接口类别码来表示,如HID(Human Interface Device,人机接口类设备)设备类别码是0x00,接口类别码是0x03,HID类的设备有键盘、鼠标以及游戏杆等;Mass Storage(大容量存储设备)的设备类别码也是0x00,而接口类别码是0x09,Mass Storage类的设备有软盘、硬盘、光盘以及FLASH盘等;其他还有显示器类、通信设备类、音频设备类等。USB规范中还有一个特别的Vendor Specific类设备,用于厂商自定义设备类型,其接口类别码为0xFF。所以,设计者总是可以找到一种适合自己要设计的设备类型。
  设计USB设备时,首先要确定好设备到底属于哪个类别,然后要实现基本USB通信协议以及设备的类别通信协议。例如,U盘属于Mass Storage设备,所以设计U盘时,除了要实现基本的USB通信协议,还要实现大容量存储设备类规范中的UFI命令规范。由于Windows 提供了对Mass Storage 协议的支持,因此U盘只需要遵循Mass Storage 协议来组织数据和处理命令,即可实现与PC 机交换数据。一般来说,一个USB设备的完整设计过程主要包括四个部分:
   (1)USB硬件接口的设计;
   (2)设备固件的编程;
   (3)PC端设备驱动程序的开发;
   (4)PC端设备应用程序的开发。
2.2 USB硬件接口设计
  USB接口芯片一般有二种选择方案:(1)USB芯片本身就是一个微控制器,如Cypress的EZ-USB系列芯片,与8051兼容,大部分EZ-USB芯片支持最大数目的端点(一个控制端点0以及30个额外的端点)以及所有的4种传输方式;(2)USB芯片只处理USB通信,所以它必须由外部的微控制器来控制,如PLILIPS的PDIUSBD12,它符合USB1.1规范,包含默认端点0在内共有3个双向端点。
2.3 控制器的固件编程
  USB接口芯片收到数据或发送出数据后都会产生中断,所以固件编程的核心就是编写中断服务程序。这项工作主要就是根据相关寄存器的标志来对各个端点缓冲区的数据进行处理。可以把中断服务程序分为一些功能模块(函数)来考虑:(1)端点0的响应。当设备插上USB接口后,主机会发出一系列的请求给设备的端点0,设备的固件程序应该能在端点0对这些要求进行正确响应。(2)其他端点的数据通信过程。通过(1)主机就能知道设备端点的使用情况,以后就可以通过其他端点以设定的传输方式来交换数据。(3)实现设备类别遵循的协议规范。例如,如果要设计U盘,则U盘的固件程序就要实现对Mass Storage Class规范中的UFI命令规范的支持。
2.4 PC端驱动程序的开发
  在Windows内执行的USB设备驱动程序,必须符合Microsoft定义的Win32驱动程序模型(Win32 Driver Model,WDM)。它是一种分层的驱动程序模型。Microsoft提供了Windows DDK(Windows Device Developer′s Kit)工具和VC编译器来编写WDM驱动程序,具体请参考相关的开发指南。也有许多第三方的工具软件可以用来编写USB的WDM驱动程序,如Jungo 的WinDriver USB。使用这类工具软件不需要深入了解WDM的编程细节。
2.5 PC端应用程序的设计
   在Win32系统中,操作系统把每一个设备都抽象为文件,应用程序的设计只需要通过几条简单的文件操作API函数,就可以实现与设备的驱动程序通信。这类Win32函数有以下几种:(1)CreatFile函数,用于打开一个设备,返回一个与设备相关的句柄;(2)ReadFile函数,用于从设备中读取数据;(3)WriteFile函数,用于向设备写数据;(4)DeviceIoControl函数,用于对设备进行一些控制操作,如更改设置等;(5)CloseHandle函数,关闭一个由CreatFile函数所打开的设备,函数的参数为CreatFile函数返回的设备句柄。还有其他一些和USB设备类别相关的API,可用于获取设备的信息,如设备路径和名称等,具体请参考相关的开发指南。
3  结  论
   本文对设计USB设备所涉及到的一些关键问题作了比较全面和通俗的解释。鉴于USB接口具有的优点,可以想象USB设备必将获得越来越广泛的应用。
参考文献
1   萧世文.USB2.0硬件设计.北京:清华大学出版社,2003
2   周立功.PDIUSBD12 USB固件编程与驱动开发.北京:北京航空航天大学出版社,2003
3   马伟.嵌入式USB主机系统的研究与设计.计算机测量与控制.2003;11(5):381
 

此内容为AET网站原创,未经授权禁止转载。