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