/********************************************************************//** * @brief * @param * @return *********************************************************************/ bool Endpoint_ConfigureEndpoint(const uint8_t Number, const uint8_t Type, const uint8_t Direction, const uint16_t Size, const uint8_t Banks) { uint8_t* ISO_Address; uint32_t PhyEP = 2*Number + (Direction == ENDPOINT_DIR_OUT ? 0 : 1); uint32_t EndPtCtrl = ENDPTCTRL_REG(Number); memset(&dQueueHead[PhyEP], 0, sizeof(DeviceQueueHead) ); dQueueHead[PhyEP].MaxPacketSize = Size & 0x3ff; dQueueHead[PhyEP].IntOnSetup = 1; dQueueHead[PhyEP].ZeroLengthTermination = 1; dQueueHead[PhyEP].overlay.NextTD = LINK_TERMINATE; if (Direction == ENDPOINT_DIR_OUT) { EndPtCtrl &= ~0x0000FFFF; EndPtCtrl |= ((Type << 2) & ENDPTCTRL_RxType) | ENDPTCTRL_RxEnable | ENDPTCTRL_RxToggleReset; if(Type == EP_TYPE_ISOCHRONOUS) { uint32_t size = 0; ENDPTCTRL_REG(Number) = (Type << 2); // TODO dummy to let DcdDataTransfer() knows iso transfer ISO_Address = (uint8_t*)CALLBACK_HAL_GetISOBufferAddress(Number, &size); DcdDataTransfer(PhyEP, ISO_Address,USB_DATA_BUFFER_TEM_LENGTH); } else USB_REG(USBPortNum)->ENDPTNAKEN |= (1 << EP_Physical2BitPosition(PhyEP)); }else /* ENDPOINT_DIR_IN */ { EndPtCtrl &= ~0xFFFF0000; EndPtCtrl |= ((Type << 18) & ENDPTCTRL_TxType)| ENDPTCTRL_TxEnable| ENDPTCTRL_TxToggleReset; if(Type == EP_TYPE_ISOCHRONOUS) { uint32_t size = 0; ENDPTCTRL_REG(Number) = (Type << 18); // TODO dummy to let DcdDataTransfer() knows iso transfer ISO_Address = (uint8_t*)CALLBACK_HAL_GetISOBufferAddress(Number, &size); DcdDataTransfer(PhyEP, ISO_Address, size); } } ENDPTCTRL_REG(Number) = EndPtCtrl; endpointhandle[Number] = (Number==ENDPOINT_CONTROLEP) ? ENDPOINT_CONTROLEP : PhyEP; return true; }
void DMANewTransferRequestISR() { uint32_t PhyEP; uint32_t NDDRIntSt = LPC_USB->NDDRIntSt; for (PhyEP = 2; PhyEP < USED_PHYSICAL_ENDPOINTS; PhyEP++) /* Check All Endpoints */ { if ( NDDRIntSt & _BIT(PhyEP) ) { if ( IsOutEndpoint(PhyEP) ) /* OUT Endpoint */ { if(dmaDescriptor[PhyEP].Isochronous == 1) // iso endpoint { DcdDataTransfer(PhyEP, ISO_Address,512); } else { uint16_t MaxPS = dmaDescriptor[PhyEP].MaxPacketSize; if(usb_data_buffer_OUT_size==0){ usb_data_buffer_OUT_index = 0; DcdDataTransfer(PhyEP, usb_data_buffer_OUT, MaxPS); }else{ uint32_t index = usb_data_buffer_OUT_index; DcdDataTransfer(PhyEP, &usb_data_buffer_OUT[usb_data_buffer_OUT_size + index], MaxPS); } } } else /* IN Endpoint */ { if(dmaDescriptor[PhyEP].Isochronous == 1) { ISO_Address = (uint8_t*)CALLBACK_HAL_GetISOBufferAddress(PhyEP/2,&SizeAudioTransfer); if(SizeAudioTransfer > 0) DcdDataTransfer(PhyEP, ISO_Address,SizeAudioTransfer); else DcdDataTransfer(PhyEP, ISO_Address,512); } } } } LPC_USB->NDDRIntClr = NDDRIntSt; }
void DMAEndTransferISR() { uint32_t PhyEP; uint32_t EoTIntSt = LPC_USB->EoTIntSt; for (PhyEP = 2; PhyEP < USED_PHYSICAL_ENDPOINTS; PhyEP++) /* Check All Endpoints */ { if ( EoTIntSt & _BIT(PhyEP) ) { if ( IsOutEndpoint(PhyEP) ) /* OUT Endpoint */ { if(dmaDescriptor[PhyEP].Isochronous == 1) // iso endpoint { #if 0 SizeAudioTransfer = (BufferAddressIso[0])& 0xFFFF; ISO_Address = (uint8_t*)CALLBACK_HAL_GetISOBufferAddress(PhyEP/2,&SizeAudioTransfer); DcdDataTransfer(PhyEP, ISO_Address,512); #endif //0 } usb_data_buffer_OUT_size += dmaDescriptor[PhyEP].PresentCount; uint32_t index = usb_data_buffer_OUT_index; if((usb_data_buffer_OUT_size + index + dmaDescriptor[PhyEP].MaxPacketSize) > 512) { LPC_USB->DMAIntEn &= (uint32_t)~(1<<1); } } else /* IN Endpoint */ { /* Should be left blank */ } } } LPC_USB->EoTIntClr = EoTIntSt; }