📄 otgcontroller.c
字号:
printf("@@@ Drop VBUS ok...\n"); } //<2>.Checking SRP detect Bit mdwOTGC_Control_A_SRP_RESP_TYPE_Set(A_SRP_RESP_TYPE_DATA_LINE); mdwOTGC_Control_A_SRP_DET_EN_Set(); printf("@@@ Enable the A_SRP_DET(Data Line Plusing) ok...\n"); //<3>. printf("@@@ <1>.Waiting for SRP to enter the Periphral mode(Data Line 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 8: mdwOTGC_Control_A_SRP_DET_EN_Clr(); printf("@@@ Disable the SRP Detect ok...\n"); break; case 9 : mdwOTGC_Control_A_BUS_DROP_Clr(); //Exit when Current Role = Host mdwOTGC_Control_A_BUS_REQ_Set(); printf("@@@ Drive VBUS ok...\n"); break; case 10: OTGC_A_Bus_Drop(); printf("@@@ Drop VBUS ok...\n"); break; case 11: mbHost20_USBCMD_HCReset_Set(); while(mbHost20_USBCMD_HCReset_Rd()>0); printf(">>> Host Controller Reset OK...\n"); break; case 12: bOPT_Device_A_Auto=1; break; case 13: OTGH_Error_Handle(); break; //john : remove force speed //case 14: // printf("********************************\n"); // printf("<0>.Disable \n"); // printf("<1>.Enable\n"); // printf(">>> Input:"); // scanf("%d",&bTemp); // bForceSpeed=bTemp; // if (bTemp==0) // mdwOTGC_Control_711MA_Phy_Issue_Clr(); // else // mdwOTGC_Control_711MA_Phy_Issue_Set(); //break; case 15: printf("********* FPGA Half Speed ***************\n"); printf("<0>.Disable(AHB Clk >= 30) \n"); printf("<1>.Enable (AHB Clk < 30) \n"); printf(">>> Input:"); scanf("%d",&bTemp); if (bTemp==0) mwPeri20_Control_HALFSPEEDEnable_Clr(); else mwPeri20_Control_HALFSPEEDEnable_Set(); break; }//switch(Item) } else { //<2>.For Peripheral OTGP_main(0,0,0); //Exit 1.when Role Change 2.when polling VBUS_VLD=0 if (flib_OTGH_Init(300,1,1)==0) { //john 0,1)==0) { OTGC_A_Bus_Drop(); OTGC_A_WaitingRoleChange(); } else { printf(" @@@ Device-A exit the Peripheral mode...\n"); if (bRoleChangeAutoTestEnable>0) flib_Host20_Enumerate(1,3); } }}//*****************************************************************************//*****************************************************************************//*********************** Group-4:Device-B *********************************//*****************************************************************************//*****************************************************************************//============================================================================= ok// OTGC_B_SRP_Init()// Description:<1>.Generate SRP// <2>.Waiting for the SRP Done Interrupt// <3>.Waiting for the VBUS-Turn-on// input: none// output: 0:Fail// 1:OK//=============================================================================UINT8 OTGC_B_SRP_Init(void){ INT32U wTimer_ms; INT8U bExitFlag; printf("OTGC_B_SRP_Init\n"); //Checking for Line State#if 0 if (mwHost20_PORTSC_LineStatus_Rd()!=0) { printf("??? Fail => 711MA Phy spec: Line State!=0, can not issue SRP...\n"); return(0) ; }#endif //<1>.Generate SRP OTG.B_bBSRPDN=0; //Bruce;;OPT;; mdwOTGC_Control_B_DSCHG_VBUS_Set(); mUsbUnPLGClr();//Bruce;;12162004;;unplug issue;; mdwOTGC_Control_B_BUS_REQ_Set(); //<2>.Waiting for the SRP Done Interrupt while(OTG.B_bBSRPDN!=1); // <A>.The done interrupt //<3>.Waiting for the VBUS-Turn-on bExitFlag=0; // wTemp=0; flib_Host20_TimerEnable(10); //1.Delay 10 ms wTimer_ms=0; // while(mdwOTGC_Control_B_SESS_VLD_Rd()==0); //==>For Peter do{ if (mdwOTGC_Control_A_VBUS_VLD_Rd()>0) //2.Waiting for VBUS Valid bExitFlag=1; flib_Host20_TimerEnable(1);//delay 1ms wTimer_ms++; if (wTimer_ms>100) //04212004;;from 10000 // Case1:Waiting for 10 sec=10000 { bExitFlag=2; } }while(bExitFlag==0); if (bExitFlag==2) {//Type-A do not turn on the bus printf(">>> OTG-B:Device-A NotResponding(Waiting Drive VBUS Fail)...\n"); return(0) ; } return (1);}//============================================================================= ok// OTGC_B_HNP_Init()// Description:Enter Peripheral mode to response the command from Host// <1>.Get OTG Descriptor // <2>.SetFeature// input: none// output: 0:HNP Fail// 1:HNP ok//=============================================================================UINT8 OTGC_B_HNP_Init(void){ printf("OTGC_B_HNP_Init\n"); //<1>.Response the GetDescriptor/SetFeature (Waitting for the HNP) //<2.1>.Host will Get Descriptor //<2.2>.Host will set feature OTGP_main(1,1,0); //<2>.If Role Change Fail => Clear the HNP_Enable to avoid the HNP if (OTG.CurrentRole==1) //Current Role => Change to Peripheral { mdwOTGC_Control_B_HNP_EN_Clr(); mdwOTGC_Control_B_BUS_REQ_Clr(); printf("exit OTGC_B_HNP_Init\n"); return(0); } else { printf("exit OTGC_B_HNP_Init\n"); return(1); }}//============================================================================// OTGC_B_Menu()// Description:For type B menu// <1>.Device-B/Host// <2>.Device-B/Peripheral// input: none// output: // //=============================================================================void OTGC_B_Menu(void){ char Item; UINT8 bTemp; UINT8 bNotSupport=0; if (OTG.CurrentRole==0) {//<1>.For Host if (mdwOTGC_Control_A_VBUS_VLD_Rd()>0) { printf("@@@ Device-B enter the Host Mode...\n"); //OTG.bHostISRType=1; if (flib_OTGH_Init(2000,2,0)==1) { //john 10000,1,0)==1) { if (flib_Host20_Enumerate(1,3)==2) { printf("??? OTG-B:OTG-A Device not support...\n"); bNotSupport=1; } if (OTGC_Device_Not_Support_Then_Return==1) { if (bNotSupport==0) if (bRoleChangeAutoTestEnable==0) OTGH_AP_Main(); } else OTGH_AP_Main(); } if (sAttachDevice.bSpeed==0) flib_Host20_Close(1);//For Full Speed else flib_Host20_Close(0);//For High Speed //while(OTG.CurrentRole==0); while(mdwOTGC_Control_CROLE_Rd()==0); OTG.CurrentRole=1; } else printf("!!! Please Drive the VBUS..."); } else {//<2>.For Peripheral if (OTGC_VBS_Valid()>0) { OTGP_main(1,1,0); } else { printf("************************** Peripheral Mode ***********************\n"); printf(" -- Normal--\n"); printf(" 1.Peripheral Mode (Path Test)\n"); printf(" 2.Peripheral Mode (VBUS off=>Still in the peripheral mode )\n"); printf(" 3.Reflash\n"); //john : remove force speed //printf(" 4.Force Host to Full-Low/High Speed\n"); printf(" 5.Request 'Role Change'\n"); printf(" 6.Request 'Role Change' Auto-Test x times\n"); printf(" 7.Dump Memory\n"); //john //printf(" 8.711MA Full Speed issue temp solution Enable/Disable\n"); printf(" 9.FPGA Half Speed (HCLK < 30 ==> Enable)((HCLK >= 30 ==> Disable)\n"); printf("******************************************************************\n"); if (wRoleChangeAutoTestCounter>=wRoleChangeAutoTestCounter_Input) { bRoleChangeAutoTestEnable=0; wRoleChangeAutoTestCounter=0; } if (bRoleChangeAutoTestEnable>0) Item=5; else { printf(">>> (Device-B / Peripheral Mode) Input Command : "); scanf("%d",&Item); printf("\n"); } switch(Item) { case 1 : printf("@@@ Device-B Enter Peripheral Mode...\n"); OTGP_main(1,1,0); //Exit 1.when Role Change 2.when polling VBUS_VLD=0 break; case 2: printf("@@@ Device-B Enter Peripheral Mode(For CV Test),Exit when 'RoleChange'...\n"); printf("@@@ CV Test will use GPIO to input the event'Remote Wake Up'(Active-Low), \n"); OTGP_main(1,1,1); break; case 3: printf("@@@ Device-B Reflash...\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(100); //johnreduce delay time 500 } printf("@@@ Device-B generate SRP/HNP...\n"); if (OTGC_B_SRP_Init()==1) { if (OTGC_B_HNP_Init()==0) //Exit when Current Role = Host printf("??? OTG-B HNP Fail(Device Not Responding)...\n"); } else printf("??? OTG-B SRP Fail...\n"); break; case 7: OTGH_Error_Handle(); break; //john : remove force speed //case 8: // printf("********************************\n"); // printf("<0>.Disable \n"); // printf("<1>.Enable\n"); // printf(">>> Input:"); // scanf("%d",&bTemp); // bForceSpeed=bTemp; // if (bTemp==0) // mdwOTGC_Control_711MA_Phy_Issue_Clr(); // else // mdwOTGC_Control_711MA_Phy_Issue_Set(); // // break; case 9: printf("********* FPGA Half Speed ***************\n"); printf("<0>.Disable(AHB Clk >= 30) \n"); printf("<1>.Enable (AHB Clk < 30) \n"); printf(">>> Input:"); scanf("%d",&bTemp); if (bTemp==0) mwPeri20_Control_HALFSPEEDEnable_Clr(); else mwPeri20_Control_HALFSPEEDEnable_Set(); break; }//switch(Item) }//if (mdwOTGC_Control_A_VBUS_VLD_Rd()>0) } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -