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

📄 otgcontroller.c

📁 GM8120 linux driver.
💻 C
📖 第 1 页 / 共 3 页
字号:
		  }	   }	   else {//For Type-B Interrupt          if (wINTStatus&OTGC_INT_BSRPDN) {//B-Type => SRP done interrupt => then set global variable                 OTG.B_bBSRPDN=1;		  }	   }	}   //end of " if (wINTStatus&OTGC_INT_IDCHG) "}//*****************************************************************************//*****************************************************************************//***********************  Group-3:Device-A  **********************************//*****************************************************************************//*****************************************************************************//============================================================================= ok//		OTGC_A_PHY_Reset()//		Description://		input: none//		output: none//=============================================================================void OTGC_A_PHY_Reset(void){   //Reset Phy   //waiting for mdwOTGC_Control_B_SESS_END_Rd      printf(">>> Waiting for B_SESS_END & Phy Reset...(under 5sec)\n");   do{      flib_Host20_TimerEnable(10);     }while(mdwOTGC_Control_B_SESS_END_Rd()==0);   mwOTG20_Control_Phy_Reset_Set();   flib_Host20_TimerEnable(1);      mwOTG20_Control_Phy_Reset_Clr();}//============================================================================= ok//		OTGC_A_Bus_Drop()//		Description:It will Drop the VBUS//                  <1>.Step1:Close the OTG-Host//                  <2>.Step2:Set Host function State to 'Reset Mode'//			        <3>.Step3:Set register 'A_BUS_DROP'//		input: none//		output: none//=============================================================================void OTGC_A_Bus_Drop(void){   flib_Host20_Close(0);   mdwOTGC_Control_A_BUS_REQ_Clr();   mdwOTGC_Control_A_BUS_DROP_Set(); //Exit when Current Role = Host         //Reset Phy   //OTGC_A_PHY_Reset();		//YPING mark}//============================================================================= ok//		OTGC_A_Bus_Drive()//		Description://		input: none//		output: none//=============================================================================void OTGC_A_Bus_Drive(void){   //OTGC_A_PHY_Reset();         mdwOTGC_Control_A_BUS_DROP_Clr(); //Exit when Current Role = Host   mdwOTGC_Control_A_BUS_REQ_Set();   printf("@@@ Drive VBUS ok...\n");}//============================================================================= ok//		OTGC_A_SRP_Init()//		Description:Device A generate the SRP procedure//                  <1>.Waiting for the A-SRP-Done Interrupt		//                  <2>.Turn on the V Bus //                  <3>.Issue Bus reset//		input: none//		output: UINT8 0:Fail 1:OK//=============================================================================UINT8 OTGC_A_SRP_Init(void){   UINT8 bResult=0;      printf("@@@ Device-A Waiting for the SRP...Count=%d\n",gWaitingSRPCounter);   gWaitingSRPCounter++;   //<1>.Waiting for the A-SRP-Done Interrupt   while(OTG.A_bASRPDET==0);      OTG.A_bASRPDET=0;   //<2>.Turn on the V Bus    mdwOTGC_Control_A_BUS_DROP_Clr();   mdwOTGC_Control_A_BUS_REQ_Set();       //<3>.Issue Bus reset   bResult=flib_OTGH_Init(10000,1,0);  //john 0,0);      if (bResult==1)      return (1);   else      return (0);                }//============================================================================= ok//		OTGC_A_HNP_Init()//		Description:Device A generate the HNP procedure//			        <1>.Get OTG Descriptor//                  <2>.Set register "A_SET_B_HNP_EN"//                  <3>.Set Feature to peripheral//                  <4>.Go to suspend//                  <5>.Waiting for Role Change...//		input: none//		output: INT8U 0:Fail / 1:OK//=============================================================================INT8U OTGC_A_HNP_Init(void){   UINT8 bCMD[8];   UINT8 bOTGData[3] ;   UINT8 bResult;   UINT8 bExitFlag;   //UINT32 wTimer_ms;   //<1>.Enumurate the Device ...   if (flib_Host20_Enumerate(0,3)==0) { //Set configuration to 0 & Set Address to 1      printf("??? Enumerate Fail...\n");      flib_Host20_Suspend();      return (0);           	     	   }   //<2>.Set register "A_SET_B_HNP_EN"   if (((UINT8)(sAttachDevice.sOTG.bED_OTG_bAttributes))!=OTGH_SRP_HNP_Enable) {      printf("??? Device-B do not support SRP/HNP (%d)\n",(UINT8)(sAttachDevice.sOTG.bED_OTG_bAttributes));      flib_Host20_Suspend();      return (0);     }    //Turn on D+   mUsbUnPLGClr();//Bruce;;12162004;;unplug issue;;    mdwOTGC_Control_A_SET_B_HNP_EN_Set();                //<3>.Set Feature to peripheral   memcpy(bCMD,OTGH_SET_FEATURE_OTG,8);   //bResult=flib_OTGH_Issue_Control(1,bCMD,0x00,bOTGData);   bResult=flib_Host20_Issue_Control (1,bCMD,0x00,bOTGData);   if (bResult!=0) {//<3.1>.SetFeature Fail      printf("??? SetFeature Fail, Device-B Do not Support HNP...(%d)\n",bResult);      //<3.2>.Recover to original situation	      mdwOTGC_Control_A_SET_B_HNP_EN_Clr();                //<3.3>.Delay 1 ms	      flib_Host20_TimerEnable(1);          	      //<3.4>.Suspend the system      flib_Host20_Suspend();           	      //<3.5>.Return 0	      return (0);          	   }   printf(">>> Device-A suspend & exit host Mode\n");                    //<4>.Go to suspend   flib_Host20_Suspend();      //<5>.Pre-Init peripheral   OTGP_init(0);//Do not init AP        //<6>.Waiting for Role Change... / or For resume signal//   wTimer_ms=0;   bExitFlag=0;   do{      //Checking for Resume from Peripheral      // if (flib_OTGH_Checking_RemoteWakeUp()==1) //0=>Do not Print data / 0=> Normal Enumerate      //    {      //     flib_Host20_TimerEnable(1);       //      flib_Host20_Suspend();      //     return(0);      //    }              //Checking the VBUS 	             if (mdwOTGC_Control_A_VBUS_VLD_Rd()==0)         if (OTGC_VBS_Valid()==0)            return (0);      if (OTG.CurrentRole==1)         return(1);                                //Checking for Role Change   } while(bExitFlag==0);   return(1);}    //============================================================================= ok//		OTGC_A_WaitingRoleChange()//		Description:<1>.Call function 'SRP'//                  <2>.Call function 'HNP'//		input: none//		output: none//=============================================================================void OTGC_A_WaitingRoleChange(void){   if (OTGC_A_SRP_Init()>0) {      //<1>.A Init HNP      if (OTGC_A_HNP_Init()==0)          printf("??? Device-B Request Role Change Fail(HNP Fail)...\n");                }   else 	  printf("??? Device-B Request Role Change Fail(SRP Fail)...(Device Not Support...)\n");  }//============================================================================= ok//		OTGC_A_Menu()//		Description:This menu is for the Device-A //                  <1>.Device-A/Host//			        <2>.Device-A/Peripheral//		input: none//		output: none//=============================================================================void OTGC_A_Menu(void){   char Item;   UINT8 bTemp;     OTG.A_bASRPDET=0;	   if (OTG.CurrentRole==0) {//<1>.For Host      printf("****************** Device-A:Host Mode  ***************************\n");        printf(" -- Normal--\n");       printf("   1.Host Mode (OTG Path Test)\n");       printf("   3.Reflash\n");  	  //john : remove force speed      //printf("   4.Force Host to Full-Low/High Speed\n");       printf(" -- SRP/HNP --\n");       printf("   5.Waiting for Role Change(SRP+HNP)(VBUS) \n");       printf("   6.Waiting for Role Change(SRP+HNP)(VBUS)Auto-Test x times \n");       printf("   7.Waiting for Role Change(SRP+HNP)(Data Line) \n");       printf("   8.Disable the SRP Detect\n");       printf("   9.Drive VBUS\n");       printf("   10.Drop the VBUS\n");       printf("   11.Reset Host Controller\n");             printf("   12.OPT-Device-A Test-Auto\n");             printf("   13.Dump Memory\n");       //john : remove force speed      //printf("   14.711MA Full Speed issue temp solution Enable/Disable\n");       printf("   15.FPGA Half Speed (HCLK < 30 ==> Enable)((HCLK >= 30 ==> Disable)\n");       printf(" -- Status \n");      printf("   **VBUS:0x%x    **SRP_DET:0x%x   ** SRP_DET_TYPE:0x%x            \n",(UINT32)(mdwOTGC_Control_A_VBUS_VLD_Rd()),(UINT32)(mdwOTGC_Control_A_SRP_DET_EN_Rd()),(UINT32)(mdwOTGC_Control_A_SRP_RESP_TYPE_Rd()));      printf("   **Host-Connect:0x%x             ** ID/Role:0x%x \n",(UINT32)(mwHost20_PORTSC_Rd()),(UINT32)(mdwOTGC_Control_Rd()));      printf("******************************************************************\n");       OTG.A_APLGRMV=0;      OTG.A_BPLGRMV=0;          OTG.IDCHG=0;                              if (wRoleChangeAutoTestCounter>=wRoleChangeAutoTestCounter_Input) {         bRoleChangeAutoTestEnable=0;         wRoleChangeAutoTestCounter=0;      }      if (bRoleChangeAutoTestEnable>0)         Item=5;      else {         if (bOPT_Device_A_Auto==1)	            Item=5;         else {                printf(">>> (Device-A / Host Mode) Input Command : ");              scanf("%d",&Item);                     printf("\n");		 } 	  }          switch(Item) {                                case 1 :                        //<1>.Turn On VBUS            OTG.bVBUSAlwaysOn=1;            //if (mdwOTGC_Control_A_VBUS_VLD_Rd()==0)            //   {            mdwOTGC_Control_A_BUS_DROP_Clr(); //Exit when Current Role = Host            mdwOTGC_Control_A_BUS_REQ_Set();            printf("@@@ Drive VBUS ok...\n");            //   }                                      //<2>.Waiting for Connect               printf("@@@ Enter DRD Host Mode...\n");            printf("@@@ Waiting for Device Connect...\n");                                      while(mwHost20_PORTSC_ConnectStatus_Rd()==0);                                                  if (flib_OTGH_Init(10000,0,0)==1) {               flib_Host20_Enumerate(1,3);               OTGH_AP_Main();               OTGC_A_Bus_Drop();               printf("@@@ Drop VBUS ok...\n");                                         OTG.bVBUSAlwaysOn=0;                                    }       		break;     		      		                             case 3:                   printf("@@@ Reflash the status...\n");                    if (OTG.A_APLGRMV>0)                 printf("   @@@ Cable-Mini-A remove...\n");                             if (OTG.A_BPLGRMV>0)                 printf("   @@@ Cable-Mini-B remove...\n");                             if (OTG.IDCHG>0)                 printf("   @@@ ID Change ...\n");       	    break;                     	     //john : remove force speed         //case 4:                      //   printf("********************************\n");                              //   printf("<0>.Clear All .\n");                                 //   printf("<1>.Force Full-Low Speed .\n");         //   printf("<2>.Force High Speed .\n");               //   printf(">>> Input:");           //   scanf("%d",&bTemp);                  //          //   bForceSpeed=bTemp;         //   flib_Host20_ForceSpeed(bForceSpeed);   		 //	break;            		       	 case 6:             printf(">>> Auto Test times(x>0): ");              scanf("%d",&wRoleChangeAutoTestCounter_Input);                     printf("\n");       		bRoleChangeAutoTestEnable=1;       		wRoleChangeAutoTestCounter=0;         case 5:             			if (bRoleChangeAutoTestEnable>0) {               wRoleChangeAutoTestCounter++;               printf("=================>>>Role Change Auto Test Counter=%d \n",wRoleChangeAutoTestCounter);                 flib_Host20_TimerEnable(500);             }                                                        //<1>.Checking VBUS            if (mdwOTGC_Control_A_VBUS_VLD_Rd()>0) {               OTGC_A_Bus_Drop();               printf("@@@ Drop VBUS ok...\n");                               }       		               	    //<2>.Checking SRP detect Bit      	    mdwOTGC_Control_A_SRP_RESP_TYPE_Clr();            mdwOTGC_Control_A_SRP_DET_EN_Set();            printf("@@@ Enable the SRP-VBUS Detect ok...\n");            //<3>.            printf("@@@ <1>.Waiting for SRP to enter the Periphral mode (VBUS Pulsing...)\n");                  printf("@@@ <2>.Init HNP \n");                  printf("@@@ <3>.Waiting for Role Change to enter periphral mode \n");                                                              //<1>.A Init SRP              //flib_OTGH_RemoteWakeEnable();            OTGC_A_WaitingRoleChange();                   	    break;                     case 7:                         //<1>.Checking VBUS            if (mdwOTGC_Control_A_VBUS_VLD_Rd()>0) {               OTGC_A_Bus_Drop();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -