网站导航: 首页 > 设计参考 > 正文 文章搜索
为嵌入式系统开发平台增加USB下载接口
 
文章编号:
090914105520
文章分类: 接口技术 USB
点 击:
...
关 键 词: ARM920T,USB控制器,MC9328MX1,海量存储类设备,RAM盘
文章来源:
网络,作者:许庆丰
摘 要:
介绍如何利用USB接口为嵌入式系统开发板提供文件下载功能。扼要介绍了USB海量存储类设备的工作原理以及下载程序的流程,为广大嵌入式系统系统开发人员提供了一种快速的开发手段。

  目前,许多嵌入式系统的开发平台采用串行口作为调试和下载目标代码的接口。通用串行口的优点是简单易用,几乎所有得嵌入式处理器都有1-2个串口。但是最大的缺点是速度太慢,这个缺点在开发小系统的时候还不太明显,随着代码尺寸的增加,串口的速度已经不能满足需要了。典型的如开发嵌入式Linux,编译后内核大小为400K-1M byte,通常还要制作一个ROM盘存放文件系统,采用115200波特率,下载1M数据就需要几分钟,在调试阶段还是太慢了,而且容易出错。虽然更新的开发系统可以采用JTAG,BDM接口进行调试和下载,但下载大尺寸的文件依然是件耗时的工作。

  考虑高速的数据接口,可采用以太网和USB。从速度上讲,10M以太网和USB1.1(12M)差不多。但使用以太网需要配置目标板的IP地址,需要连接集线器接入局域网,还需要PC机上运行TFTP的服务软件。相比之下,使用USB接口就简单多了:即插即用、自动识别设备、在Windows下使用浏览器就可直接传送文件。目前,新一代的嵌入式处理器很多都带有USB控制器,如英特尔的StrongARM-1111,XScale,AMDALCHEMY的Au1100,Motorola 68k系列的Super VZ、ColdFire 5307,ARM系列的MC928MX1和即将推出的Cosica。


  采用USB接口的主要难点在于要求PC机上有相应的驱动程序的支持,USB的驱动程序以WDM(Windows Driver Model)模型为基础。这个问题在Windows98时代的确是个问题,由于Windows98只提供少数几种设备的驱动,对于大多数设备,他要求USB设备的开发者自己编制Windows下的驱动程序。而编写驱动程序是件相当麻烦的工作。Windows2000解决了这个问题,它提供了各种USB设备的标准驱动程序,只要接入设备符合标准,Windows2000可以自动识别设备类型并自动安装相应的驱动程序。开发者只需要编写USB设备的程序就可以了。

  USB协议将设备分为几大类,每一大类又分为若干子类,分别满足不同场合的应用。每一大类都用一个类型号标识。如音频设备(Audio)为01,人机界面(HID)设备为03,海量存储类(Mass Storage)为08。由于本例中我们的目的是用USB传输大文件,可以将USB控制器配置为标准的海量存储类型,将嵌入式开发系统中的部分RAM虚拟为一个磁盘,在RAM盘开始的512字节按FAT表的格式填入数据。在PC机端利用Windows2000下的标准驱动程序,这样,我们的目标板将显示为Windows2000浏览器中的一个驱动器。驱动器的大小由RAM盘FAT表中的信息决定。用拷贝、粘贴命令可直接传送大文件。笔者用此方法开发基于ARM的嵌入式Linux,下载1M的Linux内核几乎感觉不到时延,下载6M的ROM Disk也只需要3秒钟,大大加快了开发速度。笔者的USB控制程序中还包括一段FLASH擦写程序,当下载文件结束后,可将下载内容写入FLASH中,重新启动系统后,就可以调试新下载的代码了。

一.硬件平台:

  笔者所用的开发系统硬件平台处理器为摩托罗拉龙珠系列的MC9328MX1,MC9328MX1(以下简称MX1)是摩托罗拉公司基于ARM核心的第一款MCU,主要面向高端嵌入式应用。内部采用ARM920T内核,并集成了SDRAM/Flash,LCD,USB1.1,蓝牙(bluetooth),多媒体闪存卡(MMC),CMOS摄像头等控制器。关于MX1的详细资料,感兴趣的读者可以参考:http://www.motorola.com.cn/semiconductors/。在笔者的系统中采用了两片16Mx16位的SDRAM和两片4Mx16位的同步Flash存储器,分别接入数据线的低16位和高16位。MX1的USB模块需要外接一片USB总线接口芯片完成电平转换和总线驱动,在笔者的系统中用的是飞利浦公司的PDIUSBP11AD,PDIUSBP11AD的资料可参考网址:

http://www.semiconductors.philips.com/pip/PDIUSBP11AD

  USB接口部分的原理图如图1所示:

图1.USB接口原理图

二.软件平台:

  笔者的USB下载程序是为开发嵌入式Linux而设计的,程序用C编写。编译器采用GNU的ARM交叉编译器。编译器、汇编器和连接器分别为arm-linux-gcc、arm-linux-as和arm-linux-ld。基于ARM的GNU工具可以从www.gnu.orgwww.uclinux.org下载。编译环境可以用Red Hat Linux。如果觉得另外配置Linux服务器麻烦,也可以用Windows下的虚拟Linux环境CYGWIN,这样所有的工作都可以在Windows下完成,但需要在CYGWIN中重新编译ARM交叉编译器。有关GNU工具的使用请感兴趣的读者参考相关资料,在此不再复述。CYGWIN及手册可以从www.cygwin.com免费获取。笔者的主机是一台运行Windows 2000的PC,运行CYGWIN环境编译嵌入式Linux系统和应用程序,目标代码通过USB连接下载到目标板。

三.USB设备的工作原理

  各种USB设备的工作过程在USB标准1.1中有详细的描述,在此简述如下:USB的传输方式分为4种:控制传输(Control transfer),批传输(Bluk transactions),中断传输(Interrupt transactions)和等时传输(Isochronous transactions)。控制传输用来传输设备控制指令、设备状态查询及确认命令。当USB设备收到这些数据和命令后将按照先进先出的原则按队列方式处理到达的数据;批传输主要用于完成主机和设备之间的大块数据传输。由于批传输在硬件级上对传输数据进行错误检测(若发生错误,它支持“重传”功能),因此它能保证数据传输的可靠性。批传输支持两个方面的数据传输(即主机到设备和设备到主机);中断传输用来完成设备到主机的少量数据传输,它只支持设备到主机方向数据传输(中断传输跟实现的“中断”概念没有任何联系);等时传输主要用来完成主机和设备之间实时数据的传输(如麦克风、音箱以及电话等)。USB传输事务均由主机启动,总线采取主从式结构(Master to Slave),实际的通讯过程由主机和设备的端点(Endpoint)完成。一个USB设备有多个端点,其中端点0专门用于设备的控制。端点被定义为单向的数据通道:只能为接收端点或发送端点。具有相同传输方式的多个收发端点组成通讯界面(Interface)。所有的通讯过程都由主机控制,USB设备通过接收端点接收主机的各种请求,如读写数据、请求状态,通过发送端点对请求做出应答。在本例中,由于将USB设备配置为海量存储方式,只使用了两种传输方式:控制传输和批传输,定义了三个端点:除了端点0外,还定义了批传输的接收端点和发送端点。

  当USB设备连接到总线上后,主机上的USB控制器会监测到总线电平的变化。随后,主机将复位USB设备,并给设备分配一个唯一的地址。这一过程称为总线枚举过程(Bus Enumeration)。在本例中,MX1的USB1.1控制器可自动完成总线枚举过程,不需要用户干预。下一步,主机将向设备发出初始化请求包,要求设备报告其描述和初始化信息,包括设备类型,数据包大小,界面、端点配置信息,设备的功耗等等。不同的类型的USB设备有不同的配置信息。主机将根据设备报告的初始化信息加载不同的驱动程序。通过初始化请求包,主机可要求设备报告五种配置信息:

1.设备描述表(device descriptor):每个USB设备一个,报告设备制造商的信息。
2.配置描述表(configuration descriptor):确省为每个USB设备一个,报告支持的
界面数和设备从总线上取得的最大功耗。每个USB设备至少要支持一个界面。
3.界面描述表(interface descriptor):报告端点数,端点类型和子类型。本例中只支持一个传输界面。某些USB设备可支持多个界面提供不同的功能。
4.端点描述表(endpoint descriptor):报告端点的工作模式和最大传输包长度。本例中定义了端点0和批传输接收/发送端点,最大包长64字节。
5.字串描述表(string descriptor):报告设备序列号。本例中不支持。

  USB设备必须向主机报告一个设备描述表和至少一个界面描述表。USB协议对不同类型设备的各种配置信息都有具体的规定,开发者可参考相应的文档。例如,海量存储类型设备的各种配置描述表格式和意义在文档usbmassbulk_10.pdf中有详细描述(从www.usb.org下载)。具体编程时,当收到主机的配置请求包后,只要将设备描述表和配置描述表发给主机就完成了配置过程。配置过程都是通过端点0来完成的。

  当配置过程完成后,主机和设备就可以传输数据了。首先,主机向设备发送命令字CBW(Command Block Wrapper),USB设备通分析并执行相应操作,将执行状态通过状态字CSW(Command Status Wrapper)返回主机。对于海量存储类设备,USB协议中约定了几类不同的命令集,属于海量存储类设备的子类,给不同的设备用。例如,子类号02为DVD设备,04为软盘驱动器,06为通用SCSI类设备。在本例中,配置为SCSI类设备。主机向设备发送的命令都属于SCSI命令集。由于实现的功能为大文件的传输,故只对少数几个命令提供了支持,如读磁盘扇区、写磁盘扇区、查询设备状态。执行完后,USB设备向主机返回状态字。对于不支持的命令,只需向主机发送空响应。

  作为海量存储类设备的SCSI类,主机将以访问磁盘的方式来访问设备。所以,在使用前,我们需要按磁盘分区表(FAT表)的格式对一片RAM进行格式化。在本例中采用FAT16的格式。FAT16系统中,第一个512字节为引导扇,此扇区包含BPB(BIOSParameter Block)表,描述逻辑盘结构组成,FAT扇区数、FAT拷贝数、根目录表项最大值等,可根据具体的系统设定。由于篇幅所限,FAT16表的细节请感兴趣的读者参考有关资料。本例中支持四种对RAM盘的操作:读/写磁盘扇区、查询磁盘大小和弹出设备。对于读/写操作,只需要将主机请求读/写的扇区数转换成为RAM盘的地址,将数据写入或读出就可以了。文件发送完毕后,在Windows 2000下选择弹出设备操作,设备收到后会终止USB连接。

四.USB控制器

  MX1的USB1.1控制器提供了6个端点,分别是端点0到5。除了端点0保留作控制外,端点1-5都可配置为中断、等时或批传输方式,支持全速12M的传输速度和8、16、32、64字节的包长度。工作方式可选择查询、中断或DMA传输方式。

  USB1.1控制器的工作原理可以简单地描述为:当USB控制器从USB总线检测到主机启动的某一传输请求时,USB控制器将相应标志位置位。如果配置为中断方式,则向中断控制器请求中断。软件通过访问USB控制器的状态寄存器和数据寄存器获得与此次传输有关的各种参数,并根据参数,对USB控制器的控制寄存器和数据寄存器进行相应的操作,以完成主机的传输请求。由于本例中实现的功能较简单,不需要多任务环境和操作系统的支持,采用查询方式就可以了,软件实现起来比较简单。对于不同的USB协议包,只需要查询状态寄存器中的标志位,就可以区分是配置信息还是需要执行的SCSI命令。

五.USB下载程序流程:

用USB接口的下载程序流程如图2:

图2.USB下载流程图

  首先的工作是初始化USB控制器,包括设定USB时钟,配置端点0,1,2分别为控制、批传输接收、批传输发送端点。1,2端点数据包长度64字节。接下来需要对RAM盘进行格式化,填充引导扇区和FAT表。在笔者的系统中,划分了14M RAM作为RAM盘,共28672(0x7000)个扇区,可满足一般应用。如果此时设备已经连接到了USB总线上,USB控制器将自动与主机完成总线枚举过程。在总线枚举过程过程结束后,主机首先会发送配置请求包,设备将自己的种类、子类、端点配置信息报告给主机。如果设备是第一次连接到主机,Windows 2000将显示发现USB设备并查找相应驱动程序,同时更新系统注册表。配置过程结束后,主机会发命令要求设备报告容量,以扇区为单位,并读出RAM盘的引导扇区。如果无误的话,在Windows 2000的资源管理器上就会出现新设备的驱动器图标。随后,在资源管理器中就可以直接拷贝和拖动文件了。主机会向设备发送写扇区命令,设备将数据拷贝到RAM盘中对应的地址。拷贝过程结束后,在资源管理器的驱动器图标处击右键,选择弹出设备,设备收到命令后会终止USB连接,将RAM盘中的数据写入FLASH中,完成了程序代码下载和写入的过程。

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4