From b68a71af380e27d925461349f765d1c01d57432c Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 5 May 2013 19:08:15 +0000 Subject: 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(-) (limited to 'Bootloaders') 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 - #include #include 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) -- cgit v1.2.3