一种DM642系统中的USB接口设计

2011-06-07 02:04韦照川邓力为欧阳宁孙希延
电视技术 2011年15期
关键词:集线器枚举寄存器

韦照川,邓力为,欧阳宁,孙希延

(桂林电子科技大学 信息与通信学院,广西 桂林 541004)

0 引言

本文采用了TI公司的TMS320DM642[1-3](简称DM642)芯片为核心,是基于TMS320C64X系列的高性能DSP芯片,外围设备较为丰富,具有多个视频采集端口和音频采集端口,还有网络接口、PCI接口、SPI接口以及EMIF接口等。在DM642的实际应用中,经常会涉及到大量视频数据、音频数据或者其他数据存储的问题,使用USB存储可以比较理想地达到预期目标。DM642本身不带有高速USB接口,需要外扩,这里使用NXP公司的ISP1761[4-6]进行 USB[7-8]接口扩展。

1 ISP1761芯片简介

ISP1761拥有3个端口,1个OTG端口可实现主从功能,2个主机端口可连接USB设备,内部含有一个CPU,对于主机功能而言,通过控制CPU寄存器和EHCI寄存器,实现ISP1761的基本配置。ISP1761通过飞利浦公司定义的传输描述符(PTD)来传输数据,具体可分为同步传输PTD、异步传输PTD、中断传输PTD。用户按照需要的传输方式,填写对应的PTD区域,最后启动PTD传输,ISP1761将该PTD指定的存储区通过USB总线发送给设备,完成一次事务,并返回该次事务的反馈信息,用户读取对应的中断寄存器的标志位,就可以知道该次事务的传输情况,启动下一次传输或是重传。

2 主要电路结构

基本的DM642应用平台在外部存储器接口EMIF总线上连接了ISP1761芯片,可以通过EMIF访问ISP1761的寄存器实现其主机控制功能,完成对USB大容量设备的读写,实现实时数据的存储。本文中DM642采用统一的32位地址模式,将32 Mbyte的SDRAM分配到CE0以0x80000000起始。4 Mbyte Flash分配到CE1以0x90000000起始。将ISP1761的64 kbyte内存空间分配到CE2以0xA0000000起始。图1为DM642与ISP1761的接口连接电路。

ISP1761提供了16/32位的数据读写宽度,可编程实现16位或32位数据读写方式。本文采用的是32位读写方式,PIO及DMA结合的主机控制模式。ISP1761不支持字节寻址,无AD0地址线。所以将EA3对齐ISP1761的32位地址线(即AD2)。数据线依次对齐,主机DMA请求线与GPIO1连接,通过GPIO1事件来实现EDMA传输,通过组合逻辑电路产生主机DMA应答信号。将主机中断请求与GPIO4相连,开启GPINT4的外部中断,这样就可以用32位PIO方式访问ISP1761,用DMA方式填充ISP1761的存储区,节省出大部分的CPU资源以便完成其余高开销的任务。

3 软件架构

软件设计采用了如图2所示的层次模型,主机控制器驱动(即HCD)实现主机控制器抽象和总线数据抽象。USBD调用HCD时就避免了硬件的操作,USBD实现数据管理、主机控制器及USB设备管理。USBD和HCD构成了USB的协议栈。因为本文是基于大规模存储设备的应用,使用了Mass Storage的UFI模型,实现逻辑块寻址等目的,然后一个存储设备还需要文件系统,在此基础上搭建一个文件系统,整个系统的架构就初步实现了。

3.1 ISP1761读写

首先对于ISP1761要实现基本的通信,通过PIO方式,可以访问ISP1761内部的CPU寄存器以及EHCI寄存器。读写函数如下:

如果不采用EDMA的方式存放数据,也可以采用PIO的方式实现对存储区的读写,这里不做具体介绍。

3.2 HCD初始化

对ISP1761进行初始化,初始化完成以后就可以对内部的集线器进行枚举。部分代码如下:

3.3 根集线器管理

完成了HCD初始化就已经激活了根集线器端口,可以对内置集线器进行枚举。由于篇幅所限,只列举基本的步骤:

1)通过缺省管道(即地址0管道)取得集线器的描述符,使用了USB的get descriptor命令。

2)设置集线器的地址(可以是1~127的任意值,但是必须是未使用的),接下来的通信都采用该地址。

3)激活集线器配置。

4)设置端口进入上电状态。5)清除端口当前连接状态。

这样,当有设备插入端口时,主机就能够发现设备,然后对该端口进行复位后和设备进行最基本的通信。由于内置hub只要枚举后就不会从根端口上脱落,也就不用再动态检测根端口的连接状态,但是仍然需要定期地对内置hub端口进行访问,以便及时发现设备的连接状态有无变化。

3.4 中断管理模块

需要读取ISP1761的中断寄存器,判断中断源,以便完成数据的重发或者是启动DSP的下一次EDMA传输。主机在启动下一次PTD传输前,需要检测V标志位有没有清0,如果没有,启动3次计数,3次后则重启当前PTD传输。

3.5 数据传输处理

数据传输只是涉及到单一事务,从USB驱动发起的传输中,将单一传输分解为若干个事务。例如本次设计中会用到控制传输以及批量传输。其中控制传输可以分为有数据和无数据的传输,一次传输中又可以具体分为SETUP事务、IN事务和OUT事务,使用控制端点进行。而批量传输只使用IN/OUT端点,分为IN和OUT事务,单一事务传输时,需要对ISP1761的PTD区域进行填充,指定传输区域,然后发起传输,完成一次事务。

3.6 USBD接口模块

该模块实现对USB驱动模块传递的IRP进行解析。实际完整的USB模型,需要对4种传输类型进行分类处理。对于存储设备,只需要分别对控制传输及批量传输进行处理即可。

3.7 USB驱动模块

USBD作为USB主机软件的最高层,需要遵循USB 2.0规范,完成数据传输管理以及总线枚举调度两个任务。在数据传输任务中,USB驱动需要建立IRP,指定传输类型、传输方向、缓冲区位置以及传输长度等信息。下层的USBD接口模块接收后,将传输分解为多个事务进行具体的处理。

为实现USB的即插即用功能,当设备连接到USB总线或设备从USB总线拔出时,USB驱动都需要一个总线枚举的过程,通过控制传输来识别设备。对于根端口,可以直接读取根寄存器了解端口信息。对于内置hub,需要定期地取得端口的连接状态,判断是否有设备连接上来,当发现设备连接到了端口时,USB主机驱动将采取以下的措施:

1)为设备供电,当端口处于上电状态时,会自发地对外部设备进行供电。

2)等待至少100 ms,确保插入状态稳定,供电状态稳定。

3)向内置hub的该端口发出复位命令,至少等待10 ms,确保集线器完成复位。

4)为设备分配一个地址(1~127),并且是未使用的,接下来的通信都采用该地址。

5)取得该设备的全部描述符,并激活配置。

到这里,USB驱动就完成了对设备的枚举,接下来就可以对该设备进行数据传输了。当USB驱动检测到设备拔出时,主机需要及时更新设备信息,提示设备的拔出,该hub端口处于断开连接状态,当检测到下一次设备的插入时,对该端口的设备再次进行枚举。这样,就实现了USB设备的即插即用功能。

3.8 UFID

对大规模存储类型的USB设备,需要使用基于SCSI规范的UFI子规范命令。UFI支持在USB设备之间完成数据的读写。对于USB存储设备,目前有2种协议规范:一种为CBI协议,使用了控制端点,批量传输端点以及中断端点进行传输;一种为BOT协议,仅使用批量传输端点进行传输。本文中使用的是BOT传输协议。传输模型如图3所示。

在该传输模型下,在USB主机和设备之间存在CBW,CSW和普通的3种数据。其中CBW命令块的格式如图4所示。

该命令数据格式为小端模式。

1)dCBWSignature。命令标识符,为常数(0x43425335)。

2)dCBWTag。主机发送的CBW标签,设备必须在相关的CSW中以同样的值返回。

3)dCBWDataTransferLength。在本命令执行期间,主机期望通过Bulk-In或Bulk-Out端点传输的数据长度。如果为0,则表示这之间没有数据传输。

4)bmCBWFlags。Bit7Direction(dCBWDataTransfer⁃Length为0时,该值无意义)取值,DataOut=0数据从主机到设备;DataIn=1数据从设备到主机,其余位为0。

5)bCBWLUN。表示正在发送命令字的设备的逻辑单元号(LUN),对于支持多个LUN的设备,主机设置相对应的LUN值,否则该值为0。

6)bCBWCBLength。CBWCB的有效字节长度,在1~16之间。

7)CBWCB。被设备解析执行的命令块。该块是重点部分,针对该块的命令内容,USB设备会执行不同的任务,具体的命令可以参考UFI规范手册。特别要注意的是,命令的数据格式有小端格式也有大端格式。CSW状态块如图5所示。

1)dCSWSignature。常数 0x53425355,标识为 CSW状态块。

2)dCSWTag。取相对应的CBW的dCBWTag值。

3)dCSWDataResidue。实际传输的数据个数和期望要传输的数据个数之差。

4)bCSWStatus。命令执行情况,0表示执行成功;非0表示失败。失败原因可以通过REQUEST_SENSE命令询问出错原因。

3.9 FatFs

文件分配表(File Allocation Table,FAT)。FatFs是一个开源的文件系统[9],支持FAT16,FAT32等格式。目前FatFs的作者写了两个版本的代码,一个是正式的Fat⁃Fs,比较适合RAM比较大的设备,另一个是FatFs/Tiny,比较适合小RAM的系统,比如单片机,FatFs/Tiny占用较小的RAM,代价是更慢的读写速度和更少的API函数。不过两个都支持FAT16,FAT32文件系统。FatFs的使用方法和通用的文件操作API函数有一些区别,使用时可以参考FatFs的官方网站,这个模型是完全免费和开源的。之所以推荐使用这个模型,是因为该系统具有非常高的效率,不会成为USB传输速率的瓶颈。移植的问题主要有数据类型的修改和配置,针对应用的需要,可以裁剪部分的API函数,缩减代码规模。最后,FatFs需要用户编写底层的驱动函数,包括:

所有的函数都涉及到逻辑单元号的问题,如果没有分区或是存在多个设备,就可以不需要注意drv参数,可以直接写0。disk_initalize用来对盘进行初始化,分配逻辑单元号,如果不需要,可直接返回0值。disk_status用来返回磁盘状态,当USB设备枚举完成后返回0,当设备拔出时就返回1。disk_read,disk_write两个函数需要注意参数,包括缓冲区地址、长度和逻辑扇区地址。disk_ioctl函数用于格式化信息,返回扇区总数,每扇区字节数,如果不需要格式化,可以不用理会。get_fattime用来返回系统时间。

4 仿真测试

本文仅测试f_mount,f_open,f_read,f_write和f_close 5个函数来访问U盘,先把一个test.txt的文本文档写进U盘,再读出来,证明结果是正确的,如图6所示。

5 小结

详细介绍了DM642系统中USB接口芯片ISP1761的配置和编程方法,对于实现视频数据和音频数据的高效实时存储提供了一个重要手段,具有较大的应用意义。

[1] 王柳祎.基于DM642芯片的嵌入式双目机器视觉平台[J].电视技术,2007,31(6):94-96.

[2] 张新安.基于DM642的AVS-M视频编码器的设计与优化[J].电视技术,2007,31(12):31-33.

[3] 美国德州仪器公司.TMS320C6000系列DSP的CPU与外设[M].卞红雨,纪祥春,乔钢,等,译.北京:清华大学出版社,2007.

[4]ISP1761 hi-speed universal serial bus on-the-go controller[EB/OL].[2010-12-20].http://www.icver.com/info.asp?id=527991.

[5]AN10037 interfaceing the isp176x to the intel PXA25x processor[EB/OL].[2010-12-20].http://www.doc88.com/p-5420113033.html.

[6]AN10059 ISP1761 Linux programming guide[EB/OL].[2010-12-20].http://www.stericsson.com/technical_documents/CD00222790.pdf.

[7] 韩龙,刘文洁,徐伯庆,等.USB host技术在流媒体高清电视中的应用[J].电视技术,2006,30(4):32-34.

[8]Enhanced host controller interface specification for universal serial bus[EB/OL].[2010-12-20].http://www.intel.com/technology/usb/download/ehci-r10.pdf.

[9]Mirosoft extensible firmware initiative FAT32 file system specification[EB/OL].[2010-12-20].http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/fatgen103.doc.

猜你喜欢
集线器枚举寄存器
基于理解性教学的信息技术教学案例研究
STM32和51单片机寄存器映射原理异同分析
基于差分QPSO的多能源集线器系统优化调度
一种高效的概率图上Top-K极大团枚举算法
音乐聆赏新世代 Bowers & Wilkins Formation Audio无线音乐集线器
Lite寄存器模型的设计与实现
基于太阳影子定位枚举法模型的研究
Microchip拓宽USB3.0集线器应用范围
Microchip推出具有FlexConnect功能的新型智能集线器,拓宽USB 3.0集线器的应用范围
USB开发中易混淆的概念剖析