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

📄 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -