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

📄 u_bulkin.c

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

/*--- Function Prototype ---------------------------------------------------*/
void BulkInTransfer(void);
void CSWSet(void);
void BulkInDataSet(void);
void BulkInDataSend(void);

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

/*****************************************************************************
 *
 *			: Bulk IN
 *				: FIFO
 *			: 
 *			: 
 *		: tran_flag				
 *				  bulk_actual_tran_cnt	Bulk
 *				  max_pkt_size_a		EPaMaxPacketSize
 *				  bulk_in_state			Bulk IN
 *				  bulk_tran_start_addr	Bulk
 *				  bulk_in_result		Bulk IN
 *
 *****************************************************************************/
void BulkInDataSet(void)
{
	int i;

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

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

		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){
			/* BulkMaxPacketSize */

			/*
			 * BulkMaxPacketSize
			 * FIFOBulkMaxPacketSize
			 * BulkMaxPacketSize
			 */

			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{
			/* BulkMaxPacketSize */

			/*
			 * BulkBulk
			 * FIFOBulk
			 * Bulk
			 */
			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;
}

/*****************************************************************************
 *
 *			: Bulk IN
 *				: Bulk IN
 *			: 
 *			: 
 *		: bulk_in_result		Bulk IN
 *				  retry_cnt				
 *				  protocol_phase		
 *				  tran_flag				
 *				  bulk_in_state			Bulk IN
 *				  bulk_out_state		Bulk OUT
 *				  bulk_actual_tran_cnt	Bulk
 *				  bulk_req_tran_cnt		Bulk
 *				  bulk_total_tran_cnt	Bulk
 *				  tran_protocol			
 *				  cmd_status			
 *				  int_in_state			Interrupt IN
 *				  epa_int_stat			EPa
 *
 *****************************************************************************/
void BulkInDataSend(void)
{
	int i,j;
	char n;

	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 */
				bulk_in_state = BULK_IN_DATA_SET;
			}else{
				/* Bulk */

				protocol_phase = STATUS_PHASE;
				bulk_in_state = BULK_IN_IDLE;
				tran_flag.XferCmp = 1;
				if(tran_protocol == BULKONLY){
					if(bulk_req_tran_cnt != bulk_total_tran_cnt){
						/* BulkBulk */
						/*  */

						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) {
					/* ForceSTALL */
					panic(14);
				}
#ifdef DEBUG_PRINT
				INErrorCount++;
#endif
			}else{
				if(tran_protocol == BULKONLY){
					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;
						}
					}
				}else{
					/* CBI */
					if(rEPbIntStat_BP.OUT_TranNAK || rEPcIntStat_BP.IN_TranNAK ){
						/* OUT_TranNAKIN_TranNAK */

						rEPbIntStat = 0x04;		/* OUT_TranNAK */
						rEPcIntStat = 0x08;		/* IN_TranNAK */

						if( retry_cnt_a > MAX_RETRY_CNT ){
							/*  */

							bulk_in_result = NO_RESULT;
							retry_cnt_a = 0;

							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 + -