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

📄 lib_host20.c

📁 FIC8120方案的 StartCell_Driver
💻 C
📖 第 1 页 / 共 5 页
字号:
   qTD_Structure *spTempqTD;
   UINT8        *bpDataPage;
   UINT8        bReturnValue;
  
   //<0>.Allocate qTD & Data Buffer
   spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD
   bpDataPage=sAttachDevice.bDataBuffer;
  
   //<2.1>.Setup packet
   //<A>.Fill qTD
   spTempqTD->bPID=HOST20_qTD_PID_SETUP;                   //Bit8~9   
   spTempqTD->bTotalBytes=8;           //Bit16~30   
   spTempqTD->bDataToggle=0;            //Bit31 
   spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 
   memcpy(bpDataPage,pbCmd,8);

   //<B>.Send qTD
   bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
   if (bReturnValue>0)
      return (bReturnValue);
             
   switch (bModeSelect) { // by Standard Request codes
      // <2>.Case-1:"Setup/In/Out' Format..."
   	  case 0:		// get status
         //<2.2>.In packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
         spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
         spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 
         spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);

         //<C>.Waiting for result
         memcpy(pbData,bpDataPage,hwDataSize);

         //<2.3>.Out packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
         spTempqTD->bPID=HOST20_qTD_PID_OUT;                   //Bit8~9   
         spTempqTD->bTotalBytes=0;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
         break;
     
      //<3>.Case-2:'Setup/In' Format...      => Faraday Driver will not need 
	  case 1:		// clear feature
         //<3.2>.In packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
         spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
         spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 
         spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 

		 //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
                
         //<C>.Copy Result
         memcpy(pbData,bpDataPage,hwDataSize);
         break;

      //<4>.Case-3:'Setup/Out/In'
      case 2:		// set descriptor
         //<4.2>.Out packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD 
         spTempqTD->bPID=HOST20_qTD_PID_OUT;                   //Bit8~9   
         spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 
         spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 
         memcpy(bpDataPage,pbData,hwDataSize);

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
                                     
         //<4.3>.In packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD 
         spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
         spTempqTD->bTotalBytes=0;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
         break;
      default:
	     break;
   }
   return (0);
}

//====================================================================
 //For Control-Single qTD// * Function Name: flib_Host20_Issue_Control                          
// * Description: 
//   <1>.Analysis the Controller Command => 3 type
//   <2>.Case-1:"Setup/In/Out' Format..."
//       (get status/get descriptor/get configuration/get interface)
//   <3>.Case-2:'Setup/In' Format...      => Faraday Driver will not need 
//       (clear feature/set feature/set address/set Configuration/set interface  ) 
//   <4>.Case-3:'Setup/Out/In'
//       (set descriptor)
// * Input: 
// * OutPut: 0: OK
//           X:>0 => Fail
//====================================================================
UINT8 flib_Host20_Issue_Control (UINT8 bEdNum,UINT8* pbCmd,UINT16 hwDataSize,UINT8* pbData)
{
   qTD_Structure *spTempqTD;
   UINT8        *bpDataPage;
   UINT8        bReturnValue;
  
   //<0>.Allocate qTD & Data Buffer
   spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD
   bpDataPage=sAttachDevice.bDataBuffer;
  
   //<2.1>.Setup packet
   //<A>.Fill qTD
   spTempqTD->bPID=HOST20_qTD_PID_SETUP;                   //Bit8~9   
   spTempqTD->bTotalBytes=8;           //Bit16~30   
   spTempqTD->bDataToggle=0;            //Bit31 
   spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 
   memcpy(bpDataPage,pbCmd,8);

   //<B>.Send qTD
   bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
   if (bReturnValue>0)
      return (bReturnValue);

   //<1>.Analysis the Controller Command
   switch (*(pbCmd+1)) { // by Standard Request codes
      // <2>.Case-1:"Setup/In/Out' Format..."
   	  case 0:		// get status
	  case 6:		// get descriptor
	  case 8:		// get configuration
	  case 10:	// get interface
         //<2.2>.In packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
         spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
         spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 
         spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
 
		 //<C>.Waiting for result
         memcpy(pbData,bpDataPage,hwDataSize);

         //<2.3>.Out packet
         //<A>.Fill qTD
         spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
         spTempqTD->bPID=HOST20_qTD_PID_OUT;                   //Bit8~9   
         spTempqTD->bTotalBytes=0;           //Bit16~30   
         spTempqTD->bDataToggle=1;            //Bit31 

         //<B>.Send qTD
         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
         if (bReturnValue>0)
            return (bReturnValue);
         break;
     
      //<3>.Case-2:'Setup/In' Format...      => Faraday Driver will not need 
         case 1:		// clear feature
		 case 3:		// set feature
   		 case 5:		// set address
   		 case 9:		// set Configuration   		
      	 case 11:	// set interface   		
            //<3.2>.In packet
            //<A>.Fill qTD
            spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD              
            spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
            spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
            spTempqTD->bDataToggle=1;            //Bit31 
            spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 

            //<B>.Send qTD
            bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
            if (bReturnValue>0)
               return (bReturnValue);
                
            //<C>.Copy Result
            memcpy(pbData,bpDataPage,hwDataSize);
            break;

      //<4>.Case-3:'Setup/Out/In'
         case 7:		// set descriptor
            //<4.2>.Out packet
            //<A>.Fill qTD
            spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD 
            spTempqTD->bPID=HOST20_qTD_PID_OUT;                   //Bit8~9   
            spTempqTD->bTotalBytes=hwDataSize;           //Bit16~30   
            spTempqTD->bDataToggle=1;            //Bit31 
            spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 
            memcpy(bpDataPage,pbData,hwDataSize);

			//<B>.Send qTD
            bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
            if (bReturnValue>0)
               return (bReturnValue);
                         
            //<4.3>.In packet
            //<A>.Fill qTD
            spTempqTD=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD 
            spTempqTD->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
            spTempqTD->bTotalBytes=0;           //Bit16~30   
            spTempqTD->bDataToggle=1;            //Bit31 

            //<B>.Send qTD
            bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
            if (bReturnValue>0)
               return (bReturnValue);
            break;

		 default:
			break;
   	}
    return (0);
}

//====================================================================
// * Function Name: flib_Host20_Issue_Control_Turbo with 3-qTD                         
// * Description: 
//   <1>.Analysis the Controller Command => 3 type
//   <2>.Case-1:"Setup/In/Out' Format..."
//       (get status/get descriptor/get configuration/get interface)
//   <3>.Case-2:'Setup/In' Format...      => Faraday Driver will not need 
//       (clear feature/set feature/set address/set Configuration/set interface  ) 
//   <4>.Case-3:'Setup/Out/In'
//       (set descriptor)
//   PS:1.Support 4*5k=20K Max
//      2.Data page buffer from array pointer
//
//
// * Input: 
// * OutPut: 0: OK
//           X:>0 => Fail
//====================================================================
UINT8 flib_Host20_Issue_Control_Turbo (UINT8 bEdNum,UINT8* pbCmd,UINT32 wDataSize,UINT32 *pwPageAddress,UINT32 wCurrentOffset)
{
//john what's turbo ?
   //UINT32 *pwTemp;
   UINT8 bReturnValue;
   qTD_Structure *spTempqTD;
   qTD_Structure *spTempqTD2;
   qTD_Structure *spTempqTD3;
   UINT8        *bpDataPage;
   UINT8        *bpDataPage3;
   UINT8        bCommandType;
   UINT8         bSetupMode;     //0=>Error (Not support)
                                 //1=>For 'Setup/In/Out' Format...'
                                 //2=>For 'Setup/In' Format... 
                                 //3=>For 'Setup/Out/In'
 
   //<1>.Analysis the type of the control
   bSetupMode=0;
   bCommandType=*pbCmd&0x60;
   bCommandType=bCommandType>>5;
  
   switch (bCommandType) {
      case 0:	//Standard command
		 switch (*(pbCmd+1)) { // by Standard Request codes 
            //<2.1>.Case-1:"Setup/In/Out' Format..."
   		    case 0:		// get status
		    case 6:		// get descriptor
		    case 8:		// get configuration
		    case 10:	// get interface 
		       bSetupMode=1;
		       break;
		         
 		    case 1:		// clear feature            		         
  		    case 3:		// set feature              		         
      		case 5:		// set address              		         
      		case 9:		// set Configuration   				         
         	case 11:	// set interface   		    		         
		       bSetupMode=2;
		       break;   		         
                 
            case 7:		// set descriptor
               bSetupMode=3;
	           break;   		           
		 }
		 break;         
      case 1:	//Class Request         	
         if (*(pbCmd+1)==0x0A) //For HID-Set Idle Command
         	bSetupMode=2;
         break;         	
      case 2://Vendor request	          	
         if ((*pbCmd&0x80)>0)
            bSetupMode=1;//For Vendor command => In
         else
            bSetupMode=3;    //For Vendor command => Out          	
         break;  	
   }

   if (bSetupMode==0) {
      printf("??? Control Input Error...");
      while(1);	
   }
  
   //<2>.Allocate qTD
   spTempqTD =flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD  //Will be release in Send function
   spTempqTD2=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD  //Will be release in Send function 
   spTempqTD3=flib_Host20_GetStructure(Host20_MEM_TYPE_qTD);//0=>qTD  //Will be release in Send function 
   bpDataPage =sAttachDevice.bDataBuffer;//For Control-Setup
   bpDataPage3=(sAttachDevice.bDataBuffer)+0x100;//For Control-Status

   //<3>.Setup packet
   //<A>.Fill qTD
   spTempqTD->bPID=HOST20_qTD_PID_SETUP;                   //Bit8~9   
   spTempqTD->bTotalBytes=8;           //Bit16~30   
   spTempqTD->bDataToggle=0;            //Bit31 
   spTempqTD->ArrayBufferPointer_Word[0]=bpDataPage; 
   memcpy(bpDataPage,pbCmd,8);

   //<4>.Analysis the type & send qTD
   switch (bSetupMode) { // by Standard Request codes
      // <4.1>.Case-1:"Setup/In/Out' Format..."
   	  case 1:	
         //<A>.In packet
         spTempqTD2->bPID=HOST20_qTD_PID_IN;                   //Bit8~9   
         spTempqTD2->bTotalBytes=wDataSize;           //Bit16~30   
         spTempqTD2->bDataToggle=1;            //Bit31 
         spTempqTD2->ArrayBufferPointer_Word[0]=(*pwPageAddress)+wCurrentOffset; 
         spTempqTD2->ArrayBufferPointer_Word[1]=*(pwPageAddress+1);   
         spTempqTD2->ArrayBufferPointer_Word[2]=*(pwPageAddress+2);   
         spTempqTD2->ArrayBufferPointer_Word[3]=*(pwPageAddress+3);   
         spTempqTD2->ArrayBufferPointer_Word[4]=*(pwPageAddress+4);   
             
         //<B>.Out packet
         spTempqTD3->bPID=HOST20_qTD_PID_OUT;                   //Bit8~9   
         spTempqTD3->bTotalBytes=0;           //Bit16~30   
         spTempqTD3->bDataToggle=1;            //Bit31 
         spTempqTD3->ArrayBufferPointer_Word[0]=bpDataPage3; 

⌨️ 快捷键说明

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