usb固件程序结构分析

来源:本站
导读:目前正在解读《usb固件程序结构分析》的相关信息,《usb固件程序结构分析》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《usb固件程序结构分析》的详细说明。
简介: 由于要用fpga给电脑传输视频信息,所以决定用cypress公司的cy7c68013A来作为usb、设备的主控芯片,看了好2周的usb的书,基本上算是把大概的协议搞清楚了,今天开始着手开发固件,这些示例都是以官方示例的基础上更改过来的。

usb的描述符文件。

包括设备描述 ,接口描述符,端点描述符,字符串描述符等。用于描述设备的总体信息。包括pid,vid,设备类和设备子类等。一个usb设备只能有一个设备描述符。配置描述符一般描述usb设备的配置信息。可以有一个或者多个配置,每个配置必须有一个配置描述符。字符串描述符用来保存一些供应商的名称,设备序列号,供应商名称等的文本信息。接口描述符用来表述usb接口中各个接口的特性。,包括接口号,端点个数,所属的设备和子类等等。

端点描述符表述usb设备端点的特性,包括所支持的传输类型、传输方向、最大的数据包长度、和访问间隔等信息。

;;-----------------------------------------------------------------------------;;   File:      dscr.a51;;   Contents:  This file contains descriptor data tables.   此文件包含描述符表;;;; $Archive: /USB/Examples/Fx2lp/bulkloop/dscr.a51 $;; $Date: 9/01/03 8:51p $;; $Revision: 3 $;;;;;;-----------------------------------------------------------------------------;; Copyright 2003, Cypress Semiconductor Corporation;;-----------------------------------------------------------------------------;;-----------------------------------------------------------------------------   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   18DSCR_CONFIG_LEN   equ    9DSCR_INTRFC_LEN   equ    9DSCR_ENDPNT_LEN   equ    7DSCR_DEVQUAL_LEN  equ   10ET_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, UserDscrDSCR   SEGMENT   CODE PAGE;;-----------------------------------------------------------------------------;; Global Variables;;-----------------------------------------------------------------------------      rseg DSCR      ;; locate the descriptor table in on-part memory.DeviceDscr:         db   DSCR_DEVICE_LEN      ;; Descriptor length设备描述符的长度,18字节。      db   DSCR_DEVICE   ;; Decriptor type 描述类型      dw   0002H      ;; Specification Version (BCD)  符合usb2.0规范      db   00H        ;; Device class   设备类代码      db   00H         ;; Device sub-class设备子类代码      db   00H         ;; Device sub-sub-class设备协议代码      db   64         ;; Maximum packet size端点0的最大包大小      dw   3412H      ;; Vendor ID厂商idvid      dw   7856H      ;; Product ID (Sample Device) 产品id  pid      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         ;; ReservedHighSpeedConfigDscr:         db   DSCR_CONFIG_LEN               ;; Descriptor length 配置描述符,高速设备描述符      db   DSCR_CONFIG                  ;; Descriptor type描述类型 =0x02      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 (p 2 ma)  最大电流;; Interface Descriptor 接口描述符      db   DSCR_INTRFC_LEN      ;; Descriptor length      db   DSCR_INTRFC         ;; Descriptor type   04h      db   0               ;; Zero-based index of this interface 接口号      db   0               ;; Alternate setting 替换设置号数      db   2               ;; Number of end points   除了端点0外,支持的端点数目是2      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   82H               ;; Endpoint number, and direction   端点号,和方向      db   ET_BULK            ;; Endpoint type   端点传输类型      db   00H               ;; Maximun packet size (LSB)   数据包大小低位      db   04H               ;; Max packect size (MSB)      db   00H               ;; Polling interval  轮巡间隔;; Endpoint Descriptor      db   DSCR_ENDPNT_LEN      ;; Descriptor length      db   DSCR_ENDPNT         ;; Descriptor type      db   08H               ;; Endpoint number, and direction      db   ET_BULK            ;; Endpoint type      db   00H               ;; Maximun packet size (LSB)      db   02H               ;; Max packect size (MSB)      db   00H               ;; Polling intervalHighSpeedConfigDscrEnd:   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 (p 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 intervalFullSpeedConfigDscrEnd:   StringDscr:  //字符串描述符StringDscr0:    //字符串0      db   StringDscr0End-StringDscr0      ;; String descriptor length 描述长度      db   DSCR_STRING //描述类型      db   09H,04H //设备所支持的语言代码,表示是英语StringDscr0End:StringDscr1:         db   StringDscr1End-StringDscr1      ;; String descriptor length制造商的字符串描述符      db   DSCR_STRING      db   'C',00      db   'y',00      db   'p',00      db   'r',00      db   'e',00      db   's',00      db   's',00StringDscr1End: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',00StringDscr2End:UserDscr:         //空描述符,表述描述符表的结束      dw   0000H      end      

fw.c文件,代表主程序文件,usb协议等都在这里实现,包括断电上电枚举,重枚举,唤醒以及调用用户自己的程序和控制命令等等都在这里完成。它首先进行一系列通用初始化设置,并调用void TD_Init(void)函数来实现用户的特殊初始化设置。之后,程序会一直监视是否有指令收到,并在空闲的时候反复调用TD_Poll()函数来实现我们用户的功能

//-----------------------------------------------------------------------------//   File:      fw.c//   Contents:  Firmware frameworks task dispatcher and device request parser//// $Archive: /USB/Examples/FX2LP/bulkext/fw.c $// $Date: 3/23/05 2:53p $// $Revision: 8 $//////-----------------------------------------------------------------------------// Copyright 2003, Cypress Semiconductor Corporation//-----------------------------------------------------------------------------#include "fx2.h"#include "fx2regs.h"#include "syncdly.h"            // SYNCDELAY macro//-----------------------------------------------------------------------------// Constants  目录//-----------------------------------------------------------------------------#define DELAY_COUNT   0x9248*8L  // Delay for 8 sec at 24Mhz, 4 sec at 48  在24Mhz的时钟下延迟8秒,48Mhz的时钟下延迟4秒。#define _IFREQ  48000            // IFCLK constant for Synchronization Delay#define _CFREQ  48000            // CLKOUT constant for Synchronization Delay#define SC_SetData 0xAB //自定义指令//-----------------------------------------------------------------------------// Random Macros//-----------------------------------------------------------------------------#define   min(a,b) (((a)<(b))?(a):(b))#define   max(a,b) (((a)>(b))?(a):(b))//-----------------------------------------------------------------------------// Global Variables//-----------------------------------------------------------------------------volatile BOOL   GotSUD;   //防止编译器优化BOOL      Rwuen;BOOL      Selfpwr;volatile BOOL   Sleep;                  // Sleep mode enable flagWORD   pDeviceDscr;   // Pointer to Device Descriptor; Descriptors may be movedWORD   pDeviceQualDscr;WORD   pHighSpeedConfigDscr;WORD   pFullSpeedConfigDscr;   WORD   pConfigDscr;WORD   pOtherConfigDscr;   WORD   pStringDscr;   //-----------------------------------------------------------------------------// Prototypes//-----------------------------------------------------------------------------void SetupCommand(void);void TD_Init(void);void TD_Poll(void);void DR_SetData(void); //自定义函数BOOL TD_Suspend(void);BOOL TD_Resume(void);BOOL DR_GetDescriptor(void);BOOL DR_SetConfiguration(void);BOOL DR_GetConfiguration(void);BOOL DR_SetInterface(void);BOOL DR_GetInterface(void);BOOL DR_GetStatus(void);BOOL DR_ClearFeature(void);BOOL DR_SetFeature(void);BOOL DR_VendorCmnd(void);// this table is used by the epcs macro const char code  EPCS_Offset_Lookup_Table[] ={   0,    // EP1OUT   1,    // EP1IN   2,    // EP2OUT   2,    // EP2IN   3,    // EP4OUT   3,    // EP4IN   4,    // EP6OUT   4,    // EP6IN   5,    // EP8OUT   5,    // EP8IN};// macro for generating the address of an endpoint's control and status register (EPnCS)#define epcs(EP) (EPCS_Offset_Lookup_Table[(EP & 0x7E) | (EP > 128)] + 0xE6A1)//-----------------------------------------------------------------------------// Code//-----------------------------------------------------------------------------// Task dispatchervoid main(void){   DWORD   i;   WORD   offset;   DWORD   DevDescrLen;   DWORD   j=0;   WORD   IntDescrAddr;   WORD   ExtDescrAddr;   // Initialize Global States   Sleep = FALSE;               // Disable sleep mode   Rwuen = FALSE;               // Disable remote wakeup   Selfpwr = FALSE;            // Disable self powered   GotSUD = FALSE;               // Clear "Got setup data" flag   // Initialize user device   TD_Init();   // The following section of code is used to relocate the descriptor table.    // The frameworks uses SUDPTRH and SUDPTRL to automate the SETUP requests   // for descriptors.  These registers only work with memory locations   // in the EZ-USB internal RAM.  Therefore, if the descriptors are located   // in external RAM, they must be copied to in internal RAM.     // The descriptor table is relocated by the frameworks ONLY if it is found    // to be located in external memory.   pDeviceDscr = (WORD)&DeviceDscr;   pDeviceQualDscr = (WORD)&DeviceQualDscr;   pHighSpeedConfigDscr = (WORD)&HighSpeedConfigDscr;   pFullSpeedConfigDscr = (WORD)&FullSpeedConfigDscr;   pStringDscr = (WORD)&StringDscr;   // Is the descriptor table in external RAM (> 16Kbytes)?  If yes,   // then relocate.   // Note that this code only checks if the descriptors START in    // external RAM.  It will not work if the descriptor table spans   // internal and external RAM.   if ((WORD)&DeviceDscr & 0xC000)   {      // first, relocate the descriptors      IntDescrAddr = INTERNAL_DSCR_ADDR;      ExtDescrAddr = (WORD)&DeviceDscr;      DevDescrLen = (WORD)&UserDscr - (WORD)&DeviceDscr + 2;      for (i = 0; i < DevDescrLen; i++)         *((BYTE xdata *)IntDescrAddr+i) = *((BYTE xdata *)ExtDescrAddr+i);      // update all of the descriptor pointers      pDeviceDscr = IntDescrAddr;      offset = (WORD)&DeviceDscr - INTERNAL_DSCR_ADDR;      pDeviceQualDscr -= offset;      pConfigDscr -= offset;      pOtherConfigDscr -= offset;      pHighSpeedConfigDscr -= offset;      pFullSpeedConfigDscr -= offset;      pStringDscr -= offset;   }   EZUSB_IRQ_ENABLE();            // Enable USB interrupt (INT2)   EZUSB_ENABLE_RSMIRQ();            // Wake-up interrupt   INTSETUP |= (bmAV2EN | bmAV4EN);     // Enable INT 2 & 4 autovectoring   USBIE |= bmSUDAV | bmSUTOK | bmSUSP | bmURES | bmHSGRANT;   // Enable selected interrupts   EA = 1;                  // Enable 8051 interrupts#ifndef NO_RENUM   // Renumerate if necessary.  Do this by checking the renum bit.  If it   // is already set, there is no need to renumerate.  The renum bit will   // already be set if this firmware was loaded from an eeprom.   if(!(USBCS & bmRENUM))   {       EZUSB_Discon(TRUE);   // renumerate   }#endif   // unconditionally re-connect.  If we loaded from eeprom we are   // disconnected and need to connect.  If we just renumerated this   // is not necessary but doesn't hurt anything   USBCS &=~bmDISCON;   CKCON = (CKCON&(~bmSTRETCH)) | FW_STRETCH_VALUE; // Set stretch   // clear the Sleep flag.   Sleep = FALSE;   // Task Dispatcher   while(TRUE)               // Main Loop   {      // Poll User Device      TD_Poll();      // Check for pending SETUP      if(GotSUD)      {         SetupCommand();          // Implement setup command         GotSUD = FALSE;          // Clear SETUP flag      }      // check for and handle suspend.      // NOTE: Idle mode stops the processor clock.  There are only two      // ways out of idle mode, the WAKEUP pin, and detection of the USB      // resume state on the USB bus.  The timers will stop and the      // processor will not wake up on any other interrupts.      if (Sleep)      {         if(TD_Suspend())         {             Sleep = FALSE;     // Clear the "go to sleep" flag.  Do it here to prevent any race condition between wakeup and the next sleep.            do            {               EZUSB_Susp();         // Place processor in idle mode.            }            while(!Rwuen && EZUSB_EXTWAKEUP());            // above.  Must continue to go back into suspend if the host has disabled remote wakeup            // *and* the wakeup was caused by the external wakeup pin.            // 8051 activity will resume here due to USB bus or Wakeup# pin activity.            EZUSB_Resume();   // If source is the Wakeup# pin, signal the host to Resume.                  TD_Resume();         }         }   }}BOOL HighSpeedCapable(){   // this function determines if the chip is high-speed capable.   // FX2 and FX2LP are high-speed capable. FX1 is not - it does   // not have a high-speed transceiver.   if (GPCR2 & bmFULLSPEEDONLY)      return FALSE;   else      return TRUE;}   // Device request parservoid SetupCommand(void){   void   *dscr_ptr;   switch(SETUPDAT[1])   {      case SC_GET_DESCRIPTOR:                  // *** Get Descriptor         if(DR_GetDescriptor())            switch(SETUPDAT[3])                     {               case GD_DEVICE:            // Device                  SUDPTRH = MSB(pDeviceDscr);                  SUDPTRL = LSB(pDeviceDscr);                  break;               case GD_DEVICE_QUALIFIER:            // Device Qualifier     // only retuen a device qualifier if this is a high speed  // capable chip.     if (HighSpeedCapable())  {                  SUDPTRH = MSB(pDeviceQualDscr);                  SUDPTRL = LSB(pDeviceQualDscr);  }  else  {  EZUSB_STALL_EP0();  }  break;               case GD_CONFIGURATION:         // Configuration                  SUDPTRH = MSB(pConfigDscr);                  SUDPTRL = LSB(pConfigDscr);                  break;               case GD_OTHER_SPEED_CONFIGURATION:  // Other Speed Configuration                  SUDPTRH = MSB(pOtherConfigDscr);                  SUDPTRL = LSB(pOtherConfigDscr);                  break;               case GD_STRING:            // String                  if(dscr_ptr = (void *)EZUSB_GetStringDscr(SETUPDAT[2]))                  {                     SUDPTRH = MSB(dscr_ptr);                     SUDPTRL = LSB(dscr_ptr);                  }                  else                      EZUSB_STALL_EP0();   // Stall End Point 0                  break;               default:            // Invalid request                  EZUSB_STALL_EP0();      // Stall End Point 0            }         break;      case SC_GET_INTERFACE:                  // *** Get Interface         DR_GetInterface();         break;      case SC_SET_INTERFACE:                  // *** Set Interface         DR_SetInterface();         break;      case SC_SET_CONFIGURATION:               // *** Set Configuration         DR_SetConfiguration();         break;      case SC_GET_CONFIGURATION:               // *** Get Configuration         DR_GetConfiguration();         break;      case SC_GET_STATUS:                  // *** Get Status         if(DR_GetStatus())            switch(SETUPDAT[0])            {               case GS_DEVICE:            // Device                  EP0BUF[0] = ((BYTE)Rwuen << 1) | (BYTE)Selfpwr;                  EP0BUF[1] = 0;                  EP0BCH = 0;                  EP0BCL = 2;                  break;               case GS_INTERFACE:         // Interface                  EP0BUF[0] = 0;                  EP0BUF[1] = 0;                  EP0BCH = 0;                  EP0BCL = 2;                  break;               case GS_ENDPOINT:         // End Point                  EP0BUF[0] = *(BYTE xdata *) epcs(SETUPDAT[4]) & bmEPSTALL;                  EP0BUF[1] = 0;                  EP0BCH = 0;                  EP0BCL = 2;                  break;               default:            // Invalid Command                  EZUSB_STALL_EP0();      // Stall End Point 0            }         break;      case SC_CLEAR_FEATURE:                  // *** Clear Feature         if(DR_ClearFeature())            switch(SETUPDAT[0])            {               case FT_DEVICE:            // Device                  if(SETUPDAT[2] == 1)                     Rwuen = FALSE;       // Disable Remote Wakeup                  else                     EZUSB_STALL_EP0();   // Stall End Point 0                  break;               case FT_ENDPOINT:         // End Point                  if(SETUPDAT[2] == 0)                  {                     *(BYTE xdata *) epcs(SETUPDAT[4]) &= ~bmEPSTALL;                     EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] );                  }                  else                     EZUSB_STALL_EP0();   // Stall End Point 0                  break;            }         break;      case SC_SET_FEATURE:                  // *** Set Feature         if(DR_SetFeature())            switch(SETUPDAT[0])            {               case FT_DEVICE:            // Device                  if(SETUPDAT[2] == 1)                     Rwuen = TRUE;      // Enable Remote Wakeup                  else if(SETUPDAT[2] == 2)                     // Set Feature Test Mode.  The core handles this request.  However, it is                     // necessary for the firmware to complete the handshake phase of the                     // control transfer before the chip will enter test mode.  It is also                     // necessary for FX2 to be physically disconnected (D+ and D-)                     // from the host before it will enter test mode.                     break;                  else                     EZUSB_STALL_EP0();   // Stall End Point 0                  break;               case FT_ENDPOINT:         // End Point                  *(BYTE xdata *) epcs(SETUPDAT[4]) |= bmEPSTALL;                  break;               default:                  EZUSB_STALL_EP0();      // Stall End Point 0            }         break;  case SC_SetData:     DR_SetData();           break;      default:                     // *** Invalid Command         if(DR_VendorCmnd())            EZUSB_STALL_EP0();            // Stall End Point 0   }   // Acknowledge handshake phase of device request   EP0CS |= bmHSNAK;}// Wake-up interrupt handlervoid resume_isr(void) interrupt WKUP_VECT{   EZUSB_CLEAR_RSMIRQ();}

bulkloop.c批量循环文件

//-----------------------------------------------------------------------------//   File:      bulkloop.c//   Contents:  Hooks required to implement USB peripheral function.  通过钩子请求配置usb外围设备的功能//// $Archive: /USB/Examples/FX2LP/bulkloop/bulkloop.c $// $Date: 3/23/05 2:55p $// $Revision: 4 $//////-----------------------------------------------------------------------------// Copyright 2003, Cypress Semiconductor Corporation//-----------------------------------------------------------------------------#pragma NOIV               // Do not generate interrupt vectors不产生中断向量#include "fx2.h"#include "fx2regs.h"#include "syncdly.h"            // SYNCDELAY macro 同步宏extern BOOL GotSUD;             // Received setup data flag  接受设置数据标志extern BOOL Sleep; //extern BOOL Rwuen;extern BOOL Selfpwr;BYTE Configuration;             // Current configuration   当前配置BYTE AlternateSetting;          // Alternate settings  可替代的设置#define VR_NAKALL_ON    0xD0#define VR_NAKALL_OFF   0xD1void user_init(void){OEA|=0x03;}//-----------------------------------------------------------------------------// Task Dispatcher hooks   任务收发钩子 //   The following hooks are called by the task dispatcher.//-----------------------------------------------------------------------------void TD_Init(void)    // Called once at startup  一旦开始就开始唤醒{CPUCS = 0x10;IFCONFIG = 0xCB;FIFORESET = 0x80; // reset all FIFOs重置fifoSYNCDELAY;FIFORESET = 0x02;SYNCDELAY;FIFORESET = 0x04;SYNCDELAY;FIFORESET = 0x06;SYNCDELAY;FIFORESET = 0x08;SYNCDELAY;FIFORESET = 0x00;SYNCDELAY;PINFLAGSAB = 0xCB; SYNCDELAY; PINFLAGSCD = 0x00;SYNCDELAY; PORTACFG = 0x00; SYNCDELAY;FIFOPINPOLAR = 0x00; SYNCDELAY;EP2AUTOINLENH = 0x04;SYNCDELAY; EP2AUTOINLENL = 0x00;SYNCDELAY;EP1OUTCFG = 0xA0;EP1INCFG = 0xA0;SYNCDELAY;  EP2FIFOCFG = 0x4D;                  EP2CFG = 0xEB;SYNCDELAY;                    EP4CFG = 0x00;SYNCDELAY;                    EP6CFG = 0x00;SYNCDELAY; EP8FIFOCFG = 0x31;    EP8CFG = 0xA0; AUTOPTRSETUP |= 0x01; }void TD_Poll(void)              {}BOOL TD_Suspend(void)          // Called before the device goes into suspend mode在设备挂起之前被唤醒{   return(TRUE);}BOOL TD_Resume(void)          // Called after the device resumes   设备恢复之后被唤醒{   return(TRUE);}//-----------------------------------------------------------------------------// Device Request hooks 设备请求钩子//   The following hooks are called by the end point 0 device request parser.  在最后一个端点0设备请求分析 钩子被访问//-----------------------------------------------------------------------------BOOL DR_GetDescriptor(void){   return(TRUE);}BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received  当设置包被接受到时call{   Configuration = SETUPDAT[2];   return(TRUE);            // Handled by user code   通过用户代码操作}BOOL DR_GetConfiguration(void)   // Called when a Get Configuration command is received  当请求包被接受到时被访问{   EP0BUF[0] = Configuration;   EP0BCH = 0;   EP0BCL = 1;   return(TRUE);            // Handled by user code}BOOL DR_SetInterface(void)       // Called when a Set Interface command is received  当接口设置名令被接收到时被访问{   AlternateSetting = SETUPDAT[2];   return(TRUE);            // Handled by user code}BOOL DR_GetInterface(void)       // Called when a Set Interface command is received 当设置接口命令被接收到时被访问{   EP0BUF[0] = AlternateSetting;   EP0BCH = 0;   EP0BCL = 1;   return(TRUE);            // Handled by user code}BOOL DR_GetStatus(void){   return(TRUE);}BOOL DR_ClearFeature(void){   return(TRUE);}BOOL DR_SetFeature(void){   return(TRUE);}BOOL DR_VendorCmnd(void){  BYTE tmp;    switch (SETUPDAT[1])  {     case VR_NAKALL_ON:        tmp = FIFORESET;        tmp |= bmNAKALL;              SYNCDELAY;                            FIFORESET = tmp;        break;     case VR_NAKALL_OFF:        tmp = FIFORESET;        tmp &= ~bmNAKALL;              SYNCDELAY;                            FIFORESET = tmp;        break;     default:        return(TRUE);  }  return(FALSE);}//-----------------------------------------------------------------------------// USB Interrupt Handlers 中断处理程序//   The following functions are called by the USB interrupt jump table.   下面的程序功能在产生usb中断跳转表 时被访问//-----------------------------------------------------------------------------// Setup Data Available Interrupt Handler设置可用的数据中断处理程序void ISR_Sudav(void) interrupt 0{   GotSUD = TRUE;            // Set flag设置标志   EZUSB_IRQ_CLEAR();   USBIRQ = bmSUDAV;         // Clear SUDAV IRQ  清除设备就绪中断请求}// Setup Token Interrupt Handler  设置请求的中断处理程序void ISR_Sutok(void) interrupt 0{   EZUSB_IRQ_CLEAR();   USBIRQ = bmSUTOK;         // Clear SUTOK IRQ 清除设备就绪中断请求}void ISR_Sof(void) interrupt 0{   EZUSB_IRQ_CLEAR();   USBIRQ = bmSOF;            // Clear SOF IRQ   清楚sof中断请求}void ISR_Ures(void) interrupt 0{   // whenever we get a USB reset, we should revert to full speed mode无论什么时候的usb复位,我们都应该回复全速模式   pConfigDscr = pFullSpeedConfigDscr;   ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR;   pOtherConfigDscr = pHighSpeedConfigDscr;   ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR;   EZUSB_IRQ_CLEAR();   USBIRQ = bmURES;         // Clear URES IRQ清除uses中断请求}void ISR_Susp(void) interrupt 0{   Sleep = TRUE;   EZUSB_IRQ_CLEAR();   USBIRQ = bmSUSP;}void ISR_Highspeed(void) interrupt 0{   if (EZUSB_HIGHSPEED())   {      pConfigDscr = pHighSpeedConfigDscr;      ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR;      pOtherConfigDscr = pFullSpeedConfigDscr;      ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR;   }   EZUSB_IRQ_CLEAR();   USBIRQ = bmHSGRANT;}void ISR_Ep0ack(void) interrupt 0{}void ISR_Stub(void) interrupt 0{}void ISR_Ep0in(void) interrupt 0{}void ISR_Ep0out(void) interrupt 0{}void ISR_Ep1in(void) interrupt 0{}void ISR_Ep1out(void) interrupt 0{}void ISR_Ep2inout(void) interrupt 0{}void ISR_Ep4inout(void) interrupt 0{}void ISR_Ep6inout(void) interrupt 0{}void ISR_Ep8inout(void) interrupt 0{}void ISR_Ibn(void) interrupt 0{}void ISR_Ep0pingnak(void) interrupt 0{}void ISR_Ep1pingnak(void) interrupt 0{}void ISR_Ep2pingnak(void) interrupt 0{}void ISR_Ep4pingnak(void) interrupt 0{}void ISR_Ep6pingnak(void) interrupt 0{}void ISR_Ep8pingnak(void) interrupt 0{}void ISR_Errorlimit(void) interrupt 0{}void ISR_Ep2piderror(void) interrupt 0{}void ISR_Ep4piderror(void) interrupt 0{}void ISR_Ep6piderror(void) interrupt 0{}void ISR_Ep8piderror(void) interrupt 0{}void ISR_Ep2pflag(void) interrupt 0{}void ISR_Ep4pflag(void) interrupt 0{}void ISR_Ep6pflag(void) interrupt 0{}void ISR_Ep8pflag(void) interrupt 0{}void ISR_Ep2eflag(void) interrupt 0{}void ISR_Ep4eflag(void) interrupt 0{}void ISR_Ep6eflag(void) interrupt 0{}void ISR_Ep8eflag(void) interrupt 0{}void ISR_Ep2fflag(void) interrupt 0{}void ISR_Ep4fflag(void) interrupt 0{}void ISR_Ep6fflag(void) interrupt 0{}void ISR_Ep8fflag(void) interrupt 0{}void ISR_GpifComplete(void) interrupt 0{}void ISR_GpifWaveform(void) interrupt 0{}void DR_SetData(void){ EP0BUF[0]=0xAB; EP0BCH=0; EP0BCL=2; EZUSB_Delay(100); //系统自带的函数 IOD=EP0BUF[1]; EP6FIFOBUF[0]=0x07; EP6FIFOBUF[1]=0x06; EP0CS |= bmHSNAK;  }

EZUSB.LIB 库文件

ipregs.h寄存器定义的头文件

syncdly.h同步延时宏定义

usbjmptb.OBJ包括中断向量地址的OBJ代码

提醒:《usb固件程序结构分析》最后刷新时间 2024-03-14 01:13:00,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《usb固件程序结构分析》该内容的真实性请自行鉴别。