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