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

📄 host20_ap_hub.c

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