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

📄 host20_ap.c

📁 FIC8120方案的 StartCell_Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
///////////////////////////////////////////////////////////////////////////////
//
//	File name: OTGHost_AP.C
//	Version: 1.1
//	Date: 2005/01/31
//
//	Author: Bruce
//	Email: 
//	Phone: (03) 578-7888
//	Company: Faraday Tech. Corp.
//
//	**Description: 
//    The program support the Faraday USB path Test. 
//    1.Control/Bulk/Interrupt/ISO
//    2.Suspend/Resume/RemoteWakeup
//    3.Hot Plug/Cold Plug/Static Enumeration
///////////////////////////////////////////////////////////////////////////////
#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_Camera.H"

OTGH_PT_CONTROL_Struct  sOTGH_PT_Control;
OTGH_PT_INT_Struct      sOTGH_PT_INT;
OTGH_PT_ISO_Struct      sOTGH_PT_ISO;
OTGH_PT_BLK_Struct      *sOTGH_PT_BLK;

UINT8 HOST_AP_CONTROL_VENDOR_IN[]     = {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 
UINT8 HOST_AP_CONTROL_VENDOR_OUT[]    = {0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x01}; 
	


//************************************************************************************************************
//************************************************************************************************************
//                          *** Group-1:4 Transfers Test Function ***
//*************************************************************************************************************
//************************************************************************************************************
//====================================================================
// * Function Name: OTGH_Error_Handle
// * Description: 
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_Error_Handle(void)
{
  UINT8  Item;
  UINT32 u32Start,u32Length;
  UINT32 *pu32Data;
  do{ 
     printf("******** Error Handle **************\n");
     printf("1.Dump Memory \n");
     printf("2.Exit \n");
     printf("**********************\n");     
     printf(">>>Select:\n");
     scanf("%d",&Item); 
     
     switch(Item)
     {
     	case 1:
     	       //Dump memory
               printf(">>>Input Start Address:0x");
               scanf("%x",&u32Start);
               printf("\n"); 
               printf(">>>Input Length:0x");
               scanf("%x",&u32Length); 
               printf("\n"); 
     	       
     	       if (u32Length>0)
     	          {
     	          
     	          printf("********** Dump Memory ********************\n");
                  pu32Data=u32Start;
     	          do {//Print data
     	          	pu32Data=((UINT32)pu32Data) & 0xFFFFFFF0;
     	          	printf("0x%x ==> 0x%x, 0x%x, 0x%x, 0x%x \n"
     	          	       ,(UINT32) (pu32Data),*(pu32Data),*(pu32Data+1),*(pu32Data+2),*(pu32Data+3) );
     	          	
     	          	if (u32Length>=16)
     	          	   u32Length-=16;
     	          	
     	          	pu32Data+=4;
     	          	
     	          	}while(u32Length>=16);	
	           }
     	
     	
     	break;
     	
     	
     	
     	}
     
     
     printf("\n");        
  
  
  
  
  
     }while(Item!=2);




}
//====================================================================
// * Function Name: OTGH_PT_Bulk_SendCBW                          
// * Description: The sub function call of Bulk-CBW
//   <1>.Prepare the CBW data 
//   <2>.Issue the Bulk-Out command 
// * Input: 
//   <1>.UINT32 wLength
//   <2>.UINT16 hwStartAdd
//   <3>.UINT32 wTagNum
//   <4>.UINT8 bDataDir
// * OutPut: none
//====================================================================
void OTGH_PT_Bulk_SendCBW(UINT32 wLength, UINT16 hwStartAdd,  UINT32 wTagNum , UINT8 bDataDir)
{
	Host20_BufferPointerArray_Structure aTemp;
	
	//<1>.Prepare the CBW data 
	sOTGH_PT_BLK->sCBW.u32Signature = OTGH_PT_CBW_SIGNATE;
	sOTGH_PT_BLK->sCBW.u32DataTransferLength=wLength;
	sOTGH_PT_BLK->sCBW.u32Tag=wTagNum;
	
	sOTGH_PT_BLK->sCBW.u8CB[0]=(UINT8)hwStartAdd;
	sOTGH_PT_BLK->sCBW.u8CB[1]=(UINT8)(hwStartAdd>>8);
	
	if (bDataDir==0)
	   sOTGH_PT_BLK->sCBW.u8Flags = 0x00 ;  //0 => Out
	else 
	   sOTGH_PT_BLK->sCBW.u8Flags = 0x80;  //john 0x01 ;  //0 => In
	
	aTemp.BufferPointerArray[0]=(UINT32)(&(sOTGH_PT_BLK->sCBW.u32Signature));
	aTemp.BufferPointerArray[1]=0;	
	aTemp.BufferPointerArray[2]=0;	
	aTemp.BufferPointerArray[3]=0;
	aTemp.BufferPointerArray[4]=0;		
	//<2>.Issue the Bulk-Out command
	flib_Host20_Issue_Bulk (sOTGH_PT_BLK->bOutQHDArrayNum,31,(&aTemp.BufferPointerArray[0]),0,OTGH_Dir_Out);
}

//====================================================================
// * Function Name: OTGH_PT_Bulk_SendCSW                          
// * Description: The sub function call of Bulk-CSW
//   <1>.Issue the Bulk-IN Command
//   <2>.Check the data-Tag
//   <3>.Check the data-Signature
//   <4>.Checking Status OTGH_PT_CSW_PASS
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Bulk_ReceiveCSW(void)
{
   UINT32 wCBWTag,wCSWTag;
   Host20_BufferPointerArray_Structure aTemp;

   //<1>.Issue the Bulk-IN Command
   aTemp.BufferPointerArray[0]=(UINT32)(&(sOTGH_PT_BLK->sCSW.u32Signature));
   aTemp.BufferPointerArray[1]=0;
   aTemp.BufferPointerArray[2]=0;
   aTemp.BufferPointerArray[3]=0;
   aTemp.BufferPointerArray[4]=0;
   flib_Host20_Issue_Bulk (sOTGH_PT_BLK->bInQHDArrayNum,13,&(aTemp.BufferPointerArray[0]),0,OTGH_Dir_IN);	
	
	//<2>.Check the data-Tag
    wCBWTag=(UINT32)(sOTGH_PT_BLK->sCBW.u32Tag);
    wCSWTag=(UINT32)(sOTGH_PT_BLK->sCSW.u32Tag);
    if (wCBWTag!=wCSWTag) {
	   printf(">>> Error: Received CSW->Tag fail (Expected data:0x%x / Received Data:0x%x)\n",(UINT32)(wCBWTag),(UINT32)(wCSWTag));
	   OTGH_Error_Handle();
	}

	//<3>.Check the data-Signature
	if ((sOTGH_PT_BLK->sCSW.u32Signature)!=OTGH_PT_CSW_SIGNATE)	{
	   printf(">>> Error: Received CSW->Signature fail (Expected data:%d / Received Data:%d)\n",OTGH_PT_CSW_SIGNATE,(UINT32)(sOTGH_PT_BLK->sCSW.u32Tag));
	   OTGH_Error_Handle();	
	}
	      
	//<4>.Checking Status OTGH_PT_CSW_PASS
	if ((sOTGH_PT_BLK->sCSW.u8Status)!=OTGH_PT_CSW_PASS) {
	   printf(">>> Error: Received CSW->Status fail (Expected data:%d / Received Data:%d)\n",OTGH_PT_CSW_PASS,sOTGH_PT_BLK->sCSW.u8Status);
	   OTGH_Error_Handle();	
	}	
}

//====================================================================
// * Function Name: OTGH_PT_Control_Command                          
// * Description: 
//   <1>.Get_Configuration 
//   <2>.Get_Interface
//   <3>.Set_Interface
//   <4>.Get_Status
//   <5>.Set_Feature
//   <6>.Get_Status-2
//   <7>.Clear_Feature
//   <8>.Get_Status-2
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Control_Command(void)
{
 Host20_Control_Command_Structure bCMD;	
 UINT8 bTemp;
 UINT16 hwTemp; 
 UINT32 wInputCounter,wCounter;
 
 if (OTGH_PT_ADVANCE_TEST==0)
    {   
    wInputCounter=10;	
   	
    }else
    {	 
 	printf(">>> Please Input Control Command counter:");  
    scanf("%d",&wInputCounter);   
    printf("\n");
    }
 
 
 
 
 wCounter=0;
 do{
   wCounter++;
     printf("******************* Test Control Command Counter = %d ***************************\n",wCounter);
   //<1>.Get_Configuration 
         flib_Host20_Control_Command_Request(&bCMD,0x80,HOST20_CONTROL_GetConfiguration,0,0,1);
         flib_Host20_Issue_Control(1,&bCMD,0x01,&(bTemp));
         if (bTemp==1)
               printf(">>> Get_Configuration(%d) Test                ==> PASS  \n",bTemp);
         else  printf(">>> Get_Configuration(%d) Test                ==> Fail  \n",bTemp);
         
   //<2>.Get_Interface	
         flib_Host20_Control_Command_Request(&bCMD,0x81,HOST20_CONTROL_GetInterface,0,0,1);//1=>Interface
         flib_Host20_Issue_Control(1,&bCMD,0x01,&(bTemp));//Size=1 byte
         if (bTemp==0)
               printf(">>> Get_Interface(%d) Test                    ==> PASS  \n",bTemp);
         else  printf(">>> Get_Interface(%d) Test                    ==> Fail  \n",bTemp);         

   //<3>.Set_Interface	
         flib_Host20_Control_Command_Request(&bCMD,0x01,HOST20_CONTROL_SetInterface,0,0,0);
         flib_Host20_Issue_Control(1,&bCMD,0x00,&(bTemp));//Size=0 byte
         printf(">>> Set_Interface to 0 Finish                       ==> PASS \n");	


   //<2>.Get_Interface again
         flib_Host20_Control_Command_Request(&bCMD,0x81,HOST20_CONTROL_GetInterface,0,0,1);//1=>Interface
         flib_Host20_Issue_Control(1,&bCMD,0x01,&(bTemp));//Size=1 byte
         if (bTemp==0)
               printf(">>> Get_Interface(%d) Test                    ==> PASS  \n",bTemp);
         else  printf(">>> Get_Interface(%d) Test                    ==> Fail  \n",bTemp);
	
   //<4>.Get_Status	
         //<4.1>.Get Power/RemoteWakeUp status
         flib_Host20_Control_Command_Request(&bCMD,0x80,HOST20_CONTROL_GetStatus,0,0,2);
                 //Bit0=0 => Power From VBUS
                 //Bit0=1 => Power From Device
                 //Bit1=0 => RemoteWakeUp Disable
                 //Bit1=1 => RemoteWakeUp Enable
         flib_Host20_Issue_Control(1,&bCMD,0x02,&(hwTemp));
         if (hwTemp==1)
            {  printf(">>> Get_Status(%d)(Power/RemoteWakeUp) Test   ==> PASS  \n",hwTemp);
               printf("    (Bit0=1 => Power From Device)\n");
               printf("    (Bit1=0 => RemoteWakeUp Disable)\n");
            
            }
         else  printf(">>> Get_Status(%d) (Power/RemoteWakeUp) Test  ==> Fail  \n",hwTemp);         
         
         
         //<4.2>.Get Endpoint status
         flib_Host20_Control_Command_Request(&bCMD,0x82,HOST20_CONTROL_GetStatus,0,0,2);
                 //Bit0=0 => Not Halt
                 //Bit0=1 => Halt
         flib_Host20_Issue_Control(1,&bCMD,0x02,&(hwTemp));
         if (hwTemp==0)
            {  printf(">>> Get_Status(%d) (Endpoint status) Test     ==> PASS  \n",hwTemp);
               printf("    (Bit0=0 => Not Halt)\n");
            }
         else  printf(">>> Get_Status(%d) (Endpoint status) Test     ==> Fail  \n",hwTemp);         


   //<5>.Set_Feature
         flib_Host20_Control_Command_Request(&bCMD,0x00,HOST20_CONTROL_SetFeature,1,0,0);
         flib_Host20_Issue_Control(1,&bCMD,0x00,&(bTemp));
               printf(">>> Set_Feature to 'RemoteWakeUp Enable'      ==> PASS \n");	

   //<6>.Get status 'Power/RemoteWakeUp'
         flib_Host20_Control_Command_Request(&bCMD,0x80,HOST20_CONTROL_GetStatus,0,0,2);
                 //Bit1=0 => RemoteWakeUp Disable
                 //Bit1=1 => RemoteWakeUp Enable
         flib_Host20_Issue_Control(1,&bCMD,0x02,&(hwTemp));
         if (hwTemp==3)
            {  printf(">>> Get_Status (%d)(Power/RemoteWakeUp) Test  ==> PASS \n",hwTemp);
               printf("    (Bit0=1 => Power From Device)\n");
               printf("    (Bit1=0 => RemoteWakeUp Disable)\n");
           }
         else  printf(">>> Get_Status (%d)(Power/RemoteWakeUp) Test  ==> Fail \n",hwTemp);         
 


   //<7>.Clear_Feature
         flib_Host20_Control_Command_Request(&bCMD,0x00,HOST20_CONTROL_ClearFeature,1,0,0);
         flib_Host20_Issue_Control(1,&bCMD,0x00,&(bTemp));
               printf(">>> Clear_Feature to 'RemoteWakeUp Disable'   ==> PASS\n");	

   //<8>.Get status 'Power/RemoteWakeUp'
         flib_Host20_Control_Command_Request(&bCMD,0x80,HOST20_CONTROL_GetStatus,0,0,2);
                 //Bit1=0 => RemoteWakeUp Disable
                 //Bit1=1 => RemoteWakeUp Enable
         flib_Host20_Issue_Control(1,&bCMD,0x02,&(hwTemp));
         if (hwTemp==1)
               printf(">>> Get_Status(%d) (Power/RemoteWakeUp) Test  ==> PASS  \n",hwTemp);
         else  printf(">>> Get_Status(%d)(Power/RemoteWakeUp) Test   ==> Fail  \n",hwTemp);         
  
  
  
  }while(wCounter<wInputCounter);
	
	
	
}
//====================================================================
// * Function Name: OTGH_PT_Control_Path_Init                          
// * Description: Control Path Test Init
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Control_Path_Init(void)
{
 
  sOTGH_PT_Control.wMaxSize = 4*1024*5;
 
  sOTGH_PT_Control.pbDataPage[0]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
  sOTGH_PT_Control.pbDataPage[1]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
  sOTGH_PT_Control.pbDataPage[2]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
  sOTGH_PT_Control.pbDataPage[3]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
  sOTGH_PT_Control.pbDataPage[4]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);

}

//====================================================================
// * Function Name: OTGH_PT_Control_Path_Close                          
// * Description: Close the Control Path Test
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Control_Path_Close(void)
{
  //Release data buffer
        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_Control.pbDataPage[0]);
        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_Control.pbDataPage[1]);
        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_Control.pbDataPage[2]);
        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_Control.pbDataPage[3]);
        flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_Control.pbDataPage[4]);	
}
//====================================================================
// * Function Name: OTGH_PT_Control_Path                          
// * Description: The Bulk path test function call
//   <1>.Decide => In/Out
//   <2>.Issue the Control (Data-In)
//   <3>.If Control (Data-In) then Compare Data
//   <4>.Issue the Control (Data-Out)
//   <5>.Goto Step1
//   PS:1.Data range:0~255
//      2.Max Data Size => Depend on init (4096/20K)
//      3.Size = increment (1~4096)
//
// * Input: none

⌨️ 快捷键说明

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