controlrw.c

来自「utisoftware c code for linux,机卡分离方案。」· C语言 代码 · 共 477 行 · 第 1/2 页

C
477
字号

#include  "defusr.h"
#include  "macusr.h"
#include  "libassp.h"
#include  "extern.h"
#include <linux/delay.h>


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Control write start
 *-----------------------------------------------------------------------------
 * Declaration	: void CW_Start(U16 Bsize, U8 *Table)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Bsize			; Data Size
 *				: U8  *Table		; Data Table Address
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void CW_Start(U32 Bsize, U8 *Table)
{
	dtcnt[PIPE0] = Bsize;
	dtptr[PIPE0] = (U8 *)Table;

	USBWR(DCPCTR, SQSET);							/* SQSET=1,PID=NAK */
	USB_SET_PAT(DCPCFG, DIR);						/* DIR=1 */
	USB_MDF_PAT(CFIFOSEL, (ISEL | PIPE0), (ISEL | CURPIPE));	/* ISEL=1, CURPIPE=EP0 */
	USBWR(CFIFOCTR, BCLR);
	Control_Write();
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Control write
 *-----------------------------------------------------------------------------
 * Declaration	: void Control_Write(void)
 *-----------------------------------------------------------------------------
 * Argument		: void
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void Control_Write(void)
{
	U16				count, max_size, maxp;
	register U16	even, buffer;

	max_size = dcpMaxPacketSize();					/* MaxPacketSize */
	if( dtcnt[PIPE0] < max_size ) {
		count = dtcnt[PIPE0];
	} else {
		count = max_size;
	}

	USB_CLR_STS(BEMPSTS,  BEMP0);

	do {
		USBRD(CFIFOCTR, buffer);
	} while( (buffer & FRDY) == 0 );

	USBRD(CFIFOSEL, buffer);
	if( (buffer & MBW) == MBW_8 ) {
		for( even = count; even; --even ) {
			USBWR_FF(CFIFO_8, *dtptr[PIPE0]);
			dtptr[PIPE0] += 1;
		}
	} else {
		for( even = count / 2; even; --even ) {
			USBWR_FF(CFIFO, *((U16 *)dtptr[PIPE0]));
			dtptr[PIPE0] += 2;
		}
		if( (count % 2) != 0 ) {
			USBWR_FF(CFIFO_8, *dtptr[PIPE0]);
			dtptr[PIPE0] += 1;
		}
	}

#if 0
	if( dtcnt[PIPE0] < max_size ) {
		dtcnt[PIPE0] = 0;
		USBRD(CFIFOCTR, buffer);
		if( (buffer & BVAL) == 0 )
			USBWR(CFIFOCTR, BVAL);					/* Short Packet */
	} else {
		dtcnt[PIPE0] -= count;
	}

	if( (dtcnt[PIPE0] > 0) || ((count & max_size) == 0) ) {
		USB_SET_PAT(BEMPENB, BEMP0);
	}
#endif
#if 1
	if( dtcnt[PIPE0] < max_size ) {
		dtcnt[PIPE0] = 0;
		USBRD(CFIFOCTR, buffer);
		if( (buffer & BVAL) == 0 )
			USBWR(CFIFOCTR, BVAL);					/* Short Packet */

		USBRD(DCPMAXP, buffer);
		maxp = buffer & MAXP;
		if ( (count % maxp) == 0 ) 
			USB_SET_PAT(BEMPENB, BEMP0);
	} 
	else {
		dtcnt[PIPE0] -= count;
		USB_SET_PAT(BEMPENB, BEMP0);
	}
#endif
	USB_SET_PAT(DCPCTR, PID_BUF);
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Control read start
 *-----------------------------------------------------------------------------
 * Declaration	: void CR_Start(U16 Bsize, U8 *Table)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Bsize			; Data Size
 *				: U8  *Table		; Data Table Address
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void CR_Start(U32 Bsize, U8 *Table)
{
	dtcnt[PIPE0] = Bsize;
	dtptr[PIPE0] = (U8 *)Table;

	USBWR(DCPCTR, SQSET);							/* SQSET=1,PID=NAK */
	USB_CLR_PAT(DCPCFG, DIR);						/* DIR=0 */
	USB_MDF_PAT(CFIFOSEL, PIPE0, (ISEL | CURPIPE));	/* ISEL=0, CURPIPE=EP0 */
	USBWR(CFIFOCTR, BCLR);							/* Buffer Clear */
	USB_SET_PAT(BRDYENB, BRDY0);
	USB_SET_PAT(DCPCTR, PID_BUF);
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Control read
 *-----------------------------------------------------------------------------
 * Declaration	: void Control_Read(void)
 *-----------------------------------------------------------------------------
 * Argument		: void
 *-----------------------------------------------------------------------------
 * Return		: void
 *-----------------------------------------------------------------------------
 * Note			:
 *-----------------------------------------------------------------------------
 *""FUNC COMMENT END""********************************************************/
void Control_Read(void)
{
	U16				count, dtln, max_size;
	U16				endflg = 0;
	register U16	even, buffer;

	SetEpPid(PIPE0, PID_NAK);

	do {
		USBRD(CFIFOCTR, buffer);
	} while( (buffer & FRDY) == 0 );
	dtln = buffer & DTLN;							/* Get data size */

	max_size = dcpMaxPacketSize();					/* MaxPacketSize */
	if( dtln < max_size ) {
		endflg = 1;									/* Short packet */
	}

	if( dtcnt[PIPE0] < dtln ) {
		count = dtcnt[PIPE0];
		endflg = 1;
	} else {
		count = dtln;
	}

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

	if( dtcnt[PIPE0] < count ) {
		dtcnt[PIPE0] = 0;
	} else {
		dtcnt[PIPE0] -= count;
	}

	if( dtcnt[PIPE0] == 0 ) {
		endflg = 1;
	}

	if( endflg == 1 ) {
		dtcnt[PIPE0] = 0;
		USB_CLR_PAT(BRDYENB, BRDY0);
	} else {
		USB_SET_PAT(DCPCTR, PID_BUF);
	}
}


/*""FUNC COMMENT""*************************************************************
 *-----------------------------------------------------------------------------
 * Function		: Control no data write
 *-----------------------------------------------------------------------------
 * Declaration	: U16 ControlNoWrite(U16 Req, U16 Val, U16 Indx, U16 Len)
 *-----------------------------------------------------------------------------
 * Argument		: U16 Req			; bmRequestType & bRequest
 *				: U16 Val			; wValue
 *				: U16 Indx			; wIndex
 *				: U16 Len			; wLength
 *-----------------------------------------------------------------------------
 * Return		: U16				; SACK : Done
 *				:					; SIGN : Error
 *-----------------------------------------------------------------------------
 * Note			:

⌨️ 快捷键说明

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