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

📄 u_bulkout.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
字号:
/******************************************************************************
 * File name   : bulkout.c
 * Module name : Bulk out transfer module
 * Author	   : Hiromichi.Kondo
 *-----------------------------------------------------------------------------
 * $Id: bulkout.c,v 1.1 2003/04/16 06:56:35 9551619 Exp $
 *****************************************************************************/
#include "u_value.h"
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"

/*--- Function Prototype ---------------------------------------------------*/
void BulkOutTransfer(void);
void CBWCheck(void);
void BulkOutDataGet(void);
void BulkOutDataRcv(void);

/*****************************************************************************
 * bulk_out table
 *****************************************************************************/
void (*const bulk_out_tbl[])() = {
	BulkOutDataGet,
	BulkOutDataRcv
};

void BulkOutTransfer(void)
{
	if (bulk_out_state >= BULK_OUT_IDLE) 
		panic(11);

	/* bulk_out_state  */
	bulk_out_tbl[bulk_out_state]();
}

/*****************************************************************************
 * BulkOutDataGet
 *****************************************************************************/
void BulkOutDataGet(void)
{
	int i;
	int fifo_remain;
	
	bulk_out_result = NO_RESULT;

	rEPaIntStat = rEPaIntStat;	/* EPa */
	rEPcIntStat = rEPcIntStat;	/* EPc */

	if(tran_flag.DMA)
	{
		rDMA_Join_BP.JoinEPaDMA = 0;
		rDMA_Join_BP.JoinEPbDMA = 1;
		rEPrFIFO_Clr_BP.EPbFIFO_Clr = 1;
		rEPbControl_BP.ForceNAK = 0;

		/* BulkDMA */
		rDMA_Count_HH = DWORD2BYTE_HH(bulk_actual_tran_cnt);
		rDMA_Count_HL = DWORD2BYTE_HL(bulk_actual_tran_cnt);
		rDMA_Count_LH = DWORD2BYTE_LH(bulk_actual_tran_cnt);
		rDMA_Count_LL = DWORD2BYTE_LL(bulk_actual_tran_cnt);

		rDMA_Control_BP.DMA_Go = 1;	/* DMA */
		
		bulk_actual_tran_cnt = 0;	/* Bulk */
		bulk_out_state = BULK_OUT_DATA_RCV;
	}
	else
	{
		rCPU_JoinRd_BP.JoinEPbRd = 1;
//		i = rUSB_Status;
		fifo_remain = MKWORD(rEPnRdRemain_H, rEPnRdRemain_L);
		rCPU_JoinRd_BP.JoinEPbRd = 0;
		if( fifo_remain == 0 )
		{
			/* FIFOEmpty */
			if(bulk_actual_tran_cnt)
			{
				/* Bulk */
				rEPbIntEnb_BP.EnOUT_TranACK = 1;
				rEPbControl_BP.ForceNAK = 0;
				bulk_out_state = BULK_OUT_DATA_RCV;
			}
			else
			{
				/* Bulk */
				protocol_phase = STATUS_PHASE;
				tran_flag.XferCmp = 1;
				bulk_out_state = BULK_OUT_IDLE;

				rEPbIntEnb_BP.EnOUT_TranACK = 0;
			}
		}
		else
		{
			rEPbControl_BP.ForceNAK = 1;

			if(bulk_actual_tran_cnt < fifo_remain)
			{
				/* BulkFIFO */
				rEPnControl_BP.EPrForceSTALL = 1;
				protocol_phase = RESET_WAIT;

				rEPbIntEnb_BP.EnOUT_TranACK = 0;
				bulk_in_state  = BULK_IN_STALL;
				bulk_out_state = BULK_OUT_STALL;
			}
			else
			{
				/* BulkFIFO */
				rCPU_JoinRd_BP.JoinEPbRd = 1;
				rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 1;
				for( i=fifo_remain ; i>0 ; i-- )
				{
					*bulk_tran_start_addr = rEPnFIFOforCPU;
					bulk_tran_start_addr++;
				}
				rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 0;
				rCPU_JoinRd_BP.JoinEPbRd = 0;
				bulk_actual_tran_cnt -= fifo_remain;

				if(bulk_actual_tran_cnt)
				{
					/* Bulk */
					rEPbIntEnb_BP.EnOUT_TranACK = 1;
					bulk_out_state = BULK_OUT_DATA_RCV;
					rEPbControl_BP.ForceNAK = 0;
				}
				else
				{
					/* Bulk */
					protocol_phase = STATUS_PHASE;
					tran_flag.XferCmp = 1;
					bulk_out_state = BULK_OUT_IDLE;
					rEPbIntEnb_BP.EnOUT_TranACK = 0;
				}
			}
		}
	}
}

/*****************************************************************************
 * BulkOutDataRcv
 *****************************************************************************/
void BulkOutDataRcv(void)
{
	if(bulk_out_result == FIFO_OUT_CMP)
	{
		/* FIFO_OUT_Cmp */
		bulk_out_result = NO_RESULT;
		retry_cnt_b = 0;
		protocol_phase = STATUS_PHASE;
		bulk_out_state = BULK_OUT_IDLE;
		tran_flag.XferCmp = 1;
		
		MasterDMAXferEndProc();		// DMA
	}
	else
	{
		if (bulk_out_result == EPX_OUT_ACK)
		{
			/* OUT_TranACK */
			bulk_out_result = NO_RESULT;
			retry_cnt_b = 0;
			bulk_out_state = BULK_OUT_DATA_GET;
		}
		else
		{
			if (bulk_out_result == EPX_OUT_ERR)
			{
				/* OUT_TranErr */
				bulk_out_result = NO_RESULT;
				if (rEPbControl_BP.ForceSTALL == 1)
					panic(12);
			}
			else
			{
				if (rEPaIntStat_BP.IN_TranNAK && rDMA_Control_BP.DMA_Running == 0)
				{
					/* INTranNAKDMA */
					rEPaIntStat = 0x08;		/* IN_TranNAK */
					retry_cnt_b++;			/* EPb */

					if (retry_cnt_b > MAX_RETRY_CNT)
					{
						bulk_out_result = NO_RESULT;
						retry_cnt_b = 0;

						rEPnControl_BP.EPrForceSTALL = 1;
						protocol_phase = RESET_WAIT;
						bulk_in_state  = BULK_IN_STALL;
						bulk_out_state = BULK_OUT_STALL;
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

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