欢迎各位莅临我的自由空间!

USB2.0------CY7C68013学习笔记

上一篇 / 下一篇  2008-05-10 21:34:43

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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-21  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 2482
  • 日志数: 19
  • 建立时间: 2007-04-14
  • 更新时间: 2008-11-09

RSS订阅

Open Toolbar