📄 msotg.c
字号:
#include "DrvOTGMain.h"
//#include "uart.h"
__u8 volatile usbReqOTGState;
__s8 volatile usbCurOTGState;
__u8 volatile usbSessRequest;
__u8 volatile usbResuming;
__u8 volatile usbSuspended;
__u8 volatile usbRemoteWakeup;
__u8 volatile usbHNPEnabled;
__u8 volatile usbHNPSupport;
__u8 volatile usbSRPSupport;
__u8 volatile usbSelfPower;
__u8 volatile usbEP0State;
__u8 volatile usbConfig;
__u8 volatile usbInterface;
__u8 volatile usbUSBState;
__u8 volatile usbcid;
__u8 volatile usbFaddr;
__u8 volatile usbRegDevCtl;
__u8 volatile usbSpeed;
__u8 volatile usbDescFoundOTG;
__u8 volatile usbConnectFlag;
__u8 volatile NotifyusbConnect;
__u8 volatile usbResetComplete;
__u8 volatile ProcessCount;
__u8 volatile DetCount;
__u8 volatile NotifyusbConnect2;
__u8 volatile HostMassmax_Lun;
__u8 volatile HostMassValid_Lun;
__u8 volatile Valid_lun_Mask;
__u8 volatile EPConfig;
__u8 volatile IntCheck; // for test
__u8 volatile pbGetImageFlag;
__u8 volatile DviceMassmax_Lun;
__u8 volatile usbMassRxDataReceived;
__u8 volatile usbMassCmdRevFlag;
__u8 volatile OtgDeviceType;
#if 0
__u8 volatile reset_count=0;
#endif
//void usbRead_CID(void);
void usbComplete_Resume(void);
void usbActivate_Resume(void);
__s8 usbValidate_OTG_Transition(void);
void usbA_Aidl_Bdis_Tmout(void);
void usbHost_Reset_Complete(void);
void usbHost_Reset_Start(void);
void usbB_Aase0_Brst_Tmout(void);
void usbWait_SessReq_Tmout(void);
__s8 usbExiting_Host(__u8 toOTG);
void usbExit_Active_USB_Mode(void);
void usbB_SRP_Fail(void);
static code const char msOTG_dummy_constant = 0;
extern U8 USBMode;
void usbRead_CID(void)
{
usbRead_DRC_Devctl();
if (usbRegDevCtl & M_DEVCTL_SESSION)
usbcid = (usbRegDevCtl & M_DEVCTL_BDEVICE) >> 7;
else
usbcid = CID_UNKNOWN;
}
void usbParse_DRC_INTRUSB(__u16 intrusb)
{
//__u16 i;
#ifdef Artemis_DEBUG
printf("\r\n intrusb=%x", intrusb); //artemis printf
printf("\r\n COTGS=%x", usbCurOTGState); //artemis printf
#endif
if (intrusb & M_INTR_VBUSERROR) // A device only
{
//printf("\r\n ve", 0); //artemis printf
usbChange_OTG_State(AB_IDLE);
usbREG_WRITE8(REG_DEVCTL, usbREG_READ8(REG_DEVCTL)|0x01);// enable session
}
if (intrusb & M_INTR_SUSPEND) // Valid in peripheral mode
{
//printf("\r\n Sup=%bx",usbCurOTGState);
if (usbCurOTGState == B_PERIPHERAL)
{
//printf("\r\n Sup",0);
usbSuspended = 1;
if(usbHNPEnabled)
usbChange_OTG_State(B_WAIT_ACON);
if (usbVBus_Status() < VBUS_ABOVE_AVALID)
usbChange_OTG_State(AB_IDLE);
//usbConnectFlag=0;
NotifyusbConnect=1;
}
if ((usbCurOTGState & 0x20) == 0x20) // A device ?
{
if(usbREG_READ8(REG_DEVCTL)|0x80)
{
//usbChange_OTG_State(B_PERIPHERAL);
usbChange_OTG_State(AB_IDLE);
}
else
usbChange_OTG_State(A_WAIT_BCON);
usbConnectFlag=0;
}
//usbChange_OTG_State(AB_IDLE);
else
//usbChange_OTG_State(B_PERIPHERAL);
usbReset_All_EP_IO_Vars();
//printf(", %bx",usbCurOTGState);
//usbConnectFlag=0;
}
if (intrusb & M_INTR_CONNECT) // Host mode only
{
//printf("\r\n cnt", 0); //artemis printf
usbFaddr=0;
usbREG_WRITE8(USB_REG_FADDR, usbFaddr);
usbRead_CID();
//if ((usbCurOTGState == B_WAIT_ACON) || (usbCurOTGState == B_PERIPHERAL))
//{
// printf("\r\n bcnt");
// usbChange_OTG_State(B_HOST);
//}
//else
{
//printf("\r\n hcnt",0);
//pbWriteUSB32Reg((__u16)DMA_COUNT_REGISTER(1), 0);
//pbWriteUSB16Reg((__u16)(DMA_CNTL_REGISTER(1)),0);
usbInitmemPool(USB_MSDFN_DSCR_ADDR, 0x1000);
usbChange_OTG_State(A_HOST);
#ifdef Enable_OTG_Host
otgInitMassBuffer();
#endif
}
}
if ((intrusb & M_INTR_DISCONNECT))
{
usbREG_WRITE8(USB_REG_POWER,usbREG_READ8(USB_REG_POWER)& (~M_POWER_SOFTCONN));
usbREG_WRITE8(REG_DEVCTL, usbREG_READ8(REG_DEVCTL) & (~M_DEVCTL_SESSION));// enable session
// Derek Added 2008/01/10, reset OTG IP
XBYTE[0x2500] = 0x6;
XBYTE[0x2500] = 0x0;
//pbWriteUSB16Reg(USB_REG_USB_CFG0, (pbReadUSB16Reg(USB_REG_USB_CFG0) & ~reg_usb_cfg0_srstn));
//pbWriteUSB16Reg(USB_REG_USB_CFG0, (pbReadUSB16Reg(USB_REG_USB_CFG0) | reg_usb_cfg0_srstn));
XBYTE[REG_UTMI_REG0] &= ~(reg_dp_puen+reg_term_override);//disable term_over and dp_puen
XBYTE[REG_UTMI_REG0] = 0x00;
XBYTE[REG_UTMI_REG3]|=(reg_rx_swreset+reg_utmi_tx_swreset); //reset UTMI: prevent utmi error caused by switch
XBYTE[REG_UTMI_REG3]&=~(reg_rx_swreset+reg_utmi_tx_swreset);
//printf("\r\n y=%x", usbCurOTGState);
//puts("\r\n disc\r\n");
USBMode = 0;
usbFaddr = 0;
usbSuspended = 0;
usbConnectFlag=0;
usbREG_WRITE8(USB_REG_FADDR, usbFaddr);
if((usbCurOTGState == B_PERIPHERAL))
{
//pbDPSInitFlag();
usbCurOTGState =AB_IDLE;
usbChange_USB_State(USB_DEFAULT);
usbDRC_Index_Select(0);
//artemis mark 0821 pbDPSDisvCompFlag=0;
NotifyusbConnect=1;
EPConfig=EPConfig&0x80;
}
//else
// printf("\r\n yy=%x", usbCurOTGState);
switch(usbCurOTGState)
{
case A_HOST:
//printf("\r\n TT=%x", usbResetting);
pbWriteUSB32RegINT((__u16)DMA_COUNT_REGISTER(1), 0);
pbWriteUSB16RegINT((__u16)(DMA_CNTL_REGISTER(1)),0);
usbChange_OTG_State(A_WAIT_BCON);
EPConfig=EPConfig&0x80;
NotifyusbConnect2=1;
usbDRC_Index_Select(usb_Ret_Blt_EP_Object(EP_RX));
usbREG_WRITE8(USB_REG_RXINTERVAL,0x02);
//printf("\r\n ar3=%x",usbREG_READ8(USB_REG_RXINTERVAL));
usbDRC_Index_Select(usb_Ret_Blt_EP_Object(EP_TX));
usbREG_WRITE8(USB_REG_TXINTERVAL,0x02);
//printf("\r\n at3=%x",usbREG_READ8(USB_REG_TXINTERVAL));
break;
case A_SUSPEND:
if (usbHNPSupport)
usbChange_OTG_State(A_PERIPHERAL);
else
usbChange_OTG_State(A_WAIT_BCON);
break;
case B_HOST:
usbChange_OTG_State(B_PERIPHERAL);
break;
}
ProcessCount=1;
#ifdef Artemis_DEBUG
printf("\r\n COTG2=%x", usbCurOTGState); //artemis printf
#endif
#ifdef USB_DEBUG
//printf("\r\nsusp",0);
#endif
}
#ifdef USB_DEBUG
//if (intrusb&M_INTR_RESUME)
//{
//printf("\r\nresum",0);
//}
#endif
if (intrusb & M_INTR_RESET)
{
//i=0x5000;
//while(i-->0);
//for test use
#if 0
reset_count++;
if(reset_count==2)
{
XBYTE[0x1F06]|=0x03; //reset UTMI
XBYTE[0x1F06]&=0xFC;
reset_count=0;
printf("\r\n UR",0);
}
#endif
//XBYTE[0x1E83]^=0x01; // toggle GPIOA8
usbRead_CID();
if (DRCHOST(usbRegDevCtl))
{
//printf("\r\n 1=%x",usbRegDevCtl);
//printf("\r\n Rt",0);
//usbReset_DRC_Core();
//usbFaddr = 0;
usbConnectFlag=0;
//usbREG_WRITE8(USB_REG_FADDR, usbFaddr);
//usbChange_OTG_State(A_WAIT_BCON);
//EPConfig=EPConfig&0x80;
NotifyusbConnect2=1;
}
else
{
//printf("\r\n 2=%x",usbRegDevCtl);
//printf("\r\n Rst=%bx",usbCurOTGState);
usbReset_All_EP_IO_Vars();
if(OtgDeviceType==Device_PictureBridge)
{
//artemis mark0821 pbDPSInitFlag();
//printf("\r\n UCnt=%x", usbConnectFlag);
//pbSendOptionComFlag=1;
}
usbConnectFlag=1;
usbFaddr = 0;
usbChange_USB_State(USB_DEFAULT);
if(usbCurOTGState == AB_IDLE)
usbChange_OTG_State(B_PERIPHERAL);
usbDesInit();
}
usbRead_DRC_Power();
if (usbRegPower & M_POWER_HSMODE)
{
usbSpeed = HIGH_SPEED;
XBYTE[0x1F09]|=0x80; //RX anti-dead-lock, HS set 1
}
else
{
usbSpeed = FULL_SPEED;
// only FS needs to reset UTMI TX/RX
XBYTE[REG_UTMI_REG3]|=(reg_rx_swreset+reg_utmi_tx_swreset); //reset UTMI: prevent utmi error caused by switch
XBYTE[REG_UTMI_REG3]&=~(reg_rx_swreset+reg_utmi_tx_swreset);
XBYTE[0x1F09]&=0x7F; //RX anti-dead-lock, FS set 0
}
//printf("\r\n Speed=%bx\n",usbSpeed);
#ifdef USB_DEBUG
//printf("\r\nreset",0);
//printf("\r\nCurOTGState=%x",usbCurOTGState);
#endif
if (OtgDeviceType==Device_MassStorage)
{
pbWriteUSB16RegINT((__u16)(DMA_CNTL_REGISTER(1)),0);
usbReSet_ClrRXMode1();
pbWriteUSB16RegINT(USB_REG_EP_BULKOUT, (pbReadUSB16Reg(USB_REG_EP_BULKOUT)|M_Mode1_P_BulkOut_EP));
pbWriteUSB16RegINT(USB_REG_DMA_MODE_CTL, (pbReadUSB16Reg(USB_REG_DMA_MODE_CTL)|M_Mode1_P_Enable|M_Mode1_P_AllowAck)); //allow ack,wayne added
pbWriteUSB16RegINT(USB_REG_DMA_MODE_CTL, (pbReadUSB16Reg(USB_REG_DMA_MODE_CTL)&(~M_Mode1_P_AllowAck))); //allow ack,wayne added
if(usbSpeed == HIGH_SPEED)
pbWriteUSB16RegINT(USB_REG_DMA_MODE_CTL, (pbReadUSB16Reg(USB_REG_DMA_MODE_CTL)|(USB_BUFSIZE/512))); //disable set_ok2rcv[15]&ECO4NAK_en[14],wayne added
else
pbWriteUSB16RegINT(USB_REG_DMA_MODE_CTL, (pbReadUSB16Reg(USB_REG_DMA_MODE_CTL)|(USB_BUFSIZE/64))); //disable set_ok2rcv[15]&ECO4NAK_en[14],wayne added
//printf("MCTL0=%x\n",pbReadUSB16Reg(USB_REG_DMA_MODE_CTL));
}
}
if (intrusb & M_INTR_RESUME)
{
switch (usbCurOTGState)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -