From f4814771d2544cc53098fc8c13657eb41e9e9401 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Tue, 11 Aug 2009 02:09:11 +0000
Subject: [PATCH] Completion of initial CDC host mode class driver.

Adjustments to the CDC and MIDI device class drivers to use sizeof() on the actual variable being transmitted or received rather than its datatype to reduce possible mistakes.
---
 LUFA/Drivers/USB/Class/Device/CDC.c  |  6 +++--
 LUFA/Drivers/USB/Class/Device/MIDI.c |  4 ++--
 LUFA/Drivers/USB/Class/Host/CDC.c    | 33 +++++++++++++++++++++++-----
 3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index 47290ceb6a..a6e5e26891 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -195,11 +195,13 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
 			.bRequest      = NOTIF_SerialState,
 			.wValue        = 0,
 			.wIndex        = 0,
-			.wLength       = sizeof(uint16_t),
+			.wLength       = sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
 		};
 
 	Endpoint_Write_Stream_LE(&Notification, sizeof(Notification), NO_STREAM_CALLBACK);
-	Endpoint_Write_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost, sizeof(uint8_t), NO_STREAM_CALLBACK);
+	Endpoint_Write_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
+	                         sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
+	                         NO_STREAM_CALLBACK);
 	Endpoint_ClearIN();
 }
 
diff --git a/LUFA/Drivers/USB/Class/Device/MIDI.c b/LUFA/Drivers/USB/Class/Device/MIDI.c
index a74e7a6192..76583b1732 100644
--- a/LUFA/Drivers/USB/Class/Device/MIDI.c
+++ b/LUFA/Drivers/USB/Class/Device/MIDI.c
@@ -79,7 +79,7 @@ void MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfac
 
 	if (Endpoint_IsReadWriteAllowed());
 	{
-		Endpoint_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NO_STREAM_CALLBACK);
+		Endpoint_Write_Stream_LE(Event, sizeof(Event), NO_STREAM_CALLBACK);
 		Endpoint_ClearIN();
 	}
 }
@@ -94,7 +94,7 @@ bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInter
 	if (!(Endpoint_IsReadWriteAllowed()))
 	  return false;
 
-	Endpoint_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NO_STREAM_CALLBACK);
+	Endpoint_Read_Stream_LE(Event, sizeof(Event), NO_STREAM_CALLBACK);
 	Endpoint_ClearOUT();
 	
 	return true;
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index e0e15e1457..2985b248e8 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -34,12 +34,10 @@
 #define  INCLUDE_FROM_CDC_CLASS_HOST_C
 #include "CDC.h"
 
-#warning The CDC Host mode Class driver is currently incomplete and is for preview purposes only.
-
 uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, uint16_t ConfigDescriptorSize,
                                 uint8_t* ConfigDescriptorData)
 {
-	uint8_t  FoundEndpoints = 0;
+	uint8_t FoundEndpoints = 0;
 
 	memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State));
 
@@ -198,7 +196,32 @@ static uint8_t DComp_CDC_Host_NextInterfaceCDCDataEndpoint(void* CurrentDescript
 
 void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)
 {
-	EVENT_CDC_Host_ControLineStateChanged(CDCInterfaceInfo);
+	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.Active))
+	  return;
+	
+	Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipeNumber);	
+	Pipe_Unfreeze();
+
+	if (Pipe_IsINReceived())
+	{
+		USB_Request_Header_t Notification;
+		Pipe_Read_Stream_LE(&Notification, sizeof(Notification), NO_STREAM_CALLBACK);
+		
+		if ((Notification.bRequest      == NOTIF_SerialState) &&
+		    (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)))
+		{
+			Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost,
+			                    sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost),
+			                    NO_STREAM_CALLBACK);
+			
+		}
+
+		Pipe_ClearIN();
+
+		EVENT_CDC_Host_ControLineStateChanged(CDCInterfaceInfo);
+	}
+	
+	Pipe_Freeze();
 }
 
 uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)
@@ -206,7 +229,7 @@ uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo)
 	USB_ControlRequest = (USB_Request_Header_t)
 	{
 		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
-		.bRequest      = REQ_SetControlLineState,
+		.bRequest      = REQ_SetLineEncoding,
 		.wValue        = 0,
 		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber,
 		.wLength       = sizeof(CDCInterfaceInfo->State.LineEncoding),