📄 lib_host20.c
字号:
// <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 + -