📄 host20_ap_hub.c
字号:
/////////////////////////////////////////////////////////////////////////////////// File name: OTGHost_AP_Hub.C// Version: 1.0// Date: 2004/6/08//// Author: Bruce// Email: // Phone: (03) 578-7888// Company: Faraday Tech. Corp.//// ** Support: <1>.1.X Hub Emulation// <2>.2.0 Hub Emulation // <3>.Device under Hub Emulation//// **Description: // Group-1:Main Function// <1>.OTGH_Hub_Main// <1.1>.Get Hub Descriptor // Setup=0xA0,0x06,0x00,0x00,0x00,0x00,0x47,0x00// In =47 bytes// Ack// <1.2>.Set Port Feature => Port Power Enable (All the port)// Setup=0x23,0x03,0x08,0x00,0x01,0x00,0x00,0x00// In =0 bytes// <1.3>.???=>Clear Port Feature =>Port Connection //// <1.4>.Interrupt In (loop until "Port Change detect")//// <1.5>.OTGH_Hub_Detect_Device// <1.6>.OTGH_HID_Emulate_Device//// <2>.OTGH_Hub_Detect_Device// <2.1>.Get Status(Port)// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00// In =4 bytes// Ack// <2.2>.Clear Feature(Port)=>Connection// Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00// In =0 bytes// <2.3>.Set Feature (Port)=>Port Reset// Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00// In =0 bytes// <2.4>.Get Status(Port)=>To ckeck reset complete// Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00 // In =4 bytes// Ack// <2.5>.Clear Feature(Port)=>C_Port_Reset // Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00// <2.6>.Get Status (port) => To know the speed//// <3>.OTGH_Hub_Emulate_Device// /////////////////////////////////////////////////////////////////////////////////#include <stdlib.h>#include <stdarg.h>#include <stdio.h>#include <string.h>#include "chipset.h" #include "flib.h" #include "Lib_Host20.h" #include "Host20_AP.H"#include "Host20_AP_HID.H"#include "Host20_AP_Hub.H"#include "Host20_AP_Camera.H" Host20_Hub_Attach_Structure sHub;//====================================================================// * Function Name: OTGH_Hub_Main // * Description: // * Input: none// * OutPut: none//====================================================================void OTGH_Hub_Command_Build(Host20_Control_Command_Structure *pbCMD,UINT8 bmRequestType_Temp,UINT8 bRequest_Temp,UINT16 wValue_Temp,UINT16 wIndex_Temp,UINT16 wLength_Temp){ UINT8 i; UINT8 *pbTemp; pbTemp=pbCMD; for (i=0;i<8;i++) *pbTemp++=0x00; pbCMD->bmRequestType=bmRequestType_Temp; pbCMD->bRequest=bRequest_Temp; pbCMD->wValueLow=(UINT8)wValue_Temp; pbCMD->wValueHigh=(UINT8)(wValue_Temp>>8); pbCMD->wIndexLow=(UINT8)wIndex_Temp; pbCMD->wIndexHigh=(UINT8)(wIndex_Temp>>8); pbCMD->wLengthLow=(UINT8)wLength_Temp; pbCMD->wLengthHigh=(UINT8)(wLength_Temp>>8); }//====================================================================// * Function Name: OTGH_Hub_Int_Init // * Description: // * OutPut: //====================================================================void OTGH_Hub_Int_Init(void) { UINT32 i; UINT32 wSize; //<1>.Disable the Periodic flib_Host20_Periodic_Setting(HOST20_Disable); //<2>.Init qHD for Interrupt(7~9) psHost20_qHD_List_Interrupt[0]=Host20_STRUCTURE_qHD_BASE_ADDRESS+Host20_qHD_SIZE*5; wSize=sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeHighByte; wSize=((wSize<<8)+sAttachDevice.saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeLowByte); flib_Host20_Allocate_QHD(psHost20_qHD_List_Interrupt[0],HOST20_HD_Type_QH ,sAttachDevice.bAdd,0,1,wSize);//Address,Head=0,EndPt=1,Size psHost20_qHD_List_Interrupt[0]->bTerminate=1; psHost20_qHD_List_Interrupt[0]->bHighBandwidth=1; psHost20_qHD_List_Interrupt[0]->bEdSpeed=sAttachDevice.bSpeed; //<3>.Set Periodic Base Address mwHost20_PeriodicBaseAddr_Set(Host20_STRUCTURE_Preiodic_Frame_List_BASE_ADDRESS); //<4>.Update qHD (<1>.Fill S-Mask to 1 <2>.Max Size) psHost20_qHD_List_Interrupt[0]->bInterruptScheduleMask=1; //<5>.Disable all the Frame List (Terminal=1) & Link the qHD1 to Frame List for (i=0;i<Host20_Preiodic_Frame_List_MAX;i++) psHost20_FramList->sCell[i].bTerminal=1; for (i=0;i<Host20_Preiodic_Frame_List_MAX;i=i+0x100) {psHost20_FramList->sCell[i].bLinkPointer=(UINT32)(psHost20_qHD_List_Interrupt[0])>>5; psHost20_FramList->sCell[i].bType=HOST20_HD_Type_QH; psHost20_FramList->sCell[i].bTerminal=0; } //<6>.Enable the periodic flib_Host20_Periodic_Setting(HOST20_Enable);}//====================================================================// * Function Name: OTGH_Hub_Port_Change_Detect // * Description: // * Input: none// * OutPut: none//====================================================================UINT8 OTGH_Hub_Port_Change_Detect(void){ UINT8 *pbBuffer4K_1; Host20_BufferPointerArray_Structure aTemp; UINT8 bReturn; //<1>.Init Interrupt for Hub OTGH_Hub_Int_Init();//Init the qhd //<2>.Init Buffer pbBuffer4K_1=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER); aTemp.BufferPointerArray[0]=pbBuffer4K_1; aTemp.BufferPointerArray[1]=0; aTemp.BufferPointerArray[2]=0; aTemp.BufferPointerArray[3]=0; aTemp.BufferPointerArray[4]=0; //<3>.Issue Interrupt if (sAttachDevice.bConnectStatus>0) { printf(">>> Get the Port Change Event...\n"); flib_Host20_Issue_Interrupt(0,1,&(aTemp.BufferPointerArray[0])//bArrayListNum,hwSize,*pwBufferArray ,0,OTGH_Dir_IN);//wOffset,bDirection } bReturn=*pbBuffer4K_1; printf(">>> Port Change Event = 0x%x\n",bReturn); //<4>.free memory flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,pbBuffer4K_1); //<5>.Disable Periodic flib_Host20_Periodic_Setting(HOST20_Disable); return(bReturn);}//====================================================================// * Function Name: OTGH_Hub_GetStatus // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_GetStatus(UINT8 bPortNumber,UINT8 Mode,UINT8 *pbData){ Host20_Control_Command_Structure bCMD; OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_In|Mode) ,HOST20_HUB_Request_GetStatus,0x00,(bPortNumber+1),0x04); flib_Host20_Issue_Control_ByMode (1,&bCMD,0x04 //bEdNum,UINT8* pbCmd,hwDataSize ,pbData,0);//UINT8* pbData,UINT8 bModeSelect printf(">>> Port GetStatus:0x%x, 0x%x, 0x%x, 0x%x \n",pbData[0],pbData[1],pbData[2],pbData[3]);}//====================================================================// * Function Name: OTGH_Hub_ClearFeature // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_ClearFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector){ Host20_Control_Command_Structure bCMD; UINT8 bDumyBuffer[2]; OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode) ,HOST20_HUB_Request_ClearFeature,bFeatureSelector,(bPortNumber+1),0x00); flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00 //bEdNum,UINT8* pbCmd,hwDataSize ,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect printf(">>> Clear Feature Finish(0x%x) \n",bFeatureSelector);}//====================================================================// * Function Name: OTGH_Hub_SetFeature // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_SetFeature(UINT8 bPortNumber,UINT8 Mode,UINT8 bFeatureSelector){ Host20_Control_Command_Structure bCMD; UINT8 bDumyBuffer[2]; OTGH_Hub_Command_Build(&bCMD,(HOST20_HUB_RequestType_Out|Mode) ,HOST20_HUB_Request_SetFeature,bFeatureSelector,(bPortNumber+1),0x00); flib_Host20_Issue_Control_ByMode (1,&bCMD,0x00 //bEdNum,UINT8* pbCmd,hwDataSize ,bDumyBuffer,1);//UINT8* pbData,UINT8 bModeSelect printf(">>> Set Feature Finish(0x%x)... \n",bFeatureSelector);}//====================================================================// * Function Name: OTGH_Hub_Init_Device // * Description: // * Input: // * OutPut: //====================================================================void OTGH_Hub_Init_Device(UINT8 bPortNumber){ Host20_Hub_Port_Status_Structure bStatus; //<2.1>.Get Status(Port) // Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00 // In =4 bytes // Ack OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData if (bStatus.bSts_CurrentConnect==0) { printf("??? Connect Error..."); while(1); } //<2.2>.Clear Feature(Port)=>Connection // Setup=0xA3,0x01,0x10,0x00,0x0?,0x00,0x00,0x00 // In =0 bytes if (bStatus.bChg_Connect) { printf(">>> ClearFeature (port) =>Connection \n"); OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port ,HOST20_HUB_FEATURE_C_PORT_CONNECTION); } //<2.3>.Set Feature (Port)=>Port Reset // Setup=0xA3,0x03,0x04,0x00,0x0?,0x00,0x00,0x00 // In =0 bytes printf(">>> SetFeature (port) =>Port Reset \n"); OTGH_Hub_SetFeature(bPortNumber,HOST20_HUB_RequestType_About_Port ,HOST20_HUB_FEATURE_PORT_RESET); //<2.4>.Get Status(Port)=>To ckeck reset complete // Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00 // In =4 bytes // Ack //????????=>Delay time flib_Host20_TimerEnable(50); OTGH_Hub_GetStatus(bPortNumber,HOST20_HUB_RequestType_About_Port,&(bStatus));//bPortNumber,Mode, *pbData if (bStatus.bChg_ResetComplete) { printf(">>> Reset Complete...\n"); //<2.5>.Clear Feature(Port)=>C_Port_Reset // Setup=0xA3,0x00,0x00,0x00,0x0?,0x00,0x04,0x00 printf(">>> ClearFeature (port) =>Reset Complete \n"); OTGH_Hub_ClearFeature(bPortNumber,HOST20_HUB_RequestType_About_Port ,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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -