📄 pe_usb.c
字号:
/////////////////////////////////////////////////////////////////////////////////// File name: usb.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 Service Rountine & relatived subroutine//// 1. vOTGInit(void)// 1.1 vFOTG200_Dev_Init(void);// 2. vOTGHandler(void)// 2.1 vOTG_ep0setup(void);// 2.1.1 bOTGStandardCommand(void);// 2.1.1.1 bGet_OTGstatus();// 2.1.1.2 bClear_OTGfeature();// 2.1.1.3 bSet_OTGfeature();// 2.1.1.4 bSet_OTGaddress();// 2.1.1.5 bGet_OTGdescriptor();// 2.1.1.5.1 vOTGEP0TxData(void);// 2.1.1.6 bSet_OTGdescriptor();// 2.1.1.6.1 vOTGEP0RxData(void);// 2.1.1.7 vGet_OTGconfiguration();// 2.1.1.8 bSet_OTGconfiguration();// 2.1.1.8.1 vOTGClrEPx(void);// 2.1.1.9 bGet_OTGinterface();// 2.1.1.10 bSet_OTGinterface();// 2.1.1.10.1 vOTGClrEPx(void);// 2.1.1.11 bSynch_OTGframe();// 2.2 vOTG_ep0tx(void);// 2.2.1 vOTGEP0TxData(void);// 2.3 vOTG_ep0rx(void);// 2.3.1 vOTGEP0RxData(void);// 2.4 vOTG_ep0end(void);// 2.5 vOTG_ep0fail(void);// 2.6 vOTG_rst(void);// 2.7 vOTG_suspend(void);// 2.8 vOTG_resm(void);// 2.9 vOTG_ISO_SeqErr(void);// 2.10 vOTG_ISO_SeqAbort(void);// 2.11 vOTG_TX0Byte(void);// 2.12 vOTG_RX0Byte(void);///////////////////////////////////////////////////////////////////////////////#define USB_GLOBALS#define NoFixPort 0#define FixPort 1#define USB_DataPort FixPort#include <stdlib.h>#include <stdarg.h>#include <stdio.h>#include <string.h>#include "Pe_usb.h"#include "FA510.h"#include "Pe_usb_hs_pos.h"#include "Pe_usb_fs_pos.h"#include "FOTG200_peripheral.h"#include "Pe_my_usbtable.h"#include "chipset.h" #include "flib.h" #include "OTGController.h"#include "cpe.h"SetupPacket ControlOTGCmd;INT8U * pu8OTGDescriptorEX;INT16U u16OTGTxRxCounter;BOOLEAN bOTGEP0HaltSt;CommandType eOTGCxCommand;Action eOTGCxFinishAction;INT32U OTG_interrupt_level1;INT32U OTG_interrupt_level1_Save;INT32U OTG_interrupt_level1_Mask;INT8U u8OTGConfigValue;INT8U u8OTGInterfaceValue;INT8U u8OTGInterfaceAlternateSetting;BOOLEAN bOTGBufferEmpty;BOOLEAN bOTGHighSpeed;BOOLEAN bOTGChirpFinish;INT8U u8OTGInterruptCount;INT32U u32OTGInterrupt_TX_COUNT ;INT32U u32OTGInterrupt_RX_COUNT ;INT8U u8OTGInterruptOutCount ;INT8U* u8CxOUTVendorTest = NULL;INT8U* u8CxINVendorTest = NULL;INT8U u8CxOUTVandorDataCount = 0;INT8U u8CxINVandorDataCount = 0; void vCxOUT_VendorTest(void);void vCxOUT_VendorRxData(void);void vCxIN_VendorTest(void);void vCxIN_VendorTxData(void);extern CBW tOTGCBW;extern void OTGH_Error_Handle(void);void vFOTG200_Dev_Init(void);//============================================================================= // OTGP_HNP_Enable()// Description:// // input: none// output: none//=============================================================================int Debug_Check_R138(void){ UINT32 u32Temp; u32Temp = mUsbIntSrc1MaskRd(); if ((u32Temp&0x3C)!=0x3C) { printf("??? Check 0x138 error = 0x%x\n",u32Temp); while(1) ;// return (0); } else{ return (1); }}//============================================================================= // OTGP_HNP_Enable()// Description:// // input: none// output: none//=============================================================================void OTGP_HNP_Enable(void){ //<1>.Set b_Bus_Request mdwOTGC_Control_B_BUS_REQ_Set(); //<2>.Set the HNP enable mdwOTGC_Control_B_HNP_EN_Set();}///////////////////////////////////////////////////////////////////////////////// vOTGIsr2()// Description:// 1. Record FOTG200 Device group interrupt register.// 2. Disable Usb interrupt.// 3. Expect "Usb interrupt will be renabled after all events had been// serviced in main()".// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGIsr2(void){ OTG_interrupt_level1_Save = mUsbIntGroupRegRd(); OTG_interrupt_level1_Mask = mUsbIntGroupMaskRd(); OTG_interrupt_level1 = OTG_interrupt_level1_Save & ~OTG_interrupt_level1_Mask; if (OTG_interrupt_level1 != 0) { //bruce;;04182005;; fLib_DisableInt(IRQ_FOTG200); }}///////////////////////////////////////////////////////////////////////////////// vFOTG200_Dev_Init()// Description:// 1. Reset all interrupt and clear all fifo data of FOTG200 Device// 2. Turn on the "Global Interrupt Enable" bit of FOTG200 Device// 3. Turn on the "Chip Enable" bit of FOTG200 Device// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vFOTG200_Dev_Init(void){ // suspend counter mUsbIdleCnt(7); // Clear interrupt mUsbIntBusRstClr(); mUsbIntSuspClr(); mUsbIntResmClr(); // Disable all fifo interrupt mUsbIntFIFO0_3OUTDis(); mUsbIntFIFO0_3INDis(); //if ((mUsbIntSrc1MaskRd()&0xF00FF)!=0xF00FF)//Bruce;;07192005 // {printf("??? 0x138 Set Fail...\n");//Bruce;;07192005 // while(1);//Bruce;;07192005 // }//Bruce;;07192005 // Soft Reset mUsbSoftRstSet(); // All circuit change to which state after Soft Reset? mUsbSoftRstClr(); // Clear all fifo mUsbClrAllFIFOSet(); // will be cleared after one cycle. // Enable usb200 global interrupt mUsbGlobIntEnSet(); mUsbChipEnSet();}///////////////////////////////////////////////////////////////////////////////// vOTGInit()// Description:// 1. Configure the FIFO and EPx map.// 2. Initiate FOTG200 Device.// 3. Set the usb interrupt source as edge-trigger.// 4. Enable Usb interrupt.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGInit(void){ // init variables u16OTGTxRxCounter = 0; eOTGCxCommand = CMD_VOID; u8OTGConfigValue = 0; u8OTGInterfaceValue = 0; u8OTGInterfaceAlternateSetting = 0; bOTGEP0HaltSt = FALSE; eOTGCxFinishAction = ACT_IDLE; OTG_interrupt_level1 = 0; // Initiate FUSB220 vFOTG200_Dev_Init(); // Initiate Interrupt// fLib_CloseInt(IRQ_FOTG200);// fLib_SetIntTrig(IRQ_FOTG200,LEVEL,L_ACTIVE);// fLib_ConnectInt(IRQ_FOTG200, vOTGIsr2);// fLib_EnableInt(IRQ_FOTG200); }///////////////////////////////////////////////////////////////////////////////// vOTGHandler()// Description:// 1. Service all Usb events// 2. ReEnable Usb interrupt.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGHandler(void){ INT32U *u32pData; INT32U OTG_Interrupt_level2; INT32U OTG_Interrupt_Mask; INT32U OTG_Interrupt_Origan; if (bOTGDMARunning) { u32pData=(INT32U *)(CPE_FOTG200_BASE+0x138); if ((*u32pData!=0xb003f)&(*u32pData!=0xb003c)) { printf("??? Interrupt Error During bOTGDMARunning 0x138=0x%x\n",*u32pData); OTGH_Error_Handle(); } } if (OTG_interrupt_level1 & BIT2) //Group Source 2 { OTG_Interrupt_Origan = mUsbIntSrc2Rd(); OTG_Interrupt_Mask = mUsbIntSrc2MaskRd(); OTG_Interrupt_level2 = OTG_Interrupt_Origan & ~OTG_Interrupt_Mask; if (OTG_Interrupt_level2 & BIT0) vOTG_rst(); if (OTG_Interrupt_level2 & BIT1) vOTG_suspend(); if (OTG_Interrupt_level2 & BIT2) vOTG_resm(); if (OTG_Interrupt_level2 & BIT3) { mUsbIntIsoSeqErrClr(); vOTG_ISO_SeqErr(); } if (OTG_Interrupt_level2 & BIT4) { mUsbIntIsoSeqAbortClr(); vOTG_ISO_SeqAbort(); } if (OTG_Interrupt_level2 & BIT5) { mUsbIntTX0ByteClr(); vOTG_TX0Byte(); } if (OTG_Interrupt_level2 & BIT6) { mUsbIntRX0ByteClr(); vOTG_RX0Byte(); } if (OTG_Interrupt_level2 & BIT7) { mUsbIntDmaFinishClr();#if (OTG_AP_Satus == Bulk_AP) if(bOTGDMARunning) vOTGCheckDMA(); else printf("L%02x:DMA finish Interrupt error.",u8LineOTGCount++);#endif } if (OTG_Interrupt_level2 & BIT8) { printf("L%02x:DMA error.",u8LineOTGCount++); mUsbIntDmaErrClr();#if (OTG_AP_Satus == Bulk_AP) if(bOTGDMARunning) { vOTGCheckDMA(); printf("L%02x:DMA error.",u8LineOTGCount++); } else printf("L%02x:DMA error Interrupt error.",u8LineOTGCount++);#endif } } if (OTG_interrupt_level1 & BIT0) //Group Source 0 { OTG_Interrupt_Origan = mUsbIntSrc0Rd(); OTG_Interrupt_Mask = mUsbIntSrc0MaskRd(); OTG_Interrupt_level2 = OTG_Interrupt_Origan & ~OTG_Interrupt_Mask;// printf("L%x: IntSrc0 = 0x%02x\n", u8LineOTGCount ++,OTG_Interrupt_level2); if (OTG_Interrupt_level2 & BIT5) vOTG_ep0abort(); if (OTG_Interrupt_level2 & BIT2) vOTG_ep0rx(); if (OTG_Interrupt_level2 & BIT0) vOTG_ep0setup(); else if (OTG_Interrupt_level2 & BIT3) vOTG_ep0end(); if (OTG_Interrupt_level2 & BIT1) vOTG_ep0tx(); if (OTG_Interrupt_level2 & BIT4) vOTG_ep0fail(); if (eOTGCxFinishAction == ACT_STALL) { if(u8OTGMessageLevel & (MESS_ERROR | MESS_WARNING | MESS_INFO)) printf("L%x: Unsuported EP0 command...Return Cx Stall...\n", u8LineOTGCount ++); mUsbEP0StallSet(); } else if (eOTGCxFinishAction == ACT_DONE) mUsbEP0DoneSet(); // Clear Action eOTGCxFinishAction = ACT_IDLE; #if 0 // YPING Debug if(u16OTGTxRxCounter !=0) { } #endif } if (OTG_interrupt_level1 & BIT1) //Group Source 1 { OTG_Interrupt_Origan = mUsbIntSrc1Rd(); OTG_Interrupt_Mask = mUsbIntSrc1MaskRd();//0x138 OTG_Interrupt_level2 = OTG_Interrupt_Origan & ~OTG_Interrupt_Mask;#if (OTG_AP_Satus == Bulk_AP) #if(Bulk_Satus == Bulk_FIFO_SingleDir) // YPING : use FIFO2 for ep2( bulk out) if (OTG_Interrupt_level2 & BIT5) // short packet vUsb_Bulk_Out(mUsbFIFOOutByteCount(FIFO2)); else if (OTG_Interrupt_level2 & BIT4) // full packet vUsb_Bulk_Out(mUsbFIFOOutByteCount(FIFO2)); // YPING : use FIFO0 for ep1( bulk in) if (OTG_Interrupt_level2 & BIT16) vUsb_Bulk_In(); #elif(Bulk_Satus == Bulk_FIFO_BiDir) if(bOTGDMARunning) { u32pData=(INT32U *)(CPE_FOTG200_BASE+0x138); printf("??? Interrupt Error During bOTGDMARunning 0x138=0x%x\n",*u32pData); OTGH_Error_Handle(); } // YPING : use FIFO0 for ep2( bulk out) if (OTG_Interrupt_level2 & BIT1) // short packet vUsb_Bulk_Out(mUsbFIFOOutByteCount(FIFO0)); else if (OTG_Interrupt_level2 & BIT0) // full packet vUsb_Bulk_Out(mUsbFIFOOutByteCount(FIFO0)); // YPING : use FIFO0 for ep1( bulk in) if (OTG_Interrupt_level2 & BIT16) vUsb_Bulk_In(); // YPING : FIFO3 for ep4( Interrupt out) if (OTG_Interrupt_level2 & BIT7) // short packet vOTG_Interrupt_Out(); else if (OTG_Interrupt_level2 & BIT6) // full packet vOTG_Interrupt_Out(); // YPING : use FIFO2 for ep3( Interrupt In) if (OTG_Interrupt_level2 & BIT18) vOTG_Interrupt_In(); #endif#endif#if (OTG_AP_Satus == Interrupt_AP) if(bOTGHighSpeed) { // YPING : High speed use FIFO2 for ep2( Interrupt out) if (OTG_Interrupt_level2 & BIT5) // short packet vOTG_Interrupt_Out(); else if (OTG_Interrupt_level2 & BIT4) // full packet vOTG_Interrupt_Out(); } else { // YPING : Full speed use FIFO1 for ep2( Interrupt out) if (OTG_Interrupt_level2 & BIT3) // short packet vOTG_Interrupt_Out(); else if (OTG_Interrupt_level2 & BIT2) // full packet vOTG_Interrupt_Out(); } // YPING : use FIFO0 for ep1( Interrupt In) if (OTG_Interrupt_level2 & BIT16) vOTG_Interrupt_In(); #endif#if (OTG_AP_Satus == IsochronousIN_AP) if (OTG_Interrupt_level2 & BIT16) vOTG_ISO_In();#endif#if (OTG_AP_Satus == IsochronousOUT_AP) if (OTG_Interrupt_level2 & BIT1) // short packet vOTG_ISO_Out(); else if (OTG_Interrupt_level2 & BIT0) // full packet vOTG_ISO_Out();#endif } // Clear usb interrupt flags OTG_interrupt_level1 = 0; // fLib_EnableInt(IRQ_FOTG200);}///////////////////////////////////////////////////////////////////////////////// vOTG_ep0setup()// Description:// 1. Read 8-byte setup packet.// 2. Decode command as Standard, Class, Vendor or NOT support command// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_ep0setup(void){ INT8U c; INT32U *u32UsbCmd;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -