📄 pe_usb.c
字号:
tOTGCSW.u32DataResidue = 0; eUsbOTGMassStorageState = STATE_CSW; #if(Bulk_Satus == Bulk_FIFO_SingleDir) mUsbIntF2OUTEn(); #elif(Bulk_Satus == Bulk_FIFO_BiDir) mUsbIntF0OUTEn(); #endif mUsbIntF0INEn(); mUsbIntEP0SetupEn(); mUsbIntEP0InEn(); mUsbIntEP0OutEn(); mUsbIntEP0EndEn(); mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);// Do_Delay(100);#if DCacheEnable fLib_EnableDCache();#endif}///////////////////////////////////////////////////////////////////////////////// vOTGDxFWr()// Description: Write the buffer content to USB220 Data FIFO// input: Buffer pointer, byte number to write, Change Endian type or NOT// output: none///////////////////////////////////////////////////////////////////////////////void vOTGDxFWr(INT8U FIFONum, INT8U * pu8Buffer, INT16U u16Num){ INT32U wTemp; INT32U FIFO_Sel; if (u16Num==0)//Bruce;;03152005 return; if(FIFONum<4) FIFO_Sel = 1<<FIFONum; else { printf("L%x: Set to Wrong FIFO,FIFO%d not support..", u8LineOTGCount ++,FIFONum); return; } #if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif mUsbDmaConfig(u16Num,DIRECTION_IN); mUsbDMA2FIFOSel(FIFO_Sel); mUsbDmaAddr(pu8Buffer); mUsbDmaStart(); while(1) { wTemp = mUsbIntSrc2Rd(); if(wTemp & BIT8) { mUsbFIFOClr((INT32U)FIFONum); mUsbIntDmaErrClr(); printf("L%x: FIFO%d IN transfer DMA error..", u8LineOTGCount ++,FIFONum); break; } if(wTemp & BIT7) { mUsbIntDmaFinishClr(); break; } if((wTemp & 0x00000007)>0)//If (Resume/Suspend/Reset) exit { mUsbDMARst(); mUsbFIFOClr((INT32U)FIFONum); mUsbIntDmaFinishClr(); printf("L%x: FIFO%d IN transfer DMA stop because USB Resume/Suspend/Reset..", u8LineOTGCount ++,FIFONum); break; } } mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);#if DCacheEnable fLib_EnableDCache();#endif}///////////////////////////////////////////////////////////////////////////////// vOTGDxFRd()// Description: Fill the buffer from USB220 Data FIFO// input: Buffer pointer, byte number to write, Change Endian type or NOT// output: none///////////////////////////////////////////////////////////////////////////////void vOTGDxFRd(INT8U FIFONum, INT8U * pu8Buffer, INT16U u16Num){ INT32U wTemp; INT32U FIFO_Sel; if (u16Num==0)//Bruce;;03152005 return; if(FIFONum<4) FIFO_Sel = 1<<FIFONum; else { printf("L%x: Set to Wrong FIFO,FIFO%d not support..", u8LineOTGCount ++,FIFONum); return; }#if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif mUsbDmaConfig(u16Num,DIRECTION_OUT); mUsbDMA2FIFOSel(FIFO_Sel); mUsbDmaAddr(pu8Buffer); mUsbDmaStart(); while(1) { wTemp = mUsbIntSrc2Rd(); if(wTemp & BIT8) { mUsbFIFOClr((INT32U)FIFONum); mUsbIntDmaErrClr(); printf("L%x: FIFO%d OUT transfer DMA error..", u8LineOTGCount ++,FIFONum); break; } if(wTemp & BIT7) { mUsbIntDmaFinishClr(); break; } if((wTemp & 0x00000007)>0)//If (Resume/Suspend/Reset) exit { mUsbDMARst(); mUsbFIFOClr((INT32U)FIFONum); mUsbIntDmaFinishClr(); printf("L%x: FIFO%d OUT transfer DMA stop because USB Resume/Suspend/Reset..", u8LineOTGCount ++,FIFONum); break; } } mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);#if DCacheEnable fLib_EnableDCache();#endif}///////////////////////////////////////////////////////////////////////////////// vOTGCxFWr()// Description: Write the buffer content to USB220 Cx FIFO// input: Buffer pointer, byte number to write, Change Endian type or NOT// output: none///////////////////////////////////////////////////////////////////////////////void vOTGCxFWr( INT8U *pu8Buffer, INT16U u16Num){ INT32U wTemp; if (u16Num==0)//Bruce;;03152005 return; #if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif mUsbDmaConfig(u16Num,DIRECTION_IN); mUsbDMA2FIFOSel(FOTG200_DMA2CxFIFO); mUsbDmaAddr(pu8Buffer); mUsbDmaStart(); while(1) { wTemp = mUsbIntSrc2Rd(); if(wTemp & BIT8) { mUsbCxFClr(); mUsbIntDmaErrClr(); printf("L%x: Cx IN DMA error..", u8LineOTGCount ++); break; } if(wTemp & BIT7) { mUsbIntDmaFinishClr(); break; } if((wTemp & 0x00000007)>0)//If (Resume/Suspend/Reset) exit { mUsbDMARst(); mUsbCxFClr(); mUsbIntDmaFinishClr(); printf("L%x: Cx IN DMA stop because USB Resume/Suspend/Reset..", u8LineOTGCount ++); break; } } mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);#if DCacheEnable fLib_EnableDCache();#endif }///////////////////////////////////////////////////////////////////////////////// vOTGCxFRd()// Description: Fill the buffer from USB220 Cx FIFO// input: Buffer pointer, byte number to write, Change Endian type or NOT// output: none///////////////////////////////////////////////////////////////////////////////void vOTGCxFRd(INT8U *pu8Buffer, INT16U u16Num){ INT32U wTemp; if (u16Num==0)//Bruce;;03152005 return;#if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif mUsbDmaConfig(u16Num,DIRECTION_OUT); mUsbDMA2FIFOSel(FOTG200_DMA2CxFIFO); mUsbDmaAddr(pu8Buffer); mUsbDmaStart(); while(1) { wTemp = mUsbIntSrc2Rd(); if(wTemp & BIT8) { mUsbCxFClr(); mUsbIntDmaErrClr(); printf("L%x: Cx OUT DMA error..", u8LineOTGCount ++); break; } if(wTemp & BIT7) { mUsbIntDmaFinishClr(); break; } if((wTemp & 0x00000007)>0)//If (Resume/Suspend/Reset) exit { mUsbDMARst(); mUsbCxFClr(); mUsbIntDmaFinishClr(); printf("L%x: Cx OUT DMA stop because USB Resume/Suspend/Reset..", u8LineOTGCount ++); break; } } mUsbDMA2FIFOSel(FOTG200_DMA2FIFO_Non);#if DCacheEnable fLib_EnableDCache();#endif}///////////////////////////////////////////////////////////////////////////////// vUsbCxLoopBackTest()// Description: Do Cx Data loop back test// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vUsbCxLoopBackTest(void){ INT8U u8TxTmp[64],u8RxTmp[64]; INT32U u32i; // set for Cx loop back test enable bFOTGPeri_Port(0x02) = BIT1; // write data for(u32i = 0; u32i<64; u32i++) u8TxTmp[u32i] = u32i; vOTGCxFWr(u8TxTmp,64); // check Cx Done bit mUsbEP0DoneSet(); while(!(bFOTGPeri_Port(0x0B) | BIT0)); // set for Cx loop back test clear bFOTGPeri_Port(0x02) = BIT2; bFOTGPeri_Port(0x0B) &= ~BIT0; // read data memset(u8RxTmp,0,64); vOTGCxFRd(u8RxTmp,64); //compare data for(u32i = 0; u32i<64; u32i++) { if(u8TxTmp[u32i] != u8RxTmp[u32i]) { printf("CxTest%d:***Cx loop test error, Tx=0x%x, Rx=0x%x\n", (INT16U)u32i,u8TxTmp[u32i],u8RxTmp[u32i]); } else { printf("CxTest%d:Cx loop test ok, Tx=0x%x, Rx=0x%x\n", (INT16U)u32i,u8TxTmp[u32i],u8RxTmp[u32i]); } }}///////////////////////////////////////////////////////////////////////////////// vUsbPamLoopBackTest()// Description: Do PAM (Only FIFO0 or FIFO2) loop back test .// FIFO0 => FIFO0 & FIFO1 ping pong, packet size = 512, transfer type = Bulk// FIFO2 => FIFO2 & FIFO3 ping pong, packet size = 512, transfer type = Bulk// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vUsbPamLoopBackTest(INT32U u32StartFIFONum){ INT8U *u8TxTmp,*u8RxTmp; INT32U u32i; BOOLEAN bTestPass = TRUE; u8TxTmp =(INT8U *) malloc(1024); u8RxTmp =(INT8U *) malloc(1024); mUsbIntEP0InEn(); mUsbEPMap(EP1, ((INT8U)u32StartFIFONum)); mUsbEPMxPtSz(EP1, DIRECTION_IN, 0x200 ); mUsbFIFOMap(u32StartFIFONum, 0x11); mUsbFIFOConfig(u32StartFIFONum, 0x26); mUsbFIFOConfig(u32StartFIFONum+1, 0x06); // write data for(u32i = 0; u32i<1024; u32i++) u8TxTmp[u32i] = (INT8U)u32i; vOTGDxFWr(u32StartFIFONum,u8TxTmp,1024); mUsbFIFODone(u32StartFIFONum); mUsbIntEP0OutEn(); mUsbEPMap(EP1, (((INT8U)u32StartFIFONum) << 4)); mUsbEPMxPtSz(EP1, DIRECTION_OUT, 0x200 ); mUsbFIFOMap(u32StartFIFONum, 0x01); mUsbFIFOConfig(u32StartFIFONum, 0x26); mUsbFIFOConfig(u32StartFIFONum+1, 0x06); // read data memset(u8RxTmp,0,1024); vOTGDxFRd(u32StartFIFONum,u8RxTmp,1024 ); //compare data for(u32i = 0; u32i<1024; u32i++) { if(u8TxTmp[u32i] != u8RxTmp[u32i]) { bTestPass = FALSE; printf("PAMTest%d:***PAM loop test error, Tx=0x%x, Rx=0x%x\n", (INT16U)u32i,u8TxTmp[u32i],u8RxTmp[u32i]); } else {// printf("PAMTest%d:PAM loop test ok, Tx=0x%x, Rx=0x%x\n",// (INT16U)u32i,u8TxTmp[u32i],u8RxTmp[u32i]); } } if(bTestPass) { printf("PAMTest:PAM FIFO%d loop test Pass\n",u32StartFIFONum); } printf("Please re-plug device into host.\n");}void vCxOUT_VendorTest(void){ u8CxOUTVendorTest = (INT8U*)malloc(ControlOTGCmd.Length); memset(u8CxOUTVendorTest, 0, ControlOTGCmd.Length); u16OTGTxRxCounter = ControlOTGCmd.Length; pu8OTGDescriptorEX = u8CxOUTVendorTest; eOTGCxCommand = CMD_CxOUT_Vendor;}void vCxOUT_VendorRxData(void){ INT8U u8temp; INT16U u16i;//,j; BOOLEAN bCxOUT_CmpOK = TRUE; if(u16OTGTxRxCounter < EP0MAXPACKETSIZE) u8temp = (INT8U)u16OTGTxRxCounter; else u8temp = EP0MAXPACKETSIZE; u16OTGTxRxCounter -= (INT16U)u8temp; vOTGCxFRd(pu8OTGDescriptorEX , u8temp); pu8OTGDescriptorEX = pu8OTGDescriptorEX + u8temp; // end of the data stage if (u16OTGTxRxCounter == 0) { for(u16i = 0; u16i< ControlOTGCmd.Length; u16i++) { if(u8CxOUTVendorTest[u16i] != u8CxOUTVandorDataCount) {#if 1 printf("L%02x:Vandor CxData Receive error(0x%x/0x%x)-receive=0x%02x,expect=0x%02x\n", u8LineOTGCount++,u16i,ControlOTGCmd.Length, u8CxOUTVendorTest[u16i], u8CxOUTVandorDataCount);#endif bCxOUT_CmpOK = FALSE; } u8CxOUTVandorDataCount++; } if(!bCxOUT_CmpOK) { mUsbEP0StallSet(); printf("L%02x:Cx OUT Vendor test error.\n",u8LineOTGCount++); } eOTGCxCommand = CMD_VOID; eOTGCxFinishAction = ACT_DONE; free(u8CxOUTVendorTest); }}void vCxIN_VendorTest(void){ INT16U u16i; u8CxINVendorTest = (INT8U*)malloc(ControlOTGCmd.Length); for(u16i = 0; u16i< ControlOTGCmd.Length; u16i++) { u8CxINVendorTest[u16i] = u8CxINVandorDataCount;//0xbb;// u8CxINVandorDataCount++; } u16OTGTxRxCounter = ControlOTGCmd.Length; pu8OTGDescriptorEX = u8CxINVendorTest; eOTGCxCommand = CMD_CxIN_Vendor;}void vCxIN_VendorTxData(void){ INT8U u8temp; if(u16OTGTxRxCounter < EP0MAXPACKETSIZE) u8temp = (INT8U)u16OTGTxRxCounter; else u8temp = EP0MAXPACKETSIZE; u16OTGTxRxCounter -= (INT16U)u8temp; vOTGCxFWr(pu8OTGDescriptorEX , u8temp); pu8OTGDescriptorEX = pu8OTGDescriptorEX + u8temp; // end of the data stage if (u16OTGTxRxCounter == 0) {#if 1 eOTGCxFinishAction = ACT_DONE;#else mUsbEP0DoneSet(); eOTGCxFinishAction = ACT_IDLE;#endif eOTGCxCommand = CMD_VOID; free(u8CxINVendorTest); }}//==================== For OTG Control ============================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -