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