📄 u_bulkout.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 + -