From 4904b10ef689a11b420c0a32da747533f4378712 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 13 May 2009 14:13:57 +0000
Subject: [PATCH] Moved USB Host state machine code out from USBTask.c and into
 Host.c, where it more properly belongs.

---
 Demos/Device/Keyboard/Keyboard.c     |   2 -
 LUFA/Drivers/USB/HighLevel/Events.h  |   2 +-
 LUFA/Drivers/USB/HighLevel/USBTask.c | 171 +-------------------------
 LUFA/Drivers/USB/LowLevel/Host.c     | 173 ++++++++++++++++++++++++++-
 LUFA/Drivers/USB/LowLevel/Host.h     |   6 +-
 LUFA/Drivers/USB/LowLevel/LowLevel.h |   2 +-
 LUFA/Drivers/USB/LowLevel/OTG.h      |   1 -
 LUFA/LUFAPoweredProjects.txt         |   1 +
 8 files changed, 182 insertions(+), 176 deletions(-)

diff --git a/Demos/Device/Keyboard/Keyboard.c b/Demos/Device/Keyboard/Keyboard.c
index 7b9317265..928d95b62 100644
--- a/Demos/Device/Keyboard/Keyboard.c
+++ b/Demos/Device/Keyboard/Keyboard.c
@@ -44,9 +44,7 @@ TASK_LIST
 	{ .Task = USB_USBTask          , .TaskStatus = TASK_STOP },
 	#endif
 	
-	#if !defined(INTERRUPT_DATA_ENDPOINT)
 	{ .Task = USB_Keyboard_Report  , .TaskStatus = TASK_STOP },
-	#endif
 };
 
 /* Global Variables */
diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h
index 36e16c98b..45ad801de 100644
--- a/LUFA/Drivers/USB/HighLevel/Events.h
+++ b/LUFA/Drivers/USB/HighLevel/Events.h
@@ -398,7 +398,7 @@
 
 		/* Function Prototypes: */
 			#if defined(INCLUDE_FROM_EVENTS_C)
-				void USB_Event_Stub (void) ATTR_CONST;
+				void USB_Event_Stub(void) ATTR_CONST;
 
 				#if defined(USB_FULL_CONTROLLER) || defined(USB_MODIFIED_FULL_CONTROLLER)
 					ALIAS_STUB(USB_VBUSChange);
diff --git a/LUFA/Drivers/USB/HighLevel/USBTask.c b/LUFA/Drivers/USB/HighLevel/USBTask.c
index 5202cc834..e2b7e91d5 100644
--- a/LUFA/Drivers/USB/HighLevel/USBTask.c
+++ b/LUFA/Drivers/USB/HighLevel/USBTask.c
@@ -81,178 +81,11 @@ static void USB_DeviceTask(void)
 #if defined(USB_CAN_BE_HOST)
 static void USB_HostTask(void)
 {
-	uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
-	uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
-	uint8_t PrevPipe     = Pipe_GetCurrentPipe();
+	uint8_t PrevPipe = Pipe_GetCurrentPipe();
 	
-	static uint16_t WaitMSRemaining;
-	static uint8_t  PostWaitState;
-
 	Pipe_SelectPipe(PIPE_CONTROLPIPE);
 
-	switch (USB_HostState)
-	{
-		case HOST_STATE_WaitForDevice:
-			if (WaitMSRemaining)
-			{
-				if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
-				{
-					USB_HostState = PostWaitState;
-					ErrorCode     = HOST_ENUMERROR_WaitStage;
-					break;
-				}
-				
-				WaitMSRemaining--;
-			}
-			else
-			{
-				USB_HostState = PostWaitState;
-			}
-		
-			break;
-		case HOST_STATE_Attached:
-			WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
-		
-			USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;
-			break;
-		case HOST_STATE_Attached_WaitForDeviceSettle:
-			_delay_ms(1);
-
-			if (!(WaitMSRemaining--))
-			{
-				USB_Host_VBUS_Manual_Off();
-
-				USB_OTGPAD_On();
-				USB_Host_VBUS_Auto_Enable();
-				USB_Host_VBUS_Auto_On();
-				
-				USB_HostState = HOST_STATE_Attached_WaitForConnect;
-			}
-			
-			break;
-		case HOST_STATE_Attached_WaitForConnect:		
-			if (USB_INT_HasOccurred(USB_INT_DCONNI))
-			{	
-				USB_INT_Clear(USB_INT_DCONNI);
-				USB_INT_Clear(USB_INT_DDISCI);
-
-				USB_INT_Clear(USB_INT_VBERRI);
-				USB_INT_Enable(USB_INT_VBERRI);
-
-				USB_IsConnected = true;
-				RAISE_EVENT(USB_Connect);
-					
-				USB_Host_ResumeBus();
-				Pipe_ClearPipes();
-				
-				HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Attached_DoReset);
-			}
-
-			break;
-		case HOST_STATE_Attached_DoReset:
-			USB_Host_ResetDevice();
-
-			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered);
-			break;
-		case HOST_STATE_Powered:
-			Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
-							   PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
-							   PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);		
-		
-			if (!(Pipe_IsConfigured()))
-			{
-				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
-				SubErrorCode = 0;
-				break;
-			}
-
-			USB_HostState = HOST_STATE_Default;
-			break;
-		case HOST_STATE_Default:
-			USB_ControlRequest = (USB_Request_Header_t)
-				{
-					.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
-					.bRequest      = REQ_GetDescriptor,
-					.wValue        = (DTYPE_Device << 8),
-					.wIndex        = 0,
-					.wLength       = 8,
-				};
-
-			uint8_t DataBuffer[8];
-
-			if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
-			{
-				ErrorCode = HOST_ENUMERROR_ControlError;
-				break;
-			}
-
-			#if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
-			USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
-			#else
-			USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, bMaxPacketSize0)];			
-			#endif
-	
-			USB_Host_ResetDevice();
-			
-			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
-			break;
-		case HOST_STATE_Default_PostReset:
-			Pipe_DisablePipe();
-			Pipe_DeallocateMemory();		
-			Pipe_ResetPipe(PIPE_CONTROLPIPE);
-			
-			Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
-			                   PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
-			                   USB_ControlPipeSize, PIPE_BANK_SINGLE);
-
-			if (!(Pipe_IsConfigured()))
-			{
-				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
-				SubErrorCode = 0;
-				break;
-			}
-
-			Pipe_SetInfiniteINRequests();
-			
-			USB_ControlRequest = (USB_Request_Header_t)
-				{
-					.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
-					.bRequest      = REQ_SetAddress,
-					.wValue        = USB_HOST_DEVICEADDRESS,
-					.wIndex        = 0,
-					.wLength       = 0,
-				};
-
-			if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
-			{
-				ErrorCode = HOST_ENUMERROR_ControlError;
-				break;
-			}
-
-			HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
-			break;
-		case HOST_STATE_Default_PostAddressSet:
-			USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
-
-			RAISE_EVENT(USB_DeviceEnumerationComplete);
-			USB_HostState = HOST_STATE_Addressed;
-
-			break;
-	}
-
-	if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
-	{
-		RAISE_EVENT(USB_DeviceEnumerationFailed, ErrorCode, SubErrorCode);
-
-		USB_Host_VBUS_Auto_Off();
-
-		RAISE_EVENT(USB_DeviceUnattached);
-		
-		if (USB_IsConnected)
-		  RAISE_EVENT(USB_Disconnect);
-
-		USB_ResetInterface();
-	}
+	USB_Host_ProcessNextHostState();
 	
 	Pipe_SelectPipe(PrevPipe);
 }
diff --git a/LUFA/Drivers/USB/LowLevel/Host.c b/LUFA/Drivers/USB/LowLevel/Host.c
index fe02f7cd1..9630b6aa1 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.c
+++ b/LUFA/Drivers/USB/LowLevel/Host.c
@@ -32,8 +32,179 @@
 
 #if defined(USB_CAN_BE_HOST)
 
+#define  INCLUDE_FROM_HOST_C
 #include "Host.h"
 
+void USB_Host_ProcessNextHostState(void)
+{
+	uint8_t ErrorCode    = HOST_ENUMERROR_NoError;
+	uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
+
+	static uint16_t WaitMSRemaining;
+	static uint8_t  PostWaitState;
+
+	switch (USB_HostState)
+	{
+		case HOST_STATE_WaitForDevice:
+			if (WaitMSRemaining)
+			{
+				if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+				{
+					USB_HostState = PostWaitState;
+					ErrorCode     = HOST_ENUMERROR_WaitStage;
+					break;
+				}
+				
+				if (!(WaitMSRemaining--))
+				  USB_HostState = PostWaitState;
+			}
+		
+			break;
+		case HOST_STATE_Attached:
+			WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
+		
+			USB_HostState = HOST_STATE_Attached_WaitForDeviceSettle;
+			break;
+		case HOST_STATE_Attached_WaitForDeviceSettle:
+			_delay_ms(1);
+
+			if (!(WaitMSRemaining--))
+			{
+				USB_Host_VBUS_Manual_Off();
+
+				USB_OTGPAD_On();
+				USB_Host_VBUS_Auto_Enable();
+				USB_Host_VBUS_Auto_On();
+				
+				USB_HostState = HOST_STATE_Attached_WaitForConnect;
+			}
+			
+			break;
+		case HOST_STATE_Attached_WaitForConnect:		
+			if (USB_INT_HasOccurred(USB_INT_DCONNI))
+			{	
+				USB_INT_Clear(USB_INT_DCONNI);
+				USB_INT_Clear(USB_INT_DDISCI);
+
+				USB_INT_Clear(USB_INT_VBERRI);
+				USB_INT_Enable(USB_INT_VBERRI);
+
+				USB_IsConnected = true;
+				RAISE_EVENT(USB_Connect);
+					
+				USB_Host_ResumeBus();
+				Pipe_ClearPipes();
+				
+				HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Attached_DoReset);
+			}
+
+			break;
+		case HOST_STATE_Attached_DoReset:
+			USB_Host_ResetDevice();
+
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered);
+			break;
+		case HOST_STATE_Powered:
+			Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+							   PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+							   PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);		
+		
+			if (!(Pipe_IsConfigured()))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			USB_HostState = HOST_STATE_Default;
+			break;
+		case HOST_STATE_Default:
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_GetDescriptor,
+					.wValue        = (DTYPE_Device << 8),
+					.wIndex        = 0,
+					.wLength       = 8,
+				};
+
+			uint8_t DataBuffer[8];
+
+			if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			#if defined(USE_NONSTANDARD_DESCRIPTOR_NAMES)
+			USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
+			#else
+			USB_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, bMaxPacketSize0)];			
+			#endif
+	
+			USB_Host_ResetDevice();
+			
+			HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
+			break;
+		case HOST_STATE_Default_PostReset:
+			Pipe_DisablePipe();
+			Pipe_DeallocateMemory();		
+			Pipe_ResetPipe(PIPE_CONTROLPIPE);
+			
+			Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+			                   PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+			                   USB_ControlPipeSize, PIPE_BANK_SINGLE);
+
+			if (!(Pipe_IsConfigured()))
+			{
+				ErrorCode    = HOST_ENUMERROR_PipeConfigError;
+				SubErrorCode = 0;
+				break;
+			}
+
+			Pipe_SetInfiniteINRequests();
+			
+			USB_ControlRequest = (USB_Request_Header_t)
+				{
+					.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+					.bRequest      = REQ_SetAddress,
+					.wValue        = USB_HOST_DEVICEADDRESS,
+					.wIndex        = 0,
+					.wLength       = 0,
+				};
+
+			if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+			{
+				ErrorCode = HOST_ENUMERROR_ControlError;
+				break;
+			}
+
+			HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
+			break;
+		case HOST_STATE_Default_PostAddressSet:
+			USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
+
+			RAISE_EVENT(USB_DeviceEnumerationComplete);
+			USB_HostState = HOST_STATE_Addressed;
+
+			break;
+	}
+
+	if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
+	{
+		RAISE_EVENT(USB_DeviceEnumerationFailed, ErrorCode, SubErrorCode);
+
+		USB_Host_VBUS_Auto_Off();
+
+		RAISE_EVENT(USB_DeviceUnattached);
+		
+		if (USB_IsConnected)
+		  RAISE_EVENT(USB_Disconnect);
+
+		USB_ResetInterface();
+	}
+}
+
 uint8_t USB_Host_WaitMS(uint8_t MS)
 {
 	bool    BusSuspended = USB_Host_IsBusSuspended();
@@ -80,7 +251,7 @@ uint8_t USB_Host_WaitMS(uint8_t MS)
 	return ErrorCode;
 }
 
-void USB_Host_ResetDevice(void)
+static void USB_Host_ResetDevice(void)
 {
 	bool BusSuspended = USB_Host_IsBusSuspended();
 
diff --git a/LUFA/Drivers/USB/LowLevel/Host.h b/LUFA/Drivers/USB/LowLevel/Host.h
index 9ce995f84..4457c07d8 100644
--- a/LUFA/Drivers/USB/LowLevel/Host.h
+++ b/LUFA/Drivers/USB/LowLevel/Host.h
@@ -265,8 +265,12 @@
 			};
 
 		/* Function Prototypes: */
+			void    USB_Host_ProcessNextHostState(void);
 			uint8_t USB_Host_WaitMS(uint8_t MS);
-			void    USB_Host_ResetDevice(void);
+			
+			#if defined(INCLUDE_FROM_HOST_C)
+				static void USB_Host_ResetDevice(void);
+			#endif
 	#endif
 
 	/* Disable C linkage for C++ Compilers: */
diff --git a/LUFA/Drivers/USB/LowLevel/LowLevel.h b/LUFA/Drivers/USB/LowLevel/LowLevel.h
index a5adf99f1..fad1cbf1f 100644
--- a/LUFA/Drivers/USB/LowLevel/LowLevel.h
+++ b/LUFA/Drivers/USB/LowLevel/LowLevel.h
@@ -359,7 +359,7 @@
 	
 		/* Inline Functions: */
 			#if defined(USB_CAN_BE_BOTH)
-			static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT;
+			static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline uint8_t USB_GetUSBModeFromUID(void)
 			{
 				if (USBSTA & (1 << ID))
diff --git a/LUFA/Drivers/USB/LowLevel/OTG.h b/LUFA/Drivers/USB/LowLevel/OTG.h
index 6d8185c26..d3dee96f3 100644
--- a/LUFA/Drivers/USB/LowLevel/OTG.h
+++ b/LUFA/Drivers/USB/LowLevel/OTG.h
@@ -106,7 +106,6 @@
 				 */
 				static inline void USB_OTG_Dev_InitiateSRP(uint8_t SRPTypeMask);
 			#else
-
 				#define USB_OTG_Device_RequestHNP()         MACROS{ OTGCON |=  (1 << HNPREQ); }MACROE
 
 				#define USB_OTG_Device_CancelHNPRequest()   MACROS{ OTGCON &= ~(1 << HNPREQ); }MACROE
diff --git a/LUFA/LUFAPoweredProjects.txt b/LUFA/LUFAPoweredProjects.txt
index e1ba65de1..b93604e2f 100644
--- a/LUFA/LUFAPoweredProjects.txt
+++ b/LUFA/LUFAPoweredProjects.txt
@@ -28,4 +28,5 @@
  *  - SEGA Megadrive/Genesis Development Cartridge: http://www.spritesmind.net/_GenDev/forum/viewtopic.php?t=464
  *  - CAMTRIG, a remote Camera Trigger device: http://code.astraw.com/projects/motmot/camtrig
  *  - Opendous-JTAG, an open source JTAG device: http://code.google.com/p/opendous-jtag/
+ *  - Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/
  */
\ No newline at end of file
-- 
GitLab