-USB芯片的开发过程,Cypress公司提供了KeilC51环境下编写固件程序的框架。该框架集成了开发USB总线设备所需的基本函数,用户可以在此基础上加入自己的代码实现特定的要求。固件程序框架如图3所示。
图3 EZ一USB固件程序框架
EZ一USB固件程序框架首先初始化所有的内部状态变量,然后调用用户初始化函数TD_Init(),然后初始化USB总线设备接口为非配置状态,并同时打开中断。当完成上面的任务后,EZ一USB 固件程序就开始重新枚举设备直到端点0收到SETUP包为止。一旦EZ-USB收到SETUP包,固件程序就开始进行任务分配[4]。任务分配就是依次重复地执行下面的过程:
(1) 调用用户函数TD_Poll()。
(2) 检测是否有标准的设备请求,如果有,则执行指令并做出相应的操作。
(3) 检测USB核是否有USB挂起事件。如果有USB挂起事件,则调用用户程序TD_Suspend()。当TD_Suspend()返回为真时,USB核检测是否有重新开始事件。当检测到有重新开始的事件,USB调用用户程序TD_Resume(),并继续执行步骤3.
固件代码在Keil Vision2环境中编译后,最终生成ezusb.hex文件。用USB线把DSP开发板接到PC机上,启动“EZ-USB Control Panel”,就可以把ezusb.hex文件下载到ANZ13lQ内部的8K RAM 中。
2.2 EZ-USB驱动程序开发
驱动程序(USBD)是USB总线系统中负责管理USB的工作. USB总线客户软件包含了用来控制不同USB总线外设的功能程序,它通过一个Windows定义的软件接口与根集线器驱动程序进行通信;而USB总线根集线器驱动程序则通过包含在USBD中的USBDI(USB驱动程序接口。)实现USBD的通信;然后,USBD 会选择两种主控制器之一同下方的主控制器进行通信;最后,主控制器驱动程序会通过PCI枚举器软件直接实现对USB物理总线的访问。
USB总线设备驱动程序必须遵循Win32驱动程序模型(WDM),其扩展名为.Sys。驱动程序主要实现的功能包括:设备初始化;即插即用设备的创建和删除;处理Win32打开和关闭文件句柄请求;类功能定义IO CTL(I/O Control)、功能实现;IRP(I/O Request Packet)的调用处理;访问硬件。
为帮助设备和软件的开发者测试USB总线设备请求和数据传输的能力,Cypress公司提供了EZ_ USB通用驱动程序GPD(General Purpose Driver)。GPD是用来和基于EZ_ USB外设接口的通用设备驱动程序,提供公共USB总线设备请求和数据传输的用户态接口。使用GPD作为起始点,可以创建用户特有的驱动程序。
(1) 建立EZ_USB GPD
建立GDP需要微软的WDM DDK和微软的Visual C++6.0。EZ-USB的GPD ezusb.sys是一个不用修改就可用的驱动程序,在自行开发外部设备的时,可以采用这个驱动程序作为USB驱动。
(2) 用户态和GPD的接口
对于用户态的应用,可以使用VC++编译工具CreateFile()和DeviceIoControl()。所有的用户态通过I/O控制调用来访问EZ_USB GPD的。一个用户态程序首先通过调用一个Win32函数CreateFile( )来获得设备驱动程序的句柄。然后用Win32函数DeviceIoControl()通过CreateFile( )函数返回的句柄,来提交I/O控制代码和相关的输入输出缓冲区到驱动程序。
2.3 PC机用户程序开发
后台PC机用户程序采用Visual C++6.0 编写,主要功能是利用开发的USB驱动程序完成数据的发送和接收,并将数据保存为自己定义的格式。下面将详细介绍利用USB驱动程序中定义的控制通道和块传输通道进行数据接收和保存的过程,并给出部分关键代码。
(1)打开USB设备
BOOL usbMark; ∥当前选定的USB 设备是否打开标志。
usbMark=OpenUSB();∥OpenUSB函数的功能是调用设备对应的驱动程序,并获得设备的描述,其返回值为 BOOL型,可以依此判断设备是否正确工作。
(2)定义命令请求和数据结构。
char buffer[64];∥定义数据缓冲区;
ULONG venderlong=0;
REQUEST_DATAusbRequest;∥定