基于EZ-USB FX2的USB 2.0系统软件开发
通用串行总线(Universal SeriaI Bus,简称USB)以其易插拔、无需配置、真正的即插即用等特性获得了广泛的市场认可。USB 1.O标准于1996年1月提出,传输速度为1.5 Mb/s的低速模式;1998年9月提出的USB 1.1标准则将速度提高到12 Mb/s的全速模式,并且增加了中断传输的传输方式。USB 2.0标准于2000年4月提出,将传输速度提高了40倍,达到了480 Mb/s的高速模式,足以满足大多数外设的速率要求
1 USB2.0接口芯片EZ-USB FX2的系统架构及开发 要点
CYPRESS的EZ-USB FX2是业界推出的第一个USB 2.0集成外围控制器。该器件集成有1个8051处理器、1个串行接口引擎(SIE)、1个USB收发器、8.5 kB片上RAM,4 kB FIFO存储器以及1个通用可编程接口(GPIF、)。FX2是一个相当完整的解决方案。
集成的USB收发器连接到USB总线管脚D+和D一,串行接口引擎sIE实现串行数据的编解码、检错、位填充和其他USB所需信号层的任务。最终sIE实现从USB接口 收发并行数据。
FX2中集成了增强型的8051处理器,他可工作在12MFIz,24 MHz和48 MHz的频率,并且一个指令周期只需4个时钟周期。单片机只是进行USB传输的维护及控制并不进行直接的数据传输。
为了实现USB 2.0的高速带宽,把FX2的端点FIF(和从属FIFO(实现和外部逻辑器件或处理器接口的FIFO)集成在一起以减少内部数据传输时间。并且FX2的FIFO有独特的"量子"特性,数据以I-JSB分组大小为单位被提交到FIF0,而不是每次一个字节。这简化了错误恢复,如果用经典的FIFO,当产生坏的(CR((循环校验码)时,所有的数据必然泛滥流出,因为他是坏数据;如果CRC是好的,则分组信息能从USB域交换到I/O(输入/输出)域。对外来说,他看起来仍然像FIF0,但代之以每次只传送1个字或1个字节为立即传送整个分组信息。端点缓冲器可通过固件设置为双、三或四缓冲器,与所需的数据量或灵活性有关。Fx2的FIFO量子特性及可编程设置多缓J冲为满足USB 2.0所需带宽提供了保障。
FX2片上只有RAM而无ROM,可以直接通过USB下载程序,实现所谓"软配置"。"软配置"提高了软件的调试及升级速度。
FX2与外部逻辑的2种接口方式:Slave FIFlos方式和通用可编程接口GPIF、方式。Slave FIFOs方式是从机方式,外部控制器可像普通FIF0一样对FX2的多层缓冲FIF、O进行读写。FX2的Slave FIFOs工作方式可设为同步或异步;工作时钟可选为内部产生或外部输入;其他控制信号也可灵活地设置为高有效或低有效。可编程接口(GPIF)方式是主机方式,可以软件编程读写控制波形,他几乎可以对任何8/16 b接口的控制器、存储器和总线进行数据的主动读写,非常灵活。
2系统软件的开发
USB系统软件主要包括设备固件、USB设备驱动程序和应用程序3个部分。
2.1固件架构
对于USB总线控制芯片,如果没有芯片与主机及外部逻辑通信的代码,芯片则无法完成响应功能。为了便于开发者缩短开发周期,CYPRESS为开发者提供了固件程序框架来实现循环查询的程序和与主机通信的端点中断程序。用户只需在这些框架里加入自己的代码就可以实现特定的功能。固件程序框架可以实现芯片初始化、处理USB标准设备请求、电源挂起管理等。为用户提供3类钩子函数:任务调度,标准设备请求解析,uSB中断处理。
EZ-USB FX2固件程序框架首先初识化所有内部状态量,然后调用用户初始化函数TD-Init(),然后初始化UsB总线设备接口为非配置状态,并同时打开中断。当完成上面的任务后,EZ-USB FX2固件程序就开始重新枚举,直到在端点0收到SETUP包为止。一旦EZ-USB FX2收到SETUP包,固件程序框架就开始进行任务分配、任务分配就是依次重复地执行以下过程:
(1)调用用户函数TD-Poll()。
(2)检测是否有未处理的设备请求,如果有,解析接收到的命令,进行适当响应。默认情况下,他会对给定的标准设备请求实现USB定义的响应;但是,框架提供分支程序允许用户程序解析处理或者覆盖特定的设备请求。
(3)检测USB核是否报告了一个USB挂起事件,如果有,调用用户函数TD~Susupend()。当返回值为真,检测是否有恢复事件,如果没有,则挂起处理器。当检测到恢复事件,调用用户函数TD-Resume(),并继续执行步骤(3)。当TD-Sustlpend()返回值为假时,则继续执行步骤(3)。通过以上流程,固件程序实现了简单的合作任务执行框架。
2.2驱动程序
在Windows平台下,USB驱动程序由3部分组成:USB设备驱动程序,USB总线驱动程序和USB主控制器驱动程序,他们必须遵循win32驱动程序模型(wDM)。其中,windows操作系统已经提供了处于驱动程序栈底的USB总线驱动程序和USB主控制器驱动程序。而USB设备驱动程序由设备开发者编写,他通过向USB总线驱动程序发送包含URB(USB Request Block)的IRP(I/0Request Packet),来实现USB外设之间的信息交换。当主机应用程序要对USB设备进行I/0操作时,他调用Windows API函数对win32子系统进行win32调用,由I/O管理器将此请求构造成一个合适的IRP,并把他传递给USB设备驱动程序。USB设备驱动程序接受到这个IRP后,根据IRP中的包含的具体操作代码,构造响应的URB并把他放到一个新IRP中,然后把此IRP传递到USB总线驱动程序,USB总线驱动程序根据IRP中所包含的URB执行响应的操作,并把操作结果通过IRP返还给USB设备驱动程序。USB设备驱动程序接受到此IRP后,将操作结果通过IRP返还I/O管理器。最后,I/O管理器将此IRP中的操作结果返还给应用程序,至此应用程序对uSB设备的一次I/O操作完成。
在CYPRESS公司的EZ-USB FX2开发包中,有一个通用的驱动程序。EZ-USB GENERAL PURP()SEDEVICE DRIVER(GPD),GPD提供了USB标准设备请求和数据传输的用户模式接口,可以直接用来开发上层应用程序,加快开发进度。
2.3上层应用程序
应用程序工作于用户模式,用户模式可以访问文件,处理数据,人机交互,不过必须借助设备驱动程序来访问硬件。对于EZ-USB FX2而言,所有用户模式通过I/0 control调用来访问EZ-USB GPD。每一个连接到主机的EZ-USB设备,驱动产生一个形式为ezusb-i的符号连接名。符号连接名用于调用CreateFile时得到设备驱动的句柄,实际上CreateFile()得到设备驱动创建的设备对象的句柄。
应用程序通过CreateFile()得到USB设备句柄,用Device Control()来进行控制传输。在VC环境下开发的主机端的应用程序,实现了设备的打开、关闭、固件下载、端口配置和文件传输等功能。界面如图3所示。
3结语
USB2.0为PC和外部硬件设备之间提供了一种快速-和方便的数据交换方式,本文提供了基于EZ USB FX2的一个很好的解决方案,实现了从底层固件到上层应用程序数据传输的整个软件系统。
参考文献:
[1].ROMdatasheethttp://www.dzsc.com/datasheet/ROM_1188413.html.
[2].EZ-USBdatasheethttp://www.dzsc.com/datasheet/EZ-USB_305660.html.
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码