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

📄 host20_ap_hub.c

📁 GM8120 linux driver.
💻 C
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////////////////////////////	File name: OTGHost_AP_Hub.C//	Version: 1.0//	Date: 2004/6/08////	Author: Bruce//	Email: //	Phone: (03) 578-7888//	Company: Faraday Tech. Corp.////  ** Support: <1>.1.X Hub Emulation//              <2>.2.0 Hub Emulation   //              <3>.Device under Hub Emulation////	**Description: //  Group-1:Main Function//          <1>.OTGH_Hub_Main//              <1.1>.Get Hub Descriptor //                    Setup=0xA0,0x06,0x00,0x00,0x00,0x00,0x47,0x00//                    In =47 bytes//                    Ack//              <1.2>.Set Port Feature => Port Power Enable (All the port)//                    Setup=0x23,0x03,0x08,0x00,0x01,0x00,0x00,0x00//                    In =0 bytes//              <1.3>.???=>Clear Port Feature =>Port Connection ////              <1.4>.Interrupt In (loop until "Port Change detect")////              <1.5>.OTGH_Hub_Detect_Device//              <1.6>.OTGH_HID_Emulate_Device////          <2>.OTGH_Hub_Detect_Device//              <2.1>.Get Status(Port)//                    Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00//                    In =4 bytes//                    Ack//              <2.2>.Clear Feature(Port)=>Connection//                    Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00//                    In =0 bytes//              <2.3>.Set Feature (Port)=>Port Reset//                    Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00//                    In =0 bytes//              <2.4>.Get Status(Port)=>To ckeck reset complete//                    Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00 //                    In =4 bytes//                    Ack//              <2.5>.Clear Feature(Port)=>C_Port_Reset //                    Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00//              <2.6>.Get Status (port) => To know the speed////          <3>.OTGH_Hub_Emulate_Device//              /////////////////////////////////////////////////////////////////////////////////#include <stdlib.h>#include <stdarg.h>#include <stdio.h>#include <string.h>#include "chipset.h"  #include "flib.h" #include "Lib_Host20.h" #include "Host20_AP.H"#include "Host20_AP_HID.H"#include "Host20_AP_Hub.H"#include "Host20_AP_Camera.H"  Host20_Hub_Attach_Structure sHub;//====================================================================// * Function Name:  OTGH_Hub_Main                         // * Description: // * Input: none// * OutPut: none//====================================================================void OTGH_Hub_Command_Build(Host20_Control_Command_Structure *pbCMD,UINT8 bmRequestType_Temp,UINT8 bRequest_Temp,UINT16 wValue_Temp,UINT16 wIndex_Temp,UINT16 wLength_Temp){ UINT8 i; UINT8 *pbTemp;          pbTemp=pbCMD;         for (i=0;i<8;i++)             *pbTemp++=0x00;                              pbCMD->bmRequestType=bmRequestType_Temp;          pbCMD->bRequest=bRequest_Temp;          pbCMD->wValueLow=(UINT8)wValue_Temp;             pbCMD->wValueHigh=(UINT8)(wValue_Temp>>8);                               pbCMD->wIndexLow=(UINT8)wIndex_Temp;            pbCMD->wIndexHigh=(UINT8)(wIndex_Temp>>8);                pbCMD->wLengthLow=(UINT8)wLength_Temp;            pbCMD->wLengthHigh=(UINT8)(wLength_Temp>>8);    }//====================================================================// * Function Name: OTGH_Hub_Int_Init                          // * Description: // * OutPut: //====================================================================void  OTGH_Hub_Int_Init(void) { UINT32 i; UINT32 wSize;  //<1>.Disable the Periodic       flib_Host20_Periodic_Setting(HOST20_Disable);    //<2>.Init qHD for Interrupt(7~9)         psHost20_qHD_List_Interrupt[0]=Host20_STRUCTURE_qHD_BASE_ADDRESS+Host20_qHD_SIZE*5;                  wSize=sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeHighByte;         wSize=((wSize<<8)+sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeLowByte);                  flib_Host20_Allocate_QHD(psHost20_qHD_List_Interrupt[0],HOST20_HD_Type_QH                                  ,sAttachDevice.bAdd,0,1,wSize);//Address,Head=0,EndPt=1,Size          psHost20_qHD_List_Interrupt[0]->bTerminate=1;         psHost20_qHD_List_Interrupt[0]->bHighBandwidth=1;         psHost20_qHD_List_Interrupt[0]->bEdSpeed=sAttachDevice.bSpeed;          //<3>.Set Periodic Base Address		     mwHost20_PeriodicBaseAddr_Set(Host20_STRUCTURE_Preiodic_Frame_List_BASE_ADDRESS);	 //<4>.Update qHD (<1>.Fill S-Mask to 1 <2>.Max Size)             psHost20_qHD_List_Interrupt[0]->bInterruptScheduleMask=1;    //<5>.Disable all the Frame List (Terminal=1)  & Link the qHD1 to Frame List         for (i=0;i<Host20_Preiodic_Frame_List_MAX;i++)           psHost20_FramList->sCell[i].bTerminal=1;       for (i=0;i<Host20_Preiodic_Frame_List_MAX;i=i+0x100)       {psHost20_FramList->sCell[i].bLinkPointer=(UINT32)(psHost20_qHD_List_Interrupt[0])>>5;        psHost20_FramList->sCell[i].bType=HOST20_HD_Type_QH;        psHost20_FramList->sCell[i].bTerminal=0;       }  //<6>.Enable the periodic        flib_Host20_Periodic_Setting(HOST20_Enable);}//====================================================================// * Function Name: OTGH_Hub_Port_Change_Detect                          // * Description: // * Input: none// * OutPut: none//====================================================================UINT8 OTGH_Hub_Port_Change_Detect(void){ UINT8  *pbBuffer4K_1; Host20_BufferPointerArray_Structure aTemp; UINT8 bReturn;  //<1>.Init Interrupt for Hub   OTGH_Hub_Int_Init();//Init the qhd       //<2>.Init Buffer       pbBuffer4K_1=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);   	aTemp.BufferPointerArray[0]=pbBuffer4K_1;	aTemp.BufferPointerArray[1]=0;		aTemp.BufferPointerArray[2]=0;		aTemp.BufferPointerArray[3]=0;	aTemp.BufferPointerArray[4]=0;	         //<3>.Issue Interrupt  if (sAttachDevice.bConnectStatus>0)       {       printf(">>> Get the Port Change Event...\n");        flib_Host20_Issue_Interrupt(0,1,&(aTemp.BufferPointerArray[0])//bArrayListNum,hwSize,*pwBufferArray                     ,0,OTGH_Dir_IN);//wOffset,bDirection        }  bReturn=*pbBuffer4K_1;  printf(">>> Port Change Event = 0x%x\n",bReturn);  //<4>.free memory        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,pbBuffer4K_1);  //<5>.Disable Periodic             flib_Host20_Periodic_Setting(HOST20_Disable);  return(bReturn);}//====================================================================// * Function Name:  OTGH_Hub_GetStatus                         // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_GetStatus(UINT8 bPortNumber,UINT8 Mode,UINT8 *pbData){ Host20_Control_Command_Structure bCMD;	     OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_In|Mode)                            ,HOST20_HUB_Request_GetStatus,0x00,(bPortNumber+1),0x04);     flib_Host20_Issue_Control_ByMode (1,&bCMD,0x04    //bEdNum,UINT8* pbCmd,hwDataSize                              ,pbData,0);//UINT8* pbData,UINT8 bModeSelect         printf(">>> Port GetStatus:0x%x, 0x%x, 0x%x, 0x%x \n",pbData[0],pbData[1],pbData[2],pbData[3]);}//====================================================================// * Function Name:  OTGH_Hub_ClearFeature                         // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_ClearFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector){ Host20_Control_Command_Structure bCMD;	 UINT8 bDumyBuffer[2];     OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode)                            ,HOST20_HUB_Request_ClearFeature,bFeatureSelector,(bPortNumber+1),0x00);     flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00    //bEdNum,UINT8* pbCmd,hwDataSize                              ,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect         printf(">>> Clear Feature Finish(0x%x) \n",bFeatureSelector);}//====================================================================// * Function Name:  OTGH_Hub_SetFeature                         // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_SetFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector){ Host20_Control_Command_Structure bCMD;	 UINT8 bDumyBuffer[2];     OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode)                            ,HOST20_HUB_Request_SetFeature,bFeatureSelector,(bPortNumber+1),0x00);     flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00    //bEdNum,UINT8* pbCmd,hwDataSize                              ,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect         printf(">>> Set Feature Finish(0x%x)... \n",bFeatureSelector);}//====================================================================// * Function Name:  OTGH_Hub_Init_Device                         // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_Init_Device(UINT8 bPortNumber){ Host20_Hub_Port_Status_Structure bStatus;   //<2.1>.Get Status(Port)   //      Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00   //      In =4 bytes   //      Ack           OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData           if (bStatus.bSts_CurrentConnect==0)              {              	printf("??? Connect Error...");              	while(1);              	}              //<2.2>.Clear Feature(Port)=>Connection   //      Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00   //      In =0 bytes           if (bStatus.bChg_Connect)              {              printf(">>> ClearFeature (port) =>Connection \n");              OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port                          ,HOST20_HUB_FEATURE_C_PORT_CONNECTION);	             	              }   //<2.3>.Set Feature (Port)=>Port Reset   //      Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00   //      In =0 bytes           printf(">>> SetFeature (port) =>Port Reset \n");           OTGH_Hub_SetFeature(bPortNumber,HOST20_HUB_RequestType_About_Port                               ,HOST20_HUB_FEATURE_PORT_RESET);   //<2.4>.Get Status(Port)=>To ckeck reset complete   //      Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00    //      In =4 bytes   //      Ack          //????????=>Delay time         flib_Host20_TimerEnable(50);                              OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData          if (bStatus.bChg_ResetComplete)             {              printf(">>> Reset Complete...\n");             	              //<2.5>.Clear Feature(Port)=>C_Port_Reset               //      Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00              printf(">>> ClearFeature (port) =>Reset Complete \n");              OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port                          ,HOST20_HUB_FEATURE_C_PORT_RESET);	             	             }   //<2.6>.Get Status (port) => To know the speed                      OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&bStatus);//bPortNumber,Mode, *pbData                      if (bStatus.bSts_LowSpeedAttached)               {printf(">>> Low Speed Device attach to Hub...\n");                sHub.bDeviceAOnHub[bPortNumber].bSpeed=0x01;               }

⌨️ 快捷键说明

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