uint8_t USB_Host_SendControlRequest(const uint8_t corenum, void* const BufferPtr)
{
	uint8_t* DataStream   = (uint8_t*)BufferPtr;
	uint16_t DataLen      = USB_ControlRequest.wLength;
	uint8_t ret;

	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_HOSTTODEVICE)
	{
		Pipe_Write_Stream_LE(corenum, BufferPtr, DataLen, NULL);
	}

	ret = (uint8_t)HcdControlTransfer(PipeInfo[corenum][pipeselected[corenum]].PipeHandle, &USB_ControlRequest,
					   PipeInfo[corenum][pipeselected[corenum]].Buffer);

	if(ret == (uint8_t)HOST_SENDCONTROL_Successful)
	{
		if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
		{
			PipeInfo[corenum][pipeselected[corenum]].ByteTransfered = USB_ControlRequest.wLength;
			while(DataLen)
			{
				*(DataStream++) = Pipe_Read_8(corenum);
				DataLen--;
			}
			/* Pipe_Read_Stream_LE(BufferPtr, DataLen, NULL); cannot use read stream as it call HcdDataTransfer*/
		}
		PipeInfo[corenum][pipeselected[corenum]].StartIdx = PipeInfo[corenum][pipeselected[corenum]].ByteTransfered = 0; /* Clear Control Pipe */
		return HOST_SENDCONTROL_Successful;
	}
	else
	{
		return HOST_SENDCONTROL_PipeError;
	}
}
uint8_t USB_Host_SendControlRequest(void* const BufferPtr)
{
	uint8_t* DataStream   = (uint8_t*)BufferPtr;
	uint16_t DataLen      = USB_ControlRequest.wLength;

	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_HOSTTODEVICE)
	{
		Pipe_Write_Stream_LE(BufferPtr, DataLen, NULL);
	}

	HcdControlTransfer(PipeInfo[pipeselected].PipeHandle, &USB_ControlRequest, PipeInfo[pipeselected].Buffer);
	/* TODO Control Transfer Status */

	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST)
	{
		PipeInfo[pipeselected].ByteTransfered = USB_ControlRequest.wLength; // FIXME assume no errors
		while(DataLen)
		{
			*(DataStream++) = Pipe_Read_8();
			DataLen--;
		}
		/* Pipe_Read_Stream_LE(BufferPtr, DataLen, NULL); cannot use read stream as it call HcdDataTransfer*/ 
	}

	PipeInfo[pipeselected].StartIdx = PipeInfo[pipeselected].ByteTransfered = 0; /* Clear Control Pipe */

	return HOST_SENDCONTROL_Successful;
}