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

📄 int_7263.c

📁 ST72T63游戏杆源程序
💻 C
字号:
/**************** (c) 1998       STMicroelectronics **********************

PROJECT : 
COMPILER : ST7 HICROSS C (HIWARE)

MODULE  :  int_7263.c
VERSION :  V 1.1

CREATION DATE :  25/05/98

AUTHOR :         / MICROCONTROLLER DIVISION / ST Rousset

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

DESCRIPTION : Interrupt routines for the USB project. The ST7263 can
                                  manage up to 8 interrupts (including RESET).

-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

INTERRUPT FUNCTIONS :

  INT_Trap               - TRAP interrupt routine.
  INT_EndSusp            - Comes from the USB cell.
  INT_IT1IT8             - Interrupt
  INT_Timer              - Comes from the Timer cell
  INT_I2c                - Comes from the I2C cell.
  INT_Sci                - Comes from the SCI cell.
  INT_Usb                - Comes from the USB cell (all USB interrupt's except End Suspend).
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

MODIFICATIONS :
Rev. 1.1 23/09/98
Added:
#include "int_7263.h"
Modified:
INT_EndSusp() -> bmUsbIntFlag &= 0x7F; // reset SUSP flag 

******************************************************************************/



/* EXTERNAL INTERRUPT FUNCTIONS **********************************************/

#include <hidef.h> 
#include "define.h"
#include "usb_var.h"
#include "lib_bits.h"
#include "usbrc.h"
#include "map_7263.h"
#include "usb_ail.h"
#include "int_7263.h"
#include "userio.h"
#include "usr_var.h"
#include "sci_drv.h"

/* INTERRUPT FUNCTIONS *******************************************************/

/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_Trap
INPUT/OUTPUT : None
DESCRIPTION      : TRAP interrupt routine.
COMMENTS                 : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_Trap(void)
{
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_EndSusp
INPUT/OUTPUT : None
DESCRIPTION      : USB End of Suspend mode interrupt routine.
COMMENTS                 : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_EndSusp(void)
{
       bmUsbIntFlag |= 0x4;  // set ESUSP flag
       bmUsbIntFlag &= 0x7F; // reset SUSP flag
       ClearEsusp();   // Clear ESUSP bit of ISTR register                         
       UsbPolling();       
       
}


/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_IT1IT8
INPUT/OUTPUT : None
DESCRIPTION  : Rising edge interrupt
COMMENTS     : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_IT1IT8(void)
{
   SCIBRR = FIRST_PAD_SPEED;
   
   if (MidiCmdFlag)
   {
      A_DATA[0].Packet[0]=Buff[0];
      B_DATA[0].Packet[0]=Buff[1];
      D_DATA[0].Packet[0]=Buff[2];
      A_DATA[0].Packet[1]=Buff[3];
      B_DATA[0].Packet[1]=Buff[4];
      D_DATA[0].Packet[1]=Buff[5];
      A_DATA[0].Packet[2]=Buff[6];
      SendPADABCD(1);
      MidiCmdFlag=0;
   }
   
   else {  // Report ABCD to computer 
           SendABCD(PadTotal);

          
           //MIDI Tx
           Mess_TXD[0] = 2;
           Mess_TXD[1] = 0xd;
           Mess_TXD[2] = 0xa5;
           SCI_Tx (Mess_TXD,3);
   
           A_DATA[1].Packet[0]=0;
   
           while(!ValBit(SCISR,6));
           /*if (PadTotal==1)
              PadTotal=2;
           GetABCD(PadTotal);
   
           if   (A_DATA[1].Packet[0]==0xc)
                PadTotal=2;
           else if   (A_DATA[1].Packet[0]==0x18)
                     PadTotal=3;
                else if (A_DATA[1].Packet[0]==0x24)
                        PadTotal=4;
                     else*/ PadTotal=1;
		 
           PadID=1;
        }
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_Timer
INPUT/OUTPUT : None
DESCRIPTION  : Comes from the Timer cell
COMMENTS     : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_Timer(void)
{                               
     TEMP = TIMSR;                 // Read the timer SR and 
     TEMP = TIMCLR;                //  the timer CLR in order to clear the TOF bit
     
     Timer=1;
}

/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_I2c
INPUT/OUTPUT : None
DESCRIPTION  : Comes from the I2C cell.
COMMENTS     : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_I2c(void)
{ 
}


/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_Sci
INPUT/OUTPUT : None
DESCRIPTION  : Comes from the SCI cell.
COMMENTS     : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_Sci(void)
{   
   TEMP = SCISR;
   
   USBIMR=0;                   //  Mask USB interrput

   MidiTimeOut = 0;
   Mess_RXD[1]=0;
   Mess_RXD[2]=0;
   Mess_RXD[0] = SCIDR;
   if (SCIDR==0xa5)
   {
      while (!ValBit(SCISR,5)&MidiTimeOut++<1000);
            Mess_RXD[1] = SCIDR;

      if (MidiTimeOut<1000)
      {            
		  switch (Mess_RXD[1])
          {
             // GetVersion
             case 0x01: SCI_Rx (2);
                        if (Mess_RXD[2]==PadID)
                        {  if (PadID>1)
                           {  A_DATA[0].Packet[0]=0x46;
                              //B_DATA[0].Packet[0]=0x12;
						      B_DATA[0].Packet[0]=0x31;   //i73002 id 1013-00
                              D_DATA[0].Packet[0]=HWVersion1<<4;
                              A_DATA[0].Packet[1]=HWVersion2;
                              B_DATA[0].Packet[1]=FWVersion1;
                              D_DATA[0].Packet[1]=FWVersion2;
                              A_DATA[0].Packet[2]=PTLVersion;
                              SendPADABCD(1);
                            }
                            else {  Buff[0]=0x46;
                                    //Buff[1]=0x12;
							        Buff[1]=0x31;      //i73002 id 1-13-00
                                    Buff[2]=HWVersion1<<4;
                                    Buff[3]=HWVersion2;
                                    Buff[4]=FWVersion1;
                                    Buff[5]=FWVersion2;
                                    Buff[6]=PTLVersion;
                                    MidiCmdFlag=1;      
                                 }
                         }
                         else {  Mess_TXD[0]=Mess_RXD[2];
                                 Mess_TXD[1]=0x01;
                                 Mess_TXD[2]=0xA5;
                                 SCI_Tx (Mess_TXD,3);
                                 GetABCD(2);
                                 if (PadID>1)
                                 {  A_DATA[0].Packet[0]=A_DATA[1].Packet[0];
                                    B_DATA[0].Packet[0]=B_DATA[1].Packet[0];
                                    D_DATA[0].Packet[0]=D_DATA[1].Packet[0];
                                    A_DATA[0].Packet[1]=A_DATA[1].Packet[1];
                                    B_DATA[0].Packet[1]=B_DATA[1].Packet[1];
                                    D_DATA[0].Packet[1]=D_DATA[1].Packet[1];
                                    A_DATA[0].Packet[2]=A_DATA[1].Packet[2];
                                    SendPADABCD(1);
                                 }
                                 else {  Buff[0]=A_DATA[1].Packet[0];
                                         Buff[1]=B_DATA[1].Packet[0];
                                         Buff[2]=D_DATA[1].Packet[0];
                                         Buff[3]=A_DATA[1].Packet[1];
                                         Buff[4]=B_DATA[1].Packet[1];
                                         Buff[5]=D_DATA[1].Packet[1];
                                         Buff[6]=A_DATA[1].Packet[2];
                                         MidiCmdFlag=1;      
                                      }
                             } 
                        break;
    
             // Reset
             case 0x10: Mess_RXD[1]=0x02;
             case 0x02: SCI_Rx (2);
                        if (Mess_RXD[2]==PadID)
                        {
                            AutofireState1=0;
                            AutofireState2=0;
                          
                        }    
                        else {
                                Mess_TXD[0]=Mess_RXD[2];
                                Mess_TXD[1]=0x02;
                                Mess_TXD[2]=0xA5;
                                SCI_Tx (Mess_TXD,3);
                             }
                        break;
    
             // SetControllerID
             case 0x0e: SCI_Rx (3);
                        if (Mess_RXD[3]==PadID)
                           {  ControllerID=Mess_RXD[2];
                              Return_OK();
                           }
                        else {
                                Mess_TXD[0]=Mess_RXD[3];
                                Mess_TXD[1]=Mess_RXD[2];
                                Mess_TXD[2]=0x0e;
                                Mess_TXD[3]=0xA5;
                                SCI_Tx (Mess_TXD,4);
                                Return_message();
                             }
                        break;
    
             // SetAutofire
             case 0x0f: SCI_Rx (6);
                        //if (Mess_RXD[6]==PadID)
                           //{
							   AutofireState1=Mess_RXD[2];
                              AutofireState2=Mess_RXD[3];
                              Return_OK();
                           // }
                        /*else {
                                Mess_TXD[0]=Mess_RXD[6];
                                Mess_TXD[1]=Mess_RXD[5];
                                Mess_TXD[2]=Mess_RXD[4];
                                Mess_TXD[3]=Mess_RXD[3];                            
                                Mess_TXD[4]=Mess_RXD[2];
                                Mess_TXD[5]=0x0f;
                                Mess_TXD[6]=0xA5;
                                SCI_Tx (Mess_TXD,7);
                                Return_message();
                             }*/
                        break; 

             //Data Polling
             case 0x0d: SCI_Rx (2);
                        PadID=Mess_RXD[2];
    
                        if (PadID < 4)
                        {
                           // MIDI Tx
                           Mess_TXD[2] = 0xa5;
                           Mess_TXD[1] = 0xd;
                           Mess_TXD[0] = PadID+1;
                           SCI_Tx (Mess_TXD,3);
                    
                           while(!ValBit(SCISR,6));

                           A_DATA[1].Packet[0] = 0;
                           PadTotal=1;
                           /*if (PadTotal==1)
                               PadTotal=2;
                           GetABCD(PadTotal);

                           if (A_DATA[1].Packet[0]==0xc)
                              PadTotal=2;
                           else if (A_DATA[1].Packet[0]==0x18)
                                   PadTotal=3;
                                else PadTotal=1;*/
                        }
                        A_DATA[0].Packet[0]=PadTotal*12;
                        SendABCD(PadTotal);
						SendPADABCD(PadTotal);
                        break;

             // SetDeviceMode
            /* case 0x11: SCI_Rx (3);
                        if (Mess_RXD[3]==PadID) {  
							
							Return_OK();
						}
                        else {
                                Mess_TXD[0]=Mess_RXD[3];
                                Mess_TXD[1]=Mess_RXD[2];
                                Mess_TXD[2]=0x11;
                                Mess_TXD[3]=0xA5;
                                SCI_Tx (Mess_TXD,4);
                                Return_message();
                             }
                        break;*/



             default  : SCI_Rx (2);

                        // Report Invalid Parameter
                        if (PadID>1)
                           {  A_DATA[0].Packet[0]=0xff;
                              B_DATA[0].Packet[0]=0x0;
                              D_DATA[0].Packet[0]=0x0;
                              SendPADABCD(1);
                           }
                        else {  Buff[0]=0xff;
                                Buff[1]=0x0;
                                Buff[2]=0x0;
                                MidiCmdFlag=1;      
                             }
                        break;
           }         
      }  
   }
//   else TEMP = SCISR;       // debug purpose
}


/*-----------------------------------------------------------------------------
ROUTINE NAME : INT_Usb
INPUT/OUTPUT : None
DESCRIPTION  : Comes from the USB cell.
COMMENTS     : 
-----------------------------------------------------------------------------*/ 
#pragma TRAP_PROC SAVE_REGS
void INT_Usb(void)
{
         if (USBISTR & Int_Susp)                       
         {                      
            bmUsbIntFlag |= 0x80;
            ClearSusp();   // Clear SUSP bit of ISTR register
            SetSuspend(); // Force FSUSP in USB CTRL register       
            UsbPolling();       
         }
         if (USBISTR & Int_Ctr)         
         {
            ITRFRE = 0;     // Remove the external interrupt
            bmUsbIntFlag |= 0x20;
            GetCtrInfos(); // Get PID and Endpoint Number number
            ClearCtr();    // Clear CTR bit of ISTR register
            UsbPolling();       
         }
         if (USBISTR & Int_Reset)       
         {
            bmUsbIntFlag |= 0x2;
            ClearReset();   // Clear RESET bit of ISTR register 
            UsbPolling();       
         }
         if (USBISTR & Int_Sof)         
         {
            bmUsbIntFlag |= 0x01;
            ClearSof();  // Clear SOF bit of ISTR register
            UsbPolling();       
         }
         
}

/*** (c) 1998   STMicroelectronics ****************** END OF FILE ***/

⌨️ 快捷键说明

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