如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.
分类: LINUX
2012-06-02 20:33:44
EZ Loader Custom USB Firmware Loader Driver
上面的一串英文是cypress公司的一个文档名称,是讲如何设置的,在这里保留一下,你可以google这个名称,然后找到那个文档读一下。
这里说一下CY7C68013A的C0加载方式是如何实现的。
首先我的系统是XP,系统装好了WINDDK,VC6.0.
1,你要有一个CY7C68013A的开发板,
2,安装CYPRESS的USB控制面板软件,它里面也包含了基本的驱动和一些固件例程。
我用的是如图所示的开发包,这是第一个版本,好像,现在还有2个新的版本。我这里只是使用这个版本。安装以后目录如下
然后到drivers目录
3,把EZLOADER文件夹,EZUSBDRV文件夹,EZUSBW2K.INF文件,这3个复制到另外的一个文件夹,我这里就直接放在C盘了。
4,从开始菜单,进入到WINDDK的编译环境,是DOS界面,启动它。
到c:\ezloaderok目录
目录下文件有:
5,用记事本打开Sources文件,将其中的一段修改如下,to build那个英文说得很明白了。
然后回到DOS界面
6,输入build –c,如果没有错误编译成功的话,界面如下
Ezloader.sys,就是下载固件程序到cy7c68013RAM的驱动文件,说白点就是,它是C0加载方式的,第一个驱动文件,功能就是将固件程序下载到RAM中。
这里差点漏了说,在这之前,我们要把固件程序也就是HEX文件转化为.c 的文件,将这个.c 文件中的那个数组,替换fireware.c 中对应的数组,如图
7,成功没有那么容易,我在编译的时候出现了这样的错误,
关于USHORT,类型不匹配的错误,找到相应的行,将数据变量强制类型转换,就好了。
USHORT,是unsigned short 类型的缩写。
8,现在ezloader.sys有了,接下来比较重要的就是inf文件了,我们就使用ezusbw2k.inf,做些修改,就可以达到我们的要求了,
先看看这个文件内容
[Version]
Signature="$CHICAGO$"
Class=USB
provider=%Cypress%
LayoutFile=layout.inf
[Manufacturer]
%Cypress%=Cypress
[Cypress]
;
; This is the VID/PID for the EZ-USB development board. This device
; is bound to a version of the general purpose driver that will
; automatically download the Keil 8051 monitor to external RAM.
; Do not use this VID/PID for your own device or the monitor will
; wipe out your firmware.
;
%USB\VID_0547&PID_0080.DeviceDesc%=EZUSBDEV.Dev, USB\VID_0547&PID_0080
%USB\VID_04B4&PID_0081.DeviceDesc%=EZUSBDEV.Dev, USB\VID_04B4&PID_0081
上面棕色的这段话,比较重要,我要翻译一下啊,就是说VID0547PID0080和VID04B4PID0081这2个标示是用来下载KEIL的监控程序到CY7C68013RAM的驱动所用的标示,一般程序不要使用这2个标示,这说明,这个INF文件可以下载程序到CY7C68013RAM,所以我们可以使用它为模板,来修改一下,达到我们的目的。
%USB\VID_0547&PID_1004.DeviceDesc%=EZUSBDEV.Dev,USB\VID_0547&PID_1004
%USB\VID_0547&PID_1005.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_1005
黄色是我添加的,PID1004就对应EZLOADER.SYS驱动,PID1005对应EZUSB.SYS驱动,它是USB通用驱动,CYPRESS公司提供的。
这里特别说明一下,CO加载模式需要EEPROM,在这里要使用USB控制面板将EEPROM写入C0 47 05 04 10 01 00 00,看紫色的,0410,就是1004的意思,很重要,USB刚刚接入的时候,芯片就是使用1004来进行前枚举的,也就是要首先加载EZLOADER.SYS这个驱动程序,这个驱动把固件程序下载到RAM中,然后芯片执行RAM中的程序,重新模拟USB接入,这就是后枚举了,当然了这个时候,就要使用固件程序里面设定的PID了。还有就是固件程序里面的PID要是1005,这样才可以和EZUSB.SYS匹配。如图
VID这里都是使用0547,所有的。
这一段话,很重要,理解明白,否则,你绝对会后悔。
;
; This VID/PID is used by several of the EZ-USB development kit
; samples. This device is bound to the general purpose driver.
;
%USB\VID_0547&PID_1002.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_1002
;
; The folowing PIDs are for all of the devices in the EZ-USB family.
; These are the hardcoded PIDs that will be reported by an EZ-USB
; device with no external EEPROM. Bound to the general purpose driver.
;
%USB\VID_0547&PID_2131.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2131
%USB\VID_0547&PID_2126.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2126
%USB\VID_0547&PID_2125.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2125
%USB\VID_0547&PID_2136.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2136
%USB\VID_0547&PID_2122.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2122
; EZ-USB FX
%USB\VID_0547&PID_2235.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2235
%USB\VID_0547&PID_2236.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2236
%USB\VID_0547&PID_2225.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2225
%USB\VID_0547&PID_2226.DeviceDesc%=EZUSB.Dev, USB\VID_0547&PID_2226
; EZ-USB FX2
%USB\VID_04B4&PID_8613.DeviceDesc%=EZUSB.Dev, USB\VID_04B4&PID_8613
%USB\VID_04B4&PID_1002.DeviceDesc%=EZUSB.Dev, USB\VID_04B4&PID_1002
[PreCopySection]
HKR,,NoSetupUI,,1
[DestinationDirs]
EZUSB.Files.Ext = 10,System32\Drivers
EZUSB.Files.Inf = 10,INF
EZUSBDEV.Files.Ext = 10,System32\Drivers
EZUSBDEV.Files.Inf = 10,INF
;---------------------------------------------------------------;
这下面一段是为EZUSB.SYS驱动设置的东西。
[EZUSB.Dev]
CopyFiles=EZUSB.Files.Ext, EZUSB.Files.Inf
AddReg=EZUSB.AddReg
[EZUSB.Dev.NT]
; copyfiles commented out for Win2K to avoid user intervention during install
; CopyFiles=EZUSB.Files.Ext, EZUSB.Files.Inf
AddReg=EZUSB.AddReg
[EZUSB.Dev.NT.Services]
Addservice = EZUSB, 0x00000002, EZUSB.AddService
[EZUSB.AddService]
DisplayName = %EZUSB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 2 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\ezusb.sys
LoadOrderGroup = Base
[EZUSB.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,ezusb.sys
[EZUSB.Files.Ext]
ezusb.sys
[EZUSB.Files.Inf]
ezusbw2k.Inf
;---------------------------------------------------------------;
这下面一段是为EZLOADER.SYS驱动设置的。和上面为EZUSB.SYS设置很相似。
[EZUSBDEV.Dev]
CopyFiles=EZUSBDEV.Files.Ext, EZUSBDEV.Files.Inf
AddReg=EZUSBDEV.AddReg
[EZUSBDEV.Dev.NT]
; copyfiles commented out for Win2K to avoid user intervention during install
; CopyFiles=EZUSBDEV.Files.Ext, EZUSBDEV.Files.Inf
AddReg=EZUSBDEV.AddReg
[EZUSBDEV.Dev.NT.Services]
Addservice = EZUSBDEV, 0x00000002, EZUSBDEV.AddService
[EZUSBDEV.AddService]
DisplayName = %EZUSBDEV.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 2 ; SERVICE_AUTO_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\ezloader.sys
要修改为ezloader.sys 了。
LoadOrderGroup = Base
[EZUSBDEV.AddReg]
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,ezloader.sys
[EZUSBDEV.Files.Ext]
ezloader.sys
[EZUSBDEV.Files.Inf]
ezusbw2k.Inf
;---------------------------------------------------------------;
[Strings]
Cypress="Cypress Semiconductor"
USB\VID_0547&PID_0080.DeviceDesc="Cypress EZ-U1SB Development Board"
USB\VID_04B4&PID_0081.DeviceDesc="Cypress EZ-U1SB FX2 Development Board"
USB\VID_0547&PID_1002.DeviceDesc="Cypress EZ-U1SB Sample Device"
USB\VID_04B4&PID_1002.DeviceDesc="Cypress EZ-U1SB Sample Device"
USB\VID_0547&PID_2131.DeviceDesc="Cypress EZ-U1SB (2131Q/2131S/2135S) - EEPROM missing"
USB\VID_0547&PID_2126.DeviceDesc="Cypress EZ-U1SB (2126S) - EEPROM missing"
USB\VID_0547&PID_2125.DeviceDesc="Cypress EZ-U1SB (2121S/2125S) - EEPROM missing"
USB\VID_0547&PID_2136.DeviceDesc="Cypress EZ-U1SB (2136S) - EEPROM missing"
USB\VID_0547&PID_2122.DeviceDesc="Cypress EZ-U1SB (2122S) - EEPROM missing"
USB\VID_0547&PID_2235.DeviceDesc="Cypress EZ-U1SB (2235) - EEPROM missing"
USB\VID_0547&PID_2236.DeviceDesc="Cypress EZ-U1SB (2236) - EEPROM missing"
USB\VID_0547&PID_2225.DeviceDesc="Cypress EZ-U1SB (2225) - EEPROM missing"
USB\VID_0547&PID_2226.DeviceDesc="Cypress EZ-U1SB (2226) - EEPROM missing"
USB\VID_04B4&PID_8613.DeviceDesc="Cypress EZ-U1SB FX2 (68613) - EEPROM missing"
USB\VID_0547&PID_1004.DeviceDesc="Using ezloader.inf for EZ-Loader before ReNumeration (ezloader.sys)"
USB\VID_0547&PID_1005.DeviceDesc="Cypress Widget afterReNumeration (ezusb.sys)"
EZUSB.SvcDesc="Cypress General Purpose U1SB Driver (ezusb.sys)"
EZUSBDEV.SvcDesc="Cypress General Purpose U1SB Driver (ezloader.sys)"
这里照葫芦画瓢,驱动安装以后自己可以看看效果。
说了这么多就是要把,原来ezusbw2k.inf中的ezmon.sys,替换为ezloader.sys,
不过网上一个网友说他用ezloader替换ezmon没有成功,但是,我这里成功了,也许是其他地方设置有关吧。
现在,我们ezloader.sys,ezusbw2k.inf,EEPROM的PID,VID,固件程序的VID,PID 都好了,就缺ezusb.sys这个通用驱动了。下面我们编译生成它的驱动文件。
这里涉及的内容比较多,要耐心琢磨和细心。
9,和编译生成ezloader.sys一样,看我编译成功后的界面。下图。
如果出现USHORT错误界面如下
找到对应的行数添加USHORT强制类型转换。如下图。
然后就好了。
10,接下来把ezloader.sys和ezusb.sys都复制到C:\windows\system32\drivers\目录下面,这个目录下面有很多其他的驱动,真是物以类聚啊。
11,上电,接上USB线,弹出安装驱动的对话框,不要自动寻找,要手动一步一步到
看到了吧,重枚举以后驱动程序就是EZUSB.SYS了,看看VID和PID.
因为前枚举比较快,看不到前面设置的STRING,如果你将固件程序里面的PID设置为1004的话,那么你这个时候看见的就是"Using ezloader.inf for EZ-Loader before ReNumeration (ezloader.sys)"了。我有一次忘了修改固件程序的PID,结果就是显示这个驱动,当时还感觉很奇怪呢。呵呵。
完全符合。