📄 intr.c
字号:
/*++
Copyright (c) 2001 Sunplus Technology Co., Ltd.
Module Name:
intr.c
Abstract:
Module related to interrupt 0
Environment:
Keil C51 Compiler
Revision History:
08/28/2001 Chi-Yeh Tsai created
--*/
//=============================================================================
//Header file
//=============================================================================
#include "general.h"
#include "intr.h"
#include "main.h"
#include "initio.h"
#include "ctlsetup.h"
#include "ctlout.h"
#include "ctlin.h"
#include "bulkout.h"
#include "bulkin.h"
#include "intin.h"
#include "uiflow.h"
//richie@1218
#include "usbmsdc2.h"
#define G_3AFreq 3
//=============================================================================
//Symbol
//=============================================================================
//-----------------------------------------------------------------------------
//Constant
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//Variable
//-----------------------------------------------------------------------------
//=============================================================================
//Program
//=============================================================================
//-----------------------------------------------------------------------------
//INTR_Int0
//-----------------------------------------------------------------------------
void INTR_Int0(void) INTERRUPT_0 USING_1
/*++
Routine Description:
service routine of interrupt 0
Arguments:
none
Return Value:
none
--*/
{
UCHAR log25c0, log25c2;
INTR_DisableInterrupt();
INTR_Enter();
log25c0 = XBYTE[0x25c0]; //save 0x25c0
/*
log25c1 = XBYTE[0x25c1]; //save 0x25c1
*/
log25c2 = XBYTE[0x25c2]; //save 0x25c2
if (log25c0 & 0x01) //check ACK of EP0 Setup packet
{
//patch4.3@richie@oh0530
XBYTE[0x25c0] = 0xf8; //clear Ep0SetupAck
CTLSETUP_Packet(); //Ep0SetupAck
//richie
G_btBulkIntr = 0;
//patch4.4@richie@usbvd
G_btEP0Intr = 1;
if(!_G_USB_Setup_Ack)
_G_USB_Setup_Ack=TRUE;
}
else if (log25c0 & 0x02) //check ACK of EP0 Out packet
{
XBYTE[0x25c0] = 0xfd; //clear Ep0OutAck
CTLOUT_Packet(); //Ep0OutAck
//richie
G_btBulkIntr = 0;
//patch4.4@richie@usbvd
G_btEP0Intr = 1;
}
else if (log25c0 & 0x04) //check ACK of EP0 In packet
{
XBYTE[0x25c0] = 0xfb; //clear Ep0InAck
CTLIN_Packet(); //Ep0InAck
//richie
G_btBulkIntr = 0;
//patch4.4@richie@usbvd
G_btEP0Intr = 1;
}
#if 1 // USB Connect Pin status Event --
//chamber@0103 // USB plug-in Event Detect in I/O option(GPIO 0)
// Rising edge for Un-plug-in and Falling Edge for plug-in
else if (XBYTE[0x2078] &0x01) // check USB power falling edge event
{
XBYTE[0x2078] = 0xfe; // clean the event state
USER_DelayDT(4000); // Delay 10mS for de-bounce
//if(!(XBYTE[0x2040]&0x01))
if(!USBDETECT)
_G_USBConnect = TRUE; // USB pin is low,
}
else if (XBYTE[0x2048] &0x01) // check USB power rising edge event
{
XBYTE[0x2048] = 0xfe; // clean the event state
USER_DelayDT(4000); // Delay 10mS for de-bounce
//if(XBYTE[0x2040]&0x01)
if(USBDETECT)
{
_G_USBConnect = FALSE; // USB DisConnect Right Now!
_G_USB_Setup_Ack=FALSE;
_G_ucSuspend = 0;
XBYTE[0x25d0] &= 0xef; // Disable Suspend interrupt Event
// G_UI_USBConnect = K_UI_USB_DISCONNECT; // Another Definition for MSDC's Subroutine
//patch4.5@richie@eject
G_USBMSDC_ucEject = 0;
}
}
#endif
//richie
//#if 0
//richie@mi 0411
else if ((log25c2 & K_USB_CLASS_IN_ACK_MASK) //check ACK of Bulk In packet
&& (XBYTE[0x25d2] & K_USB_CLASS_IN_ACK_MASK))
{
XBYTE[0x25c2] = K_USB_CLASS_IN_ACK_RESET; //clear BulkInAck
G_ucPktStorIntrf = K_StorageInterface1;
BULKIN_Packet(); //BulkInAck
//richie
G_btBulkIntr = 1;
}
//richie@mi 0411
else if ((log25c2 & K_USB_CLASS_OUT_ACK_MASK) //check ACK of Bulk Out packet
&& (XBYTE[0x25d2] & K_USB_CLASS_OUT_ACK_MASK))
{
XBYTE[0x25c2] = K_USB_CLASS_OUT_ACK_RESET; //clear BulkOutAck
G_ucPktStorIntrf = K_StorageInterface1;
BULKOUT_Packet(); //BulkOutAck
//richie
G_btBulkIntr = 1;
}
#if 0
else if (log25c2 & 0x04) //check ACK of Interrupt In packet
{
XBYTE[0x25c2] = 0xfb; //clear IntInAck
G_ucPktStorIntrf = K_StorageInterface1;
INTIN_Packet(); //IntInAck
//richie
G_btBulkIntr = 0;
}
#endif
//-------------- Suspend/Resume/Configuration Change Event
else if ((log25c0 & 0x10)&&(XBYTE[0x25d0]&0x10)) //check SUSPEND event
// else if (log25c0 & 0x10) //check suspend intr
{
XBYTE[0x25c0] = 0xef; //clear suspend
_G_ucSuspend = 1;
XBYTE[0x25d0] &= 0xef; //Disable interrupt for suspend
USER_DelayDT(8000); // Delay 10mS for de-bounce
if(XBYTE[0x2040]&0x01)
{
USER_DelayDT(4000); // Delay 10mS for de-bounce
if(XBYTE[0x2040]&0x01)
{
_G_ucSuspend = 0;
}
}
}
else if ((log25c0 & 0x80)&&(XBYTE[0x25d0]&0x80)) //check Resume event
// else if (log25c0 & 0x80) //check resume intr
{
XBYTE[0x25c0] = 0x7f; //clear resume
// _G_ucSuspend = 0;
}
else if (log25c0 & 0x20) //check configuration change intr
{
XBYTE[0x25c0] = 0x4f; //clear suspend/resume/configuration change
if(XBYTE[0x25B1]&0xf0)
{
// DbgPrint("X:%bx \n",XBYTE[0x25d0]);
XBYTE[0x25d0] |= 0x10; // Enable Suspend interrupt Event
_G_USB_Setup_Interrupt1=1;
// DbgPrint("EI \n");
// DbgPrint("X:%bx \n",XBYTE[0x25c0]);
// DbgPrint("X:%bx \n",XBYTE[0x25d0]);
// DbgPrint("X:%bx \n",XBYTE[0x25B1]);
}
}
INTR_Leave();
INTR_EnableInterrupt();
}
//-----------------------------------------------------------------------------
//INTR_Enter
//-----------------------------------------------------------------------------
void INTR_Enter(void) USING_1
/*++
Routine Description:
pre-processing in service routine of interrupt 0
Arguments:
none
Return Value:
none
--*/
{
}
//-----------------------------------------------------------------------------
//INTR_Leave
//-----------------------------------------------------------------------------
void INTR_Leave(void) USING_1
/*++
Routine Description:
post-processing in service routine of interrupt 0
Arguments:
none
Return Value:
none
--*/
{
// POWER_UsbConnectStatusChangeInt();
}
//-----------------------------------------------------------------------------
//INTR_DisableInterrupt
//-----------------------------------------------------------------------------
void INTR_DisableInterrupt(void) USING_1
/*++
Routine Description:
disable relative trigger of interrupt 0
Arguments:
none
Return Value:
none
--*/
{
//richie
EX0 = 0;
#if (K_CHIP_SET == K_CHIP_533)
XBYTE[0x25d1] &= 0xfc; //disable change event interrupt of
// video interface alternate setting
// audio interface alternate setting
#endif
XBYTE[0x25a0] &= 0xfc; //NAK of (automatic done by hardware)
// EP0 Out packet
// EP0 In packet
XBYTE[0x25d0] &= 0xf0; //disable ACK interrupt of
// EP0 Setup packet OK
// EP0 Out packet OK
// EP0 In packet OK
// USB reset event
XBYTE[0x25a1] &= 0xc0; //NAK of (automatic done by hardware)
// Bulk In packet
// Bulk Out packet
// Int In packet
// Bulk In 2 packet
// Bulk Out 2 packet
// Int In 2 packet
// richie@1210
//XBYTE[0x25d2] &= 0xc0; //disable ACK interrupt of
///// XBYTE[0x25d2] &= 0xc3; //disable ACK interrupt of
// Bulk In packet OK
// Bulk Out packet OK
// Int In packet OK
// Bulk In 2 packet OK
// Bulk Out 2 packet OK
// Int In 2 packet OK
}
//-----------------------------------------------------------------------------
//INTR_EnableInterrupt
//-----------------------------------------------------------------------------
void INTR_EnableInterrupt(void) USING_1
/*++
Routine Description:
enable relative trigger of interrupt 0
Arguments:
none
Return Value:
none
--*/
{
// XBYTE[0x25a0] |= 0x03; //ACK of
// // EP0 Out packet
// // EP0 In packet
//OHCI update by cch //cch@10/30
if (XBYTE[0x25c0] & 0x01)
{
//patch4.3@richie@oh0530 mark
//XBYTE[0x25a0] &= 0xfc; //NAK of
// EP0 Out packet
// EP0 In packet
//patch4.3@richie@oh0530
XBYTE[0x25c0] = 0xf9; //clear EP0InAck
}
//patch4.4@richie@usbvd
else if (G_btEP0Intr == 1)
// else
{
//patch4.4@richie@usbvd
G_btEP0Intr = 0;
//patch4.3@richie@oh0530
if(G_ucCtrlPhase==K_OutDataPhase)
XBYTE[0x25a0] |= 0x01;
else
XBYTE[0x25a0] |= 0x03; //ACK of
// EP0 Out packet
// EP0 In packet
}
XBYTE[0x25d0] |= 0x07; //enable ACK interrupt of
// EP0 Setup packet OK
// EP0 Out packet OK
// EP0 In packet OK
//richie
if (G_btBulkIntr == 1)
{
//P1 = G_ucBulkPhase;
switch (G_ucBulkPhase)
{
case K_CommandPhase:
case K_OutDataPhase:
//richie@0114
//richie@mi 0409 mark
//case K_OutDataPhaseWrite:
case K_OutResponsePhase:
//DbgPrint(">>>>>>>>>>> Out open\n");
//richie ??? 02 or 06
XBYTE[0x25a1] |= K_USB_CLASS_OUT_OPEN;//0x06; //ACK of
// Bulk Out packet
// Int In packet
XBYTE[0x25d2] |= K_USB_CLASS_OUT_ACK_MASK;//0x06; //enable ACK interrupt of
// Bulk Out packet OK
// Int In packet OK
break;
case K_InDataPhase:
//richie@mi 0409 mark
//case K_InDataPhaseRead:
case K_InResponsePhase:
case K_InCompletionPhase:
//DbgPrint("<<<<<<<<<<< in open\n");
//richie ??? 01 or 05
XBYTE[0x25a1] |= K_USB_CLASS_IN_OPEN;//0x05; //ACK of
// Bulk In packet
// Int In packet
XBYTE[0x25d2] |= K_USB_CLASS_IN_ACK_MASK;//0x05; //enable ACK interrupt of
// Bulk In packet OK
// Int In packet OK
break;
//richie@mi 0409 begin
case K_InDataPhaseRead:
break;
case K_OutDataPhaseWrite:
break;
//richie@mi 0409 end
default:
break;
}
//richie
G_btBulkIntr = 0;
}
EX0 = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -