通用串行总线USB(Universal Serial Bus)是现今最为流行的计算机接口,它是一种快速、双向、同步、可动态监测的串行接口[1]。目前大多数的USB设计都是经过系统集成,采用现成的商用USB芯片进行开发,并没有涉及到IP(Intellectual Property)核的设计与开发。在SoC(System on Chip)开发中可以利用已有的IP核开发成果,缩短系统芯片的设计周期,提高效率。本文通过分析USB2.0协议,实现了一个无需外置MCU(Micro Control Unit)的USB2.0设备控制器IP核,并进行了FPGA验证,可用于SoC的集成中。
1 USB2.0设备控制器系统设计
目前USB2.0设备控制器广泛使用的系统架构是串行接口引擎SIE(Serial Interface Engine) +MCU模式,SIE负责解释USB协议层的动作[2]。一方面,SIE模块将主机发送的信息解释成后端功能设备能够识别的信息;另一方面,将功能模块相关数据按照符合USB协议的格式发送给主机。这种传统的USB设备控制器设计核心是针对事务(Transaction)和信息包(Packet)的处理。对于关键的控制传输,则需要外置单片机和固件的辅助,因为这种传统的USB设备控制器不能独立完成USB与主机通信过程中最核心的枚举过程。
本文使用硬件电路代替传统单片机实现MCU和固件的功能。整体框架如图1所示,图中实心箭头代表应用与主机之间的数据流。
采用Top-to-Down(自顶向下)的设计结构将USB设备控制器划分为以下主要功能模块:
(1)Init模块:实现UTMI协议(USB 2.0 Transceriver Macrocell Interface(UTMI) Specification)的相关细节,主要用于控制总线挂起/恢复模式与速度模式的切换。
(2)Packet模块:对接收到的USB格式的信息包进行处理,提取其中的数据,检验CRC;对发送的数据进行封装,添加CRC检验位。
(3)Transaction模块:对USB定义的基本事务(transaction)类型(如IN、OUT、SETUP和PING等)按照协议规范处理。以上模块实现SIE的功能, 其事务处理流程如图2所示。
(4)Serial模块:例化调用其他模块,同时对传输过程中的错误进行处理。
(5)Descriptor ROM和Control模块:完成枚举过程中的控制传输。
2 硬件电路代替MCU和固件
2.1方案分析
微控制器的主要功能是负责执行固件框架程序,协助完成 USB的控制传输。这一部分可以用单片机或者硬件电路实现,目前常用单片机实现,优点是设计简单、灵活;缺点是单片机的速度比较慢,远远低于硬件电路。
使用硬件电路实现虽然设计复杂而且灵活度不如单片机,但它的优点是:(1)降低协议开销,从而得到更快的传输速度;(2)降低用户使用开发周期,因为使用硬件电路实现MCU功能,省去了后期固件和驱动程序的开发;(3)不使用单独的单片机,显著地降低了成本。
2.2 MCU和固件功能模拟
本设计中Descriptor ROM模块用于存储控制传输协议中需要用到的各种描述符,模拟枚举过程中固件的功能。例如18 B的设备描述符定义如下:
constant desc_dev: byte_array(0 to 19) := (
X"12", -- bLength = 18 bytes
X"01", -- bDescriptorType=device descriptor
X"00",
X"02", -- bcdUSB = 2.00
X"02", --bDeviceClass=CDC
X"00", -- bDeviceSubClass = none
X"00", -- bDeviceProtocol = none
X"40", -- bMaxPacketSize0 = 64 bytes
VENDORID(7 downto 0), -- idVendor
VENDORID(15 downto 8),
PRODUCTID(7 downto 0), -- idProduct
PRODUCTID(15 downto 8),
VERSIONBCD(7 downto 0), -- bcdDevice
VERSIONBCD(15 downto 8),
X"01", -- iManufacturer
X"02", -- iProduct
X"03", -- iSerialNumber
X"01", -- bNumConfigurations = 1
X"00", X"00" ); -- 2 bytes padding
([注] byte_array是自定义的数组类型)
Control模块模拟MCU的行为,根据控制传输时主机请求的类型,在Descriptor ROM中选择相应的描述符返回给主机。为了精简工作流程,设计中按照“在保证传输正确的基础上尽量减少中断”的设计原则[3],实现了设备控制器最大限度精简指令。根据USB2.0规定的标准设备请求的结构, Control模块的主要工作流程图3所示。
Control模块代码的结构主体是一个三重状态机。图3是Control模块简化流程示意图, 没有标出差错处理机制和其他细节。控制传输中,主机发送数据域长度为8 B的请求,当Transaction模块检测到Setup类型传输时,通知Control模块,Control模块检测识别标准USB请求的8 B数据,进行相应操作(如SetAddress、GetDesciriptor和GetConfiguration)。按照主机发送8 B请求的顺序,核心处理步骤如下:
(1)检测bmRequestType字节,bmRequestType的D6~5位为00代表USB协议定义的标准请求(bRequest)。(2)检查bRequest字节,USB支持11类的标准请求,此步骤可以确定请求的描述符类型。(3)检查wValue域(2 B),低字节表示索引号,用来选择同一种描述符(例如字符串描述符和配置描述符)中具体某个描述符;高字节表示描述符的类型编号。(4)检查wIndex域,在获取字符串描述符时表示字符串的语言ID号。(5)最后检查wLength,表示数据过程(如果有时)所需要传输的字节数。
当Endpoint(端点)寄存器为“0000” (表示控制端点)且内部Dscbusy寄存器为‘0’(控制传输,但请求的不是描述符)时,选择发送给主机的数据是代表当前的Device(设备)、Endpoint和Interface(接口)状态的数据;当Endpoint(端点)寄存器为“0000”(表示控制端点)且Dscbusy寄存器为‘1’时,选择wValue确定的描述符发送给主机;其他情况发送的是来自应用系统(Application)的数据。
2.3 错误检测和处理的改进
USB规范中列出了种类繁多的错误的产生及其相应的检测恢复方法。对于传统的SIE+MCU系统,传输过程中发生的任何错误都向外部MCU提出中断,固件对规范中的错误类型应有处理及恢复机制[4]。例如Host发出 IN令牌包接收到数据以后,必须及时地返回握手包,否则超时。超时后,MCU马上产生中断并选择在下一个IN令牌包来时重传上一次数据。这种处理的缺点是中断频繁、效率比较低。本设计中没有使用MCU,对错误的检测和处理均是在设备控制器内部进行。由于省去了中断请求与处理的延时,对传输过程中发生的错误能够得到高效的处理。例如对上述所提到的错误,Serial选择在下一个IN令牌到来时自动重传上一次数据,且最多尝试3次,如果问题依旧存在,作为线路故障处理。这种处理方法能够充分发挥硬件电路的高速优势。
3 系统仿真与FPGA验证
在验证过程中,利用事务模型建立USB虚拟主机和应用模型完成系统功能仿真,然后综合代码、设置引脚、自动布局布线后下载到FPGA内验证。本文选用Cypress公司的CY7C68000芯片作为前端的收发器(PHY)和Xilinx公司的Spartan-3E(XC3S500E -4PQ208C)芯片制作的 FPGA开发板作为验证USB设备控制器IP核的平台。XC3S500E系统门数达50万,可提供高达340 MHz的内部性能。
枚举过程属于控制传输,一般分为3个阶段,以Get_descriptor为例,过程如下:
(1)建立阶段:如图4所示,USB主机首先发送来一个SETUP令牌包,PID为0x2d,设备地址为0x00,端点0x00(控制端点)。后面紧跟一个DATA0的数据包,PID为0xc3,后面的数据0x80、0x06、0x00、0x01、0x00、0x00、0x12、0x00表示这是一个Get_Descriptor标准设备请求的数据包。其中PHY_TXVALID、 PHY_TXREADY、 PHY_DATAOUT是符合UTMI定义数据发送接口信号,PHY_RXVALID、PHY_RXACTIVE、PHY_DATAIN是符合UTMI规范的数据接收接口信号。
(2)数据阶段:主机发出一个IN包,如图5所示,PID为0x69,设备收到IN包后用数据包DATA1(PID为0x4b)返回自己的设备描述符,与前面定义的18 B设备描述符数据一致。主机收到正确的数据包后返回一个ACK握手包(PID为0xd2),表示接收正确。
(3)状态阶段:主机发出OUT包,但与数据阶段不同,状态阶段所发数据包内容为空。设备成功收到数据包后应答ACK握手包。
本文实现了一种有别于传统的MCU+SIE方案的USB2.0设备控制器IP核设计。使用硬件电路代替单片机实现MCU和固件功能,显著地降低了系统硬件规模和实现成本。同时简化了错误检测和处理的流程,有利于进一步提高USB传输速度。FPGA验证表明,该方案实现的USB2.0设备控制器IP核有效可行,可以进一步完成ASIC设计,使之作为独立模块添加到SoC系统中。
参考文献
[1] USB Implementers Forum, Inc. Universal serial bus specification(Rev 2.0)[EB/OL]. (2002-04-xx)[2013-01-24]. http://www.usb.org.
[2] 陈亮,袁志坚,史大龙,等.内嵌8051的USB2.0设备控制器IP设计[J]. 微型机与应用,2012,31(17):28-30.
[3] [美]AXELSON J. USB开发大全[M]. 李鸿鹏, 郑瑞霞,陈香凝,等译. 北京:人民邮电出版社, 2011.
[4] 黄卫华,朱向东, 沈绪榜.一种高速USB设备控制器IP核的设计与实现[J]. 微电子学与计算机, 2005,22(5):106-109.