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

📄 host20_ap_hub.c

📁 FIC8120方案的 StartCell_Driver
💻 C
📖 第 1 页 / 共 2 页
字号:
                            ,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;
   }
   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 + -