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

📄 intrn.c

📁 utisoftware c code for linux,机卡分离方案。
💻 C
字号:
//#include  "stddefs.h"
#include <linux/time.h>
#include  "defusr.h"
#include  "macusr.h"
#include  "libassp.h"
#include  "extern.h"
//#include "sttbx.h"


extern U8	UsbDeviceTS[4];
U8 		SendCount 		= 0;
U8 		ReceiveCount 	= 0;
extern U16 	USBerror;

struct timeval  PreTime;
struct timeval  CurrentTime;

extern U16 	USBerror, USBerrorPre;


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: INTR interrupt
 *-----------------------------------------------------------------------------
 * Declaration	: void INTR_int(U16 Status, U16 Int_enbl)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Status		; BRDYSTS Register Value
 *				: U16 Int_enbl		; BRDYENB Register Value
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void INTR_int(U16 Status, U16 Int_enbl)
{
	register U16	buffer;

	if( (Status & BRDY0) && (Int_enbl & BRDY0) ) {
		USB_CLR_STS(BRDYSTS, BRDY0);
		USB_MDF_PAT(CFIFOSEL, PIPE0, CURPIPE);
		USBRD(CFIFOSEL, buffer);
		if( (buffer & ISEL) == 0 ) {
			Control_Read();
		}
	} else {
		if( (Status & BRDY1) && (Int_enbl & BRDY1) ) {
			USB_CLR_STS(BRDYSTS, BRDY1);
			USBWR(PIPESEL, PIPE1);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {

			ReceiveCount++;
			if (ReceiveCount >3)
			{			
				SetEpPid(PIPE1, PID_NAK);
				SetEpPid(PIPE2, PID_BUF);
				ReceiveCount = 0;
			}

		/*		DisableIntR(PIPE1);
				DisableIntR(PIPE2);
				USBWR(D0FIFOSEL,DCLRM|MBW_8|PIPE1);
				USBWR(D1FIFOSEL,DCLRM|DREQE|MBW_8|PIPE2);
				Buffer_Write_Data_Flag[PIPE1] = DATA_OK;
				Buffer_Write_Data_Flag[PIPE2] = DATA_NONE;
				
				return;*/
				/* Data_In(PIPE1);*/		
			} else {
				DMA_Out(PIPE1);
			}
		}
		if( (Status & BRDY2) && (Int_enbl & BRDY2) ) {
			USB_CLR_STS(BRDYSTS, BRDY2);
			USBWR(PIPESEL, PIPE2);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE2);
			} else {
			
			SendCount++;
			if (SendCount >3)
			{			
				SetEpPid(PIPE2, PID_NAK);
				SetEpPid(PIPE1, PID_BUF);
				SendCount = 0;
			}
				/*DMA_Out(PIPE2);*/
	/*			DisableIntR(PIPE1);
				DisableIntR(PIPE2);
				USBWR(D1FIFOSEL,DCLRM|MBW_8|PIPE2);
				USBWR(D0FIFOSEL,DCLRM|DREQE|MBW_8|PIPE1);

				Buffer_Write_Data_Flag[PIPE1] = DATA_NONE;
				Buffer_Write_Data_Flag[PIPE2] = DATA_OK;
				
				return;*/
				/*User_Data_In (PIPE1, 512, (U8 *)P1_Buff);*/
				}
		}
		if( (Status & BRDY3) && (Int_enbl & BRDY3) ) {
			USB_CLR_STS(BRDYSTS, BRDY3);
			USBWR(PIPESEL, PIPE3);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE3);
			} else {
				Data_Out(PIPE3);
			}
		}
		if( (Status & BRDY4) && (Int_enbl & BRDY4) ) {
			USB_CLR_STS(BRDYSTS, BRDY4);
			USBWR(PIPESEL, PIPE4);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE4);
			} else {
				Data_Out(PIPE4);
			}
		}
		if( (Status & BRDY5) && (Int_enbl & BRDY5) ) {
			USB_CLR_STS(BRDYSTS, BRDY5);
			USBWR(PIPESEL, PIPE5);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE5);
			} else {
				Data_Out(PIPE5);
			}
		}
		if( (Status & BRDY6) && (Int_enbl & BRDY6) ) {
			USB_CLR_STS(BRDYSTS, BRDY6);
			USBWR(PIPESEL, PIPE6);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE6);
			} else {
				Data_Out(PIPE6);
			}
		}
		if( (Status & BRDY7) && (Int_enbl & BRDY7) ) {
			USB_CLR_STS(BRDYSTS, BRDY7);
			USBWR(PIPESEL, PIPE7);
			USBRD(PIPECFG, buffer);
			if( (buffer & DIR) == DIR_H_IN ) {
				Data_In(PIPE7);
			} else {
				Data_Out(PIPE7);
			}
		}
	}
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: INTN interrupt
 *-----------------------------------------------------------------------------
 * Declaration	: void INTN_int(U16 Status, U16 Int_enbl)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Status		; NRDYSTS Register Value
 *				: U16 Int_enbl		; NRDYENB Register Value
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void INTN_int(U16 Status, U16 Int_enbl)
{
	if( (Status & NRDY0) && (Int_enbl & NRDY0) ) 
	{
		USB_CLR_STS(NRDYSTS, NRDY0);
	} 
	else 
	{
		if( (Status & NRDY1) && (Int_enbl & NRDY1) ) 
		{
			USB_CLR_STS(NRDYSTS, NRDY1);
			SetEpPid(PIPE1, PID_BUF);
			USBerror++;

			do_gettimeofday(&CurrentTime);
	
			if (((CurrentTime.tv_sec - PreTime.tv_sec) * 1000000 + (CurrentTime.tv_usec - PreTime.tv_usec))<10000)
			{
				if (USBerror>50)
				{
					BchgFlg = YES;
					DisableIntNR(PIPE1);
					DisableIntNR(PIPE2);
					usb_detach();
					USBerror =0;
					USBerrorPre = 0;
				}

			}
			else
			{
				USBerror =0;
				USBerrorPre = 0;
			}
		
			PreTime = CurrentTime;
		}
		if( (Status & NRDY2) && (Int_enbl & NRDY2) ) {
			USB_CLR_STS(NRDYSTS, NRDY2);
			SetEpPid(PIPE2, PID_BUF);
			USBerror++;
		}
		if( (Status & NRDY3) && (Int_enbl & NRDY3) ) {
			USB_CLR_STS(NRDYSTS, NRDY3);
		}
		if( (Status & NRDY4) && (Int_enbl & NRDY4) ) {
			USB_CLR_STS(NRDYSTS, NRDY4);
		}
		if( (Status & NRDY5) && (Int_enbl & NRDY5) ) {
			USB_CLR_STS(NRDYSTS, NRDY5);
		}
		if( (Status & NRDY6) && (Int_enbl & NRDY6) ) {
			USB_CLR_STS(NRDYSTS, NRDY6);
		}
		if( (Status & NRDY7) && (Int_enbl & NRDY7) ) {
			USB_CLR_STS(NRDYSTS, NRDY7);
		}
	}
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: BEMP interrupt
 *-----------------------------------------------------------------------------
 * Declaration	: void BEMP_int(U16 Status, U16 Int_enbl)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Status		; BEMPSTS Register Value
 *				: U16 Int_enbl		; BEMPENB Register Value
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void BEMP_int(U16 Status, U16 Int_enbl)
{
	register U16	buffer;

	if( (Status & BEMP0) && (Int_enbl & BEMP0) ) {
		USB_CLR_STS(BEMPSTS, BEMP0);
		USB_MDF_PAT(CFIFOSEL, PIPE0, CURPIPE);
		USBRD(CFIFOSEL, buffer);
		if( (buffer & ISEL) != 0 ) {
			Control_Write();
		}
	} else {
		if( (Status & BEMP1) && (Int_enbl & BEMP1) ) {
			USB_CLR_STS(BEMPSTS, BEMP1);
		}
		if( (Status & BEMP2) && (Int_enbl & BEMP2) ) {
			USB_CLR_STS(BEMPSTS, BEMP2);
		}
		if( (Status & BEMP3) && (Int_enbl & BEMP3) ) {
			USB_CLR_STS(BEMPSTS, BEMP3);
		}
		if( (Status & BEMP4) && (Int_enbl & BEMP4) ) {
			USB_CLR_STS(BEMPSTS, BEMP4);
		}
		if( (Status & BEMP5) && (Int_enbl & BEMP5) ) {
			USB_CLR_STS(BEMPSTS, BEMP5);
		}
		if( (Status & BEMP6) && (Int_enbl & BEMP6) ) {
			USB_CLR_STS(BEMPSTS, BEMP6);
		}
		if( (Status & BEMP7) && (Int_enbl & BEMP7) ) {
			USB_CLR_STS(BEMPSTS, BEMP7);
		}
	}
}

⌨️ 快捷键说明

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