📄 u_usb.c
字号:
/******************************************************************************
* File name : usb.c
* Module name : usb common module
* Author : Hiromichi.Kondo
*----------------------------------------------------------------------------
* $Id: usb.c,v 1.3 2003/05/16 06:51:07 9551619 Exp $
*****************************************************************************/
#include "u_value.h"
#include "u_macro.h"
#include "u_ram_data.h"
#include "u_rom_data.h"
#include "u_regNikka.h"
/*--- Function Prototype ---------------------------------------------------*/
int VBUSCheck(void);
int LineStateCheck(void);
void AttachProc(void);
void DetachProc(void);
void USBResetProc(void);
void SuspendResumeProc(void);
void USBProc(void);
void InitUSBWorkArea(void);
//---------------------------------------------------------------------------------
// Function name :VBUSCheck
// Function description :Check VBUS state
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :VBUS state
//
// Global variable :void
//---------------------------------------------------------------------------------
int VBUSCheck(void)
{
return rUSB_Status_BP.VBUS;
}
//---------------------------------------------------------------------------------
// Function name :LineStateCheck
// Function description :Check line state
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :line state
//
// Global variable :void
//---------------------------------------------------------------------------------
int LineStateCheck(void)
{
return rUSB_Status_BP.LineState;
}
//---------------------------------------------------------------------------------
// Function name :Attach Process
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void AttachProc(void)
{
unsigned char line_state;
rUSB_Control_BP.ActiveUSB = 1; /* USB */
rUSB_Control_BP.EnAutoNego = 0; //fukaya
rUSB_Control_BP.DisBusDetect = 1; /* ResetSuspend */
rXcvrControl_BP.RpuEnb = 1; /* Enable D+ pull up */
rXcvrControl_BP.OpMode = 0x02; /* Disable bitstuffing & NRZI Encoding */
while( 1 )
{
line_state = LineStateCheck(); /* LineState */
if( line_state == J_STATE )
break;
}
rSIE_IntEnb_BP.EnDetectRESET = 1;
rSIE_IntEnb_BP.EnDetectSUSPEND = 1;
#ifdef DIS_AUTONEGO
rUSB_Control_BP.DisBusDetect = 0; /* ResetSuspend */
#else /* DIS_AUTONEGO */
rUSB_Control_BP.EnAutoNego = 1; /* Auto Nego */
#endif /* DIS_AUTONEGO */
special_flag.Attach = 0;
}
//---------------------------------------------------------------------------------
// Function name :Detach Process
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void DetachProc(void)
{
rXcvrControl_BP.OpMode = 0x01; /* Non Drive */
rXcvrControl_BP.RpuEnb = 0;
rUSB_Control_BP.EnAutoNego = 0; /* Auto Nego */
rUSB_Control_BP.ActiveUSB = 0; /* USB */
special_flag.Detach = 0;
special_flag.Attach = 1;
}
//---------------------------------------------------------------------------------
// Function name :Reset Process
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void USBResetProc(void)
{
special_flag.Reset = 0;
rXcvrControl_BP.OpMode = 0x00; /* Normal */
#ifdef DIS_AUTONEGO
rUSB_Control_BP.EnAutoNego = 0; //fukaya
rUSB_Control_BP.DisBusDetect = 1; /* -> */
#endif /* DIS_AUTONEGO */
/* Endpoint 0 */
if(usb_flag.Init == 0){
/* USB */
rEP0ControlOUT_BP.AutoForceNAK = 1;
rEP0Control_BP.ReplyDescriptor = 0;
/* EP0 */
rEP0IntEnb_BP.EnIN_TranACK = 1;
rEP0IntEnb_BP.EnOUT_TranACK = 1;
rEP0IntEnb_BP.EnIN_TranErr = 1;
rEP0IntEnb_BP.EnOUT_TranErr = 1;
/* EP0Endpoint */
rEPaConfig_0_BP.EnEndPoint = 0;
rEPbConfig_0_BP.EnEndPoint = 0;
rEPcConfig_0_BP.EnEndPoint = 0;
/* RcvEPSETUP */
rMainIntStat = 0x01; /* RcvEP0SETUP = 0 */
/* */
DIRECT_B(main_int_stat) = 0x00;
DIRECT_B(sie_int_stat) &= 0x84;
DIRECT_B(epr_int_stat) = 0x00;
DIRECT_B(dma_int_stat) = 0x00;
DIRECT_B(fifo_int_stat) = 0x00;
DIRECT_B(ep0_int_stat) = 0x00;
DIRECT_B(epa_int_stat) = 0x00;
DIRECT_B(epb_int_stat) = 0x00;
DIRECT_B(epc_int_stat) = 0x00;
/* */
control_state = CTRL_IDLE;
bulk_in_state = BULK_IN_IDLE;
bulk_out_state = BULK_OUT_IDLE;
int_in_state = INT_IN_IDLE;
device_state = DEV_WAIT_RCV_CMD;
InitUSBWorkArea();
InitDeviceWorkArea();
protocol_phase = COMMAND_PHASE;
/* EP0 */
max_pkt_size_0 = fs_device_desc.bMaxPacketSize0;
rEP0MaxSize = max_pkt_size_0; /* EP0 MaxPacketSize */
rEPnControl_BP.AllFIFO_Clr = 1; /* All FIFO Clear */
usb_flag.Init = 1;
}
#ifdef DIS_AUTONEGO
rSIE_IntStat = 0x04; /* DetectJ */
rSIE_IntEnb_BP.EnDetectJ = 1; /* DetectJ */
rUSB_Control_BP.StartDetectJ = 1; /* J */
#endif /* DIS_AUTONEGO */
}
//---------------------------------------------------------------------------------
// Function name :SuspendResumeProc
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void SuspendResumeProc(void)
{
unsigned char vbus_state,line_state;
special_flag.Suspend = 0;
#ifdef DIS_AUTONEGO
rUSB_Control_BP.InSUSPEND = 1; /* NonJ */
#endif /* DIS_AUTONEGO */
rSIE_IntStat = 0x40; /* NonJ */
rSIE_IntEnb_BP.EnNonJ = 1; /* NonJ */
#ifdef DIS_AUTONEGO
rUSB_Control_BP.EnAutoNego = 0; //fukaya
rUSB_Control_BP.DisBusDetect = 1;
#endif
while(1){
#ifdef REMOTE_WAKEUP_SW
if( usb_flag.EnbRemoteWakeup && WAKEUP_SW == 0){
/* RemoteWakeup */
usb_flag.RemoteWakeup = 1;
timer0_Run();
while(timer0_Chk(TMOUT_5) != TMOUT_5){
if(sie_int_stat.VBUS_Changed || sie_int_stat.NonJ){
usb_flag.RemoteWakeup = 0;
break;
}
}
timer0_Stop();
}
#endif
if(usb_flag.RemoteWakeup){
usb_flag.RemoteWakeup = 0;
rSIE_IntEnb_BP.EnNonJ = 0; /* Non_J */
/* LineStateK1ms */
rUSB_Control_BP.SendWakeup = 1;
soft_Wait(1);
rUSB_Control_BP.SendWakeup = 0;
di();
sie_int_stat.NonJ = 1; /* Non_J */
ei();
}
if(sie_int_stat.VBUS_Changed){
/* VBUS */
vbus_state = VBUSCheck();
di();
sie_int_stat.VBUS_Changed = 0;
ei();
if(vbus_state == VBUS_NOT_CONNECT){
rUSB_Control_BP.InSUSPEND = 0; /* NonJ */
rSIE_IntEnb_BP.EnNonJ = 0; /* Non_J */
DetachProc(); /* Detach */
return;
}
/* VBUS */
break;
}
if(sie_int_stat.NonJ){
/* J */
line_state = LineStateCheck();
di();
sie_int_stat.NonJ = 0;
ei();
if(line_state != J_STATE && line_state != SE1_STATE){
rUSB_Control_BP.InSUSPEND = 0; /* NonJ */
#ifdef DIS_AUTONEGO
if( line_state == SE0_STATE ){
special_flag.Reset = 1; /* USBReset */
USBResetProc(); /* USB Reset */
}
if(line_state == K_STATE){
/* USB Resume */
rSIE_IntStat = 0x04;
rSIE_IntEnb_BP.EnDetectJ = 1;
rUSB_Control_BP.StartDetectJ = 1;
}
#endif /* DIS_AUTONEGO */
break;
}
/* J */
rSIE_IntEnb_BP.EnNonJ = 1; /* Non_J */
}
}
}
//---------------------------------------------------------------------------------
// Function name :USBProc
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void USBProc(void)
{
if(usb_flag.USBReqRcvd){
if(control_state == CTRL_IDLE){
control_state = CTRL_REQ_CHECK;
}
}
if(bulk_in_state < BULK_IN_IDLE){
/* IDLE,STALL */
BulkInTransfer();
}
if(bulk_out_state < BULK_OUT_IDLE){
/* IDLE,STALL */
BulkOutTransfer();
}
if(int_in_state < INT_IN_IDLE){
/* IDLE,STALL */
IntInTransfer();
}
if(control_state != CTRL_IDLE){
/* IDLE,STALL */
ControlTransfer();
}
}
//---------------------------------------------------------------------------------
// Function name :InitUSBWorkArea
// Function description :
//
// Parameters
// Input :void
// Output :void
// I/O :void
//
// Return value :void
//
// Global variable :void
//---------------------------------------------------------------------------------
void InitUSBWorkArea(void)
{
int i;
usb_state = DEFAULT_STATE;
tran_protocol = BULKONLY;
assigned_addr = 0x00;
DIRECT_B(usb_flag) = 0x00;
DIRECT_B(special_flag) = 0x00;
retry_cnt_0 = 0;
retry_cnt_a = 0;
retry_cnt_b = 0;
retry_cnt_c = 0;
current_alt_set = 0x00;
tran_start_addr = 0x00;
req_tran_cnt = total_tran_cnt = actual_tran_cnt = 0x00;
max_pkt_size_0 = max_pkt_size_a = max_pkt_size_b = max_pkt_size_c = 0x00;
control_result = bulk_in_result = NO_RESULT;
bulk_out_result = int_in_result = NO_RESULT;
for (i = 0;i < sizeof(usb_wk_data); i++) {
usb_wk_data[i] = 0x00;
}
}
/***** End of file *****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -