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

📄 dataio.c

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


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Data out start
 *-----------------------------------------------------------------------------
 * Declaration	: void DO_Start(U16 Pipe, U16 Bsize, U8 *Table)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Pipe			; Pipe Number
 *				: U16 Bsize			; Data Size
 *				: U8  *Table		; Data Table Address
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void DO_Start(U16 Pipe, U32 Bsize, U8 *Table)
{
	if( RprtSTS(DIDO, 0) != YES )
		return;

	dtcnt[Pipe] = Bsize;
	dtptr[Pipe] = (U8 *)Table;
	Buffer_Write_Data_Flag[Pipe] = DATA_WAIT;

	SetEpPid(Pipe, PID_BUF);						/* Set BUF */
	EnableIntR(Pipe);							/* Enable Ready Interrupt */
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Data out
 *-----------------------------------------------------------------------------
 * Declaration	: void Data_Out(U16 Pipe)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Pipe			; Pipe Number
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void Data_Out(U16 Pipe)
{
	U16				size, count;
	U16				setival = 0;
	register U16	even, buffer;

	size = dataInSize(Pipe);						/* Data size */

	/* Readout counter */
	if( dtcnt[Pipe] < size) {
		count = dtcnt[Pipe];
		setival = 1;
		dtcnt[Pipe] = 0;
	} else {
		count = size;
		dtcnt[Pipe] -= size;
	}

	USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
	/*
	 * Cautions !!!
	 * Depending on the external bus speed of CPU, you may need to wait for 200ns here.
	 * For details, please look at the data sheet.
	 */
	/***** The example of reference. *****/
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	/*************************************/
	do {
		USBRD(CFIFOCTR, buffer);
	} while( (buffer & FRDY) == 0 );

	USBRD(CFIFOSEL, buffer);
	if( (buffer & MBW) == MBW_8 ) {					/* 8bit FIFO access mode */
		for( even = count; even; --even ) {
			USBWR_FF(CFIFO_8, *dtptr[Pipe]);
			dtptr[Pipe] += 1;
		}
	} else {										/* 16bit FIFO access mode */
		for( even = count / 2; even; --even ) {
			USBWR_FF(CFIFO, *((U16 *)dtptr[Pipe]));
			dtptr[Pipe] += 2;
		}
		if( (count % 2) != 0 ) {
			USBWR_FF(CFIFO_8, *dtptr[Pipe]);
			dtptr[Pipe] += 1;
		}
	}
	if( setival ) {
		USBRD(CFIFOCTR, buffer);
		if( (buffer & BVAL) == 0 )
			USB_SET_PAT(CFIFOCTR, BVAL);
	}

	if( dtcnt[Pipe] == 0 ) {
		DisableIntR(Pipe);						/* Disable Ready Interrupt */
		Buffer_Write_Data_Flag[Pipe] = DATA_NONE;	/* End */
	}
}

void DMA_Out(U16 Pipe)
{
	U16				size, count;
	U16				setival = 0;
//	register U16	even, buffer;

	size = dataInSize(Pipe);						/* Data size */

	/* Readout counter */
	if( dtcnt[Pipe] < size) {
		count = dtcnt[Pipe];
		setival = 1;
		dtcnt[Pipe] = 0;
	} else {
		count = size;
		dtcnt[Pipe] -= size;
	}

	if( dtcnt[Pipe] == 0 ) {
		DisableIntR(Pipe);							/* Disable Ready Interrupt */
		Buffer_Write_Data_Flag[Pipe] = DATA_NONE;	/* End */
	}
}

/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Data in start
 *-----------------------------------------------------------------------------
 * Declaration	: void DI_Start(U16 Pipe, U16 Bsize, U8 *Table)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Pipe			; Pipe Number
 *				: U16 Bsize			; Data Size
 *				: U8  *Table		; Data Table Address
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void DI_Start(U16 Pipe, U32 Bsize, U8 *Table)
{
	if( RprtSTS(DIDO, 0) != YES )
		return;

	dtcnt[Pipe] = Bsize;
	dtptr[Pipe] = (U8 *)Table;
	Buffer_Read_Data_Size[Pipe] = 0;
	Buffer_Read_Data_Flag[Pipe] = DATA_WAIT;

	SetEpPid(Pipe, PID_BUF);						/* Set BUF */
#if 0
	ClearIntR(Pipe);
	EnableIntR(Pipe);								/* Enable Ready Interrupt */
#endif
}

#if 0
/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Data in
 *-----------------------------------------------------------------------------
 * Declaration	: void Data_In(U16 Pipe)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Pipe			; Pipe Number
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void Data_In(U16 Pipe)
{
	U16				size, count, mxps;
	register U16	even, buffer;

	SetEpPid(Pipe, PID_NAK);

	mxps = getMaxPacketSize(Pipe);					/* Max Packet Size */

	USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
	/*
	 * Cautions !!!
	 * Depending on the external bus speed of CPU, you may need to wait for 200ns here.
	 * For details, please look at the data sheet.
	 */
	/***** The example of reference. *****/
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	/*************************************/
	do {
		USBRD(CFIFOCTR, buffer);
	} while( (buffer & FRDY) == 0 );

	USBRD(CFIFOCTR, buffer);
	size = buffer & DTLN;
	if( dtcnt[Pipe] < size ) {						/* Buffer Full ? */
		count = 0;
		dtcnt[Pipe] = 0;
	} else if( size % mxps ) {						/* Short Packet ? */
		count = size;
		dtcnt[Pipe] = 0;
	} else {
		count = size;
		dtcnt[Pipe] -= size;
	}
	Buffer_Read_Data_Size[Pipe] += count;

	if( size == 0 ) {								/* 0 length packet */
		USBWR(CFIFOCTR, BCLR);						/* Clear BVAL */
	} else {
		USBRD(CFIFOSEL, buffer);
		if( (buffer & MBW) == MBW_8 ) {				/* 8bit FIFO access mode */
			for( even = count; even; --even ) {
				USBRD_FF(CFIFO_8, *dtptr[Pipe]);
				dtptr[Pipe] += 1;
			}
		} else {
			for( even = count / 2; even; --even ) {
				USBRD_FF(CFIFO, *((U16 *)dtptr[Pipe]));
				dtptr[Pipe] += 2;
			}
			if( (count % 2) != 0 ) {
				USBRD_FF(CFIFO_8, *dtptr[Pipe]);
				dtptr[Pipe] += 1;
			}
		}
	}

	if( dtcnt[Pipe] == 0 ) {
		DisableIntR(Pipe);							/* Disable Ready Interrupt */
		Buffer_Read_Data_Flag[Pipe] = DATA_OK;
	} else {
		SetEpPid(Pipe, PID_BUF);					/* Set BUF */
	}
}
#endif

#if 1
/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Data in
 *-----------------------------------------------------------------------------
 * Declaration	: void Data_In(U16 Pipe)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Pipe			; Pipe Number
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void Data_In(U16 Pipe)
{
	U16				size, count, mxps;
	register U16	even, buffer;

	SetEpPid(Pipe, PID_NAK);

	mxps = getMaxPacketSize(Pipe);					/* Max Packet Size */

	USB_MDF_PAT(CFIFOSEL, Pipe, CURPIPE);
	/*
	 * Cautions !!!
	 * Depending on the external bus speed of CPU, you may need to wait for 200ns here.
	 * For details, please look at the data sheet.
	 */
	/***** The example of reference. *****/
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	USBRD(CFIFOCTR, buffer);						/* Wait for About 42ns */
	/*************************************/
	
	do {
		USBRD(CFIFOCTR, buffer);
	} while( (buffer & FRDY) == 0 );

	USBRD(CFIFOCTR, buffer);
	size = buffer & DTLN;
	if( dtcnt[Pipe] < size ) {						/* Buffer Full ? */
		count = 0;
		dtcnt[Pipe] = 0;
	} else if( size % mxps ) {						/* Short Packet ? */
		count = size;
		dtcnt[Pipe] = 0;
	} else {
		count = size;
		dtcnt[Pipe] -= size;
	}
	Buffer_Read_Data_Size[Pipe] += count;

	if( size == 0 ) {								/* 0 length packet */
		USBWR(CFIFOCTR, BCLR);						/* Clear BVAL */
	} else {
		USBRD(CFIFOSEL, buffer);
		if( (buffer & MBW) == MBW_8 ) {				/* 8bit FIFO access mode */
			for( even = count; even; --even ) {
				USBRD_FF(CFIFO_8, *dtptr[Pipe]);
				dtptr[Pipe] += 1;
			}
		} else {
			for( even = count / 2; even; --even ) {
				USBRD_FF(CFIFO, *((U16 *)dtptr[Pipe]));
				dtptr[Pipe] += 2;
			}
			if( (count % 2) != 0 ) {
				USBRD_FF(CFIFO_8, *dtptr[Pipe]);
				dtptr[Pipe] += 1;
			}
		}
	}

	if( dtcnt[Pipe] == 0 ) {
		/* DisableIntR(Pipe);*/							/* Disable Ready Interrupt */
		/* Buffer_Read_Data_Flag[Pipe] = DATA_NONE; */
		 Buffer_Read_Data_Flag[Pipe] = DATA_OK;
	} else {
		SetEpPid(Pipe, PID_BUF);					/* Set BUF */
	}
}
#endif

void DMA_In(U16 Pipe)
{
	U16				size, count, mxps;
	register U16	buffer;

	SetEpPid(Pipe, PID_NAK);

	mxps = getMaxPacketSize(Pipe);					/* Max Packet Size */

	
	USBRD(D0FIFOCTR, buffer);
	size = buffer & DTLN;
	if( dtcnt[Pipe] < size ) {						/* Buffer Full ? */
		count = 0;
		dtcnt[Pipe] = 0;
	} else if( size % mxps ) {						/* Short Packet ? */
		count = size;
		dtcnt[Pipe] = 0;
	} else {
		count = size;
		dtcnt[Pipe] -= size;
	}
	Buffer_Read_Data_Size[Pipe] += count;

	
	if( dtcnt[Pipe] == 0 ) {
		DisableIntR(Pipe);							/* Disable Ready Interrupt */
		Buffer_Read_Data_Flag[Pipe] = DATA_OK;
	} else {
		SetEpPid(Pipe, PID_BUF);					/* Set BUF */
	}
}

⌨️ 快捷键说明

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