📄 pe_usb_bulk.c
字号:
/////////////////////////////////////////////////////////////////////////////////// File name: usb_bulk.c// Version: 1.0// Date: 2003/8/05//// Author: Andrew// Email: yping@faraday.com.tw// Phone: (03) 578-7888// Company: Faraday Tech. Corp.//// Description: USB Bulk IN OUT test Rountine & relatived subroutine/////////////////////////////////////////////////////////////////////////////////#define USB_BULK_GLOBALS#include <stdlib.h>#include <stdio.h>#include <string.h>//#include "fLib.h"#include "Pe_usb.h"#include "FA510.h"#include "FOTG200_peripheral.h"#include "Pe_my_usbtable.h"MassStorageState eOTGProessCBW(void);MassStorageState eOTGDataOut(INT16U u16FIFOByteCount);MassStorageState eOTGDataIn(void);void vShowCBW(void);void vShowCSW(void);void vOTGSendCSW(void);void vOTG_FIFO_INT_action(MassStorageState eState);MassStorageState eUsbOTGMassStorageState;INT8U* u8VirtOTGMemory = NULL;//[MAX_BUFFER_SIZE];INT32U* u32VirtOTGMemory = NULL;CSW tOTGCSW;INT32U u32VirtOTGMemoryIndex;CBW tOTGCBW;INT32U u32OTGFIFOUseDMA;INT32U u32UseDMAOTGChannel;INT8U bOTGDMARunning;extern void OTGH_Error_Handle(void);///////////////////////////////////////////////////////////////////////////////// vOTG_APInit()// Description: User specified circuit (AP) init// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_APInit(void){ ////// initial Cx Vandor command test ////// u8CxOUTVandorDataCount = 0; u8CxINVandorDataCount = 0; ////// initial Bulk ////// eUsbOTGMassStorageState = STATE_CBW; // Init State if(u8VirtOTGMemory != NULL) free(u8VirtOTGMemory); u8VirtOTGMemory = (INT8U *)malloc(MAX_BUFFER_SIZE);// for(u16_i = 0; u16_i < MAX_BUFFER_SIZE; u16_i ++)// {// u8VirtOTGMemory[u16_i] = 0x00; // Init Buffer// } if(u32VirtOTGMemory != NULL) free(u32VirtOTGMemory); u32VirtOTGMemory = (INT32U *)malloc(MAX_BUFFER_SIZE); memcpy(u32VirtOTGMemory,u8VirtOTGMemory,MAX_BUFFER_SIZE); tOTGCSW.u32Signature = CSW_SIGNATE; // Init u32Signature ////// initial INT and ISO test //////////// u8OTGInterruptCount = 0; u32OTGInterrupt_TX_COUNT = 1; u8OTGInterruptOutCount = 0; u32OTGInterrupt_RX_COUNT = 1; u32ISOOTGInTransferCount = 0; u32ISOOTGOutTransferCount = 0; }///////////////////////////////////////////////////////////////////////////////// vUsb_Bulk_Out()// Description: USB FIFO2 interrupt service process// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vUsb_Bulk_Out(INT16U u16FIFOByteCount){ switch(eUsbOTGMassStorageState) { case STATE_CBW: if (u16FIFOByteCount == 31) eUsbOTGMassStorageState = eOTGProessCBW(); else mUsbEPoutStallSet(mUsbFIFOMapRd(FIFO2)); break; case STATE_CB_DATA_OUT:#if 0 if((INT16U)tOTGCBW.u32DataTransferLength != u16FIFOByteCount) printf("L%x: Byte Count Error = %d. (Correct = %d)\n", u8LineOTGCount, u16FIFOByteCount, (INT16U)tOTGCBW.u32DataTransferLength); else#endif eUsbOTGMassStorageState = eOTGDataOut(u16FIFOByteCount); break; default: if(u8OTGMessageLevel & (MESS_INFO & MESS_ERROR & MESS_WARNING)) printf("L%x: Error FIFO2_OUT interrupt.\n", u8LineOTGCount); break; } vOTG_FIFO_INT_action(eUsbOTGMassStorageState);}///////////////////////////////////////////////////////////////////////////////// vUsb_Bulk_In()// Description: USB FIFO0 interrupt service process// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vUsb_Bulk_In(void){ switch(eUsbOTGMassStorageState) { case STATE_CSW: vOTGSendCSW(); eUsbOTGMassStorageState = STATE_CBW; mUsbIntF0INDis(); break; case STATE_CB_DATA_IN: eUsbOTGMassStorageState = eOTGDataIn(); break; default: if(u8OTGMessageLevel & (MESS_INFO & MESS_ERROR & MESS_WARNING)) printf("L%x: Error FIFO0_IN interrupt.\n", u8LineOTGCount); break; } if(!bOTGDMARunning) vOTG_FIFO_INT_action(eUsbOTGMassStorageState);}///////////////////////////////////////////////////////////////////////////////// vOTG_FIFO_INT_action()// Description: FIFO interrupt enable or not// depend on the STORAGE state// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_FIFO_INT_action(MassStorageState eState){ switch(eState) { case STATE_CBW: case STATE_CB_DATA_OUT: mUsbIntF0INDis(); break; case STATE_CSW: case STATE_CB_DATA_IN: mUsbIntF0INEn(); break; default: break; }}///////////////////////////////////////////////////////////////////////////////// eOTGProessCBW()// Description: Process the CBW// input: none// output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGProessCBW(void){ MassStorageState eState;#if(Bulk_Satus == Bulk_FIFO_SingleDir) vOTGDxFRd(FIFO2, (INT8U *)(&tOTGCBW), 12); // change little endian to big endian vOTGDxFRd(FIFO2, (INT8U *)(&(tOTGCBW.u8Flags)), 19);#elif(Bulk_Satus == Bulk_FIFO_BiDir) vOTGDxFRd(FIFO0, (INT8U *)(&tOTGCBW), 12); // change little endian to big endian vOTGDxFRd(FIFO0, (INT8U *)(&(tOTGCBW.u8Flags)), 19);#endif #if ShowMassMsg// if(u8OTGMessageLevel & MESS_INFO) vShowCBW();#endif if(tOTGCBW.u32Signature != CBW_SIGNATE) eState = STATE_CBW; else { // pass u32DataTransferLength to u32DataResidue tOTGCSW.u32DataResidue = tOTGCBW.u32DataTransferLength; // pass Tag from CBW to CSW tOTGCSW.u32Tag = tOTGCBW.u32Tag; // Assume Status is CMD_PASS tOTGCSW.u8Status = CSW_STATUS_CMD_PASS; // Get Virtual Memory start address.#if 1 u32VirtOTGMemoryIndex = (INT32U)(tOTGCBW.u8CB[0]) | ((INT32U)tOTGCBW.u8CB[1] << 8);#else u32VirtOTGMemoryIndex = ((INT32U)(tOTGCBW.u8CB[0]) | ((INT32U)tOTGCBW.u8CB[1] << 8))>>2;#endif if (tOTGCSW.u32DataResidue == 0) eState = STATE_CSW; else if (tOTGCBW.u8Flags == 0x00) eState = STATE_CB_DATA_OUT; else eState = STATE_CB_DATA_IN; } return eState;}///////////////////////////////////////////////////////////////////////////////// Waiting_For_DMA_Complete()// Description: Process the data intput stage// input: none// output: MassStorageState///////////////////////////////////////////////////////////////////////////////#if 0int Waiting_For_DMA_Complete(INT8U FIFONum){ UINT32 wTemp; //Waiting for Complete while(1) { wTemp = mUsbIntSrc2Rd(); if(wTemp & BIT8) { mUsbFIFOClr((INT32U)FIFONum); mUsbIntDmaErrClr(); printf("Waiting_For_DMA_Complete => FIFO%d transfer DMA error..\n",FIFONum); while(1); 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); bOTGDMARunning = FALSE; vOTGCheckDMA();return 0;}#endif///////////////////////////////////////////////////////////////////////////////// eOTGDataOut()// Description: Process the data output stage// input: none// output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGDataOut(INT16U u16FIFOByteCount){ //INT32U *u32pData; //Bruce;;Test if (bOTGDMARunning == TRUE) {printf("??? Error (eOTGDataOut during bOTGDMARunning = TRUE )\n"); OTGH_Error_Handle(); } memset(u8VirtOTGMemory, 0xaa, MAX_BUFFER_SIZE); #if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif #if(Bulk_Satus == Bulk_FIFO_SingleDir) mUsbIntF0INDis(); mUsbIntF2OUTDis(); u32OTGFIFOUseDMA = FIFO2; mUsbDMA2FIFOSel(FOTG200_DMA2FIFO2);#elif(Bulk_Satus == Bulk_FIFO_BiDir) mUsbIntF0INDis(); mUsbIntF0OUTDis(); u32OTGFIFOUseDMA = FIFO0; mUsbDMA2FIFOSel(FOTG200_DMA2FIFO0);#endif mUsbDmaConfig(tOTGCSW.u32DataResidue,DIRECTION_OUT); mUsbDmaAddr(&u8VirtOTGMemory[u32VirtOTGMemoryIndex]); if (mUsbIntDmaFinishRd()>0) {printf("??? Error (Do not clear mUsbIntDmaFinish during start another DMA )\n"); OTGH_Error_Handle(); } //Bruce;;Move// mUsbDmaStart(); mUsbIntEP0SetupDis(); mUsbIntEP0InDis(); mUsbIntEP0OutDis(); mUsbIntEP0EndDis(); bOTGDMARunning = TRUE; //u32pData=0x92000138; //if ((*u32pData&0x00000003)!=3) // {printf("??? Peripheral can not disable the mask...\n"); // OTGH_Error_Handle(); // } //u32pData=0x92000038;//Debug;;Bruce //*u32pData=0xAA;//Debug;;Bruce mUsbDmaStart();//Bruce;;Move #if 0//Bruce;;07152005 Waiting_For_DMA_Complete(FIFO0); #endif return STATE_CB_DATA_OUT;} ///////////////////////////////////////////////////////////////////////////////// eOTGDataIn()// Description: Process the data intput stage// input: none// output: MassStorageState///////////////////////////////////////////////////////////////////////////////MassStorageState eOTGDataIn(void){// INT32U *u32pData; //Bruce;;Test if (bOTGDMARunning == TRUE) {printf("??? Error (eOTGDataIn during bOTGDMARunning = TRUE )\n"); OTGH_Error_Handle(); } #if DCacheEnable CPUCleanInvalidateDCacheAll(); fLib_DisableDCache(); #endif #if(Bulk_Satus == Bulk_FIFO_SingleDir) mUsbIntF0INDis(); mUsbIntF2OUTDis(); u32OTGFIFOUseDMA = FIFO2;#elif(Bulk_Satus == Bulk_FIFO_BiDir) mUsbIntF0INDis(); mUsbIntF0OUTDis(); u32OTGFIFOUseDMA = FIFO0;#endif mUsbDmaConfig(tOTGCSW.u32DataResidue,DIRECTION_IN); mUsbDMA2FIFOSel(FOTG200_DMA2FIFO0); mUsbDmaAddr(&u8VirtOTGMemory[u32VirtOTGMemoryIndex]); if (mUsbIntDmaFinishRd()>0) {printf("??? Error (Do not clear mUsbIntDmaFinish during start another DMA )\n"); OTGH_Error_Handle(); } //Bruce;;Move mUsbDmaStart(); mUsbIntEP0SetupDis(); mUsbIntEP0InDis(); mUsbIntEP0OutDis(); mUsbIntEP0EndDis(); bOTGDMARunning = TRUE; u32OTGFIFOUseDMA = FIFO0;// u32pData=0x92000138;// if ((*u32pData&0x00000003)!=3)// {printf("??? Peripheral can not disable the mask...\n"); // OTGH_Error_Handle(); // }// u32pData=0x92000038;//Debug;;Bruce// *u32pData=0xAA;//Debug;;Bruce mUsbDmaStart();//Bruce;;Move #if 0//Bruce;;07152005 Waiting_For_DMA_Complete(FIFO0); #endif return STATE_CB_DATA_IN;} ///////////////////////////////////////////////////////////////////////////////// vShowCBW()// Description: show the whole CBW structure// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vShowCBW(void){ INT8U i; INT8U * pp; pp = (INT8U *)&tOTGCBW; printf("tOTGCBW: \n"); for (i = 0; i < 16; i ++) printf("%02x ", *(pp ++)); printf("\n"); for (i = 16; i < 31; i ++) printf("%02x ", *(pp ++)); printf("\n");}///////////////////////////////////////////////////////////////////////////////// vShowCSW()// Description: show the whole CSW structure// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vShowCSW(void){ if(u8OTGMessageLevel & (MESS_INFO)) { INT8U i; INT8U * pp; pp = (INT8U *)&tOTGCSW; printf("tOTGCSW: \n"); for (i = 0; i < 13; i ++) printf("%02x ", *(pp ++)); printf("\n"); }}///////////////////////////////////////////////////////////////////////////////// vOTGSendCSW()// Description: Send out the CSW structure to PC// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGSendCSW(){ // Send CSW to F0 via DBUS;#if ShowMassMsg vShowCSW();#endif vOTGDxFWr(FIFO0, (INT8U *)(&tOTGCSW ) , 13); mUsbFIFODone(FIFO0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -