Example #1
0
bool Pipe_ConfigurePipe(const uint8_t  Number, const uint8_t Type, const uint8_t Token, const uint8_t EndpointNumber,
						const uint16_t Size, const uint8_t Banks)
{
	Pipe_SelectPipe(Number);
	Pipe_EnablePipe();

	UPCFG1X = 0;
	
	UPCFG0X = ((Type << EPTYPE0) | Token | (EndpointNumber << PEPNUM0));
	UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));

	return Pipe_IsConfigured();
}
Example #2
0
void Pipe_ConfigurePipe_P(const uint8_t  PipeNum,
                          const uint16_t PipeSize,
                          const uint8_t  UPCFG0Xdata,
                          const uint8_t  UPCFG1Xdata)
{
	Pipe_SelectPipe(PipeNum);
	Pipe_EnablePipe();
	
	UPCFG0X = UPCFG0Xdata;
	UPCFG1X = ((UPCFG1X & (1 << ALLOC)) | UPCFG1Xdata | Pipe_BytesToEPSizeMask(PipeSize));
	UPCFG2X = 0;
	
	Pipe_AllocateMemory();
}
Example #3
0
bool Pipe_ConfigurePipe(const uint8_t Address,
                        const uint8_t Type,
                        const uint8_t EndpointAddress,
                        const uint16_t Size,
                        const uint8_t Banks)
{
	uint8_t Number = (Address & PIPE_EPNUM_MASK);
	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;

	if (Number >= PIPE_TOTAL_PIPES)
	  return false;

	if (Type == EP_TYPE_CONTROL)
	  Token = PIPE_TOKEN_SETUP;

#if defined(ORDERED_EP_CONFIG)
	Pipe_SelectPipe(Number);
	Pipe_EnablePipe();

	UPCFG1X = 0;

	UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0));
	UPCFG1X = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size));

	Pipe_SetInfiniteINRequests();

	return Pipe_IsConfigured();
#else
	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
	{
		uint8_t UPCFG0XTemp;
		uint8_t UPCFG1XTemp;
		uint8_t UPCFG2XTemp;
		uint8_t UPIENXTemp;

		Pipe_SelectPipe(PNum);

		if (PNum == Number)
		{
			UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0));
			UPCFG1XTemp = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size));
			UPCFG2XTemp = 0;
			UPIENXTemp  = 0;
		}
		else
		{
			UPCFG0XTemp = UPCFG0X;
			UPCFG1XTemp = UPCFG1X;
			UPCFG2XTemp = UPCFG2X;
			UPIENXTemp  = UPIENX;
		}

		if (!(UPCFG1XTemp & (1 << ALLOC)))
		  continue;

		Pipe_DisablePipe();
		UPCFG1X &= ~(1 << ALLOC);

		Pipe_EnablePipe();
		UPCFG0X = UPCFG0XTemp;
		UPCFG1X = UPCFG1XTemp;
		UPCFG2X = UPCFG2XTemp;
		UPIENX  = UPIENXTemp;

		Pipe_SetInfiniteINRequests();

		if (!(Pipe_IsConfigured()))
		  return false;
	}

	Pipe_SelectPipe(Number);
	return true;
#endif
}
Example #4
0
bool Pipe_ConfigurePipe(const uint8_t Address,
                        const uint8_t Type,
                        const uint8_t EndpointAddress,
                        const uint16_t Size,
                        const uint8_t Banks)
{
	uint8_t Number = (Address & PIPE_EPNUM_MASK);
	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT;

	if (Number >= PIPE_TOTAL_PIPES)
	  return false;

	if (Type == EP_TYPE_CONTROL)
	  Token = PIPE_TOKEN_SETUP;

	USB_Pipe_FIFOPos[Number]     = &AVR32_USBB_SLAVE[Number * PIPE_HSB_ADDRESS_SPACE_SIZE];

#if defined(ORDERED_EP_CONFIG)
	Pipe_SelectPipe(Number);
	Pipe_EnablePipe();

	(&AVR32_USBB.upcfg0)[Number] = 0;
	(&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
	                                ((uint32_t)Type  << AVR32_USBB_PTYPE_OFFSET)  |
	                                ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
	                                ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       |
	                                Pipe_BytesToEPSizeMask(Size) |
	                                ((uint32_t)Number << AVR32_USBB_PEPNUM_OFFSET));

	Pipe_SetInfiniteINRequests();

	return Pipe_IsConfigured();
#else
	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
	{
		uint32_t UPCFG0Temp;

		Pipe_SelectPipe(PNum);

		if (PNum == Number)
		{
			UPCFG0Temp = (AVR32_USBB_ALLOC_MASK |
			              ((uint32_t)Type  << AVR32_USBB_PTYPE_OFFSET)  |
			              ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
			              ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       |
			              Pipe_BytesToEPSizeMask(Size) |
			              ((EndpointAddress & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
		}
		else
		{
			UPCFG0Temp = (&AVR32_USBB.upcfg0)[PNum];
		}

		if (!(UPCFG0Temp & AVR32_USBB_ALLOC_MASK))
		  continue;

		Pipe_DisablePipe();
		(&AVR32_USBB.upcfg0)[PNum] &= ~AVR32_USBB_ALLOC_MASK;

		Pipe_EnablePipe();
		(&AVR32_USBB.upcfg0)[PNum] = UPCFG0Temp;

		Pipe_SetInfiniteINRequests();

		if (!(Pipe_IsConfigured()))
		  return false;
	}

	Pipe_SelectPipe(Number);
	return true;
#endif
}
Example #5
0
bool Pipe_ConfigurePipe(const uint8_t Number,
                        const uint8_t Type,
                        const uint8_t Token,
                        const uint8_t EndpointNumber,
                        const uint16_t Size,
                        const uint8_t Banks)
{
#if defined(ORDERED_EP_CONFIG)
	Pipe_SelectPipe(Number);
	Pipe_EnablePipe();

	UPCFG1X = 0;

	UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
	UPCFG1X = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));

	Pipe_SetInfiniteINRequests();

	return Pipe_IsConfigured();
#else	
	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++)
	{
		uint8_t UPCFG0XTemp;
		uint8_t UPCFG1XTemp;
		uint8_t UPCFG2XTemp;
		uint8_t UPCONXTemp;
		uint8_t UPINRQXTemp;
		uint8_t UPIENXTemp;

		Pipe_SelectPipe(PNum);
		
		if (PNum == Number)
		{
			UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointNumber & PIPE_EPNUM_MASK) << PEPNUM0));
			UPCFG1XTemp = ((1 << ALLOC) | Banks | Pipe_BytesToEPSizeMask(Size));
			UPCFG2XTemp = 0;
			UPCONXTemp  = ((1 << PEN) | (1 << INMODE));
			UPINRQXTemp = 0;
			UPIENXTemp  = 0;
		}
		else
		{
			UPCFG0XTemp = UPCFG0X;
			UPCFG1XTemp = UPCFG1X;
			UPCFG2XTemp = UPCFG2X;
			UPCONXTemp  = UPCONX;
			UPINRQXTemp = UPINRQX;
			UPIENXTemp  = UPIENX;
		}

		Pipe_SetInfiniteINRequests();
	
		if (!(UPCFG1XTemp & (1 << ALLOC)))
		  continue;
		  
		Pipe_DisablePipe();
		UPCFG1X &= (1 << ALLOC);

		Pipe_EnablePipe();
		UPCFG0X = UPCFG0XTemp;
		UPCFG1X = UPCFG1XTemp;
		UPCFG2X = UPCFG2XTemp;
		UPCONX  = UPCONXTemp;
		UPINRQX = UPINRQXTemp;
		UPIENX  = UPIENXTemp;

		if (!(Pipe_IsConfigured()))
		  return false;		
	}
		
	Pipe_SelectPipe(Number);	
	return true;
#endif
}