📄 u_control.c
字号:
control_state = CTRL_DATA_RCV;
}else{
/* */
control_state = CTRL_PARA_UPDATE;
}
}else{
/* */
control_state = CTRL_STS_START;
}
}else{
/* FIFOEmpty */
if( actual_tran_cnt < fifo_remain ){
/* */
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}else{
/* FIFO */
/*
* FIFOEmpty
* FIFO
*
*/
rCPU_JoinRd = 0x00;
rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 1;
for( i=fifo_remain; i>0; i-- ){
*tran_start_addr = rEPnFIFOforCPU;
tran_start_addr++;
}
rEnEPnFIFO_Access_BP.EnEPnFIFO_Rd = 0;
actual_tran_cnt -= fifo_remain;
if( actual_tran_cnt ){
/* */
rEP0ControlOUT_BP.ForceNAK = 0;
control_state = CTRL_DATA_RCV;
}else{
/* */
control_state = CTRL_PARA_UPDATE;
}
}
}
}
/*****************************************************************************
*
* :
* :
* :
* :
* : actual_tran_cnt
* control_state Control
* protocol_phase
* int_in_state Interrupt IN
* usb_wk_data[] USB
* cmd_block[]
* usb_cmd_tran_cnt
* device_flag
*
*****************************************************************************/
void ControlParaUpdate(void)
{
int i;
switch(rEP0SETUP_1){
case TEST_EP0_OUT:
/* Test_EP0_Out */
if( actual_tran_cnt ){
/* */
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}else{
/* */
control_state = CTRL_STS_START;
}
break;
case ACCEPT_DEV_SPC_CMD:
/* Accept Device-Specific Command */
AcceptDevSpecCmdCheck();
break;
default:
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}
}
/*****************************************************************************
*
* : Accept Device-Specific Command
* :
* :
* :
* : protocol_phase
* control_state Control
* usb_wk_data[] USBAREA
* int_in_state InterruptIN
* cmd_block[] ATAPI
* device_flag
* cmd_status
*
*****************************************************************************/
void AcceptDevSpecCmdCheck(void)
{
int i;
if( protocol_phase == DATA_PHASE ){
/* */
if( usb_wk_data[0] == 0x1D && usb_wk_data[1] == 0x04 ){
/* CBI Reset */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}else{
/* CBI Reset */
protocol_phase = COMMAND_PHASE; /* */
int_in_state = INT_IN_IDLE; /* InterruptINIDLE */
/* */
for( i=0; i<12; i++ ){
cmd_block[i] = usb_wk_data[i];
}
device_flag.RcvCommand = 1; /* */
control_state = CTRL_STS_START;
if( cmd_status == COMMAND_FAILED ){
/* FAILED */
rEPaControl_BP.ForceSTALL = 0;
rEPbControl_BP.ForceSTALL = 0;
}
}
}else{
/* */
if( protocol_phase == STATUS_PHASE ){
/* */
protocol_phase = COMMAND_PHASE;
int_in_state = INT_IN_IDLE; /* InterruptINIDLE */
}
/* */
for( i=0; i<12; i++ ){
cmd_block[i] = usb_wk_data[i];
}
device_flag.RcvCommand = 1; /* */
control_state = CTRL_STS_START;
if( cmd_status == COMMAND_FAILED ){
/* FAILED */
rEPaControl_BP.ForceSTALL = 0;
rEPbControl_BP.ForceSTALL = 0;
}
}
}
/*****************************************************************************
*
* :
* :
* :
* :
* : control_result Control
* control_state Control
* usb_flag USB
* ep0_int_stat EP0
*
*****************************************************************************/
void ControlStatusStart(void)
{
rEP0IntStat = rEP0IntStat; /* */
if( rEP0Control_BP.INxOUT ){
/* (IN) */
rEP0Control_BP.INxOUT = 0;
rEP0ControlOUT_BP.ForceNAK = 0;
}else{
/* (OUT) */
if( usb_flag.Address ){
/* Address */
usb_flag.Address = 0; /* Address */
rUSB_Address_BP.AutoSetAddress = 1; /* Auton Set Address */
}
rEP0Control_BP.INxOUT = 1;
rEP0ControlIN_BP.ForceNAK = 0;
rEP0ControlIN_BP.EnShortPkt = 1;
}
control_result = NO_RESULT;
control_state = CTRL_STS_END;
}
/*****************************************************************************
*
* :
* :
* :
* :
* : control_result Control
* retry_cnt
* control_state Control
* usb_flag USB
* ep0_int_stat EP0
*
*****************************************************************************/
void ControlStatusEnd(void)
{
int fifo_remain;
if( control_result == EP0_IN_ACK || control_result == EP0_OUT_ACK ){
/* IN_TranACKOUT_TranACK */
control_result = NO_RESULT;
retry_cnt_0 = 0;
rCPU_JoinRd = 0x00;
fifo_remain = MKWORD(rEPnRdRemain_H, rEPnRdRemain_L);
if( fifo_remain != 0){
/* FIFOEmpty */
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}else{
/* FIFOEmpty */
if( usb_flag.TestMode ){
/* TestMode */
usb_flag.TestMode = 0; /* TestMode */
TestModeProc(); /* TestMode */
}
}
control_state = CTRL_IDLE;
}else{
if( control_result == EP0_IN_ERR || control_result == EP0_OUT_ERR ){
/* IN_TranErrOUT_TranErr */
control_result = NO_RESULT;
if( control_result == EP0_IN_ERR ){
if( rEP0ControlIN_BP.ForceSTALL == 1 ){
panic(9);
}
#ifdef DEBUG_PRINT
EP0INErrorCount++;
#endif
}else{
if( rEP0ControlOUT_BP.ForceSTALL == 1 ){
panic(10);
}
#ifdef DEBUG_PRINT
EP0OUTErrorCount++;
#endif
}
}else{
if(usb_flag.USBReqRcvd){
/* SETUP */
control_state = CTRL_REQ_CHECK;
}else{
if( rEP0Control_BP.INxOUT ){
/* IN */
if( rEP0IntStat_BP.OUT_TranNAK ){
/* OutTranNAK */
retry_cnt_0 = 0;
rEP0Control_BP.INxOUT = 0;
if( req_tran_cnt != 0 && actual_tran_cnt == 0 ){
/* */
/* Zero Length */
rEP0ControlOUT_BP.ForceNAK = 0;
control_state = CTRL_DATA_GET;
}else{
/* */
/*
*
*/
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}
}
}else{
/* OUT */
if( rEP0IntStat_BP.IN_TranNAK ){
/* INTranNAK */
retry_cnt_0 = 0;
rEP0Control_BP.INxOUT = 1;
if( actual_tran_cnt ){
/* */
/* */
rEP0ControlIN_BP.ForceSTALL = 1;
rEP0ControlOUT_BP.ForceSTALL = 1;
control_state = CTRL_IDLE;
}else{
/* */
/* Zero Length */
rEP0ControlIN_BP.ForceNAK = 0;
rEP0ControlIN_BP.EnShortPkt = 1;
control_state = CTRL_DATA_SEND;
}
}
}
}
}
}
}
/*****************************************************************************
*
* :
* :
* :
* :
*
*****************************************************************************/
void TestModeProc(void)
{
BYTE temp;
/* */
rMainIntEnb = 0x00;
rSIE_IntEnb = 0x00;
rEPrIntEnb = 0x00;
rDMA_IntEnb = 0x00;
rFIFO_IntEnb = 0x00;
if( rUSB_Test_BP.Test_J || rUSB_Test_BP.Test_K ){
/* Test_J Test_k */
rXcvrControl_BP.OpMode = 0x02; /* Disable Bitstuffing and NRZI encoding) */
}
rUSB_Control_BP.EnAutoNego = 0; /* AutoNego */
rUSB_Control_BP.DisBusDetect = 1; /* */
rUSB_Test_BP.EnUSB_Test = 1; /* TestMode */
/* VBUS */
do{
if( VBUSCheck() == 0 ) break;
}while( 1 );
/* VBUS TestModeOFFAttach */
rUSB_Test_BP.EnUSB_Test = 0; /* TestMode */
rXcvrControl_BP.OpMode = 0x01; /* Non Drive */
rXcvrControl_BP.RpuEnb = 0;
rUSB_Control_BP.ActiveUSB = 0; /* USB */
#ifdef DEBUG_PRINT
for (;;){
DebugProc();
}
#else
for (;;)
;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -