From aa640330a1b9421a16e425f5e0043a08558fb9bf Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 20 Sep 2009 12:34:07 +0000
Subject: Finish Class Driver MouseHost demo. Update HID Host Class driver;
 boot protocol now works, still need to finish and test report protocol mode.

---
 LUFA/Drivers/USB/Class/Host/HID.c       | 18 +++++++-----------
 LUFA/Drivers/USB/Class/Host/HIDParser.c | 24 +++++++-----------------
 LUFA/Drivers/USB/Class/Host/HIDParser.h |  6 +++---
 3 files changed, 17 insertions(+), 31 deletions(-)

(limited to 'LUFA')

diff --git a/LUFA/Drivers/USB/Class/Host/HID.c b/LUFA/Drivers/USB/Class/Host/HID.c
index 22b2de1cb..d01d31211 100644
--- a/LUFA/Drivers/USB/Class/Host/HID.c
+++ b/LUFA/Drivers/USB/Class/Host/HID.c
@@ -75,7 +75,7 @@ uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint
 		if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData,
 		                              DComp_HID_Host_NextHIDInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found)
 		{
-			if (FoundEndpoints == (1 << HID_FOUND_DATAPIPE_IN))
+			if (FoundEndpoints & HID_FOUND_DATAPIPE_IN)
 			  break;
 				
 			return HID_ENUMERROR_EndpointsNotFound;
@@ -199,7 +199,8 @@ uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, bool
 
 		if ((ErrorCode = Pipe_Read_Stream_LE(Buffer, ReportSize, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
 		  return ErrorCode;
-		
+		 
+		Pipe_ClearIN();		
 		Pipe_Freeze();
 		
 		return PIPE_RWSTREAM_NoError;		
@@ -239,6 +240,7 @@ uint8_t HID_Host_SendReport(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo, uint8_t
 		if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, ReportSize, NO_STREAM_CALLBACK)) != PIPE_RWSTREAM_NoError)
 		  return ErrorCode;
 		
+		Pipe_ClearOUT();
 		Pipe_Freeze();
 		
 		return PIPE_RWSTREAM_NoError;
@@ -255,7 +257,7 @@ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
 	Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipeNumber);
 	Pipe_Unfreeze();
 	
-	ReportReceived = Pipe_IsReadWriteAllowed();
+	ReportReceived = Pipe_IsINReceived();
 	
 	Pipe_Freeze();
 	
@@ -264,16 +266,13 @@ bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
 
 uint8_t USB_HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
 {
-	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
-	  return false;
-
 	uint8_t ErrorCode;
 
 	USB_ControlRequest = (USB_Request_Header_t)
 		{
 			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 			.bRequest      = REQ_SetProtocol,
-			.wValue        = 1,
+			.wValue        = 0,
 			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
 			.wLength       = 0,
 		};
@@ -293,9 +292,6 @@ uint8_t USB_HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
 
 uint8_t USB_HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInfo)
 {
-	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive))
-	  return false;
-
 	uint8_t ErrorCode;
 
 	uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize];
@@ -318,7 +314,7 @@ uint8_t USB_HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* HIDInterfaceInf
 		{
 			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 			.bRequest      = REQ_SetProtocol,
-			.wValue        = 0,
+			.wValue        = 1,
 			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber,
 			.wLength       = 0,
 		};
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.c b/LUFA/Drivers/USB/Class/Host/HIDParser.c
index 008d173f0..6c315da7a 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.c
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.c
@@ -246,21 +246,21 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 					{
 						case TAG_MAIN_INPUT:
 							NewReportItem.ItemType  = REPORT_ITEM_TYPE_In;
-							NewReportItem.BitOffset = CurrReportIDInfo->BitsIn;
+							NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In];
 								
-							CurrReportIDInfo->BitsIn += CurrStateTable->Attributes.BitSize;
+							CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In] += CurrStateTable->Attributes.BitSize;
 							break;
 						case TAG_MAIN_OUTPUT:
 							NewReportItem.ItemType  = REPORT_ITEM_TYPE_Out;
-							NewReportItem.BitOffset = CurrReportIDInfo->BitsOut;
+							NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out];
 								
-							CurrReportIDInfo->BitsOut += CurrStateTable->Attributes.BitSize;
+							CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out] += CurrStateTable->Attributes.BitSize;
 							break;
 						case TAG_MAIN_FEATURE:
 							NewReportItem.ItemType  = REPORT_ITEM_TYPE_Feature;						
-							NewReportItem.BitOffset = CurrReportIDInfo->BitsFeature;
+							NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature];
 								
-							CurrReportIDInfo->BitsFeature += CurrStateTable->Attributes.BitSize;
+							CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature] += CurrStateTable->Attributes.BitSize;
 							break;
 					}
 
@@ -347,17 +347,7 @@ uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, uint8_t Report
 	for (uint8_t i = 0; i < HID_MAX_REPORT_IDS; i++)
 	{
 		if (ParserData->ReportIDSizes[i].ReportID == ReportID)
-		{
-			switch (ReportType)
-			{
-				case REPORT_ITEM_TYPE_In:
-					return ParserData->ReportIDSizes[i].BitsIn;
-				case REPORT_ITEM_TYPE_Out:
-					return ParserData->ReportIDSizes[i].BitsOut;
-				case REPORT_ITEM_TYPE_Feature:
-					return ParserData->ReportIDSizes[i].BitsFeature;
-			}
-		}
+		  return ParserData->ReportIDSizes[i].ReportSizeBits[ReportType];
 	}
 
 	return 0;
diff --git a/LUFA/Drivers/USB/Class/Host/HIDParser.h b/LUFA/Drivers/USB/Class/Host/HIDParser.h
index f598789df..74916dbb6 100644
--- a/LUFA/Drivers/USB/Class/Host/HIDParser.h
+++ b/LUFA/Drivers/USB/Class/Host/HIDParser.h
@@ -208,9 +208,9 @@
 			typedef struct
 			{
 				uint8_t                      ReportID; /** Report ID of the report within the HID interface */
-				uint8_t                      BitsIn; /** Total number of IN data bits in the current report ID */
-				uint8_t                      BitsOut; /** Total number of OUT data bits in the current report ID */
-				uint8_t                      BitsFeature; /** Total number of FEATURE data bits in the current report ID */
+				uint8_t                      ReportSizeBits[3]; /** Total number of bits in each report type for the given Report ID,
+				                                                 *  indexed by the \ref HID_ReportItemTypes_t enum
+																 */
 			} HID_ReportSizeInfo_t;
 
 			/** Type define for a complete processed HID report, including all report item data and collections. */
-- 
cgit v1.2.3