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

📄 host20_ap.c

📁 FIC8120方案的 StartCell_Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
// * OutPut: none
//====================================================================
void OTGH_PT_Control_Path(void)
{

  UINT32 wRandomSize,wOffset,wCounter,wRandomSizeMax,wInputCounter,i,wOffsetMax,wDecrementInterval;
  UINT8 bCMD[8];	
  UINT8 *pbTemp;
  UINT8 bTemp;
  UINT32 wTotalSize_Byte,wPrintCounter;
  UINT32 wTotalSize_MB;
  
 do{ 

    if (OTGH_PT_ADVANCE_TEST==0)
       {   
        printf(">>> Free Run 10000000 times:\n");
        wInputCounter=10000000;
        wPrintCounter=1;  
       }
    else
       {
	   printf(">>> Please Input Control Path  counter:");  
       scanf("%d",&wInputCounter);   
       printf("\n");
       
	   printf(">>> Please Input the 'Print Message'  counter:");  
       scanf("%d",&wPrintCounter);         
       printf("\n");       
       
       }//if (AP_Auto_Test==1)
    
    OTGH_PT_Control_Path_Init();
    wOffsetMax=100;//Large than Max Control Packet Size = 64
    wRandomSizeMax=20*1024-200;//Large than wOffsetMax
    wDecrementInterval=101;
    
    
    wRandomSize=wRandomSizeMax;
    wOffset=0;//(0~100)
    wCounter=0;
    wTotalSize_Byte=0;
    wTotalSize_MB=0;
    
  while(wCounter<=wInputCounter)
    {	

	
  //<1>.Control-Setup/Out/In
        pbTemp=(sOTGH_PT_Control.pbDataPage[0]+wOffset);
        for (i=0;i<(wRandomSize);i++)
             *(pbTemp+i)=sOTGH_PT_Control.bDataCounter_OUT++;
 
	
	//<1.2>.Issue command   
            memcpy(bCMD,HOST_AP_CONTROL_VENDOR_OUT,8);
            bCMD[6]=(UINT8)wRandomSize;      //Byte6 = Low byte
            bCMD[7]=(UINT8)(wRandomSize>>8); //Byte7 = High byte
            flib_Host20_Issue_Control_Turbo (1,bCMD,wRandomSize,&(sOTGH_PT_Control.pbDataPage[0]),wOffset);
	
	
	
	
	        wOffset++;
  //<2>.Control-Setup/In/Out	
	//<2.1>.Issue command   
            memcpy(bCMD,HOST_AP_CONTROL_VENDOR_IN,8);
            bCMD[6]=(UINT8)wRandomSize;      //Byte6 = Low byte
            bCMD[7]=(UINT8)(wRandomSize>>8); //Byte7 = High byte
            flib_Host20_Issue_Control_Turbo (1,bCMD,wRandomSize,&(sOTGH_PT_Control.pbDataPage[0]),wOffset);
        
   	//<2.2>.Compare data
        pbTemp=(sOTGH_PT_Control.pbDataPage[0]+wOffset);
        for (i=0;i<(wRandomSize);i++)
             if (*(pbTemp+i)!=sOTGH_PT_Control.bDataCounter_IN++)
   	            {printf("??? Control Path Test Error...(Expect:%d  Actual:%d)\n",sOTGH_PT_Control.bDataCounter_IN-1,*(pbTemp+i));
   	             printf("??? In data address = 0x%x\n",(UINT32)(pbTemp+i));
   	             printf("??? i=%d   \n",i);   	             
   	            OTGH_Error_Handle();
   	             }


  //<3>.Change Variable Size/wOffset
        wCounter++;

        wTotalSize_Byte+=wRandomSize*2+16;
        if (wTotalSize_Byte>1000000)
           {wTotalSize_MB++;
            wTotalSize_Byte=wTotalSize_Byte-1000000;
           }
 
 
   	  if ((wCounter%wPrintCounter)==0)     
       printf(">>> Control Setup-In/Setup-Out Data Compare PASS(Counter=%d)(Size=%d)(wOffset=%d)(TotalSize=%dMB + %dBytes)...\n",wCounter,wRandomSize,wOffset,wTotalSize_MB,wTotalSize_Byte);	
         
        if (wRandomSize > wDecrementInterval)
              wRandomSize= wRandomSize-wDecrementInterval; 
        else  wRandomSize=wRandomSizeMax;

        if (wOffset<wOffsetMax)
            wOffset++;
        else wOffset=0;   


   }// while(wCounter<wInputCounter)
	

       printf(">>> Finish Control Path Test PASS (%d)...\n",wCounter);	

	
	OTGH_PT_Control_Path_Close();
	
	   printf(">>> Again(1/2->y/n):");  
       scanf("%d",&bTemp);    	
	   printf("\n");
	   
  }while(bTemp==1);		
	
}


//====================================================================
// * Function Name: OTGH_PT_Bulk_Close                          
// * Description: Close the Bulk Path Test
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Bulk_Close(void)
{
 UINT8 i;	

	flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,(UINT32 *)sOTGH_PT_BLK);

  //Release Memory	sOTGH_PT_BLK->pbDataPage_Out
    for (i=0;i<5;i++)
	flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_BLK->pbDataPage_Out[i]);

  //Release Memory	sOTGH_PT_BLK->pbDataPage_In
    for (i=0;i<5;i++)
	flib_Host20_ReleaseStructure(Host20_MEM_TYPE_4K_BUFFER,sOTGH_PT_BLK->pbDataPage_In[i]);	

   //<5>.Hang the qHD
       if (psDevice_AP->saCD[0].sInterface[0].sED[0].bED_bmAttributes==OTGH_ED_BULK)    
          {//<5.1>.stop Asynchronous Schedule
            flib_Host20_Asynchronous_Setting(HOST20_Disable);
           if (psHost20_qHD_List_Bulk[0]->bMaxPacketSize> 128)
               {//Support only 2 QHD
                  mwHost20_CurrentAsynchronousAddr_Set(Host20_STRUCTURE_qHD_BASE_ADDRESS);
              }
           else           
           {
           //<5.2>.Hang the qHD for ED0~ED3
            psHost20_qHD_List_Control[1]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Control[0])>>5);
            }
            
           //<5.2>.Enable Asynchronous Schedule
            flib_Host20_Asynchronous_Setting(HOST20_Enable);
           }      
	
}
//====================================================================
// * Function Name: OTGH_PT_Bulk_Init                          
// * Description: Bulk Test Init
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Bulk_Init(void)
{

 UINT32 i,j,wMaxPacketSize;

 UINT8 *wTemp;

         wMaxPacketSize=psDevice_AP->saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeHighByte;
         wMaxPacketSize=(wMaxPacketSize<<8)+(psDevice_AP->saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeLowByte);


      
   //<5>.Hang the qHD
       if (psDevice_AP->saCD[0].sInterface[0].sED[0].bED_bmAttributes==OTGH_ED_BULK)    
          {//<5.1>.stop Asynchronous Schedule
             flib_Host20_Asynchronous_Setting(HOST20_Disable);
           if (wMaxPacketSize>128)
               {//Support only 2 QHD
                  psHost20_qHD_List_Bulk[0]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Bulk[1])>>5);
                  psHost20_qHD_List_Bulk[1]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Bulk[0])>>5);
                  mwHost20_CurrentAsynchronousAddr_Set(((UINT32)psHost20_qHD_List_Bulk[0]));


              }
           else{
               	//<5.2>.Hang the qHD for ED0~ED3
                  psHost20_qHD_List_Control[1]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Bulk[0])>>5);
                  psHost20_qHD_List_Bulk[0]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Bulk[1])>>5);
                  psHost20_qHD_List_Bulk[1]->bNextQHDPointer=(((UINT32)psHost20_qHD_List_Control[0])>>5);
                }    
               
               
           //<5.2>.Enable Asynchronous Schedule
           flib_Host20_Asynchronous_Setting(HOST20_Enable);
           
           }      
      
      
      
      
       //Setting Max Packet Size and print message
         wMaxPacketSize=psDevice_AP->saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeHighByte;
         wMaxPacketSize=(wMaxPacketSize<<8)+(psDevice_AP->saCD[0].sInterface[0].sED[0].bED_wMaxPacketSizeLowByte);
         psHost20_qHD_List_Bulk[0]->bMaxPacketSize=wMaxPacketSize;  
         psHost20_qHD_List_Bulk[1]->bMaxPacketSize=wMaxPacketSize; //Suppose In/Out have the same Max packet Size        
         psHost20_qHD_List_Bulk[0]->bDeviceAddress=psDevice_AP->bAdd;
         psHost20_qHD_List_Bulk[1]->bDeviceAddress=psDevice_AP->bAdd;
      
         
         printf(">>> Bulk In/Out Max Packet Size = %d\n",wMaxPacketSize);
 
        //For Bulk Structure
         sOTGH_PT_BLK=( OTGH_PT_BLK_Struct *)flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);//2=>4kBuffer;
         sOTGH_PT_BLK->wDataRange=4*1024*5; //4K*5  
         
         //For Bulk-Out = 20K bytes          
	     sOTGH_PT_BLK->pbDataPage_Out[0]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
	     sOTGH_PT_BLK->pbDataPage_Out[1]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
	     sOTGH_PT_BLK->pbDataPage_Out[2]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
	     sOTGH_PT_BLK->pbDataPage_Out[3]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
	     sOTGH_PT_BLK->pbDataPage_Out[4]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
         
         wTemp=sOTGH_PT_BLK->pbDataPage_Out[0];
         j=0;
         for (i=0;i<(sOTGH_PT_BLK->wDataRange);i++)
             {
              *(wTemp+i)=j++;
              if ((j%233)==0)//Random Number alignment
                 {
                 j=0;//Change Random number	
                 }
                          
             }

         //For Bulk-In  = 20K bytes
         sOTGH_PT_BLK->pbDataPage_In[0]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);
         sOTGH_PT_BLK->pbDataPage_In[1]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);         
         sOTGH_PT_BLK->pbDataPage_In[2]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);         
         sOTGH_PT_BLK->pbDataPage_In[3]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);         
         sOTGH_PT_BLK->pbDataPage_In[4]=flib_Host20_GetStructure(Host20_MEM_TYPE_4K_BUFFER);         

         wTemp=sOTGH_PT_BLK->pbDataPage_In[0];
         for (i=0;i<(sOTGH_PT_BLK->wDataRange);i++)
              *(wTemp+i)=0x88;         

	if (((psDevice_AP->saCD[0].sInterface[0].sED[0].bED_EndpointAddress)&BIT7)>0)
       { sOTGH_PT_BLK->bInQHDArrayNum=0;//Array 0
         sOTGH_PT_BLK->bOutQHDArrayNum=1;//Array 0
       }
    else{
         sOTGH_PT_BLK->bInQHDArrayNum=1;//Array 0
         sOTGH_PT_BLK->bOutQHDArrayNum=0;//Array 0
    }


  if (psDevice_AP->bDeviceOnHub==1)
    if (psDevice_AP->bSpeed!=HOST20_Attach_Device_Speed_High)
      {//Init For Device on Hub
       for (i=0;i<2;i++)
            {psHost20_qHD_List_Bulk[i]->bHubAddr=sAttachDevice.bAdd;
             psHost20_qHD_List_Bulk[i]->bPortNumber=psDevice_AP->bOnHubPortNumber+1;
             psHost20_qHD_List_Bulk[i]->bSplitTransactionMask=0xF8;//??
             psHost20_qHD_List_Bulk[i]->bInterruptScheduleMask=0x01;//??
             psHost20_qHD_List_Bulk[i]->bEdSpeed=psDevice_AP->bSpeed;
             psHost20_qHD_List_Bulk[i]->bControlEdFlag=0;//For Bulk      	
      	    }
      }


}

//====================================================================
// * Function Name: OTGH_PT_Bulk                          
// * Description: 
//   <1>.Increment Size Test
//   <2>.Increment Start Address Test
//   <3>.Random Pattern test
//
//   The Bulk path test function call
//   <1>.Issue the Loop1-CBW
//   <2>.Issue the Loop1-OutData
//   <3>.Issue the Loop1-CSW
//   <4>.Issue the Loop2-CBW
//   <5>.Issue the Loop2-InData & Compare
//   <6>.Issue the Loop2-CSW
//   <7>.Compare data 
// * Input: none
// * OutPut: none
//====================================================================
void OTGH_PT_Bulk(void)
{
   UINT32 wTag,i;
   UINT32  wInputCounter,wCounter,wOffset,wRandomSize,wRandomSizeMax,wOffsetMax,wSizeInterval,wDumyControlInterval;
   UINT8  bTemp; 
   UINT8 *pbData;
   UINT8 bCMD[8];
   UINT32 wTotalSize_Byte,wPrintCounter;
   UINT32 wTotalSize_MB;  
   UINT8 *pbData2;
  
   pbData=malloc(250);
  
   do { 
	  printf(">>> Please Input the Bulk-In/Out  counter:");  
      scanf("%d",&wInputCounter);         
      printf("\n");
	  printf(">>> Please Input the 'Print Message'  counter:");  
      scanf("%d",&wPrintCounter);         
      printf("\n");       

      OTGH_PT_Bulk_Init(); 

      //Cofiguration Setting
      wOffset=0; //From 0 to 100 bytes
      wOffsetMax=550;//Large than Max PacketSize 512
      wRandomSizeMax=20*1024-600;  //16*1024; //john  //20*1024-600;//600 large than wOffsetMax  
      wSizeInterval=101;
      wDumyControlInterval=8;

      //Init Value
      wCounter=0;   
      wTag=0x88888888;   
      wRandomSize=wRandomSizeMax;
      wTotalSize_Byte=0;
      wTotalSize_MB=0;
   
      while(wCounter<wInputCounter)
	  {
         pbData2=sOTGH_PT_BLK->pbDataPage_In[0]+wOffset;
         for (i=0;i<wRandomSize;i++)
            *(pbData2+i)=0x88;          
         
         //<1>.Issue the Loop1-CBW
         OTGH_PT_Bulk_SendCBW(wRandomSize, wOffset, wTag++,OTGH_Dir_Out);
     
         //<2>.Issue the Loop1-OutData
	     flib_Host20_Issue_Bulk (sOTGH_PT_BLK->bOutQHDArrayNum,wRandomSize,&(sOTGH_PT_BLK->pbDataPage_Out[0]),wOffset,OTGH_Dir_Out);

         //<3>.Issue the Loop1-CSW
         OTGH_PT_Bulk_ReceiveCSW();

         //Here should be insert the dumy control transfer 
         if ((psHost20_qHD_List_Bulk[0]->bMaxPacketSize)<=128)
            if (wCounter%wDumyControlInterval==0)  
			{
         	   memcpy(bCMD,OTGH_GETDESCRIPTOR_DEVICE,8);
               flib_Host20_Issue_Control (1,bCMD,0x12,pbData);    
			}


         //<4>.Issue the Loop2-CBW
         OTGH_PT_Bulk_SendCBW(wRandomSize, wOffset, wTag++,OTGH_Dir_IN);     
     
         //<5>.Issue the Loop2-InData & Compare
	     flib_Host20_Issue_Bulk (sOTGH_PT_BLK->bInQHDArrayNum, wRandomSize,&(sOTGH_PT_BLK->pbDataPage_In[0]),wOffset,OTGH_Dir_IN);

         //<6>.Issue the Loop2-CSW
         OTGH_PT_Bulk_ReceiveCSW();

         //Here should be insert the dumy control transfer 
         if ((psHost20_qHD_List_Bulk[0]->bMaxPacketSize)<=128)
            if (wCounter%wDumyControlInterval==0)  
			{
       	       memcpy(bCMD,OTGH_GETDESCRIPTOR_DEVICE,8);
               flib_Host20_Issue_Control (1,bCMD,0x12,pbData);    
			}

            //<7>.Compare data 
            for (i=0;i<wRandomSize;i++)

⌨️ 快捷键说明

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