⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 function.c

📁 USB2.0原理与工程开发光盘(第二版)
💻 C
字号:
#pragma NOIV           

#include "testheader.h"
#include "testregs.h"
#include "testdly.h"

extern BOOL GotSUD;       
extern BOOL Sleep;
extern BOOL Rwuen;
extern BOOL Selfpwr;

extern void EZUSB_Delay(WORD ms);

BYTE Configuration;          
BYTE AlternateSetting;         
BOOL in_enable = FALSE;          
BOOL enum_high_speed = FALSE;      

#define EXTFIFOHF  !(GPIFREADYSTAT & bmBIT1)
#define EXTFIFOEF  !(GPIFREADYSTAT & bmBIT0)

#define GPIFTRIGRD 4
#define GPIF_EP2 0
#define GPIF_EP4 1
#define GPIF_EP6 2
#define GPIF_EP8 3

#define VR_NAKALL_ON    0xD0
#define VR_NAKALL_OFF   0xD1

void GpifInit ();

void TD_Init(void)           
{ 
  CPUCS = ((CPUCS & ~bmCLKSPD) | bmCLKSPD1);
  SYNCDELAY; 

  EP2CFG = 0xE8;         
  SYNCDELAY;           
  EP4CFG = 0x00;   
  SYNCDELAY;                        
  EP6CFG = 0x00;    
  SYNCDELAY;              
  EP8CFG = 0x00;    
  SYNCDELAY;  
  
  FIFORESET = 0x80; 
  SYNCDELAY;
  FIFORESET = 0x02;  
  SYNCDELAY;
  FIFORESET = 0x00;  
  SYNCDELAY;

  EP2FIFOCFG = 0x08; 
  SYNCDELAY;

  EP4FIFOCFG = 0x00;  
  SYNCDELAY;
  EP6FIFOCFG = 0x00; 
  SYNCDELAY; 
  EP8FIFOCFG = 0x00;  
  SYNCDELAY; 
    
  EP2ISOINPKTS=0x01;

  GpifInit ();       

  OEA |= 0x02;     
  IOA |= 0x02;    
  IOA &= 0xFD;     
  EZUSB_Delay (1); 
  IOA |= 0x02;     
}

void TD_Poll(void)              
{
 if(in_enable)                  
  {
    if ( GPIFTRIG & 0x80 )      
    { 
      if (EXTFIFOHF)            
	  {      
	    if ((EP24FIFOFLGS & 0x02 ) )      
		{
          if(enum_high_speed)
		  {
	        SYNCDELAY;    
            GPIFTCB1 = 0x10;              
            SYNCDELAY;
            GPIFTCB0 = 0x00;
            SYNCDELAY;
		  }
		  else
		  {
		    SYNCDELAY;
		    GPIFTCB1 = 0x00;          
            SYNCDELAY;
		    GPIFTCB0 = 0x40;
		    SYNCDELAY;
		  }
               
          GPIFTRIG = GPIFTRIGRD | GPIF_EP2;
	      SYNCDELAY;

	      while( !( GPIFTRIG & 0x80 ) )
          {
            ;
          }
          SYNCDELAY;
          in_enable=FALSE;  
		}
	  }
    }
  }
}

BOOL TD_Suspend(void)       
{
   return(TRUE);
}

BOOL TD_Resume(void)        
{
   return(TRUE);
}


BOOL DR_GetDescriptor(void)
{
   return(TRUE);
}

BOOL DR_SetConfiguration(void)  
{
  if( EZUSB_HIGHSPEED( ) )
  {     
    SYNCDELAY; 
    EP2AUTOINLENH = 0x04;     
    SYNCDELAY;                
    EP2AUTOINLENL = 0x00;
    SYNCDELAY;                  
    enum_high_speed = TRUE;
  }
  else
  { 
    SYNCDELAY;                   
    EP2AUTOINLENH = 0x00;    
    SYNCDELAY;                   
    EP2AUTOINLENL = 0x40;
    SYNCDELAY;                  
    enum_high_speed = FALSE;
  }
  Configuration = SETUPDAT[2];
  return(TRUE);     
}

BOOL DR_GetConfiguration(void)  
{
   EP0BUF[0] = Configuration;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);         
}

BOOL DR_SetInterface(void)    
{
   AlternateSetting = SETUPDAT[2];
   return(TRUE);          
}

BOOL DR_GetInterface(void)      
{
   EP0BUF[0] = AlternateSetting;
   EP0BCH = 0;
   EP0BCL = 1;
   return(TRUE);       
}

BOOL DR_GetStatus(void)
{
   return(TRUE);
}

BOOL DR_ClearFeature(void)
{
   return(TRUE);
}

BOOL DR_SetFeature(void)
{
   return(TRUE);
}

#define VX_B5 0xB5 
#define VX_B6 0xB6 
BOOL DR_VendorCmnd(void)
{
   switch (SETUPDAT[1])
  {
   	case VX_B5: 
	{   
      OEA |= 0x02;     
      IOA |= 0x02;     
      IOA &= 0xFD;     
      EZUSB_Delay (1); 
      IOA |= 0x02;     

      FIFORESET = 0x80;  
      SYNCDELAY;
      FIFORESET = 0x02;  
      SYNCDELAY;
      FIFORESET = 0x00;  
      SYNCDELAY;  
   
      OEA |= 0xFC;
      IOA &= 0x03;     
   

      EZUSB_Delay (1); 
      
      OED = 0xFF;      
      IOD = 0x80; 

      IOA |= 0x20;     

      in_enable = TRUE;

      *EP0BUF = VX_B5;
  	  EP0BCH = 0;
	  EP0BCL = 1;
	  EP0CS |= bmHSNAK;
	  break;

    }
    case VX_B6: 
	{
      IOA &= 0xDF;    

      *EP0BUF = VX_B6;
  	  EP0BCH = 0;
	  EP0BCL = 1;
	  EP0CS |= bmHSNAK;
	  break;
    }
     default:
        return(TRUE);
  }

  return(FALSE);
}

void ISR_Sudav(void) interrupt 0
{
   GotSUD = TRUE;          
   EZUSB_IRQ_CLEAR();
   USBIRQ = bmSUDAV;       
}
     
void ISR_Sutok(void) interrupt 0
{
   EZUSB_IRQ_CLEAR();
   USBIRQ = bmSUTOK;       
}

void ISR_Sof(void) interrupt 0
{
   EZUSB_IRQ_CLEAR();
   USBIRQ = bmSOF;       
}

void ISR_Ures(void) interrupt 0
{   
   pConfigDscr = pFullSpeedConfigDscr;
   ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR;
   pOtherConfigDscr = pHighSpeedConfigDscr;
   ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR;

   EZUSB_IRQ_CLEAR();
   USBIRQ = bmURES;    
}

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
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -