コード例 #1
0
/********************************************************************//**
 * @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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}