Update the Printer class bootloader to use the new Printer Device Class driver, rathe...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 5 May 2013 19:08:15 +0000 (19:08 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 5 May 2013 19:08:15 +0000 (19:08 +0000)
Bootloaders/Printer/BootloaderPrinter.c
Bootloaders/Printer/Descriptors.h
Bootloaders/Printer/makefile

index e81646b..023ec3e 100644 (file)
 
 #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);
 }
index 5590c25..1265f21 100644 (file)
@@ -38,7 +38,6 @@
 
        /* Includes: */
                #include <LUFA/Drivers/USB/USB.h>
-               #include <LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h>
 
                #include <avr/pgmspace.h>
 
index fc268f8..c5aa970 100644 (file)
@@ -18,7 +18,7 @@ F_CPU        = 8000000
 F_USB        = $(F_CPU)\r
 OPTIMIZATION = s\r
 TARGET       = BootloaderPrinter\r
-SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB)\r
+SRC          = $(TARGET).c Descriptors.c BootloaderAPI.c BootloaderAPITable.S $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS)\r
 LUFA_PATH    = ../../LUFA\r
 CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ -DBOOT_START_ADDR=$(BOOT_START_OFFSET)\r
 LD_FLAGS     = -Wl,--section-start=.text=$(BOOT_START_OFFSET) $(BOOT_API_LD_FLAGS)\r