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

📄 u_bulkin.c

📁 EPSON USB DEVICE MASS-STORAGE CLASS driver, BULK ONLY on Ram disk
💻 C
字号:
/*****************************************************************************	
 * File name   : bulkin.c
 * Module name : Bulk in transfer module
 * Author	   : Hiromichi.Kondo
 *----------------------------------------------------------------------------
 * $Id: bulkin.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 BulkInTransfer(void);
void CSWSet(void);
void BulkInDataSet(void);
void BulkInDataSend(void);

/*****************************************************************************
 * bulk_in tbl
 *****************************************************************************/
void (*const bulk_in_tbl[])() = {
	BulkInDataSet,		/* Bulk In 	*/
	BulkInDataSend		/* Bulk In 	*/
};

void BulkInTransfer(void)
{
	if (bulk_in_state >= BULK_IN_IDLE)
		panic(13);
	
	/* bulk_in_state  */
	bulk_in_tbl[bulk_in_state]();
}

/*****************************************************************************
 * BulkInDataSet
 *****************************************************************************/
void BulkInDataSet(void)
{
	int i;

	rEPbIntStat = rEPbIntStat;	/* EPb */
	rEPcIntStat = rEPcIntStat;	/* EPc */

	if(tran_flag.DMA)
	{
		rDMA_Join_BP.JoinEPbDMA = 0;
		rDMA_Join_BP.JoinEPaDMA = 1;
		rEPrFIFO_Clr_BP.EPaFIFO_Clr = 1;

		rEPaControl_BP.ForceNAK = 0;

		if(bulk_actual_tran_cnt & (max_pkt_size_a - 1))
		{
			/* BulkMaxPacketSize */
			rDMA_FIFO_Control_BP.AutoEnShort = 1;
		}

		/* 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 */
	}
	else
	{
		rEPaIntStat = rEPaIntStat;
		rEPaIntEnb_BP.EnIN_TranACK = 1;	/*  */

		rDMA_FIFO_Control_BP.AutoEnShort = 0;
		rEPaControl_BP.ForceNAK = 1;

		if(bulk_actual_tran_cnt >= max_pkt_size_a)
		{
			rCPU_JoinWr_BP.JoinEPaWr = 1;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 1;
			
			for(i=max_pkt_size_a; i>0; i--)
			{
				rEPnFIFOforCPU = *bulk_tran_start_addr;
				bulk_tran_start_addr++;
			}
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 0;
			rCPU_JoinWr_BP.JoinEPaWr = 0;
			bulk_actual_tran_cnt -= max_pkt_size_a;

		}
		else
		{
			rCPU_JoinWr_BP.JoinEPaWr = 1;
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 1;
			
			for(i=bulk_actual_tran_cnt; i>0; i--)
			{
				rEPnFIFOforCPU = *bulk_tran_start_addr;
				bulk_tran_start_addr++;
			}
			rEnEPnFIFO_Access_BP.EnEPnFIFO_Wr = 0;
			rCPU_JoinWr_BP.JoinEPaWr = 0;
			bulk_actual_tran_cnt = 0;

			rEPaControl_BP.EnShortPkt = 1;
		}
		rEPaControl_BP.ForceNAK = 0;
	}
	/* BULK IN */
	bulk_in_state = BULK_IN_DATA_SEND;
	bulk_in_result = NO_RESULT;
}

/*****************************************************************************
 * BulkInDataSend
 *****************************************************************************/
void BulkInDataSend(void)
{
	if (bulk_in_result == FIFO_IN_CMP)
	{
		/* FIFO_IN_Cmp */
		bulk_in_result = NO_RESULT;
		retry_cnt_a = 0;
		protocol_phase = STATUS_PHASE;
		bulk_in_state  = BULK_IN_IDLE;
		tran_flag.XferCmp = 1;
	}
	else
	{
		if (bulk_in_result == EPX_IN_ACK)
		{
			/* IN_TranACK */
			bulk_in_result = NO_RESULT;
			retry_cnt_a = 0;
			rEPaIntEnb_BP.EnIN_TranACK = 0;
			
			if (bulk_actual_tran_cnt)
				bulk_in_state = BULK_IN_DATA_SET;
			else
			{
				/* Bulk */
				protocol_phase = STATUS_PHASE;
				bulk_in_state = BULK_IN_IDLE;
				tran_flag.XferCmp = 1;
				
				if (bulk_req_tran_cnt != bulk_total_tran_cnt)
				{
					rEPaControl_BP.ForceSTALL = 1;
					protocol_phase = DATA_PHASE;
					bulk_in_state = BULK_IN_STALL;
				}
			}
		}
		else
		{ 
			if ( bulk_in_result == EPX_IN_ERR )
			{
				/* IN_TranErr */
				bulk_in_result = NO_RESULT;

				if(rEPaControl_BP.ForceSTALL == 1) 
					panic(14);

				if( rEPbIntStat_BP.OUT_TranNAK )
				{
					/* OutTranNAK */
					rEPbIntStat = 0x04;		/* OUT_TranNAK */
					retry_cnt_a++;			/* EPa */

					if( retry_cnt_a > MAX_RETRY_CNT )
					{
						bulk_in_result = NO_RESULT;
						retry_cnt_a = 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 + -