void USB_Init(void)
{
#if defined(USB_MULTI_PORTS)
	uint8_t i;
	USB_Memory_Init(USBRAM_BUFFER_SIZE);
	for(i = 0;i<MAX_USB_CORE;i++)
	{
		HAL_USBInit(i);
		USB_ResetInterface(i);
	}
#else
	USBPortNum = (uint8_t)USB_PORT_SELECTED;
	HAL_USBInit(USBPortNum);
	#if defined(USB_CAN_BE_HOST) 
	USB_Memory_Init(USBRAM_BUFFER_SIZE);
	#endif
	USB_ResetInterface(USBPortNum);
#endif
	USB_IsInitialized = true;
}
void USB_Init(uint8_t corenum, uint8_t mode)
{
#if defined(USB_CAN_BE_HOST)	
	if (mode == USB_MODE_Host && Mem_IsInitialized == false)
	{
	USB_Memory_Init(USBRAM_BUFFER_SIZE);
		Mem_IsInitialized = true;
	}
#endif
	USB_CurrentMode[corenum] = mode;
	HAL_USBInit(corenum);
	USB_ResetInterface(corenum, mode);
	USB_IsInitialized = true;
}
static void USB_Init_Host(void)
{
	//uint8_t i;

	//for(i=0;i<PIPE_TOTAL_PIPES;i++) PipeInfo[i].PipeHandle=0;

	pipeselected = PIPE_CONTROLPIPE;

	USB_Memory_Init(USBRAM_BUFFER_SIZE); /* TODO currently Memory Management for Host only */

	if(HcdInitDriver(USBPortNum)==HCD_STATUS_OK)
	{
		USB_IsInitialized = true;
		HAL_EnableUSBInterrupt();
	}
	else
	{
		USB_IsInitialized = false;
		HcdDeInitDriver(USBPortNum);
	}

	USB_HostState       = HOST_STATE_Unattached;
	USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
}