From b68a71af380e27d925461349f765d1c01d57432c Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Sun, 5 May 2013 19:08:15 +0000
Subject: [PATCH] Update the Printer class bootloader to use the new Printer
 Device Class driver, rather than implementing the Printer USB class manually.

---
 Bootloaders/Printer/BootloaderPrinter.c | 110 +++++++++---------------
 Bootloaders/Printer/Descriptors.h       |   1 -
 Bootloaders/Printer/makefile            |   2 +-
 3 files changed, 43 insertions(+), 70 deletions(-)

diff --git a/Bootloaders/Printer/BootloaderPrinter.c b/Bootloaders/Printer/BootloaderPrinter.c
index e81646ba1..023ec3e93 100644
--- a/Bootloaders/Printer/BootloaderPrinter.c
+++ b/Bootloaders/Printer/BootloaderPrinter.c
@@ -35,6 +35,35 @@
 
 #include "BootloaderPrinter.h"
 
+/** LUFA Printer Class driver interface configuration and state information. This structure is
+ *  passed to all Printer Class driver functions, so that multiple instances of the same class
+ *  within a device can be differentiated from one another.
+ */
+USB_ClassInfo_PRNT_Device_t TextOnly_Printer_Interface =
+	{
+		.Config =
+			{
+				.InterfaceNumber          = 0,
+				.DataINEndpoint           =
+					{
+						.Address          = PRINTER_IN_EPADDR,
+						.Size             = PRINTER_IO_EPSIZE,
+						.Banks            = 1,
+					},
+				.DataOUTEndpoint =
+					{
+						.Address          = PRINTER_OUT_EPADDR,
+						.Size             = PRINTER_IO_EPSIZE,
+						.Banks            = 1,
+					},
+				.IEEE1284String =
+					"MFG:Generic;"
+					"MDL:Generic_/_Text_Only;"
+					"CMD:1284.4;"
+					"CLS:PRINTER",
+			},
+	};
+
 /** Intel HEX parser state machine state information, to track the contents of
  *  a HEX file streamed in as a sequence of arbitrary bytes.
  */
@@ -310,26 +339,25 @@ int main(void)
 
 	while (RunBootloader)
 	{
-		USB_USBTask();
-
-		Endpoint_SelectEndpoint(PRINTER_OUT_EPADDR);
+		uint8_t BytesReceived = PRNT_Device_BytesReceived(&TextOnly_Printer_Interface);
 
-		/* Check if we have received new printer data from the host */
-		if (Endpoint_IsOUTReceived()) {
-			LEDs_ToggleLEDs(LEDMASK_USB_BUSY);
+		if (BytesReceived)
+		{
+			LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
 
-			/* Read all bytes of data from the host and parse them */
-			while (Endpoint_IsReadWriteAllowed())
+			while (BytesReceived--)
 			{
+				int16_t ReceivedByte = PRNT_Device_ReceiveByte(&TextOnly_Printer_Interface);
+
 				/* Feed the next byte of data to the HEX parser */
-				ParseIntelHEXByte(Endpoint_Read_8());
+				ParseIntelHEXByte(ReceivedByte);
 			}
 
-			/* Send an ACK to the host, ready for the next data packet */
-			Endpoint_ClearOUT();
-
 			LEDs_SetAllLEDs(LEDMASK_USB_READY);
 		}
+
+		PRNT_Device_USBTask(&TextOnly_Printer_Interface);
+		USB_USBTask();
 	}
 
 	/* Disconnect from the host - USB interface will be reset later along with the AVR */
@@ -397,8 +425,7 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 	bool ConfigSuccess = true;
 
 	/* Setup Printer Data Endpoints */
-	ConfigSuccess &= Endpoint_ConfigureEndpoint(PRINTER_IN_EPADDR,  EP_TYPE_BULK, PRINTER_IO_EPSIZE, 1);
-	ConfigSuccess &= Endpoint_ConfigureEndpoint(PRINTER_OUT_EPADDR, EP_TYPE_BULK, PRINTER_IO_EPSIZE, 1);
+	ConfigSuccess &= PRNT_Device_ConfigureEndpoints(&TextOnly_Printer_Interface);
 
 	/* Indicate endpoint configuration success or failure */
 	LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
@@ -410,58 +437,5 @@ void EVENT_USB_Device_ConfigurationChanged(void)
  */
 void EVENT_USB_Device_ControlRequest(void)
 {
-	/* Process Printer specific control requests */
-	switch (USB_ControlRequest.bRequest)
-	{
-		case PRNT_REQ_GetDeviceID:
-			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
-			{
-				/* Generic printer IEEE 1284 identification string, will bind to an in-built driver on
-				 * Windows systems, and will fall-back to a text-only printer driver on *nix.
-				 */
-				const char PrinterIDString[] =
-					"MFG:Generic;"
-					"MDL:Generic_/_Text_Only;"
-					"CMD:1284.4;"
-					"CLS:PRINTER";
-
-				Endpoint_ClearSETUP();
-
-				while (!(Endpoint_IsINReady()))
-				{
-					if (USB_DeviceState == DEVICE_STATE_Unattached)
-					  return;
-				}
-
-				Endpoint_Write_16_BE(sizeof(PrinterIDString));
-				Endpoint_Write_Control_Stream_LE(PrinterIDString, strlen(PrinterIDString));
-				Endpoint_ClearStatusStage();
-			}
-
-			break;
-		case PRNT_REQ_GetPortStatus:
-			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
-			{
-				Endpoint_ClearSETUP();
-
-				while (!(Endpoint_IsINReady()))
-				{
-					if (USB_DeviceState == DEVICE_STATE_Unattached)
-					  return;
-				}
-
-				Endpoint_Write_8(PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT);
-				Endpoint_ClearStatusStage();
-			}
-
-			break;
-		case PRNT_REQ_SoftReset:
-			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
-			{
-				Endpoint_ClearSETUP();
-				Endpoint_ClearStatusStage();
-			}
-
-			break;
-	}
+	PRNT_Device_ProcessControlRequest(&TextOnly_Printer_Interface);
 }
diff --git a/Bootloaders/Printer/Descriptors.h b/Bootloaders/Printer/Descriptors.h
index 5590c2536..1265f2174 100644
--- a/Bootloaders/Printer/Descriptors.h
+++ b/Bootloaders/Printer/Descriptors.h
@@ -38,7 +38,6 @@
 
 	/* Includes: */
 		#include <LUFA/Drivers/USB/USB.h>
-		#include <LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h>
 
 		#include <avr/pgmspace.h>
 
diff --git a/Bootloaders/Printer/makefile b/Bootloaders/Printer/makefile
index fc268f850..c5aa97042 100644
--- a/Bootloaders/Printer/makefile
+++ b/Bootloaders/Printer/makefile
@@ -18,7 +18,7 @@ F_CPU        = 8000000
 F_USB        = $(F_CPU)
 OPTIMIZATION = s
 TARGET       = BootloaderPrinter
-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB)
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)
 LUFA_PATH    = ../../LUFA
 CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)
 LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)
-- 
GitLab