📄 pe_usb.c
字号:
case 0x50: pu8OTGDescriptorEX = &u8OTGString50DescriptorEX[0]; u16OTGTxRxCounter = u8OTGString50DescriptorEX[0]; break; default: return FALSE; } break; default: return FALSE; } if (u16OTGTxRxCounter > ControlOTGCmd.Length) u16OTGTxRxCounter = ControlOTGCmd.Length; eOTGCxCommand = CMD_SET_DESCRIPTOR; return TRUE;} ///////////////////////////////////////////////////////////////////////////////// vGet_OTGconfiguration()// Description:// 1. Send 1 bytes configuration value to host.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vGet_OTGconfiguration(void){ INT8U u8Tmp[2]; u8Tmp[0] = u8OTGConfigValue; vOTGCxFWr( u8Tmp, 1); eOTGCxFinishAction = ACT_DONE;}///////////////////////////////////////////////////////////////////////////////// bSet_OTGconfiguration()// Description:// 1. Get 1 bytes configuration value from host.// 2-1. if(value == 0) then device return to address state// 2-2. if(value match descriptor table)// then config success & Clear all EP toggle bit// 2-3 else stall this command// input: none// output: TRUE or FALSE///////////////////////////////////////////////////////////////////////////////BOOLEAN bSet_OTGconfiguration(void){ if ((INT8U)ControlOTGCmd.Value == 0) { u8OTGConfigValue = 0; mUsbCfgClr(); } else { if (mUsbOTGHighSpeedST()) // First judge HS or FS?? { if ((INT8U)ControlOTGCmd.Value > HS_CONFIGURATION_NUMBER) return FALSE; u8OTGConfigValue = (INT8U)ControlOTGCmd.Value; vOTGClrEPxFIFOxReg(); vOTGFIFO_EPxCfg_HS(); mUsbSOFMaskHS(); } else { if ((INT8U)ControlOTGCmd.Value > FS_CONFIGURATION_NUMBER) return FALSE; u8OTGConfigValue = (INT8U)ControlOTGCmd.Value; vOTGFIFO_EPxCfg_FS(); mUsbSOFMaskFS(); } mUsbCfgSet(); vOTGClrEPx(); } if ((INT8U)ControlOTGCmd.Value == 1) // Card Reader App. {#if (OTG_AP_Satus == Bulk_AP) #if(Bulk_Satus == Bulk_FIFO_SingleDir) { mUsbIntF2OUTEn(); } #elif(Bulk_Satus == Bulk_FIFO_BiDir) mUsbIntF0OUTEn(); mUsbIntF2INEn(); mUsbIntF3OUTEn(); #endif mUsbIntF0INDis();#endif #if (OTG_AP_Satus == Interrupt_AP) mUsbIntF0INEn(); if(bOTGHighSpeed) mUsbIntF2OUTEn(); else mUsbIntF1OUTEn(); #endif #if (OTG_AP_Satus == IsochronousIN_AP) mUsbIntF0INEn();#endif#if (OTG_AP_Satus == IsochronousOUT_AP) mUsbIntF0OUTEn();#endif } eOTGCxFinishAction = ACT_DONE; return TRUE;}///////////////////////////////////////////////////////////////////////////////// bGet_OTGinterface()// Description:// Getting interface// input: none// output: TRUE or FALSE///////////////////////////////////////////////////////////////////////////////BOOLEAN bGet_OTGinterface(void){ INT8U u8Tmp[2]; if (mUsbCfgST() == 0) return FALSE; // If there exists many interfaces, Interface0,1,2,...N, // You must check & select the specific one switch (u8OTGConfigValue) { #if (HS_CONFIGURATION_NUMBER >= 1) // Configuration 1 case 1: if (ControlOTGCmd.Index > HS_C1_INTERFACE_NUMBER) return FALSE; break; #endif #if (HS_CONFIGURATION_NUMBER >= 2) // Configuration 2 case 2: if (ControlOTGCmd.Index > HS_C2_INTERFACE_NUMBER) return FALSE; break; #endif default: return FALSE; } u8Tmp[0] = u8OTGInterfaceAlternateSetting; vOTGCxFWr( u8Tmp, 1); eOTGCxFinishAction = ACT_DONE; return TRUE;}///////////////////////////////////////////////////////////////////////////////// bSet_OTGinterface()// Description:// 1-1. If (the device stays in Configured state)// &(command match the alternate setting)// then change the interface// 1-2. else stall it// input: none// output: TRUE or FALSE///////////////////////////////////////////////////////////////////////////////BOOLEAN bSet_OTGinterface(void){ if (mUsbCfgST() ) {// if(u8OTGMessageLevel & MESS_INFO)// {// printf("L%x: EP0Cmd:", u8LineOTGCount ++); // } // If there exists many interfaces, Interface0,1,2,...N, // You must check & select the specific one switch (ControlOTGCmd.Index) { case 0: // Interface0 if((INT8U)ControlOTGCmd.Value == u8ConfigOTGDescriptorEX[12]) { u8OTGInterfaceValue = (INT8U)ControlOTGCmd.Index; u8OTGInterfaceAlternateSetting = (INT8U)ControlOTGCmd.Value; vOTGClrEPxFIFOxReg(); if (mUsbOTGHighSpeedST()) // First judge HS or FS?? vOTGFIFO_EPxCfg_HS(); else vOTGFIFO_EPxCfg_FS(); vOTGClrEPx(); eOTGCxFinishAction = ACT_DONE; return TRUE; } case 1: // Interface1 case 2: // Interface2 default: break; } } return FALSE;}///////////////////////////////////////////////////////////////////////////////// bSynch_OTGframe()// Description:// 1. If the EP is a Iso EP, then return the 2 bytes Frame number.// else stall this command// input: none// output: TRUE or FALSE///////////////////////////////////////////////////////////////////////////////BOOLEAN bSynch_OTGframe(void){ INT8S TransferType; INT16U u16Tmp; TransferType = -1; // Does the Endpoint support Isochronous transfer type? switch(ControlOTGCmd.Index) { case 1: // EP1 TransferType = u8ConfigOTGDescriptorEX[22] & 0x03; break;#if 0 case 2: // EP2 TransferType = u8ConfigOTGDescriptorEX[29] & 0x03; break; case 3: // EP3 TransferType = u8ConfigOTGDescriptorEX[36] & 0x03; break; case 4: // EP4 TransferType = u8ConfigOTGDescriptorEX[43] & 0x03; break; case 5: // EP5 TransferType = u8ConfigOTGDescriptorEX[50] & 0x03; break; #endif default: break; } if (TransferType == 1) // Isochronous { u16Tmp = mUsbFrameNo(); vOTGCxFWr( &u16Tmp, 2); eOTGCxFinishAction = ACT_DONE; return TRUE; } else return FALSE;}///////////////////////////////////////////////////////////////////////////////// vOTGEP0TxData()// Description:// 1. Send data(max or short packet) to host.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGEP0TxData(void){ INT8U u8temp; if(u16OTGTxRxCounter < EP0MAXPACKETSIZE) u8temp = (INT8U)u16OTGTxRxCounter; else u8temp = EP0MAXPACKETSIZE; u16OTGTxRxCounter -= (INT16U)u8temp; // Transmit u8Temp bytes data vOTGCxFWr( pu8OTGDescriptorEX, u8temp); pu8OTGDescriptorEX = pu8OTGDescriptorEX + u8temp; eOTGCxFinishAction = ACT_DONE; // end of the data stage if (u16OTGTxRxCounter == 0) { eOTGCxCommand = CMD_VOID; }}///////////////////////////////////////////////////////////////////////////////// vOTGEP0RxData()// Description:// 1. Receive data(max or short packet) from host.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGEP0RxData(void){ INT8U u8temp; 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) { eOTGCxCommand = CMD_VOID; eOTGCxFinishAction = ACT_DONE; }}///////////////////////////////////////////////////////////////////////////////// vOTGClrEPx()// Description:// 1. Clear all endpoint Toggle Bit// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGClrEPx(void){ INT8U u8ep; // Clear All EPx Toggle Bit for (u8ep = 1; u8ep <= FOTG200_Periph_MAX_EP; u8ep ++) { mUsbEPinRsTgSet(u8ep); mUsbEPinRsTgClr(u8ep); } for (u8ep = 1; u8ep <= FOTG200_Periph_MAX_EP; u8ep ++) { mUsbEPoutRsTgSet(u8ep); mUsbEPoutRsTgClr(u8ep); }}///////////////////////////////////////////////////////////////////////////////// vOTGClrEPxFIFOxReg()// Description:// 1. Clear all endpoint & FIFO register setting// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGClrEPxFIFOxReg(void){ INT8U u8ep; for (u8ep = 1; u8ep <= FOTG200_Periph_MAX_EP; u8ep ++) { mUsbEPMxPtSzClr(u8ep,DIRECTION_IN); mUsbEPMxPtSzClr(u8ep,DIRECTION_OUT); } mUsbEPMapAllClr(); mUsbFIFOMapAllClr(); mUsbFIFOConfigAllClr();}///////////////////////////////////////////////////////////////////////////////// vOTG_ISO_SeqErr()// Description:// 1. FOTG200 Device Detects High bandwidth isochronous Data PID sequential error.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_ISO_SeqErr(void){ INT8U u8Tmp = mUsbIntIsoSeqErrRd(); INT8U i; mUsbIntIsoSeqErrSetClr(u8Tmp); for(i = 1; i < 8; i ++) { if(u8Tmp & (BIT0 << i)) { if(u8OTGMessageLevel & MESS_INFO) { printf("L%x: EP%x Isochronous Sequential Error\n", u8LineOTGCount ++, i); } } }}///////////////////////////////////////////////////////////////////////////////// vOTG_ISO_SeqAbort()// Description:// 1. FOTG200 Device Detects High bandwidth isochronous Data PID sequential abort.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_ISO_SeqAbort(void){ INT8U u8Tmp = mUsbIntIsoSeqAbortRd(); INT8U i; mUsbIntIsoSeqAbortSetClr(u8Tmp); for(i = 1; i < 8; i ++) { if(u8Tmp & (BIT0 << i)) { if(u8OTGMessageLevel & MESS_INFO) { printf("L%x: EP%x Isochronous Sequential Abort\n", u8LineOTGCount ++, i); } } }}///////////////////////////////////////////////////////////////////////////////// vOTG_TX0Byte()// Description:// 1. Send 0 byte data to host.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_TX0Byte(void){ INT8U u8Tmp = mUsbIntTX0ByteRd(); INT8U i; mUsbIntTX0ByteSetClr(u8Tmp); for(i = 1; i < 8; i ++) { if(u8Tmp & (BIT0 << i)) { if(u8OTGMessageLevel & MESS_INFO) {// printf("L%x: EP%x IN data 0 byte to host\n", u8LineOTGCount ++, i); } } }}///////////////////////////////////////////////////////////////////////////////// vOTG_RX0Byte()// Description:// 1. Receive 0 byte data from host.// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTG_RX0Byte(void){ INT8U u8Tmp = mUsbIntRX0ByteRd(); INT8U i; mUsbIntRX0ByteSetClr(u8Tmp); for(i = 1; i < 8; i ++) { if(u8Tmp & (BIT0 << i)) { if(u8OTGMessageLevel & MESS_ERROR) { printf("L%x: EP%x OUT data 0 byte to Device\n", u8LineOTGCount ++, i); } } }}///////////////////////////////////////////////////////////////////////////////// vOTGCheckDMA()// Description: Check OTG DMA finish or error// input: none// output: none///////////////////////////////////////////////////////////////////////////////void vOTGCheckDMA(void){ // UINT8 *pData; #if 0 if(eUsbOTGMassStorageState == STATE_CB_DATA_IN) mUsbFIFODone(FIFO0);#endif bOTGDMARunning = FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -