📄 int_7263.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 + -