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

📄 host20_ap_hub.c

📁 GM8120 linux driver.
💻 C
📖 第 1 页 / 共 2 页
字号:
           else if (bStatus.bSts_HighSpeedAttached)                   {printf(">>> High Speed Device attach to Hub...\n");                    sHub.bDeviceAOnHub[bPortNumber].bSpeed=0x02;                                     }                else  {printf(">>> Full Speed Device attach to Hub...\n");                       sHub.bDeviceAOnHub[bPortNumber].bSpeed=0x00;                                       } }//====================================================================// * Function Name: OTGH_Hub_AnalysisConfigyration                          // * Description: // * Input: //// * OutPut: //====================================================================void OTGH_Hub_AnalysisConfigyration (UINT8 *pbData,UINT8 bPortNumber){ UINT8 i,j,k; //<1>.Copy Configuration 1~2       for (i=0;i<sHub.bDeviceAOnHub[bPortNumber].sDD.bCONFIGURATION_NUMBER;i++)           {                          memcpy(&(sHub.bDeviceAOnHub[bPortNumber].saCD[i]),pbData,HOST20_CONFIGURATION_LENGTH);             pbData=pbData+HOST20_CONFIGURATION_LENGTH;                   //<2>.Copy Interface 1~5                   if (sHub.bDeviceAOnHub[bPortNumber].saCD[i].bINTERFACE_NUMBER>HOST20_INTERFACE_NUM_MAX)                      {                      printf("??? Analysis Interface Fail(bINTERFACE_NUMBER>Max)...");	                      while(1);                      }                                     for (j=0;j<sHub.bDeviceAOnHub[bPortNumber].saCD[i].bINTERFACE_NUMBER;j++)                        {                                             memcpy(&(sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j]),pbData,HOST20_INTERFACE_LENGTH);                          pbData=pbData+HOST20_INTERFACE_LENGTH;                            //<3>.Copy Class HID                                  if (sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j].bInterfaceClass ==3)                               {//Only support 1 class                                memcpy(&(sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j].sClass[0]),pbData,*pbData);                                pbData=pbData+(*pbData);                               	}                                   //<4>.Copy Endpoint 1~5                                  if (sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j].bEP_NUMBER>HOST20_ENDPOINT_NUM_MAX)                                     {                                     printf("??? Analysis Endpoint Fail(bEP_NUMBER>Max)...");	                                     while(1);                                     }                                                   for (k=0;k<sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j].bEP_NUMBER;k++)                                       {                                                            memcpy(&(sHub.bDeviceAOnHub[bPortNumber].saCD[i].sInterface[j].sED[k]),pbData,HOST20_ENDPOINT_LENGTHX);                                         pbData=pbData+HOST20_ENDPOINT_LENGTHX;                                        }//Endpoint                         }//Interface                       }//Configuration }//====================================================================// * Function Name:  OTGH_Hub_Emulate_Device                         // * Description: // * Input: // * OutPut: //====================================================================UINT8  OTGH_Hub_Emulate_Device(UINT8 bPortNumber){  UINT8 bCMD[8]; UINT16 wLength; UINT32 i; UINT8 *pbData; UINT32 wSizeTemp;  //<1>.Init the qHD address         psHost20_qHD_List_Control[0]->bDeviceAddress=0;//Default Address=0        psHost20_qHD_List_Control[0]->bHubAddr=sAttachDevice.bAdd;        psHost20_qHD_List_Control[0]->bPortNumber=bPortNumber+1;        psHost20_qHD_List_Control[0]->bSplitTransactionMask=0xF8;        psHost20_qHD_List_Control[0]->bInterruptScheduleMask=0x01;        psHost20_qHD_List_Control[0]->bEdSpeed=sHub.bDeviceAOnHub[bPortNumber].bSpeed;        psHost20_qHD_List_Control[0]->bControlEdFlag=1;     //<2>.GetDescriptor - Device (8 Bytes)        memcpy(bCMD,OTGH_GETDESCRIPTOR_DEVICE_8,8);        if (flib_Host20_Issue_Control (0,bCMD,0x08,&(sHub.bDeviceAOnHub[bPortNumber].sDD))>0)            return (0);       //Set the ep0 max packet size         psHost20_qHD_List_Control[0]->bMaxPacketSize=sHub.bDeviceAOnHub[bPortNumber].sDD.bEP0MAXPACKETSIZE;    //<3>.Set Address to i        memcpy(bCMD,OTGH_SETADDRESS,8);        sHub.bDeviceAOnHub[bPortNumber].bAdd=sAttachDevice.bAdd+(bPortNumber+1);        bCMD[2]=sHub.bDeviceAOnHub[bPortNumber].bAdd;        if (flib_Host20_Issue_Control(0,bCMD,0,OTGH_NULL)>0)            return (0);  //<4>.Update qHD for new address        psHost20_qHD_List_Control[0]->bDeviceAddress=sHub.bDeviceAOnHub[bPortNumber].bAdd;  //<5>.GetDescriptor - Device (18 Bytes)        memcpy(bCMD,OTGH_GETDESCRIPTOR_DEVICE,8);        if (flib_Host20_Issue_Control (0,bCMD,0x12,&(sHub.bDeviceAOnHub[bPortNumber].sDD))>0)            return (0);  //<6>.GetDescriptor - Configuration (8Bytes)        memcpy(bCMD,OTGH_GETDESCRIPTOR_CONFIG,8);        pbData=malloc(1000);        for (i=0;i<1000;i++)            *(pbData+i)=0;        if (flib_Host20_Issue_Control (0,bCMD,0x08,pbData)>0)            {            free(pbData);	            return (0);                    }        wLength=*(pbData+2)+((*(pbData+3))<<8);  //<7>.GetDescriptor - Configuration (Y-Bytes = wLength)        bCMD[6]=*(pbData+2);//Low Byte        bCMD[7]=*(pbData+3) ;//High Byte        if (flib_Host20_Issue_Control (0,bCMD,wLength,pbData)>0)            {            free(pbData);	            return (0);                    }                             OTGH_Hub_AnalysisConfigyration(pbData,bPortNumber);  //<8>.Get String         sHub.bDeviceAOnHub[bPortNumber].bStringLanguage[0]=0;        sHub.bDeviceAOnHub[bPortNumber].bStringManufacture[0]=0;        sHub.bDeviceAOnHub[bPortNumber].bStringProduct[0]=0;        sHub.bDeviceAOnHub[bPortNumber].bStringSerialN[0]=0;           //<7.1>.Get String -Language ID            if ((sHub.bDeviceAOnHub[bPortNumber].sDD.bManufacturer>0)                 |(sHub.bDeviceAOnHub[bPortNumber].sDD.bProduct>0)                 |(sHub.bDeviceAOnHub[bPortNumber].sDD.bSerialNumber>0) )               {memcpy(bCMD,OTGH_GETDESCRIPTOR_STR70,8);               wSizeTemp=10;//10//Size  =4                  bCMD[2]=0;//Get the language ID               bCMD[6]=wSizeTemp;                         if (flib_Host20_Issue_Control (0,bCMD,wSizeTemp,sHub.bDeviceAOnHub[bPortNumber]                    .bStringLanguage)>0)                  	 return (0);                     }            //<7.2>.Get String -Manufacture             if (sHub.bDeviceAOnHub[bPortNumber].sDD.bManufacturer>0)                {memcpy(bCMD,OTGH_GETDESCRIPTOR_STR70,8);                 wSizeTemp=0xFF;//Size=26/100                   bCMD[2]=sHub.bDeviceAOnHub[bPortNumber].sDD.bManufacturer;//Get the language ID                 bCMD[4]=0x09;                 bCMD[5]=0x04;                                               bCMD[6]=wSizeTemp;                                   if (flib_Host20_Issue_Control (0,bCMD,wSizeTemp,sHub.bDeviceAOnHub[bPortNumber].bStringManufacture)>0)                    	 return (0);                          	                 }           //<7.3>.Get String -product             if (sHub.bDeviceAOnHub[bPortNumber].sDD.bProduct>0)                        {memcpy(bCMD,OTGH_GETDESCRIPTOR_STR70,8);                wSizeTemp=100;//Size=34                 bCMD[2]=sHub.bDeviceAOnHub[bPortNumber].sDD.bProduct;                 bCMD[4]=0x09;                 bCMD[5]=0x04;                                               bCMD[6]=wSizeTemp;                              if (flib_Host20_Issue_Control (0,bCMD,wSizeTemp,sHub.bDeviceAOnHub[bPortNumber].bStringProduct)>0)                   	 return (0);                      }        //<7.4>.Get String -SerialNumber          if (sHub.bDeviceAOnHub[bPortNumber].sDD.bSerialNumber>0)                             { memcpy(bCMD,OTGH_GETDESCRIPTOR_STR70,8);              wSizeTemp=100;//Size=4              bCMD[2]=sHub.bDeviceAOnHub[bPortNumber].sDD.bSerialNumber;              bCMD[4]=0x09;              bCMD[5]=0x04;                                            bCMD[6]=wSizeTemp;                if (flib_Host20_Issue_Control (0,bCMD,wSizeTemp,sHub.bDeviceAOnHub[bPortNumber].bStringSerialN)>0)                 	 return (0);                   }  //<9>.Set Configurarion to 0        memcpy(bCMD,OTGH_SETCONFIGURATION,8);        if (flib_Host20_Issue_Control (0,bCMD,0x00,OTGH_NULL)>0)            return (0);           //<10>.Printf the Device-Descriptor/Configuration-Descriptor            flib_PrintDeviceInfo_ByInput(&(sHub.bDeviceAOnHub[bPortNumber]));return (1);}//====================================================================// * Function Name:  OTGH_Hub_Main                         // * Description: // * Input: none// * OutPut: none//====================================================================void OTGH_Hub_Main(void){ int i;   UINT8 bItem;  Host20_Control_Command_Structure bCMD;	 UINT8 bDumyDataBuffer[10];  UINT8 bPortChangeEvent; UINT32 wVID_PID; UINT8 aLogitechSerial[10]={0x22,0x03,0x30,0x00,0x31,0x00,0x34,0x00,0x30,0x00};    //<1>.Get Hub Descriptor    //Setup=0xA0,0x06,0x00,0x00,0x00,0x00,0x47,0x00   //In =47 bytes   //Ack     OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_In|HOST20_HUB_RequestType_About_Hub)                            ,HOST20_HUB_Request_GetDescriptor,0x00,0x00,0x12);//guess value     if (flib_Host20_Issue_Control_ByMode (1,&bCMD,0x12    //bEdNum,UINT8* pbCmd,hwDataSize                              ,&(sHub.sDes),0)>0)//UINT8* pbData,UINT8 bModeSelect             {         printf("??? Get Hub Descriptor Fail...\n");         return ;	         }   //<2>.Set Port Feature => Port Power Enable (All the port)   //Setup=0x23,0x03,0x08,0x00,0x01,0x00,0x00,0x00   //In =0 bytes     for (i=1;i<5;i++)     {          OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|HOST20_HUB_RequestType_About_Port)                                ,HOST20_HUB_Request_SetFeature,HOST20_HUB_FEATURE_PORT_POWER                                ,i,0x00);          if (flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00    //bEdNum,UINT8* pbCmd,hwDataSize                               ,bDumyDataBuffer,1)>0)//UINT8* pbData,UINT8 bModeSelect                  {               printf("??? Set Port Feature Fail...\n");               return ;	                }     }         for (i=0;i<5;i++)       flib_Host20_TimerEnable(1000);      //<3>.???=>Clear Port Feature =>Port Connection ===>Reserved         //<4>.Interrupt In (loop until "Port Change detect")           bPortChangeEvent=OTGH_Hub_Port_Change_Detect();       //<5>.OTGH_Hub_Detect_Device           for (i=0;i<4;i++)               {               	if ((bPortChangeEvent>>(i+1))&0x01)               	    {//Device Connect to Hub               	     printf("***************************** Port-%d ***************************************\n",(i+1));               	     sHub.bDeviceAOnHub[i].bConnectStatus=1;               	     sHub.bDeviceAOnHub[i].bDeviceOnHub=1;               	     sHub.bDeviceAOnHub[i].bOnHubPortNumber=i;//Start from 0                     OTGH_Hub_Init_Device(sHub.bDeviceAOnHub[i].bOnHubPortNumber);                     OTGH_Hub_Emulate_Device(sHub.bDeviceAOnHub[i].bOnHubPortNumber);                                          }               	else  sHub.bDeviceAOnHub[i].bConnectStatus=0;              	}   //<6>.Run Device Function         printf("*************************************************************************\n");         printf("*************************************************************************\n");                  printf(">>> Select Port to run AP(1~4):");           scanf("%d",&bItem);          printf("\n");           if (sHub.bDeviceAOnHub[bItem-1].bConnectStatus)                           {             psDevice_AP=&(sHub.bDeviceAOnHub[bItem-1]);             wVID_PID=(psDevice_AP->sDD.bVIDLowByte);             wVID_PID=(wVID_PID<<8) | (psDevice_AP->sDD.bVIDHighByte);             wVID_PID=(wVID_PID<<8) | (psDevice_AP->sDD.bPIDLowByte);             wVID_PID=(wVID_PID<<8) | (psDevice_AP->sDD.bPIDHighByte);                          if (wVID_PID==OTGH_FARADAY_TEST_AP)//For Faraday Test AP Device                 OTGH_AP_Faraday();             else  if (psDevice_AP->saCD[0].sInterface[0].bInterfaceClass==3)//For HID                        OTGH_HID_Main(0); //psAttachDevice,bControlListNum                     else   if (memcmp(&(psDevice_AP->bStringSerialN[0]),&(aLogitechSerial[0]),10)==0)                          Host20_Camera_Main();                                          }}

⌨️ 快捷键说明

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