Add proper reset handling to the USB Printer Device Class driver.
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 5 May 2013 19:32:07 +0000 (19:32 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 5 May 2013 19:32:07 +0000 (19:32 +0000)
LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c
LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h

index 5a87f20..3d34047 100644 (file)
@@ -59,7 +59,7 @@ void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTIn
                                }
 
                                uint16_t IEEEStringLen = strlen(PRNTInterfaceInfo->Config.IEEE1284String);
                                }
 
                                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();
                        }
                                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();
 
                                Endpoint_ClearSETUP();
                                Endpoint_ClearStatusStage();
 
+                               PRNTInterfaceInfo->State.IsPrinterReset = true;
+
                                EVENT_PRNT_Device_SoftReset(PRNTInterfaceInfo);
                        }
 
                                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 (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,
 }
 
 uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo,
index bcb892f..1c50a98 100644 (file)
                                        USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
 
                                        char* IEEE1284String; /**< IEEE 1284 identification string, sent to the host during enumeration
                                        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
                                           *   <b>must</b> 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_*
                                } Config; /**< Config data for the USB class interface within the device. All elements in this section
                                           *   <b>must</b> 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.
                                          */
                                } 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.
                                          */
                         *
                         *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state.
                         */
                         *
                         *  \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
 
                        /** 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