diff --git a/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c b/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c index 5a87f20736..3d34047eb3 100644 --- a/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c +++ b/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c @@ -59,7 +59,7 @@ void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTIn } uint16_t IEEEStringLen = strlen(PRNTInterfaceInfo->Config.IEEE1284String); - Endpoint_Write_16_BE(IEEEStringLen + 1); + Endpoint_Write_16_BE(IEEEStringLen); Endpoint_Write_Control_Stream_LE(PRNTInterfaceInfo->Config.IEEE1284String, IEEEStringLen); Endpoint_ClearStatusStage(); } @@ -87,6 +87,8 @@ void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTIn Endpoint_ClearSETUP(); Endpoint_ClearStatusStage(); + PRNTInterfaceInfo->State.IsPrinterReset = true; + EVENT_PRNT_Device_SoftReset(PRNTInterfaceInfo); } @@ -122,6 +124,21 @@ void PRNT_Device_USBTask(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) if (Endpoint_IsINReady()) PRNT_Device_Flush(PRNTInterfaceInfo); #endif + + if (PRNTInterfaceInfo->State.IsPrinterReset) + { + Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); + Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + + Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); + Endpoint_ClearStall(); + Endpoint_ResetDataToggle(); + Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + Endpoint_ClearStall(); + Endpoint_ResetDataToggle(); + + PRNTInterfaceInfo->State.IsPrinterReset = false; + } } uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, diff --git a/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h index bcb892f416..1c50a9803a 100644 --- a/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h +++ b/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h @@ -87,14 +87,20 @@ USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ char* IEEE1284String; /**< IEEE 1284 identification string, sent to the host during enumeration - * to identify the printer model, manufacturer and other characteristics. */ + * to identify the printer model, manufacturer and other characteristics. + */ } Config; /**< Config data for the USB class interface within the device. All elements in this section * must be set or the interface will fail to enumerate and operate correctly. */ struct { uint8_t PortStatus; /**< Current status of the Printer virtual port, a collection of \c PRNT_PORTSTATUS_* - * bitmask values. */ + * bitmask values. + */ + + volatile bool IsPrinterReset; /**< Flag indicating that the host has requested that the Printer interface be reset + * and that all current Mass Storage operations should immediately abort. + */ } State; /**< State data for the USB class interface within the device. All elements in this section * are reset to their defaults when the interface is enumerated. */ @@ -131,7 +137,7 @@ * * \param[in,out] PRNTInterfaceInfo Pointer to a structure containing a Printer Class configuration and state. */ - void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); /** Sends a given data buffer to the attached USB host, if connected. If a host is not connected when the function is * called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank