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

📄 u_bulkout.c

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 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"
#include "u_com_fp.h"




extern void MasterDMAXferEndProc(void);


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

/*****************************************************************************
 *
 *			: Bulk OUT
 *				: Bulk OUT
 *			: 
 *			: 
 *		: bulk_out_state		Bulk OUT
 *
 *****************************************************************************/
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]();
}

/*****************************************************************************
 *
 *			: Bulk OUT
 *				: FIFO
 *			: 
 *			: 
 *		: tran_flag				
 *				  bulk_actual_tran_cnt	Bulk
 *				  bulk_out_state		Bulk OUT
 *				  protocol_phase		
 *				  tran_protocol			
 *				  cmd_status			
 *				  int_in_state			Interrupt IN
 *				  bulk_in_state			Bulk IN
 *				  bulk_tran_start_addr	Bulk
 *
 *****************************************************************************/
void BulkOutDataGet(void)
{
	int i;
	WORD fifo_remain;
	
	bulk_out_result = NO_RESULT;

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

	if(tran_flag.DMA){
		/* 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{
		/* DMA */

		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;

			/*
			 * FIFOEmptyBulk
			 * Bulk
			 * Bulk
			 */
			
			if(bulk_actual_tran_cnt < fifo_remain){
				/* BulkFIFO */

				if(tran_protocol == BULKONLY){
					/* EPaEPb  STALL */
					rEPnControl_BP.EPrForceSTALL = 1;
					protocol_phase = RESET_WAIT;
				}else{
					/* EPaEPb  STALL */
					rEPaControl_BP.ForceSTALL = 1;
					rEPbControl_BP.ForceSTALL = 1;
					protocol_phase = STATUS_PHASE;
					cmd_status = PHASE_ERROR;
					int_in_state = INT_IN_DATA_SET;
				}

				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;
				}
			}
		}
	}
}

/*****************************************************************************
 *
 *			: Bulk OUT
 *				: Control
 *			: 
 *			: 
 *		: bulk_out_result		Bulk OUT
 *				  retry_cnt				
 *				  bulk_out_state		Bulk OUT
 *				  protocol_phase		
 *				  tran_flag				
 *				  tran_protocol			
 *				  cmd_status			
 *				  int_in_state			Interrupt IN
 *				  bulk_in_state			Bulk IN
 *				  epb_int_stat			EPb
 *
 *****************************************************************************/
void BulkOutDataRcv(void)	/* Bulk OUT */
{
	unsigned long ide_count,fifo_count;
	BYTE mask;
	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) {
					/* ForceSTALL */
					panic(12);
				}
#ifdef DEBUG_PRINT
				OUTErrorCount++;
#endif

			}else{
				if(tran_protocol == BULKONLY){
					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;

						}

					}
				}else{
					/* CBI */

					if( rEPaIntStat_BP.IN_TranNAK && rEPcIntStat_BP.IN_TranNAK ){
						/* IN_TranNAK */

						rEPaIntStat = 0x08;		/* IN_TranNAK */
						rEPcIntStat = 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;
							rEPaControl_BP.ForceSTALL = 1;
							rEPbControl_BP.ForceSTALL = 1;

							protocol_phase = STATUS_PHASE;
							cmd_status = PHASE_ERROR;
							bulk_in_state  = BULK_IN_STALL;
							bulk_out_state = BULK_OUT_STALL;
							int_in_state   = INT_IN_DATA_SET;
						}
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

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