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

📄 fifo_if.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 4 页
字号:
{
	LONG retValue;
	ULONG wFIFODataCount;
	UCHAR bTemp[2];

	retValue = STATUS_SUCCESS;

	while (1) {
		if (number >= MAX_FIFO) {
			/* Specified the FIFO when it cannot be specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		*pRemain = 0;
		if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
			if ((RegRead(REG08_MediaFIFO_Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For DMA0,DMA1 not Joined */
				RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);			/* Select EP0 JoinCPU_Rd */

				bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				do {
					bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
					bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
					wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
				wFIFODataCount &= ~RD_REMAIN_VALID_MASK;

				RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);						/* Clear EP0 JoinCPU_Rd */

				/* Return the number of bytes that exists in FIFO*/
				*pRemain = wFIFODataCount;
			}
			break;
		}
		if (number == 0) {
			if ((RegRead(REG08_D_EP0Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For DMA0,DMA1 not Joined  */
				RegSet(REG08_D_EP0Join,BIT_JoinCPU_Rd);					/* Select EP0 JoinCPU_Rd */

				bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				do {
					bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
					bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
					wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
				wFIFODataCount &= ~RD_REMAIN_VALID_MASK;

				RegClear(REG08_D_EP0Join,BIT_JoinCPU_Rd);				/* Clear EP0 JoinCPU_Rd */

				/* Return the number of bytes that exists in FIFO */
				*pRemain = wFIFODataCount;
			}
		} else {
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For JoinIDE,DMA0,DMA1 not Joined  */
				RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);		/* Select EPa,EPb,EPc */

				bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				do {
					bTemp[1] = RegRead(REG08_FIFO_RdRemain_H);
					bTemp[0] = RegRead(REG08_FIFO_RdRemain_L);
					wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);
				} while (!(wFIFODataCount & RD_REMAIN_VALID_MASK));
				wFIFODataCount &= ~RD_REMAIN_VALID_MASK;

				RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);	/* Clear EPa,EPb,EPc JoinCPU_Rd */

				/* Return the number of bytes that exists in FIFO */
				*pRemain = wFIFODataCount;
			}
		}
	break;};

	return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOWrRemain
// description	: Return the number which can be written to FIFO.
// argument		: number	End point number
//				  pRemain	Pointer to return can be written number
// return		: STATUS_SUCCESS			Terminated normally
//				  STATUS_NOT_OPENED			Not opened
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG FIFO_IF_FIFOWrRemain(UCHAR number,ULONG *pRemain)
{
	LONG retValue;
	ULONG wFIFODataCount;
	UCHAR bTemp[2];

	retValue = STATUS_SUCCESS;

	while (1) {
		if (number >= MAX_FIFO) {
			/* Specified the FIFO when it cannot be specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		*pRemain = 0;
		if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
			if ((RegRead(REG08_MediaFIFO_Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For DMA0,DMA1 not Joined */
				RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);			/* Select EP0 */

				bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);

				RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);			/* Select EP0 */

				/* Return the number of bytes that exists in FIFO */
				*pRemain = wFIFODataCount;
			}
			break;
		}
		if (number == 0) {
			if ((RegRead(REG08_D_EP0Join) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For DMA0,DMA1 not Join */
				RegSet(REG08_D_EP0Join,BIT_JoinCPU_Wr);					/* Select EP0 JoinCPU_Rd */

				bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);

				RegClear(REG08_D_EP0Join,BIT_JoinCPU_Wr);				/* Select EP0 */

				/* Return the number of bytes that exists in FIFO */
				*pRemain = wFIFODataCount;
			}
		} else {
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & (MASK_JoinDMA0 | MASK_JoinDMA1)) == 0) {
				/* For JoinIDE,DMA0,DMA1 not Join */
				RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr);		/* Select EPa,EPb,EPc */

				bTemp[1] = RegRead(REG08_FIFO_WrRemain_H);
				bTemp[0] = RegRead(REG08_FIFO_WrRemain_L);
				wFIFODataCount = MAKEWORD(bTemp[0],bTemp[1]);

				RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr);	/* Clear EPa,EPb,EPc */

				/* Return the number of bytes that exists in FIFO */
				*pRemain = wFIFODataCount;
			}
		}
	break;};

	return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOClear
// description	: Clear the specified FIFO
// argument		: number					FIFO number
// return		: STATUS_SUCCESS			Terminated normally
//				  STATUS_NOT_OPENED			Not opened
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG FIFO_IF_FIFOClear(UCHAR number)
{
	LONG retValue;
	retValue = STATUS_SUCCESS;

	while (1) {
		if (number >= MAX_FIFO) {
			/* Specified the FIFO when it cannot be specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}
		if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
			RegWrite(REG08_MediaFIFO_Control,BIT_MediaFIFO_Clr);
			break;
		}
		if (number == 0) {
			RegWrite(REG08_D_EPnControl,BIT_EP0FIFO_Clr);		/* EP0 FIFO Clear */
		} else {
			RegWrite(REG08_D_EPrFIFO_Clr,1 << (number - 1));	/* EPa,EPb,EPc FIFO Clear */
		}
		sFifoInfo[number].ByteAccess = 0;
	break;};

	return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IF_FIFOAllClear
// description	: Clear all FIFO
// argument		: None
// return		: STATUS_SUCCESS			Terminated normally
//				  STATUS_NOT_OPENED			Not opened
// flag			:
// global		:
// =============================================================================
*/
LONG FIFO_IF_FIFOAllClear(void)
{
	LONG retValue;
	UCHAR i;

	retValue = STATUS_SUCCESS;

	while (1) {
		/* Clear FIFO of all end point */
		RegWrite(REG08_D_EPnControl,BIT_AllFIFO_Clr);

		RegWrite(REG08_MediaFIFO_Control,BIT_MediaFIFO_Clr);

		for (i = 0;i < MAX_FIFO;i++) {
			sFifoInfo[i].ByteAccess = 0;
		}
	break;};

	return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IFGetFIFO_Join
// description	: Examine the bit that Joined to FIFO
// argument		: number		FIFO number
//				  pJoin			Joined bit
// return		: STATUS_SUCCESS			Terminated normally
//				  STATUS_NOT_OPENED			Not opened
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG FIFO_IFGetFIFO_Join(UCHAR number,UCHAR *pJoin)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	while (1) {
		if (number >= MAX_FIFO) {
			/* Specified the FIFO when it cannot be specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}
		*pJoin = 0x00;
		if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
			if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinIDE)) {
				*pJoin |= FIFO_IF_JOIN_IDE;
			}
			if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinDMA0)) {
				*pJoin |= FIFO_IF_JOIN_DMA0;
			}
			if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinDMA1)) {
				*pJoin |= FIFO_IF_JOIN_DMA1;
			}
			if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinCPU_Rd)) {
				*pJoin |= FIFO_IF_JOIN_CPU_RD;
			}
			if ((RegRead(REG08_MediaFIFO_Join) & MASK_JoinCPU_Wr)) {
				*pJoin |= FIFO_IF_JOIN_CPU_WR;
			}
			break;
		}
		if (number == 0) {
			if ((RegRead(REG08_D_EP0Join) & MASK_JoinDMA0)) {
				*pJoin |= FIFO_IF_JOIN_DMA0;
			}
			if ((RegRead(REG08_D_EP0Join) & MASK_JoinDMA1)) {
				*pJoin |= FIFO_IF_JOIN_DMA1;
			}
			if ((RegRead(REG08_D_EP0Join) & MASK_JoinCPU_Rd)) {
				*pJoin |= FIFO_IF_JOIN_CPU_RD;
			}
			if ((RegRead(REG08_D_EP0Join) & MASK_JoinCPU_Wr)) {
				*pJoin |= FIFO_IF_JOIN_CPU_WR;
			}
		} else {
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinIDE)) {
				*pJoin |= FIFO_IF_JOIN_IDE;
			}
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinFIFO_Stat)) {
				*pJoin |= FIFO_IF_JOIN_STAT;
			}
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinDMA0)) {
				*pJoin |= FIFO_IF_JOIN_DMA0;
			}
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinDMA1)) {
				*pJoin |= FIFO_IF_JOIN_DMA1;
			}
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinCPU_Rd)) {
				*pJoin |= FIFO_IF_JOIN_CPU_RD;
			}
			if ((RegRead(REG08_D_EPxJoin(number - 1)) & MASK_JoinCPU_Wr)) {
				*pJoin |= FIFO_IF_JOIN_CPU_WR;
			}
		}
	break;};

	return retValue;
}
/* =============================================================================
// Function_Name: FIFO_IFSetFIFO_Join
// description	: Specify the Join of FIFO
// argument		: number		FIFO number
//				  Join			Bit mask to join
//				  flag			Specify set/clear
// return		: STATUS_SUCCESS			Terminated normally
//				  STATUS_NOT_OPENED			Not opened
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG FIFO_IFSetFIFO_Join(UCHAR number,UCHAR join,UCHAR flag)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	while (1) {
		if (number >= MAX_FIFO) {
			/* Specified the FIFO when it cannot be specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (!(flag == 0 || flag == 1)) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if( number == FIFO_IF_NUM_FIFO_MEDIA ) {
			if (IS_BIT(join,FIFO_IF_JOIN_IDE) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_MediaFIFO_Join,BIT_JoinIDE);
				} else {
					RegClear(REG08_MediaFIFO_Join,BIT_JoinIDE);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_MediaFIFO_Join,BIT_JoinDMA0);
				} else {
					RegClear(REG08_MediaFIFO_Join,BIT_JoinDMA0);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_MediaFIFO_Join,BIT_JoinDMA1);
				} else {
					RegClear(REG08_MediaFIFO_Join,BIT_JoinDMA1);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);
				} else {
					RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Rd);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);
				} else {
					RegClear(REG08_MediaFIFO_Join,BIT_JoinCPU_Wr);
				}
			}
			if (flag == 1 && RegRead(REG08_MediaFIFO_Join) != join) {
				/* For can not Join */
				retValue = STATUS_INVALID_PARAMETER;
				break;
			}
			break;
		}
		if (number == 0) {
			if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EP0Join,BIT_JoinDMA0);
				} else {
					RegClear(REG08_D_EP0Join,BIT_JoinDMA0);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EP0Join,BIT_JoinDMA1);
				} else {
					RegClear(REG08_D_EP0Join,BIT_JoinDMA1);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EP0Join,BIT_JoinCPU_Rd);
				} else {
					RegClear(REG08_D_EP0Join,BIT_JoinCPU_Rd);
				}

			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EP0Join,BIT_JoinCPU_Wr);
				} else {
					RegClear(REG08_D_EP0Join,BIT_JoinCPU_Wr);
				}
			}
			if (flag == 1 && RegRead(REG08_D_EP0Join) != join) {
				/* For can not Join */
				retValue = STATUS_INVALID_PARAMETER;
				break;
			}
		} else {
			if (IS_BIT(join,FIFO_IF_JOIN_IDE) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinIDE);
				} else {
					RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinIDE);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_STAT) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinFIFO_Stat);
				} else {
					RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinFIFO_Stat);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_DMA0) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinDMA0);
				} else {
					RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinDMA0);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_DMA1) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinDMA1);
				} else {
					RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinDMA1);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_RD) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);
				} else {
					RegClear(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Rd);
				}
			}
			if (IS_BIT(join,FIFO_IF_JOIN_CPU_WR) == TRUE) {
				if (flag == 1) {
					RegSet(REG08_D_EPxJoin(number - 1),BIT_JoinCPU_Wr);
				} else {

⌨️ 快捷键说明

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