摘 要:分析了USB主机端的层次结构,采用PowerPC8270处理器设计了一种基于PCI总线的USB主机端设备,简化了主处理器与USB控制器的交互。在VxWorks操作系统下进行了USB主机端驱动的设计和实现,并通过试验对USB主机端的功能和读写速率性能参数进行了测试验证。测试表明,能够稳定地支持对USB接口存储外设的读写访问。
关键词:USB主机;PCI总线;VxWorks
通用串行总线(USB)是一种用于连接计算机与外围设备的串行接口标准,具有结构简单、配置灵活、即插即用、支持热插拔、可靠性高、成本低等优点[1]。USB接口主机端为支持USB主机协议的计算机系统,在机载计算机领域,USB接口主机端一般为嵌入式的控制设备。USB接口主机端在USB总线上占控制地位,可以挂载USB外设,所有的USB接口传输事务由主机端发起,控制整个USB总线工作。
本文提出一种适用于机载计算机领域的USB接口主机端设计,采用PowerPC系列处理器作为USB主机端的控制器,基于PCI总线与USB控制器连接,构成基于PCI总线的USB接口主机端嵌入式设备。基于VxWorks操作系统完成USB接口主机端的驱动程序设计和开发,实现了一套完整的USB接口主机端软硬件产品。利用U盘作为USB外设,对所设计的USB接口主机端进行了测试和验证。结果表明,本文设计的USB接口主机端能够很好地支持与USB外设的USB通信访问和控制。
1 USB接口主机端分析
USB总线系统由USB主机、USB外设及USB互联总线三部分构成。USB主机作为USB通信主控设备,主动发起对USB外设的访问、控制及通信操作。USB总线作为一种标准通信协议,其主机端层次结构如图1所示[2]。
如图1所示,USB主机端采用分层结构,其层次包括USB硬件层、USB主机控制器驱动层、USB主机协议驱动层和USB主机应用层,其中USB硬件层功能由硬件USB控制器完成,之上3层由软件完成。USB硬件层主要由USB主机控制器实现,负责完成USB总线的物理层和链路层协议,并对软件提供配置和操作接口,由软件实现对USB控制器的通信控制和总线访问等功能。USB主机控制器驱动层实现USB主机控制器的驱动程序,该部分驱动程序需针对不同的USB主机控制器芯片的操作接口进行开发,一方面,通过软件实现了USB硬件层的接口,完成对USB控制器基本操作的控制;另一方面,向上层提供了一个统一的接口抽象,屏蔽了底层硬件控制器的差异。USB主机协议驱动层提供USB协议的主机驱动程序,通过USB主机控制器层的抽象,使该部分程序不依赖于具体硬件层,利用下层的封装接口,实现对USB总线的控制和管理,为上层软件提供USB总线的访问控制。USB主机应用层利用USB主机协议层驱动,实现对USB外设的访问,实现独立的USB功能,常见的USB主机应用层功能包括USB存储外设访问控制、USB鼠标键盘访问控制等。
2 基于PCI总线的USB接口设计
机载计算机中一般选用具有高可靠性的PowerPC系列处理器。在PowerPC8270处理器芯片中,集成了PCI桥功能,支持标准的PCI总线访问控制。本文USB主机端硬件设计选用PowerPC8270处理器,通过PCI总线接口连接USB控制器,完成USB主机硬件功能。USB主机核心硬件设计如图2所示。
如图2所示,主机端处理器PowerPC8270芯片通过内部集成的PCI桥功能,经PCI总线连接USB控制器;USB控制器芯片选用ISP1562芯片,该芯片具有标准的PCI总线接口,内部集成PCI核,可支持其作为PCI主设备或从设备工作,内部支持2个OHCI控制器核和1个增强型EHCI控制器核,可支持低速1.5 Mb/s、全速12 Mb/s和高速480 Mb/s的通信速率。在图2设计中,PowerPC处理器作为PCI主设备,USB控制器作为PCI从设备,PCI总线位宽为32 bit,总线频率为33 MHz,处理器通过PCI总线实现对USB控制器的配置和对USB总线的访问控制等操作。USB控制器通过I2C接口外接一片EEPROM,用于支持系统信息的加载和读取。USB控制器接出USB总线经过保护电路后,连接USB外设,保护电路用来防止USB总线信号因过流、过压和ESD静电瞬态放电而导致的USB控制器损坏和通信故障。处理器通过局部的60X总线,挂载SDRAM和Flash存储器。SDRAM存储器用于支持主机程序运行,Flash存储器支持主机端操作系统固件及应用程序的固化存储。
采用图2所示的设计结构和标准PCI接口对USB控制器的配置寄存器进行相应的设置,即可完成对控制器的初始化及访问控制操作,大大简化了主处理器与USB控制器之间配置操作的复杂时序和流程控制,为主机端USB驱动及协议软件设计和实现提供了便利。
3 VxWorks系统下USB主机端软件设计
VxWorks操作系统BSP中集成了对USB通信协议的支持,但在实际使用中,需要根据自身硬件的设计、地址空间的划分及中断分配等情况,对其通信协议进行修改。USB主机端程序的调试是一个复杂的流程,而BSP中的程序不支持调试功能。因此,在驱动设计和修改中,单独将VxWorks操作系统BSP中USB相关的程序作为一个部件剥离出来,添加到主机应用程序的工程中,以支持对USB程序的调试,便于程序修改、功能调试和验证。
3.1 USB主机端软件设计
在VxWorks操作系统下,基于PCI总线的USB接口主机端驱动流程设计如图3所示。
如图3所示的USB主机端程序流程中,首先需要进行主机端PCI总线配置及初始化,主要进行PCI桥的寄存器设置、主机端与USB控制器的PCI地址空间划分、控制器中断设置等工作。设计的USB接口选用EHCI接口控制器实现高速的USB通信,USB主机协议栈初始化进行EHCI接口控制器的查找,通过PCI总线对EHCI接口的配置寄存器进行设置和初始化,并对USB的主机协议层驱动USBD所需要的全局变量进行初始化操作。控制器初始化及EHCI接口挂接完成对EHCI主机控制器驱动HCD的初始化,并建立控制器驱动HCD与主机协议层驱动USBD的连接关系。USB设备创建和挂载注册回调函数,当有USB设备连接时,创建USB存储设备,并将设备挂载到主机文件系统,支持主机对USB存储设备的读写访问。通过图3所示流程,完成VxWorks操作系统下USB协议主机端软件设计,支持USB协议主机端软件开发。
3.2 PCI桥配置
PCI总线具有性能高、成本低、开放性和兼容性好等优点,一般采用PCI专用芯片实现PCI总线设备的开发[3]。PowerPC8270处理器内部集成了PCI桥功能,通过该桥实现与USB控制器的访问控制,在USB主机端软件开发中(如图3所示),首先需要进行PCI桥的配置。在软件上,首先需要进行PCI桥配置接口的设计。PowerPC8270处理器提供两个地址寄存器,一个为PCI地址寄存器,另一个为PCI数据寄存器。在PCI读操作时,首先将要读的PCI总线地址写入PCI地址寄存器,从PCI数据寄存器即可读到该地址的数据;在PCI写操作时,首先将要写入的PCI总线地址写入PCI地址寄存器,然后将数据写入PCI数据寄存器,可以完成一次写操作。地址寄存器和数据寄存器的基址由处理器的配置字定义,偏移地址分别为0x10900和0x10904。USB控制器作为PCI从设备挂载在主机PCI桥下,根据USB控制器与主机的PCI总线上IDSEL信号的连接方式,可以计算出主机访问USB控制器的基址。通过该基址加上偏移地址对主机与USB控制器连接的PCI配置空间进行配置。
通过上述方法,对PCI配置空间的基址BAR0寄存器、命令状态寄存器、Cache Line长度、总线延迟寄存器进行配置,建立通过BAR0寄存器的地址访问USB控制器配置寄存器的通路。为了支持上层的USB软件,需要通过PCI总线建立处理器访问USB控制器及USB控制器访问处理器的双向地址映射关系。处理器访问USB控制器的地址映射通过BAR0地址的配置来完成,USB控制器访问处理器的地址映射需要通过主机PCI桥的InBound机制来配置完成,通过配置InBound机制的寄存器,提供一种外部设备通过PCI访问处理器地址空间的方法。通过PCI桥配置,实现双向地址映射的示意图如图4所示。
图4中虚线框代表虚拟地址,实线框代表实际的物理空间。图4给出了处理器空间和USB控制器空间通过PCI桥的地址映射关系,建立3段地址空间。处理器空间中,通过硬件连接方式确定基址ADDR2,作为处理器访问控制器的256 B的PCI配置空间;通过向PCI配置中BAR0寄存器写入ADDR3,建立处理器访问USB控制器自身配置寄存器空间的映射,根据USB控制器手册描述,该段空间大小为116 B,处理器对USB控制器的初始化均通过该段空间完成;通过处理器PCI桥的InBound机制,设置InBound基址、大小寄存器,建立控制器访问处理器内存空间的映射关系。在主机端USB协议栈调试时,可以通过ADDR3的映射来访问USB控制器的寄存器,判断其当前的工作状态,起到故障排查和定位的作用。
通过PCI桥配置,建立处理器与USB控制器的访问地址映射,实现两者的互相访问,为USB主机端协议功能的实现提供基础支持。
3.3 USB主机端软件实现
在PCI配置完成的基础上进行USB主机端软件设计。按照图3所示的流程实现对USB总线的管理和控制,进行初始化、应用程序注册、动态链接注册等功能。USBD初始化相关的API包括usbdInitialize、usbdShutdown、usbdHcdAttach和usbdHcdDetach共4个,完成usbdLib库的初始化、关闭usbdLib库、连接HCD和断开HCD功能;使用usbdClientRegister和usbdClientUnregister 2个API实现应用程序注册和取消注册功能,USBD允许同时有多个应用程序模块使用USB总线,因此对于要使用USB总线的应用程序模块,需要先在USBD中进行注册,而不再使用USB的模块应当取消在USBD中的注册,以节省主机端资源;动态连接注册API接口函数usbdDynamicAttachRegister和usbdDynamicAttachUnRegister用于注册回调函数,当USB总线上有设备插入或设备拔出动作时,回调函数能够收到报告并进行相应处理,对于插入操作,回调函数进行设备类型判断、设备创建操作,对于拔出操作,回调函数进行设备类型确认、设备销毁操作。
4 测试验证
采用标准的U盘设备对本文设计的USB主机端进行了功能测试和读写速度性能测试,测试结果如表1所示。
表1针对主机设备未插入卡、插入卡和拔出卡3种场景下USB主机端的串口输出进行了测试。在未插入卡的情况下,USB主机端完成了协议栈初始化、USBD驱动初始化、EHCI控制器初始化并连接EHCI控制器与USBD驱动;当有卡插入主机端时,触发回调函数工作,首先查找到主机设备下的卡设备,然后创建/bd0文件系统,完成卡设备到/bd0文件系统的挂载;当拔出卡时,触发回调函数的移除设备操作,主机端移除/bd0文件系统。
向主机端插入U盘设备,分别写入和读取1 MB~10 MB数据,测试主机端对U盘外设的读取速率,结果如图5所示。
图5中,横轴为每次读或写的数据量大小,纵轴为所测量出来的读写速率。从图可以看出,随着每次读写数据量的增大,读写的速率基本保持稳定,而读取的速率比写入的速率快4 Mb/s左右。计算平均值可得,本文设计的USB主机端写入U盘的速率为5.92 Mb/s,读取U盘的速率为9.77 Mb/s。
本文基于PowerPC处理器设计并实现了一种基于PCI总线的USB主机端设备,并在VxWorks操作系统下设计并实现了其PCI配置、USB主机端驱动及协议软件,能够稳定地支持对U盘等存储外设的访问,在工程上取得了良好的应用。
参考文献
[1] 杨伟,刘强,顾新.Linux下USB设备驱动研究与开发[J].计算机工程,2006,32(19):283-285.
[2] 张杨,于银涛.VxWorks内核、设备驱动与BSP开发详解[M]. 北京:人民邮电出版社,2009.
[3] 邓凤军,张龙,王益忠.基于PCI总线的HDLC通信卡的设计与实现[J].电子技术应用,2012,38(8):30-32.