《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 嵌入式VxWorks下基于PCI总线的USB接口主机端设计
嵌入式VxWorks下基于PCI总线的USB接口主机端设计
来源:电子技术应用2014年第2期
刘智武,王建宇,张立辉
中航工业西安航空计算技术研究所,陕西 西安710119
摘要: 分析了USB主机端的层次结构,采用PowerPC8270处理器设计了一种基于PCI总线的USB主机端设备,简化了主处理器与USB控制器的交互。在VxWorks操作系统下进行了USB主机端驱动的设计和实现,并通过试验对USB主机端的功能和读写速率性能参数进行了测试验证。测试表明,能够稳定地支持对USB接口存储外设的读写访问。
中图分类号: TP302.1
文献标识码: A
文章编号: 0258-7998(2014)02-0005-03
Design of USB host device in embedded VxWorks based on PCI bus
Liu Zhiwu,Wang Jianyu,Zhang Lihui
AVIC Computing Technique Research Institute,Xi′an 710119,China
Abstract: This paper analyses the USB host stack structure. A PCI bus-based USB host device is designed using PowerPC8270 CPU. The design simplifies interaction between host CPU and USB controller, implements the USB host driver in embedded VxWorks operating system. Finally, the USB host function and the speed of read/write are tested on USB storage device. The results slow that this design can support reading and writing USB storage peripheral device steadily.
Key words : USB host;PCI bus;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.