[ZLG-ARM] 32 位ARM 嵌入式系统扩展USB 接口设计

[复制链接]
2322|3
 楼主| lpczcy 发表于 2009-6-22 13:57 | 显示全部楼层 |阅读模式
常用的主机与嵌入式外设的高速通信接口有LPT&nbsp;并行口、USB、1394&nbsp;及10/100M&nbsp;以太网等接口。RS232&nbsp;不适合高速数据传送,1394&nbsp;接口需要专门的适配器接口成本过高,一般较少使用,USB&nbsp;接口被广泛用于高、中、低不同速度设备与主机通信,USB2.0&nbsp;的最高速度可达480Mb/s,&nbsp;可传送高清晰数字视频码流,完全可以替代1394&nbsp;接口,USB&nbsp;与以太网接口相比,采用主从结构,有即插即用特性,驱动程序丰富,互操作性好等优点。<br />&nbsp;&nbsp;&nbsp;&nbsp;USB(Universal&nbsp;Serial&nbsp;Bus,通用串行总线)接口是1994&nbsp;年Intel、Microsoft&nbsp;等多家公司联合推出的计算机外设互连总线协议。USB&nbsp;接口支持1.5Mb/s、12Mb/s&nbsp;和480Mb/s&nbsp;的数据传输速率,支持控制、中断、批量与实时4&nbsp;种数据传输模式,让外围设备可以有弹性的选择。不管是交换少量或是大量的数据,还是有无时效的限制,都有合适的传输类型。USB的实时同步数据传输模式适合于高速实时音视频数据流的传送。<br />&nbsp;&nbsp;&nbsp;&nbsp;基于ARM(Advanced&nbsp;RISC&nbsp;Machines)处理器的32&nbsp;位嵌入系统具有极高运算速度和大容量的数据处理能力,常需要设计高速接口与其他设备通信,为此本文讨论基于S3C44B0XARM7&nbsp;处理器的嵌入式统扩展USB&nbsp;接口(设备端)的技术方案。<br /><br />1&nbsp;USB&nbsp;接口原理<br />&nbsp;&nbsp;&nbsp;&nbsp;USB1.1&nbsp;规范将USB&nbsp;分为5&nbsp;部分:控制器、控制器驱动程序、USB&nbsp;芯片驱动程序、USB设备以及针对不同USB&nbsp;设备的客户端驱动程序。<br />(1)&nbsp;控制器(Host&nbsp;Controller)主要负责执行由控制器驱动程序发出的命令。<br />(2)&nbsp;控制器驱动程序(Host&nbsp;Controller&nbsp;Driver),&nbsp;在控制器与USB&nbsp;设备间建立通信管道(Pipe)。<br />(3)&nbsp;USB&nbsp;驱动程序(USB&nbsp;Driver),提供对不同USB&nbsp;设备及芯片的支持。<br />(4)&nbsp;USB&nbsp;设备(USB&nbsp;Device),&nbsp;有两类USB&nbsp;设备:一类称为功能设备(Function),另一类是称为USB&nbsp;集线器(HUB),可以连接多个USB&nbsp;设备。<br />(5)&nbsp;USB&nbsp;设备驱动程序(Client&nbsp;Driver&nbsp;Software)及特定应用程序。<br /><br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;主控制器的驱动软件由操作系统支持,USB&nbsp;设备开发人员一般只需编写客户驱动程序,实现特定功能,设备端所有功能软件需要全面设计。<br />&nbsp;&nbsp;&nbsp;&nbsp;USB&nbsp;的四种数据传输模式分别是:控制型传输、中断型传输、批量型传输、实时型传输。第一种在缺省通道中传输USB&nbsp;接口本身的配置等控制信息,后面三种用于功能部件传输数据。中断型用于键盘等的异步输入输出少量数据传输,批量传输主要用于象硬盘等块设备的数据传输,在中断和批量的传输过程中要传递交互握手信号,确保数据准确无误。<br />&nbsp;&nbsp;&nbsp;&nbsp;实时传输对带宽有严格要求,但允许有一定误码,省去了交互握手信号的传递,常用于音视频码流数据传输。四种类型数据都按带宽要求分配在1ms&nbsp;一帧的数据帧内进行传输,USB1.0&nbsp;实时传输可得到的最大带宽10.24Mbps。<br /><br />2&nbsp;嵌入式系统USB&nbsp;接口设计<br />&nbsp;&nbsp;&nbsp;&nbsp;要满足高性能ARM嵌入式系统的要求,扩展USB接口必须选择高性能USB控制器芯片,Philips公司的PDISUBD12&nbsp;USB器件,是与微处理器配合使用的高性能USB接口器件,性价比很高。PDIUSBD12主要特性有:<br />(1)&nbsp;符合USB&nbsp;1.1&nbsp;技术规范;<br />(2)&nbsp;USB控制器并行接口与处理器间的数据传输速度高达2M&nbsp;字节/秒;<br />(3)&nbsp;在批量模式和同步模式下均可实现1M&nbsp;字节/秒的数据传输速率;<br />(4)&nbsp;集成了FIFO存储收发器,支持DMA&nbsp;操作;<br />(5)&nbsp;内置时钟倍频PLL电路,可编程时钟频率输出;<br />(6)&nbsp;多中断模式实现批量和同步传输;<br />&nbsp;&nbsp;&nbsp;&nbsp;采用PDIUSBD12&nbsp;USB标准组件与S3C44B0X接口,减小了开发的时间、风险以及费用,是最快捷、最经济的方法实现ARM嵌入式系统扩展USB的解决方案之一。PDIUSBD12与S3C44B0X&nbsp;ARM7处理器的电路图见图2。因ARM7用存储器影射方法扩展I/O接口,一般按16bit方式寻址,所以U2的A0连到U1的Addr1引脚,&nbsp;片选信号nGCS1的基地址是0x0200_0000。<br /><br /><br /><br /><br />3&nbsp;ARM&nbsp;端USB&nbsp;设备程序<br />&nbsp;&nbsp;&nbsp;&nbsp;设备端程序主要完成:ARM&nbsp;BIOS&nbsp;和ucLinux&nbsp;的加载、启动通信进程、USB&nbsp;控制器初始化、响应主控制器标准PnP&nbsp;及其他命令、建立USB&nbsp;端点(End&nbsp;point)逻辑通道、数据传输操作等功能,图3&nbsp;是基于ARM&nbsp;的USB&nbsp;设备与PC&nbsp;间音频通信的程序功能结构图。<br /><br /><br /><br />操作USB&nbsp;芯片的接口函数的宏定义为:<br />typedef&nbsp;unsigned&nbsp;short&nbsp;int&nbsp;U16&nbsp;;<br />#define&nbsp;pD12_CMD&nbsp;(&nbsp;(&nbsp;U16&nbsp;*)&nbsp;0x02000002&nbsp;)&nbsp;//指向D12&nbsp;命令寄存器指针<br />#define&nbsp;pD12_DAT&nbsp;(&nbsp;(&nbsp;U16&nbsp;*)&nbsp;0x02000000&nbsp;)&nbsp;//指向D12&nbsp;数据寄存器指针<br />#define&nbsp;D12WriteCmd(&nbsp;data&nbsp;)&nbsp;(*p&nbsp;D12_CMD&nbsp;=&nbsp;(U16)(data)&nbsp;&&nbsp;0xff&nbsp;)<br />#define&nbsp;D12WriteData(&nbsp;data&nbsp;)&nbsp;(*&nbsp;pD12_DAT&nbsp;=&nbsp;(U16)(data)&nbsp;&&nbsp;0xff&nbsp;)<br />#define&nbsp;D12ReadData()&nbsp;(*&nbsp;pD12_DAT&nbsp;&&nbsp;0xff&nbsp;)<br /><br />4&nbsp;音频码流USB&nbsp;设备驱动程序<br />&nbsp;&nbsp;&nbsp;&nbsp;Windows2000&nbsp;中各种USB&nbsp;设备客户驱动程序结构框架基本相同,可以从Windows2000DDK&nbsp;中获得USB&nbsp;设备驱动程序范例代码,对范例代码作少量修改就可以满足特定功能需要。图1&nbsp;显示了驱动程序各层间的数据传递关系,底层USB&nbsp;主控制器驱动程序(USB&nbsp;Host&nbsp;Driver)由操作系统提供支持,设备驱动程序只需要对USB&nbsp;Host&nbsp;Driver&nbsp;上传的I/O&nbsp;数据包IRP&nbsp;作出响应,并把要输出数据以IRP&nbsp;形式下传给USB&nbsp;Host&nbsp;Driver&nbsp;即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;在ISO(实时型)模式下传输音频码流,USB&nbsp;客户程序除了WDM(Windows&nbsp;Driver&nbsp;Model)驱动常规处理外,必须计算好带宽,并为驱动程序在非分页存储区内分配好环行缓冲区(Ringbuffer),以便USB&nbsp;主控制器可以不间断输出实时数据。RingBuffer&nbsp;的大小按下式<br />计算:<br />每帧字节数&nbsp;×&nbsp;每缓冲帧数&nbsp;×&nbsp;缓冲区数&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;每传完一缓冲区,USB&nbsp;Host&nbsp;Driver&nbsp;回调(CallBack)一次客户驱动程序,USB&nbsp;带宽按每1ms&nbsp;传送1&nbsp;帧数据来分配,要实现8kHz&nbsp;采样频率、8bits&nbsp;编码的音频PCM&nbsp;码流传输,帧数据包大小必须设为8Bytes,若设置4&nbsp;个缓冲区交替工作,每缓冲区分20&nbsp;帧传送,&nbsp;则RingBuffer&nbsp;的大小为640Bytes,那么USB&nbsp;主控制器每20ms&nbsp;的频率中断回调一次客户驱动程序是合适的。<br />&nbsp;&nbsp;&nbsp;&nbsp;驱动程序通过IoSetCompletionRoutine()函数给每个IRP&nbsp;设置回调函数入口地址,每完成一个IRP&nbsp;缓冲区数据传送操作,回调一次该地址指向的函数,以便把下一缓冲包数据压入到IRP&nbsp;栈,直到全部数据流传送完毕或人为终止传送。<br /><br />5&nbsp;结束语<br />&nbsp;&nbsp;&nbsp;&nbsp;扩展USB&nbsp;接口,大幅提升了32&nbsp;位ARM&nbsp;嵌入式系统数据通信的吞吐能力,有即插即用特性和多种数据传输模式,方案适合于嵌入式系统的多种应用。**具体阐述了方案硬件、软件设计的关键问题,并讨论了如何分配USB&nbsp;总线带宽,实现恒速音频PCM&nbsp;码流传送,实验结果表明该方案能流畅地接收Windows2000&nbsp;通过USB&nbsp;接口输出话音编码信号,方案可行,具有较高参考价值。<br />
arminfo 发表于 2009-6-22 14:05 | 显示全部楼层

不错的帖子,感谢啊

  
miclinux 发表于 2009-6-24 13:18 | 显示全部楼层

好,很详细

  
qtopia 发表于 2009-7-2 13:10 | 显示全部楼层

路过,顶

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

77

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部