From 8bb007f80b3e275c9857a5ffa2cf597711fb7478 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 9 Nov 2009 08:24:01 +0000
Subject: [PATCH] Fixed HID host Class driver report send/receive report broken
 when issued through the control pipe.

Make Mass Storage device Class driver accept resets at any time, rather than just after a command block has been processed.

Remove the HID device parser from the boot protocol Keyboard/Mouse demos.
---
 Demos/Host/ClassDriver/KeyboardHost/makefile |  1 -
 Demos/Host/ClassDriver/MouseHost/makefile    |  1 -
 LUFA/Drivers/USB/Class/Common/HID.h          |  8 +++++
 LUFA/Drivers/USB/Class/Device/MassStorage.c  | 31 +++++++++-----------
 LUFA/Drivers/USB/Class/Host/HID.c            |  4 +--
 LUFA/Drivers/USB/Class/Host/HID.h            |  5 +++-
 LUFA/Drivers/USB/Class/Host/HIDParser.h      | 11 ++-----
 LUFA/ManPages/ChangeLog.txt                  |  1 +
 LUFA/ManPages/FutureChanges.txt              |  2 +-
 9 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/Demos/Host/ClassDriver/KeyboardHost/makefile b/Demos/Host/ClassDriver/KeyboardHost/makefile
index ab4704c7f..4a682b037 100644
--- a/Demos/Host/ClassDriver/KeyboardHost/makefile
+++ b/Demos/Host/ClassDriver/KeyboardHost/makefile
@@ -137,7 +137,6 @@ SRC = $(TARGET).c                                                 \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c  \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/HID.c            \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/HID.c              \
-	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/HIDParser.c        \
 	  
 
 # List C++ source files here. (C dependencies are automatically generated.)
diff --git a/Demos/Host/ClassDriver/MouseHost/makefile b/Demos/Host/ClassDriver/MouseHost/makefile
index 9564b74ad..d37d4d53d 100644
--- a/Demos/Host/ClassDriver/MouseHost/makefile
+++ b/Demos/Host/ClassDriver/MouseHost/makefile
@@ -137,7 +137,6 @@ SRC = $(TARGET).c                                                 \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/HighLevel/ConfigDescriptor.c  \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Device/HID.c            \
 	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/HID.c              \
-	  $(LUFA_PATH)/LUFA/Drivers/USB/Class/Host/HIDParser.c        \
 	  
 
 # List C++ source files here. (C dependencies are automatically generated.)
diff --git a/LUFA/Drivers/USB/Class/Common/HID.h b/LUFA/Drivers/USB/Class/Common/HID.h
index 233512643..d53b12f6b 100644
--- a/LUFA/Drivers/USB/Class/Common/HID.h
+++ b/LUFA/Drivers/USB/Class/Common/HID.h
@@ -87,6 +87,14 @@
 		#define HID_BOOT_KEYBOARD_PROTOCOL   0x01
 
 	/* Type Defines: */
+		/** Enum for the different types of HID reports. */
+		enum HID_ReportItemTypes_t
+		{
+			REPORT_ITEM_TYPE_In                   = 1, /**< Indicates that the item is an IN report type. */
+			REPORT_ITEM_TYPE_Out                  = 2, /**< Indicates that the item is an OUT report type. */
+			REPORT_ITEM_TYPE_Feature              = 3, /**< Indicates that the item is a FEATURE report type. */
+		};
+
 		/** Type define for the HID class specific HID descriptor, to describe the HID device's specifications. Refer to the HID
 		 *  specification for details on the structure elements.
 		 */
diff --git a/LUFA/Drivers/USB/Class/Device/MassStorage.c b/LUFA/Drivers/USB/Class/Device/MassStorage.c
index fce864386..43dc3f82b 100644
--- a/LUFA/Drivers/USB/Class/Device/MassStorage.c
+++ b/LUFA/Drivers/USB/Class/Device/MassStorage.c
@@ -120,21 +120,21 @@ void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
 			}
 			
 			MS_Device_ReturnCommandStatus(MSInterfaceInfo);
-			
-			if (MSInterfaceInfo->State.IsMassStoreReset)
-			{
-				Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataOUTEndpointNumber);
-				Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataINEndpointNumber);
-				
-				Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber);
-				Endpoint_ClearStall();
-				Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber);
-				Endpoint_ClearStall();
-			}
 		}
 	}
 	
-	MSInterfaceInfo->State.IsMassStoreReset = false;
+	if (MSInterfaceInfo->State.IsMassStoreReset)
+	{
+		Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataOUTEndpointNumber);
+		Endpoint_ResetFIFO(MSInterfaceInfo->Config.DataINEndpointNumber);
+		
+		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpointNumber);
+		Endpoint_ClearStall();
+		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber);
+		Endpoint_ClearStall();
+
+		MSInterfaceInfo->State.IsMassStoreReset = false;
+	}
 }
 
 static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
@@ -165,11 +165,8 @@ static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInte
 	                        StreamCallback_MS_Device_AbortOnMassStoreReset);
 							
 	Endpoint_ClearOUT();
-	  
-	if (MSInterfaceInfo->State.IsMassStoreReset)
-	  return false;
-
-	return true;
+	
+	return !(MSInterfaceInfo->State.IsMassStoreReset);
 }
 
 static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c
index 7d9b3b559..a82fe537f 100644
--- a/LUFA/Drivers/USB/Class/Host/HID.c
+++ b/LUFA/Drivers/USB/Class/Host/HID.c
@@ -162,7 +162,7 @@ uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceI
 	{
 		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 		.bRequest      = REQ_SetReport,
-		.wValue        = ReportID,
+		.wValue        = (REPORT_ITEM_TYPE_In << 8) | ReportID,
 		.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
 		.wLength       = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, REPORT_ITEM_TYPE_In),
 	};
@@ -249,7 +249,7 @@ uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo
 			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 			.bRequest      = REQ_SetReport,
 #if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
-			.wValue        = ReportID,
+			.wValue        = (REPORT_ITEM_TYPE_Out << 8) | ReportID,
 #else
 			.wValue        = 0,
 #endif
diff --git a/LUFA/Drivers/USB/Class/Host/HID.h b/LUFA/Drivers/USB/Class/Host/HID.h
index 89cb3d860..8a70f27b3 100644
--- a/LUFA/Drivers/USB/Class/Host/HID.h
+++ b/LUFA/Drivers/USB/Class/Host/HID.h
@@ -158,6 +158,9 @@
 
 
 			/** Receives a HID IN report from the attached HID device, when a report has been received on the HID IN Data pipe.
+			 *  
+			 *  \note The destination buffer should be large enough to accomodate the largest report that the attached device
+			 *        can generate.
 			 *
 			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state
 			 *  \param[in] Buffer  Buffer to store the received report into
@@ -167,7 +170,7 @@
 			uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, void* Buffer) ATTR_NON_NULL_PTR_ARG(1, 2);
 
 			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY)
-			/** Received a HID IN report from the attached device, by the report ID.
+			/** Receives a HID IN report from the attached device, by the report ID.
 			 *
 			 *  \note When the HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable.
 			 *
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h
index 751e40e0e..d7ef272d3 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h
@@ -62,6 +62,7 @@
 		#include <stdbool.h>
 
 		#include "HIDReportData.h"
+		#include "../Common/HID.h"
 
 		#include "../../../../Common/Common.h"
 
@@ -124,15 +125,7 @@
 		#endif
 
 	/* Public Interface - May be used in end-application: */
-		/* Enums: */
-			/** Enum for indicating what type of report item an entry in a \ref HID_ReportInfo_t ReportItem array is */
-			enum HID_ReportItemTypes_t
-			{
-				REPORT_ITEM_TYPE_In                   = 0, /**< Indicates that the item is an IN report type. */
-				REPORT_ITEM_TYPE_Out                  = 1, /**< Indicates that the item is an OUT report type. */
-				REPORT_ITEM_TYPE_Feature              = 2, /**< Indicates that the item is a FEATURE report type. */
-			};
-			
+		/* Enums: */			
 			/** Enum for the possible error codes in the return value of the \ref USB_ProcessHIDReport() function */
 			enum HID_Parse_ErrorCodes_t
 			{
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 9fe00ee48..0dd349655 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -46,6 +46,7 @@
   *  - Fixed HID device class driver not reselecting the correct endpoint once the user callback routines have been called
   *  - Corrected HID descriptor in the Joystick Device demos - buttons should be placed outside the pointer collection
   *  - Fixed HID report parser collection paths invalid due to misplaced semicolon in the free path item search loop
+  *  - Fixed HID host Class driver report send/receive report broken when issued through the control pipe
   *
   *  \section Sec_ChangeLog090924 Version 090924
   *
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 60afc3fa6..750fb15d7 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -24,7 +24,7 @@
   *  - Add unit testing to APIs
   *  - Add board overviews
   *  - Add resume interrupt support
-  *  - Specification compliance testing for all device demos
+  *  - Correct mishandling of error cases in Mass Storage demo
   *  - Add RNDIS Host Class driver
   *  - Make new demos
   *      -# Keyboard/Mouse Dual Class Host
-- 
GitLab