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