📄 lib_host20.c
字号:
//<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;
spTempqTD->bStatus_Active=0;
spTempqTD2->bStatus_Active=1;
//<D>.Send 2 qTD
bReturnValue=flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Control[bEdNum],5);
if (bReturnValue>0)
return (bReturnValue);
break;
//<4.3>.Case-3:'Setup/Out/In'
case 3: // set descriptor
//<A>.Out Packet
spTempqTD2->bPID=HOST20_qTD_PID_OUT; //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>.In packet
spTempqTD3->bPID=HOST20_qTD_PID_IN; //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;
default:
break;
}
return (0);
}
//====================================================================
// * Function Name: flib_Host20_Issue_Bulk
// * Description: Input data must be 4K-Alignment
// <1>.MaxSize=20 K
// <2>.Support Only 1-TD
// * Input:
// * OutPut:
//====================================================================
UINT8 flib_Host20_Issue_Bulk (UINT8 bArrayListNum,UINT16 hwSize,UINT32 *pwBufferArray,UINT32 wOffset,UINT8 bDirection)
{
qTD_Structure *spTempqTD;
//<1>.Fill TD
spTempqTD =flib_Host20_GetStructure(Host20_MEM_TYPE_qTD); //The qTD will be release in the function "Send"
spTempqTD->bTotalBytes=hwSize;
spTempqTD->ArrayBufferPointer_Word[0]=(UINT32)((*pwBufferArray++)+wOffset);
spTempqTD->ArrayBufferPointer_Word[1]=(UINT32)*pwBufferArray++;
spTempqTD->ArrayBufferPointer_Word[2]=(UINT32)*pwBufferArray++;
spTempqTD->ArrayBufferPointer_Word[3]=(UINT32)*pwBufferArray++;
spTempqTD->ArrayBufferPointer_Word[4]=(UINT32)*pwBufferArray++;
//<2>.Analysis the Direction
if (bDirection)
spTempqTD->bPID=HOST20_qTD_PID_IN;
else
spTempqTD->bPID=HOST20_qTD_PID_OUT;
//<3>.Send TD
return (flib_Host20_Send_qTD(spTempqTD ,psHost20_qHD_List_Bulk[bArrayListNum],1000));
}
//====================================================================
// * Function Name: flib_Host20_ISO_Init
// * Description:
// <1>.Init FrameList
// <2>.Enable Periotic schedule
//
// * Input:
// * OutPut:
//====================================================================
void flib_Host20_ISO_Init (void)
{
UINT32 i;
// <1>.Init FrameList
for (i=0;i<1024;i++)
{
if (sAttachDevice.bDeviceOnHub==0)
psHost20_FramList->sCell[i].bType=HOST20_HD_Type_iTD;
else
psHost20_FramList->sCell[i].bType=HOST20_HD_Type_siTD;
psHost20_FramList->sCell[i].bLinkPointer=0;
psHost20_FramList->sCell[i].bTerminal=1;
}
//<2>.Set Periodic Base Address
mwHost20_PeriodicBaseAddr_Set(Host20_STRUCTURE_Preiodic_Frame_List_BASE_ADDRESS);
//<2>.Enable the periodic
flib_Host20_Periodic_Setting(HOST20_Enable);
}
//====================================================================
// * Function Name: flib_Host20_Issue_ISO
// * Description:
// 1.Mult=1 => MaxPacketSize = 256,512,1024
// Mult=2 => MaxPacketSize = 128
// Mult=3 => MaxPacketSize = 64
// 2.Suppose 1024 iTD
//
// * Input:
// UINT8 bAddress
// UINT8 bEndPt
// UINT32 wMaxPacketSize
// UINT32 wSize
// UINT32 *pwBufferArray
// UINT32 wOffset
// UINT8 bDirection)
//
// * OutPut:
//====================================================================
UINT32 wRandomFrameStart=200;//393;
UINT32 wISOOTGIn_Counter=0;
void flib_Host20_Issue_ISO(UINT8 bCheckResult,UINT32 wEndPt,UINT32 wMaxPacketSize,UINT32 wSize
,UINT32 *pwBufferArray,UINT32 wOffset,UINT8 bDirection,UINT8 bMult)
{
UINT32 wRemainSize,wCurrentOffset,wCurrentBufferNum,wCurrentLength,wiTDNum,wFrameNumber,i,wOriginalFrameNumber,wDummyTemp;
UINT8 bCurrentTransactionNum,bCurrentPageNum,bTransactionNumMax,bExitFlag;
iTD_Structure *spTempiTD;
UINT32 *pwLastTransaction;
UINT32 wCurrentBufferNum1,wCurrentBufferNum3,j,wCurrentBufferNum2,wCurrentBufferNum4;
UINT32 *pwData;
//<2>.Allocate the iTD for the Data Buffer
wRemainSize=wSize;
wCurrentBufferNum=0;
wiTDNum=0;
wCurrentOffset=wOffset;
while(wRemainSize)
{
//<2.1>.Allocate iTD
psDevice_AP->wISOiTDAddress[wiTDNum]=flib_Host20_GetStructure(Host20_MEM_TYPE_iTD);
spTempiTD=psDevice_AP->wISOiTDAddress[wiTDNum];
spTempiTD->ArrayBufferPointer_Word[0].bMultiFunction|=(wEndPt<<8);
spTempiTD->ArrayBufferPointer_Word[0].bMultiFunction|=psDevice_AP->bAdd;
spTempiTD->ArrayBufferPointer_Word[1].bMultiFunction=(bDirection<<11);
spTempiTD->ArrayBufferPointer_Word[1].bMultiFunction|=wMaxPacketSize;
spTempiTD->ArrayBufferPointer_Word[2].bMultiFunction=bMult;
bCurrentTransactionNum=0;
bCurrentPageNum=0;
spTempiTD->ArrayBufferPointer_Word[bCurrentPageNum].bBufferPointer
=((UINT32)*(pwBufferArray+wCurrentBufferNum)>>12);
if (psDevice_AP->bSpeed==0)
bTransactionNumMax=1;//For Full Speed
else
bTransactionNumMax=8;//For High Speed
//<2.2>.Fill iTD
while ((wRemainSize)&&(bCurrentTransactionNum<bTransactionNumMax))
{
//Fill iTD
if (wRemainSize<(wMaxPacketSize*bMult))
{printf(">>> Length must be the X*wMaxPacketSize*bMult\n");
while(1);
}
else
wCurrentLength=wMaxPacketSize*bMult;
spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bLength=wCurrentLength;
spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bStatus=HOST20_iTD_Status_Active;
spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bInterruptOnComplete=0;
spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bPageSelect=bCurrentPageNum;
spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bOffset=wCurrentOffset;
//Maintain the wRemainSize/bCurrentPageNum/wCurrentOffset/wCurrentBufferNum
wRemainSize=wRemainSize-wCurrentLength;
wCurrentOffset=wCurrentOffset+wCurrentLength;
if (wCurrentOffset>=4096)
{
bCurrentPageNum++;
wCurrentBufferNum++;
spTempiTD->ArrayBufferPointer_Word[bCurrentPageNum].bBufferPointer
=((UINT32)*(pwBufferArray+wCurrentBufferNum)>>12);
wCurrentOffset=wCurrentOffset-4096;
}
//Set the finish Complete-Interrupt
if (wRemainSize==0)
{spTempiTD->ArrayStatus_Word[bCurrentTransactionNum].bInterruptOnComplete=1;
pwLastTransaction=&(spTempiTD->ArrayStatus_Word[bCurrentTransactionNum]);
}
bCurrentTransactionNum++;
}//while ((wRemainSize)&&(bCurrentTransactionNum<8))
//<2.3>.Maintain Variable
wiTDNum++;
if (wiTDNum>512)
{printf(">>> Waring...iTD Number >512... \n");
while(1);
}
} //while(wRemainSize)
//<3>.Hang the qTD to the FrameList
//<3.1>.Read the Current Frame List
//Critical Time Period Start ---------------------------------------------------
psDevice_AP->bSendStatusError=0;
#if 0 //Waiting for FrameList=0~10;
wCurrentBufferNum1=(mwHost20_FrameIndex_Rd()>>3)&0x000003FF; //wCurrentBufferNum1
if ((wCurrentBufferNum1>10)&(wCurrentBufferNum1<1020))
{gwFrameList0Interrupt=0;
mwHost20_USBSTS_FrameRollover_Set();
mwHost20_USBINTR_FrameRollover_Set();
do{
}while(gwFrameList0Interrupt==0);
mwHost20_USBINTR_FrameRollover_Clr();
}
wCurrentBufferNum1=mwHost20_FrameIndex14Bit_Rd()>>3; //wCurrentBufferNum1
wOriginalFrameNumber=wRandomFrameStart++;
if (wRandomFrameStart>500)
wRandomFrameStart=200;
#else //Waiting for FrameList=0~10;
wCurrentBufferNum1=mwHost20_FrameIndex14Bit_Rd()>>3;
wOriginalFrameNumber=(mwHost20_FrameIndex_Rd()>>3);
wOriginalFrameNumber=wOriginalFrameNumber+20;//300
#endif //Waiting for FrameList=0~10;
pwData=0x90100080;
*pwData=0X200;
//<3.2>.Hang the qTD to the Current Frame + 100 ms
// wInterruptMask=mwOTG20_Interrupt_Mask_Rd();
// mwOTG20_Interrupt_Mask_Set(0);
wCurrentBufferNum2=mwHost20_FrameIndex14Bit_Rd()>>3; //wCurrentBufferNum2
wFrameNumber=wOriginalFrameNumber;
for (i=0;i<wiTDNum;i++)
{
if (wFrameNumber>1023)
wFrameNumber=wFrameNumber-1024;
psHost20_FramList->sCell[wFrameNumber].bLinkPointer=(UINT32)(psDevice_AP->wISOiTDAddress[i])>>5;
psHost20_FramList->sCell[wFrameNumber].bTerminal=0;
wFrameNumber++;
}
//<4>.Waiting for the Complete the processing iTDs
gwLastiTDSendOK=0;
psDevice_AP->bISOTransferEnable=1;
wISOOTGIn_Counter++;
//wCurrentBufferNum2=mwHost20_FrameIndex14Bit_Rd()>>3;
// if (wISOOTGIn_Counter==2)
// mwHost20_CurrentAsynchronousAddr_Set(0xFFFFFFFF);
wCurrentBufferNum3=(mwHost20_FrameIndex14Bit_Rd())>>3; //wCurrentBufferNum3
// mwOTG20_Interrupt_Mask_Set(wInterruptMask);
bExitFlag=0;
do
{
wDummyTemp++;
if (wDummyTemp>1000)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -