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

📄 lib_host20.c

📁 GM8120 linux driver.
💻 C
📖 第 1 页 / 共 5 页
字号:
      // <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;          //<C>.Link Pointer         spTempqTD->bNextQTDPointer=(((UINT32)spTempqTD2)>>5);         spTempqTD->bAlternateQTDPointer=(((UINT32)spTempqTD2)>>5);                      spTempqTD2->bNextQTDPointer=(((UINT32)spTempqTD3)>>5);         spTempqTD2->bAlternateQTDPointer=(((UINT32)spTempqTD3)>>5);                      spTempqTD->bTerminate=0;         spTempqTD->bAlternateTerminate=0;                      spTempqTD2->bTerminate=0;         spTempqTD2->bAlternateTerminate=0;                      spTempqTD->bStatus_Active=0;         spTempqTD2->bStatus_Active=1;         spTempqTD3->bStatus_Active=1;                //<D>.Send 3 qTD         bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);         if (bReturnValue>0)            return (bReturnValue);         break;           //<4.2>.Case-2:'Setup/In' Format...      => Faraday Driver will not need 	  case 2:		// clear feature         //<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;         //<C>.Link Pointer         spTempqTD->bNextQTDPointer=(((UINT32)spTempqTD2)>>5);         spTempqTD->bAlternateQTDPointer=(((UINT32)spTempqTD2)>>5);                      spTempqTD->bTerminate=0;         spTempqTD->bAlternateTerminate=0;             

⌨️ 快捷键说明

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