引言
USB作为当前最为常见和方便的数据传输接口,在PC上已经作为标配,然而在嵌入式设备中还并不普遍,其中一个非常重要的因素是技术上的障碍。无论是从硬件还是软件方面讲,要实现USB接口都有非常大的工作量,并且不同的平台会遇到不同的问题,这些因素都制约了USB在嵌入式设备中的应用。 USB提供的是主机和设备中间的一种数据通信服务。主机是USB的核心,每一次USB数据通信都必须由USB主机发起,主机管理着每个USB设备。为了实现USB主机功能的统一,提高系统的可靠性与可移植性,上游芯片生产厂家在满足USB标准的同时,也遵循相应的主机规范,也就是HCI(主机控制接口)。现在用得比较多的有三种,包括用于USB2.0高速设备的EHCI增强主机控制接口、英特尔推出的UHCI通用主机接口,以及前康柏、微软等公司推出的OHCI开放主机控制接口。这些规范定义了usb主机控制器寄存器层面的接口以及主机控制器驱动器和主机控制器软硬件之间的接口。但是EHCI和OHCI要求系统提供高速高性能的CPU、大的存储空间以及PCI总线接口。 由于大多数的嵌入式系统无法满足EHCI和OHCI的这些要求,所以这些主控制器接口规范大都用在PC环境下。针对这种情况,爱普生(EPSON)公司推出主要面向嵌入式领域的USB控制器,其主机控制器接口采用通道方式而不是EHCI。这种方式适用于中低端的处理器系统,并且不需要太大的存储空间,另外和CPU之间采用的是总线接口而不是PCI。 图1 USB系统的总体结构 图1是USB系统的总体结构,分为软件部分和硬件部分。其中USB设备部分最常见的就是U盘。此外就是USB主机部分要实现的内容。
本文以EPSON的S1R72V17为例,分析并介绍如何实现其USB主机功能。 图2 S1R72V17 USB主机硬件原理图 S1R72V17实现USB主机的硬件参考原理图如图2所示。S1R72V17的电源系统分三个部分。{dy}部分是HVDD,这部分为72V17的USB以及相应的I/O供电,需要的参考电压是3.3V;第二部分是LVDD,这部分为72V17内部模块、OSC以及测试模块供电,需要的参考电压是1.8V;第三部分是CVDD,这部分为72V17的CPU接口供电,需要的参考电压是1.8V~3.3V。 72V17与CPU可以通过16位或8位数据总线相接进行数据传输,CPU可以通过9位地址总线访问72V17内部的0x200范围内的地址空间,包括所有的寄存器和FIFO内容。由于72V17和CPU之间的数据传输需要中断的通知,所以还有一个中断信号需要输出。用户可以通过设置0x75寄存器来配置总线的访问模式、中断触发等问题。 另外一部分电路是关于USB接口部分。这里涉及到几个信号,如DP、DM、VBUSFLG、VBUSEN、VBUS。其中DP/DM是传输USB数据的差分信号线, 从硬件方面来说,这对差分信号线应该遵循以下的规则:差分阻抗90Ω;DM/DP尽量短,使得信号传输延时保持在1ns以下;两条线必须平行,并且等长;这两条线下面的PCB层不能有分割;避免在这两条线附近走线;如果不能一直走直线,那么力求减小信号反射;VBUS线必须远离DP/DM;如果信号线有分叉或者线上有其它器件接入,一定要确保匹配阻抗;推荐使用防静电和浪涌的保护器件。 除了DM/DP信号之外,VBUSFLG和VBUSEN是72V17工作在主机模式下用来控制VBUS的信号。这两个信号与USB过电流保护和电源开关芯片配合使用。如果插入的USB设备正常的话,VBUSFLG为高,72V17内部判断之后并使能VBUSEN, 电源就会打开为设备供电。 图3 USB主机方案软件框架图
USB主机方案软件系统构架如图3所示。可以看到软件部分可以分割成四个部分。HCD(主机控制器驱动)层是USB控制器的硬件接口层,用来驱动USB控制器来完成相应的功能,USBD(USB驱动)层完成USB协议层的内容,通过调用HCD层的函数来实现USB协议内容。Class层位于USBD之上,通过注册可以驱动USBD完成特定的功能。在Class层之上,用户可以加上特定的应用,例如文件系统等。 USBD是整个软件体系的核心部分,起到中间桥梁的作用,它解释USB设备类驱动程序发出的命令并将其划分为依下列的USB事务,然后发送给HCD。USBD不与USB主机控制器硬件直接打交道,而是通过HCD这个媒介来与USB主机控制器硬件进行通信。 如果客户需要定制特殊的应用,例如人机接口类(HID)、通信类(CDC)或者音频类,只需要实现相应的Class软件层,并将相应的函数注册进USBD中就可以了。 要使USB主机能够正常工作,还要根据其使用的硬件平台完成一定的软件移植工作。这部分工作主要集中在HCD层上,用户可以根据实际的硬件原理图配置hcd_init中的参数,包括系统分配给USB控制器的地址空间基地址;系统访问USB控制器的访问模式,包括大小端设定等;中断信号触发配置,一般配置为低电平有效;设定72V17时钟唤醒时间,并且启动USB内部时钟(GoActive);设定72V17工作模式(Host模式、Slave模式选择)。
在调试USB主机功能的过程中会遇到很多问题。 USB主机方案中,设备在连接、挂起恢复或复位后,都要进行高速设备的连接检测。高速设备的连接检测是在全速信号环境下进行的。通过高速设备和高速集线器之间传输一个握手信号来指示设备是否为高速设备。如果握手信号传输失败,则默认为全速设备。设备连接到集线器Hub或主机时,全速和高速设备在D+线上有一个1.5KΩ的上拉电阻,由于下拉电阻为15KΩ,D+会加到近似90%的直流电平。当集线器探测到D+的高电平时,就认为连接到全速设备。此时总线进入FS空闲状态并且会有VBUS Change中断发生,这时软件上可以对USB控制器进行设置使得USB主机工作,接着USB总线进入悬挂状态。 USB总线的下一个状态是USB复位,软件就会通过复位命令发送一个RESET信号到集线器,让集线器驱动一个SE0信号(D+和D-都为低电平)小于3ms。高速设备检测到RESET信号后发送一个Chirp K信号给集线器(1ms~7ms的时间)。集线器的高速接收器若在设备发出Chirp K序列后2.5ms内检测到,则响应传送一个交替的Chirp K和Chirp J信号序列。设备检测到这6个线性调频脉冲Chirp序列(3个交替的KJ信号对),集线器将连接端口置入高速启用状态,并从D+断开上拉电阻,启用高速设备终端,设置高速设备默认状态。若设备在RESET之后没有发出Chirp K信号或者设备没有检测到集线器响应的交替KJ信号序列,则高速设备就继续以全速模式进行操作。 EPSON USB主机的USBD层usb_new_device函数可完成对插入设备的枚举过程。 经过上面的调试后,USB外设可以发送和接收数据,设备如果不立即使用则会进入挂起状态,直到使用。 该USB主机软件中的大容量存储类层(mass storage class)主要函数usb_stor_init、usb_stor_open、usb_stor_write、usb_stor_read、usb_stor_ioctl和usb_stor_close是根据Bulk-Only Transport传输协议以及大容量存储设备的SCSI(06h)子类编写的。通过这些函数就可以对存储在U盘上的数据进行操作了。
EPSON 72V系列 USB主机方案是适用于嵌入式中低端平台的USB解决方案,通过其硬件系统和软件系统的协调工作,能够实现对U盘和移动硬盘的高速读写以及HID类的应用。 |