www.pudn.com > EP26_Bulk.zip > periph.c


#pragma NOIV               // Do not generate interrupt vectors 
//----------------------------------------------------------------------------- 
//   File:      periph.c 
//   Contents:   Hooks required to implement USB peripheral function. 
// 
//   Copyright (c) 1997 AnchorChips, Inc. All rights reserved 
//----------------------------------------------------------------------------- 
#include "fx2.h" 
#include "fx2regs.h" 
#include "fx2sdly.h"      
#include "io.h" 
#include "serial.h" 
 
extern BOOL   GotSUD;         // Received setup data flag 
extern BOOL   Sleep; 
extern BOOL   Rwuen; 
extern BOOL   Selfpwr; 
 
BYTE   Configuration;      // Current configuration 
BYTE   AlternateSetting;   // Alternate settings 
WORD   EndPoint6_MaxInLength; 
 
 
//----------------------------------------------------------------------------- 
// Task Dispatcher hooks 
//   The following hooks are called by the task dispatcher. 
//----------------------------------------------------------------------------- 
 
void TD_Init(void)             // Called once at startup 
{ 
   BREAKPT &= ~bmBPEN;      // to see BKPT LED go out TGE 
   Rwuen = TRUE;            // Enable remote-wakeup 
   REVCTL = 0x03;	 
 
   // EP2 512 BULK OUT 4x 
   SYNCDELAY;                    // see TRM section 15.14 
   EP2CFG = 0xA0; //512PACKET;                // BUF[1:0]=00 for 4x buffering 
   
  // EP4 and  EP6 and EP8 are not used in this implementation... 
  SYNCDELAY;                    //  
  EP4CFG = 0x20;                // clear valid bit 
  SYNCDELAY;                    //  
  EP6CFG = 0xE0;                
  SYNCDELAY;                    //  
  EP8CFG = 0x60;                // clear valid bit 
 
     // 8-bit bus (WORDWIDE=1)... 
   EP2FIFOCFG = 0x00;//manual OUT 8-BIT BUS 
   SYNCDELAY;  
   EP6FIFOCFG = 0x00;//manual IN  8-BIT BUS 
   SYNCDELAY;  
 
  SYNCDELAY;                    //  
  FIFORESET = 0x80;             // activate NAK-ALL to avoid race conditions 
  SYNCDELAY;                    //  
  FIFORESET = 0x02;             // reset, FIFO 2 
  SYNCDELAY;                    //  
  FIFORESET = 0x04;             // reset, FIFO 4 
  SYNCDELAY;                    //  
  FIFORESET = 0x06;             // reset, FIFO 6 
  SYNCDELAY;                    //  
  FIFORESET = 0x08;             // reset, FIFO 8 
  SYNCDELAY;                    //  
  FIFORESET = 0x00;             // deactivate NAK-ALL 
  SYNCDELAY; 
	 
 
 
  EPIRQ = 0xFF; 
  SYNCDELAY;  
  EPIE |= 0x50;     //enable the ep2 inout interrupt*/ 
	 
  SYNCDELAY;  
 
  /*when REVCTL.0 = 1 do this*/ 
OUTPKTEND = 0x82; 
SYNCDELAY;  
OUTPKTEND = 0x82; 
SYNCDELAY;  
OUTPKTEND = 0x82; 
SYNCDELAY;  
OUTPKTEND = 0x82; 
SYNCDELAY;  
 
  /*when REVCTL.0 = 0 do this*/ 
/*  EP2BCL = 0x80;   //arm first buffer skip =  1 
  SYNCDELAY;  
  EP2BCL = 0x80;   //arm second buffer skip =  1 
  SYNCDELAY; 
  EP2BCL = 0x80;   //arm third buffer skip =  1 
  SYNCDELAY; 
  EP2BCL = 0x80;   //arm third buffer skip =  1 
  SYNCDELAY;*/ 
} 
 
void TD_Poll(void)             // Called repeatedly while the device is idle 
{ 
} 
 
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. 
//----------------------------------------------------------------------------- 
 
BOOL DR_GetDescriptor(void) 
{ 
   return(TRUE); 
} 
 
BOOL DR_SetConfiguration(void)   // Called when a Set Configuration command is received 
{ 
   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) 
{ 
   return(TRUE); 
} 
 
//----------------------------------------------------------------------------- 
// USB Interrupt Handlers 
//   The following functions are called by the USB interrupt jump table. 
//----------------------------------------------------------------------------- 
 
// 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 
} 
 
void ISR_Ures(void) interrupt 0 
{ 
   // whenever we get a USB reset, we should revert to full speed mode 
   pConfigDscr = pFullSpeedConfigDscr; 
   ((CONFIGDSCR xdata *) pConfigDscr)->type = CONFIG_DSCR; 
   pOtherConfigDscr = pHighSpeedConfigDscr; 
   ((CONFIGDSCR xdata *) pOtherConfigDscr)->type = OTHERSPEED_DSCR; 
   EndPoint6_MaxInLength = 64; 
 
   EZUSB_IRQ_CLEAR(); 
   USBIRQ = bmURES;         // Clear URES IRQ 
} 
 
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; 
	  EndPoint6_MaxInLength = 512; 
   } 
 
   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 
{ 
	Serial_SendString(EP2FIFOBUF,(EP2BCH<<8)|EP2BCL,0); 
	/*when REVCTL.0 = 0 do this*/ 
//	EP2BCH = 0; 
//	EP2BCL = 0x80;          //不启动外部逻辑(gpif ,slave fifo) 
 
	/*when REVCTL.0 = 1 do this*/ 
    OUTPKTEND = 0x82;       //不启动外部逻辑(gpif ,slave fifo) 
	EZUSB_IRQ_CLEAR(); 
	EPIRQ = 0x10;  
} 
void ISR_Ep4inout(void) interrupt 0 
{ 
} 
void ISR_Ep6inout(void) interrupt 0 
{ 
	EZUSB_IRQ_CLEAR(); 
	EPIRQ = 0x40;  
} 
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 
{ 
 
}