⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msotg.c

📁 MSTAR03的数码相框的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -