📄 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"
#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 + -