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

📄 portcstb.c

📁 站长:我所上传的是FX2开发板的相关程序及驱动,绝对是有市场的,FX2开发板在市上卖到800-500元,有了这些程序,就可以自己设计了,不用发钱买了. The purpose of this cod
💻 C
字号:
#pragma NOIV                    // Do not generate interrupt vectors
//-----------------------------------------------------------------------------
//   File:      portcstb.c
//   Contents:  Hooks required to implement USB peripheral function.
//              Code written for FX2 100-pin REVD...
//              This firmware is used to demonstrate the PORTC STROBE FEATURE
//   Copyright (c) 2001 Cypress Semiconductor All rights reserved
//-----------------------------------------------------------------------------
#include "fx2.h"
#include "fx2regs.h"
#include "fx2sdly.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

// EZUSB FX2 PORTA i/o...
sbit LATRIGWR = IOA ^ 0;        // alt. func., INT0#
sbit LATRIGRD = IOA ^ 1;        // alt. func., INT1#
sbit PA2 = IOA ^ 2;
sbit PA3 = IOA ^ 3;             // alt. func., WU2
sbit PA4 = IOA ^ 4;
sbit PA5 = IOA ^ 5;
sbit PA6 = IOA ^ 6;
sbit PA7 = IOA ^ 7;

// EZUSB FX2 PORTE is not bit-addressable...

// ...debug LEDs: accessed via movx reads only ( through CPLD )
xdata volatile const BYTE LED0_ON  _at_ 0x8000;
xdata volatile const BYTE LED0_OFF _at_ 0x8100;
xdata volatile const BYTE LED1_ON  _at_ 0x9000;
xdata volatile const BYTE LED1_OFF _at_ 0x9100;
xdata volatile const BYTE LED2_ON  _at_ 0xA000;
xdata volatile const BYTE LED2_OFF _at_ 0xA100;
xdata volatile const BYTE LED3_ON  _at_ 0xB000;
xdata volatile const BYTE LED3_OFF _at_ 0xB100;
// it may be worth noting here that the default monitor loads at 0xC000

// use this global variable when (de)asserting debug LEDs...
BYTE ledX_rdvar = 0x00;

//-----------------------------------------------------------------------------
// Task Dispatcher hooks
//   The following hooks are called by the task dispatcher.
//-----------------------------------------------------------------------------

void TD_Init( void )              
{ // Called once at startup
  CPUCS = 0x10;                 // CLKSPD[1:0]=10, for 48MHz operation

  IFCONFIG = 0xC0;              // set peripheral interface to ports mode
  
  CPUCS |= 0x26;                // enable portc strobe feature, and inv CLKOUT

  // Registers which require a synchronization delay, see section 15.14
  // FIFORESET        FIFOPINPOLAR
  // INPKTEND         OUTPKTEND
  // EPxBCH:L         REVCTL
  // GPIFTCB3         GPIFTCB2
  // GPIFTCB1         GPIFTCB0
  // EPxFIFOPFH:L     EPxAUTOINLENH:L
  // EPxFIFOCFG       EPxGPIFFLGSEL
  // PINFLAGSxx       EPxFIFOIRQ
  // EPxFIFOIE        GPIFIRQ
  // GPIFIE           GPIFADRH:L
  // UDMACRCH:L       EPxGPIFTRIG
  // GPIFTRIG
  
  // Note: The pre-REVE EPxGPIFTCH/L register are affected, as well...
  //      ...these have been replaced by GPIFTC[B3:B0] registers

  SYNCDELAY;                    // see TRM section 15.14
  EP1OUTCFG = 0xA0;             // ep1out is valid BULK OUT 64
  SYNCDELAY;                    // see TRM section 15.14
  EP1INCFG = 0xA0;              // ep1in is valid BULK IN 64
  SYNCDELAY;                    // see TRM section 15.14
  EP1OUTBC = 0x00;              // arm ep1out (warning: only 64 bytes deep)
  
  PORTACFG = 0x00;              // PORTA as i/o pins...
  OEA = 0xFF;                   // and as outputs...
  
  PORTCCFG = 0x00;              // PORTC as i/o pins...

  BREAKPT &= ~bmBPEN;           // to see BKPT LED go out TGE
  Rwuen = TRUE;                 // Enable remote-wakeup
  
  // turn debug LED[3:0] off...
  ledX_rdvar = LED0_OFF;
  ledX_rdvar = LED1_OFF;
  ledX_rdvar = LED2_OFF;
  ledX_rdvar = LED3_OFF;
}

void TD_Poll( void )              
{ // Called repeatedly while the device is idle
  BYTE i;

  if( !( EP1OUTCS & 0x02 ) )
  { // BUSY=0, after host sent pkt. 
  
    if( EP1OUTBC )
    {
      LATRIGWR = 1;             // PA0, just to give the LA a nice trigger
      LATRIGWR = 0;             // PA0, just to give the LA a nice trigger
      LATRIGWR = 1;             // PA0, just to give the LA a nice trigger
  
      OEC = 0xFF;               // PORTC[7:0] as outputs...
  
      for( i = 0x00; i < EP1OUTBC; i++ )
      {
        IOC = EP1OUTBUF[ i ];   // Write next byte to PortC, strobe WR#
      }
    }
    else
    { // host sent a zerolenpkt, or greater than 64 byte pkt.
      ledX_rdvar = LED3_ON;     // visual
    }
    EP1OUTBC = 0x00;            // (re) arm endp buffer
  }
  else
  {

  }

  if( !( EP1INCS & 0x02 ) )
  { // BUSY=0, when endp buffer is available...

    LATRIGRD = 1;               // PA1, just to give the LA a nice trigger
    LATRIGRD = 0;               // PA1, just to give the LA a nice trigger
    LATRIGRD = 1;               // PA1, just to give the LA a nice trigger
  
    OEC = 0x00;                 // PORTC[7:0] as inputs
    
    for( i = 0x00; i < 64; i++ )
    {
      EP1INBUF[ i ] = IOC;      // Read next byte from PortC, strobe RD#
    }
    EP1INBC = 64;               // commit pkt to host...
  }
  else
  {

  }
  
}

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);
}

#define VX_B2 0xB2              // (re)arm endp 1 out 

BOOL DR_VendorCmnd( void )
{

  switch( SETUPDAT[ 1 ] )
  { 
    case VX_B2:
    { // (re)arm endp1 out
      ledX_rdvar = LED3_OFF;    // visual
      *EP0BUF = EP1OUTBC;
      EP1OUTBC = 0x00;          // (re)arm endp1out
      EP0BCH = 0;
      EP0BCL = 1;               // Arm endpoint with # bytes to transfer
      EP0CS |= bmHSNAK;         // Acknowledge handshake phase of device request
      break;
    }
    default:
    {
      break;
    }
  }
  
  return( FALSE );              // no error; command handled OK
}

//-----------------------------------------------------------------------------
// 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
{
   if (EZUSB_HIGHSPEED())
   {
      pConfigDscr = pHighSpeedConfigDscr;
      pOtherConfigDscr = pFullSpeedConfigDscr;
   }
   else
   {
      pConfigDscr = pFullSpeedConfigDscr;
      pOtherConfigDscr = pHighSpeedConfigDscr;
   }
   
   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;
      pOtherConfigDscr = pFullSpeedConfigDscr;
   }
   else
   {
      pConfigDscr = pFullSpeedConfigDscr;
      pOtherConfigDscr = pHighSpeedConfigDscr;
   }

   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 + -