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

📄 host20_ap_hub.c

📁 FIC8120方案的 StartCell_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 + -