USB2.0------CY7C68013学习笔记
USB2.0------CY7C68013学习笔记
-------------by nong.hero 2008.05.12
一.USB2.0的枚举和重枚举的流程
1.在USB插入SUB主机后,因为RENUM位复位状态为‘0’,因此默认为缺省USB响应,也就是说根据EZ-USB的内部缺省SUB的PID VDI进行安装驱动程序,如果采用了由驱动程序下载固件的方式的话,则可以采用由CYPRESS公司提供的EZ-LOADER 驱动程序下载固件程序到EZ-USB的内部RAM中(应该注意的是EZ-LOADER 驱动程序的*.INF文件中的USB PID VID应该和EZ-USB的缺省PID/VID相一致,否则USB主机找不到相应的驱动程序)并且置位RENUM为‘1’表示以后usb主机的usb请求由固件程序进行响应,而不是缺省的USB设备响应,同时模拟USB的电气断开,通过置位和复位USBCS寄存器中的DISCON位来实现USB的模拟电气断开,USB主机重新枚举USB设备,根据固件中的PID VID重新安装驱动程序,以实现USB设备的功能。
二.USB2.0的固件下载方式
1.无EEPROM
2.有EEPROM的‘C0’下载方式
3.有EEPROM的‘C2’下载方式
三.固件代码分析
1.固件的描述符表(dscr.a51)
(1)固件描述符表的作用:
;;-----------------------------------------------------------------------------
;; File: dscr.a51
;; Contents: This file contains descriptor data tables.
;;
;; Copyright (c) 1997 AnchorChips, Inc. All rights reserved
;;-----------------------------------------------------------------------------
DSCR_DEVICE equ 1 ;; Descriptor type: Device
DSCR_CONFIG equ 2 ;; Descriptor type: Configuration
DSCR_STRING equ 3 ;; Descriptor type: String
DSCR_INTRFC equ 4 ;; Descriptor type: Interface
DSCR_ENDPNT equ 5 ;; Descriptor type: Endpoint
DSCR_DEVQUAL equ 6 ;; Descriptor type: Device Qualifier
DSCR_DEVICE_LEN equ 18
DSCR_CONFIG_LEN equ 9
DSCR_INTRFC_LEN equ 9
DSCR_ENDPNT_LEN equ 7
DSCR_DEVQUAL_LEN equ 10
ET_CONTROL equ 0 ;; Endpoint type: Control
ET_ISO equ 1 ;; Endpoint type: Isochronous
ET_BULK equ 2 ;; Endpoint type: Bulk
ET_INT equ 3 ;; Endpoint type: Interrupt
public DeviceDscr, DeviceQualDscr, HighSpeedConfigDscr, FullSpeedConfigDscr, StringDscr, UserDscr
DSCR SEGMENT CODE PAGE
;;-----------------------------------------------------------------------------
;; Global Variables
;;-----------------------------------------------------------------------------
rseg DSCR ;; locate the descriptor table in on-part memory.
DeviceDscr:
db DSCR_DEVICE_LEN ;; Descriptor length
db DSCR_DEVICE ;; Decriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
dw 4705H ;; Vendor ID
dw 0210H ;; Product ID (Sample Device)
dw 0000H ;; Product version ID
db 1 ;; Manufacturer string index
db 2 ;; Product string index
db 0 ;; Serial number string index
db 1 ;; Number of configurations
DeviceQualDscr:
db DSCR_DEVQUAL_LEN ;; Descriptor length
db DSCR_DEVQUAL ;; Decriptor type
dw 0002H ;; Specification Version (BCD)
db 00H ;; Device class
db 00H ;; Device sub-class
db 00H ;; Device sub-sub-class
db 64 ;; Maximum packet size
db 1 ;; Number of configurations
db 0 ;; Reserved
HighSpeedConfigDscr:
db DSCR_CONFIG_LEN ;; Descriptor length
db DSCR_CONFIG ;; Descriptor type
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (HighSpeedConfigDscrEnd-HighSpeedConfigDscr) / 256 ;; Total Length (MSB)
db 1 ;; Number of interfaces
db 1 ;; Configuration number
db 0 ;; Configuration string
db 10000000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)
;; Interface Descriptor
db DSCR_INTRFC_LEN ;; Descriptor length
db DSCR_INTRFC ;; Descriptor type
db 0 ;; Zero-based index of this interface
db 0 ;; Alternate setting
db 4 ;; Number of end points
db 0ffH ;; Interface class
db 00H ;; Interface sub class
db 00H ;; Interface sub sub class
db 0 ;; Interface descriptor string index
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 02H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 04H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 86H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 88H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 00H ;; Maximun packet size (LSB)
db 02H ;; Max packect size (MSB)
db 00H ;; Polling interval
HighSpeedConfigDscrEnd:
FullSpeedConfigDscr:
db DSCR_CONFIG_LEN ;; Descriptor length
db DSCR_CONFIG ;; Descriptor type
db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) mod 256 ;; Total Length (LSB)
db (FullSpeedConfigDscrEnd-FullSpeedConfigDscr) / 256 ;; Total Length (MSB)
db 1 ;; Number of interfaces
db 1 ;; Configuration number
db 0 ;; Configuration string
db 10000000b ;; Attributes (b7 - buspwr, b6 - selfpwr, b5 - rwu)
db 50 ;; Power requirement (div 2 ma)
;; Interface Descriptor
db DSCR_INTRFC_LEN ;; Descriptor length
db DSCR_INTRFC ;; Descriptor type
db 0 ;; Zero-based index of this interface
db 0 ;; Alternate setting
db 4 ;; Number of end points
db 0ffH ;; Interface class
db 00H ;; Interface sub class
db 00H ;; Interface sub sub class
db 0 ;; Interface descriptor string index
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 02H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 40H ;; Maximun packet size (LSB)
db 00H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 04H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 40H ;; Maximun packet size (LSB)
db 00H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 86H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 40H ;; Maximun packet size (LSB)
db 00H ;; Max packect size (MSB)
db 00H ;; Polling interval
;; Endpoint Descriptor
db DSCR_ENDPNT_LEN ;; Descriptor length
db DSCR_ENDPNT ;; Descriptor type
db 88H ;; Endpoint number, and direction
db ET_BULK ;; Endpoint type
db 40H ;; Maximun packet size (LSB)
db 00H ;; Max packect size (MSB)
db 00H ;; Polling interval
FullSpeedConfigDscrEnd:
StringDscr:
StringDscr0:
db StringDscr0End-StringDscr0 ;; String descriptor length
db DSCR_STRING
db 09H,04H
StringDscr0End:
StringDscr1:
db StringDscr1End-StringDscr1 ;; String descriptor length
db DSCR_STRING
db 'Y',00
db 'C',00
db 'L',00
db 'T',00
db 'e',00
db 'c',00
db 'h',00
StringDscr1End:
StringDscr2:
db StringDscr2End-StringDscr2 ;; Descriptor length
db DSCR_STRING
db 'E',00
db 'Z',00
db '-',00
db 'U',00
db 'S',00
db 'B',00
db ' ',00
db 'F',00
db 'X',00
db '2',00
StringDscr2End:
UserDscr:
dw 0000H
end
2.TD_int()函数
3.TD_POLL()函数
4.GET_DESCRIPTION 的代码分析
(1)setup段
四.驱动程序分析
1.驱动程序启动流程分析
(1)ezloader.sys驱动程序的作用:主要用于通过‘C0’方式下载固件到CY7C68013的内部RAM中。
1'在CYPRESS的安装完的工具软件目录下有ezloader的源程序。在DDK2000的安装目录下建立一个新的文件夹,如C:/NTDDK/EZLOADER;把ezloader的源程序下的所有文件都拷贝到新的文件夹下。
2'通过KEIL51编译器,将固件程序编译生成目标代码*.hex,如固件的目标代码文件为bulk.hex。通过CYPRESS公司提供的工具hex2c.exe;将bulk.hex转换成C数组数据,并且将新的数组数据代替ezloader源程序中的fireware.c中的数组数据。fireware.c中的数据数据也就是简要下载到cy7c68013中固件程序。
3' 在DDK2000的目录下找到build.exe工具软件。在安装完毕的DDK2000 程序中有“checked build environment”和“free build environment”两个build.exe 工具,任意选择打开一个工具便可。在该WIN32环境中显示的是" c:/ntddk>" ,通过在该提示符下输入“c:/ntddk>cd ezloader”进入到ezloader目录下。然后通过输入命令“c:/ntddk/cd ezloader> build -c”编译生成目标文件ezloader.sys。将生成的目标文件ezloader.sys拷贝到c:/winnt/system32/drivers目录下。
4'因为刚刚生成的ezloader.sys没有自动生成其对应的*.inf文件,所以需要自己建立一个*.inf文件,如ezloader.inf;该文件可以通过修改相同类型的usb相关的*.inf文件得到。如要注意的是在ezloader.inf文件中,对于"C0"下载方式,对应的PID、VID要与外部ROM中存储的PID、VID相同,以此保证USB第一次枚举的时候安装的是ezloader.sys;
至此,对于ezloader.sys的编写工作完毕。
(2)ezusb.sys驱动程序的作用:ezusb.sys是cypress公司提供的GDP(通用驱动程),主要用来实现usb外设访问的功能驱动。
1'ezusb.sys对应的ezusb.inf文件中的PID、VID要与下载到cy7c68013 RAM中的固件程序所定义的描述符中的新PID、VID相同。在固件程序中(如上面的固件程序bulk.hex),如果实现了重枚举的功能,则当重枚举的时候通过ezusb.inf文件PC就可以重新安装cy7c68013的驱动程序ezusb.sys,以实现相应的功能驱动;当然如果固件中没有实现重枚举的功能,那么也就不会进行重枚举,如采用cypress公司的例子dev_io,就没有实现重枚举。
总的来说,如果采用‘C0’下载的方式,先将固件程序通过hex2c.exe工具转换成相应的C数据格式替换掉ezloader源程序中的fierware.c中的数组;然后通过DDK的build.exe工具生成ezloader.sys,同时还要建立ezloader.sys的inf文件,引导安装ezloader.sys;最后是生成GDP驱动程序ezusb.sys,要注意的是ezusbb.sys的inf文件中的PID、VID要与固件中新定义的PID、VID相同,以便重枚举的时候可以找到ezusb.sys驱动。
当cy7c68013设备插入PC后,会检测到新设备(第一次枚举),通过向导先安装ezloader.sys驱动,当再次提示检测到新设备(重枚举)时,通过向导安装ezusb.sys通用驱动程序。以后每次重新插入cy7c68013设备,以上驱动都会自动安装完毕。
2.EZLOADER.SYS驱动程序分析
3.EZUSB.SYS功能驱动程序分析
4.一些概念的理解
(1)管道(PIPE)与端点(ENDPOINT)
(2)CY7C68013没有进入高速模式,而只是进入了全速模式,为什么?
TAG:
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | 6 | ||||
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
| 21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
| 28 | 29 | 30 | 31 | ||||||
我的存档
数据统计
- 访问量: 2482
- 日志数: 19
- 建立时间: 2007-04-14
- 更新时间: 2008-11-09
