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

📄 intr.c

📁 凌阳MP3 spSPCA755yuanma
💻 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 + -