usb外设控制器固件的设计
- 格式:pdf
- 大小:307.60 KB
- 文档页数:5
USB 外设控制器固件的设计衣晓峰① 苏彦锋② 周荣政 洪志良 摘 要 本文讨论了U S B外设控制器中固件的设计和实现,重点研究了用单片机实现U S B 高层通信协议,同时提供了利用C 语言进行U S B 外设控制接口编程时的一些基本考虑,其中主要涉及到U S B 规范中描述主机和外设在应用层进行通信的部分。
经系统验证后,本设计既可作为特定应用实现,也可以作为其他设计时的模板。
关键词 U S B M CU 固件一、前言U S B (U niversal Serial Bus ),即“通用器串行总线”,是由Compaq 、Inter 、M icros oft 、N EC 等几家著名公司共同提出的用于外部设备接到主机的外部总线结构。
它同时又是一种通信协议,采用基于令牌的主机查询方式完成主机(Host )与U S B 器件之间的数据传送,由于任何数据传送的主动权都在主机一侧,这就将整个外设系统最复杂的部分交给了主机,从而简化了U S B 外设的结构,降低了生和设计成本。
同时,U S B 器件是在微控制器的控制下完成U S B 协议的,因此它作为一种智能接口支持器件的“热插拔”。
此外,为了降低U S B 系统数据传送的误码率,U S B 还引入了诸如P I D 检错、CRC 校验、流量控制以及自动重发等功能,使得U S B 系统非常健壮(其误码率低于10-10)。
基于上述种种原因,U S B 接口越来越受用户亲睐,现在市场上已经有多种使用U S B 接口的产品,如打印机、数码相机、读卡机,等等。
而且U S B 2.0协议也已经推出,它将原先最高数据传输速率从12M bp s 提高到480M bp s ,大大弥补了U S B 1.1传输速率较低的缺点,使得U S B 的应用更加广泛。
现在市场上主流的U S B 器件主要依据U S B 1.1规范[1]用微处理器(M CU )来控制U S B 底层电路以实现完整的U S B 协议功能。
本文重点介绍U S B 控制器中固件的功能及其实现和验证。
由于固件的开发强烈的依赖于U S B 底层电路的结构和器件的选择,因此在介绍固件之前首先介绍一下所选用的U S B 器件底层电路的结构,并且又由于固件同时与和主机端的U S B 驱动程序和客户应用程序通信,因此固件的设计和验证实际上涉及到U S B 系统的各个方面,其中主要包括两个方面:固件与硬件相结合的设计以及固件与U S B 驱动程序相交互的设计和验证。
以上描述了U S B 外设的一些特点,本文第二部分简要说明U S B 底层电路的结构框图以及各模块的功能,第三部分将详细阐述固件的设计,第四部分简要介绍主机端U S B 驱动程序的编写,最后将介绍一下对U S B 固件的验证及其结果。
二、基本体系结构按照U S B 规范[1],整个外设接口部分通常分为三层:总线接口层,设备层,和应用层。
总线接口层实现依赖于物理连接的串行通信,设备层实现U S B 器件的逻辑功能,主要是利用缺省管道(D efault P i pe )和Host 端的操作系统进行通信,完成器件的动态配置。
功能层则是利用某一特定接口中的相应管道完成特定的传输任务,如图像数据,键盘输入等,它的通信对象一般而言是Host 端的客户软件,它的工作方式是通过微控制器中的固件具体实现U S B 1.1规范第9章的相关内容。
由上所述,整个U S B 外设接口按照数据流向可划分为图1所示的结构。
通常情况下有两种可以选择的方案,它们的区别主要在功能控制器的实现上,一种是利用微处理器实现,另一种是采用A S I C 电路实现。
用A S I C 实现的好处是处理速度快,集成度高,但是由于其逻辑十分复杂造成开发风险大、周期长,而且不利于升级和移植、以及根据用户的要求改变功能。
用微处理器实现则可避免这些问题,但其处理速度相对较慢,集成度低。
由于U S B 协议包含了通信过程中的流量控制,所以可以使用一般的通用微处理器来实现功能控制器,因而就需要合理的固件设计。
在主要的通用U S B 外设芯片中,一般采用两种集成形式,即外设接口和微处理器集成在一起的芯片和不包含微处理器的外设芯片。
这两种方案对于固件的设计并没有太大的区别,只是考虑到在初期开发阶段的成本和验证方便,我们采用了两者分开的形式。
其中外设芯片采用PH I L IPS 公司的PD I U S BD 12,微控制器采用比较常见的A TM EL 89C 52,这样有利于固件开发过程中的不断修改和重新烧录[5]。
①②苏彦锋 复旦大学集成电路设计实验室 上海 200433衣晓峰 复旦大学集成电路设计实验室 上海 200433固件的设计主要应用U S B外设接口芯片的状态和控制命令。
这些命令可以分为三类:初始化命令,数据流命令和通用命令。
它们的具体格式可参照器件手册[2]。
器件状态是固件对U S B外设进行控制的主要依据之一,它主要分为上电状态(Pow ered),预置状态(D efault),地址状态(A ddress),配置状态(Configured),挂起状态(Sus pended)。
状态转换之间的详细描述可参见U S B规范,此处不再详述。
所有U S B器件都应响应Host通过默认信道发来的请求(request),Host通过这些请求来控制数据的传送。
这些请求主要包括:C lear Feature,Get Configurati on,Get D escri p tor,GetInterface,Get Status,Set Feature,Set A ddress,SetConfigurati on,Set Interface,具体命令的格式请参阅U S B1.1规范。
三、固件的设计U S B器件是在微控制器的控制下与Host进行通信的,其简要过程是:当U S B外设接到Host上时,Host先复位U S B器件,然后通过U S B器件的缺省信道向Endpoint0发送命令和数据,发送的数据以Packet的形式写入器件的Buffer,当Buffer被写满或数据发送完毕后,U S B接口电路发出中断信号,微控制器响应中断后读入Buffer中的内容,并根据接口电路中状态寄存器的状态进行相应的处理。
当Host发送过来的命令中要求U S B器件发送数据时,微控制器就根据命令将Host所需的数据写到U S B器件相应的Endpoint的Buffer中去,同时利用命令寄存器通知底层电路数据有效,等待主机将数据取走。
以上是数据收发的基本过程,同时为了支持“即插即用”,在U S B器件与主机完成连接后,U S B器件必须按照协议响应Host发送过来的命令,完成对U S B器件的配置。
固件主要实现以下功能[3]:1)收发数据缓冲区的管理;2)通过对Host的响应进行U S B器件的配置;3)管理实际的功能应用(如大量数据的传送)。
为了便于固件的维护和移植,固件可设计为基于中断查询和响应的层次式结构(如图2所示)和采用单片机的C语言编程[4]。
硬件抽象层完成微处理器与U S B器件底层电路之间的数据通信工作,它主要依赖于U S B底层电路的结构和微处理器的类型。
U S B器件接口包含了控制U S B器件的各种命令寄存器,获得U S B器件和状态寄存器以及一些参数寄存器。
固件是通过对U S B器件命令寄存器和状态寄存器以及一些参数寄存器。
固件是通过对U S B器件命令寄存器和状态寄存器的读写来指示U S B器件完成协议功能的;中断服务程序用于及时响应Host发送过来的各种令牌,接收和发送相应的数据、配置信息,并设置事件标志以通知主循环程序进一步的处理。
U S B标准器件请求和用户自定义函数中包含有U S B标准器件请求函数和实际应用的客户应用函数,通过对种种请求函数的调用来响应Host发送来的命令,以完成U S B协议功能;主循环通过查询事件标志调用相应的处理函数(包括U S B标准器件请求函和用户自定义函数)。
1.循环程序在进行中断响应时,通过主循环查询此次中断的类型,以调用相应的处理函数。
当从Host对收到的数据据类型为Setup Packet时,主循环程序根据Host发来的标准器件请求调用相应U S B.1协议第九章的标准器件请求函数,以完成Host对U S B器件的配置。
若希望响应用户自定义的请求,则应先定义好Setup Packet中各个字的含义(必须与驱动程序定义的相一致),然后将用户自定义的函数加入的相应的V endor R equest的函数的调用之中。
以便固件能根据用户的要求来完成对用户自定义的调用。
主循环函数的另一个功能就是完成对U S B器件的初始化设置。
主循环程序的流程图见图3。
2.中断服务程序(I n terrupt Serv i ce Routi n e)在U S B器件引起M CU中断以后,固件首先读取中断寄存器的内容以确定是哪一端口引起的中断,然后再调用相应端口的中断服务程序,完成每一次中断的数据传送并将相应的中断类型标志置“1”。
对于支持DM A传送的U S B系统来说,其主端口中断服务程序只需清除中断标志即可。
中断服务程序的流程图见图4。
图5、图6分别为各个端口(Endpoint)对应的处理程序,Control O ut端口的处理程序(Control RXhandler Subroutine)用于接收Host发送过来的器件请求以及用户请求,Control In端口的处理程序(Control TX handlerSubroutine)用于完成向Host传送有关U S B器件的描述字、版本号等信息的功能。
3.标准器件请求函数在与Host通信时,U S B器件是通过固件对标准器件请求函数的调用来实现U S B协议的。
标准件请求函数对应于U S B协议定义的标准件请求,其主要功能是解析每种请求的数据格式和分析其对应的内容,以便做出特定的协议处理。
B器件命令函数固件通过对U S B器件命令函数的调用来实现微控制器对U S B底层电路的控制。
U S B器件歙命令函数完成对U S B器件命令寄存和状态寄存器的读写命令的抽象。
对不同的U S B器件,U S B器件命令函数集所包括的命令函数具体形式也有所不同。
5.硬件抽象层硬件抽象层是固件与U S B器件底层电路直接通信的物理层。
它包括两个函数:inportb(),outportb()。
它们完成对U S B器件底层电路中各个Buffer和寄存器的读写。
这两个函数根据外设芯片中的各个命令寄存器、状态寄存器、以及各Endpoint的Buffer的不同地址进行读写操作,一次写入或读出1Byte的数据,实现对上层软件的透明操作,便于在不同的外设芯片之间移植。