📄 host20_ap_hub.c
字号:
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 + -